)]}'
{"tests/base.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"98042a0f677b5d2b6401e83caf1bb0e043714640","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    ]"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __new__(cls, name, bases, nmspc):"},{"line_number":29,"context_line":"        cls \u003d super(_AddUrlPathMeta, cls).__new__(cls, name, bases, nmspc)"},{"line_number":30,"context_line":"        if not any(name.endswith(suffix)"},{"line_number":31,"context_line":"                   for suffix in _AddUrlPathMeta.ignore_class_suffixes):"},{"line_number":32,"context_line":"            new_bases \u003d [cls]"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a2fa921_5df628d8","line":29,"updated":"2015-10-07 15:31:48.000000000","message":"Since this is your first step, you could write this using __init__() instead of __new__().","commit_id":"ba66cc4ec4aef9e2aa2c4c6c0038a32547b4f457"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"73da3dd5977e5bd5429c64a64f5a3432a4b0e84f","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    ]"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __new__(cls, name, bases, nmspc):"},{"line_number":29,"context_line":"        cls \u003d super(_AddUrlPathMeta, cls).__new__(cls, name, bases, nmspc)"},{"line_number":30,"context_line":"        if not any(name.endswith(suffix)"},{"line_number":31,"context_line":"                   for suffix in _AddUrlPathMeta.ignore_class_suffixes):"},{"line_number":32,"context_line":"            new_bases \u003d [cls]"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a2fa921_3910194e","line":29,"in_reply_to":"7a2fa921_38281ae2","updated":"2015-10-07 17:11:20.000000000","message":"A metaclass is just like a class; __new__() is called to allocate the object, then __init__() is called to initialize it.  And, for the record, I have used both __new__() and __init__() in a metaclass; in fact, I think I may have written one metaclass that used both.","commit_id":"ba66cc4ec4aef9e2aa2c4c6c0038a32547b4f457"},{"author":{"_account_id":1054,"name":"Darragh Bailey","email":"daragh.bailey@gmail.com","username":"dbailey-k"},"change_message_id":"414f36eef80b63829356ec0550e79446a7baa427","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    ]"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __new__(cls, name, bases, nmspc):"},{"line_number":29,"context_line":"        cls \u003d super(_AddUrlPathMeta, cls).__new__(cls, name, bases, nmspc)"},{"line_number":30,"context_line":"        if not any(name.endswith(suffix)"},{"line_number":31,"context_line":"                   for suffix in _AddUrlPathMeta.ignore_class_suffixes):"},{"line_number":32,"context_line":"            new_bases \u003d [cls]"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a2fa921_38281ae2","line":29,"in_reply_to":"7a2fa921_5df628d8","updated":"2015-10-07 16:09:10.000000000","message":"For metaclasses __new__ is used to create the object that this is the metaclass for. I don\u0027t believe __init__ on the metaclass is called during class creation.","commit_id":"ba66cc4ec4aef9e2aa2c4c6c0038a32547b4f457"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"98042a0f677b5d2b6401e83caf1bb0e043714640","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            new_class \u003d type(name.replace(\"Test\", \"UrlPathTest\"),"},{"line_number":35,"context_line":"                             tuple(new_bases),"},{"line_number":36,"context_line":"                             {\u0027base_url\u0027: \u0027http://example.com/jenkins\u0027})"},{"line_number":37,"context_line":"            new_class.__module__ \u003d cls.__module__"},{"line_number":38,"context_line":"            setattr(sys.modules[cls.__module__], new_class.__name__, new_class)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        return cls"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a2fa921_1d9c3068","line":37,"updated":"2015-10-07 15:31:48.000000000","message":"You could wrap this into the new_class construction:\n\n    new_class \u003d type(name.replace(\"Test\", \"UrlPathTest\"),\n                     tuple(new_bases),\n                     {\n                         \u0027base_url\u0027: \u0027http://example.com/jenkins\u0027,\n                         \u0027__module__\u0027: cls.__module__,\n                     })","commit_id":"ba66cc4ec4aef9e2aa2c4c6c0038a32547b4f457"},{"author":{"_account_id":1054,"name":"Darragh Bailey","email":"daragh.bailey@gmail.com","username":"dbailey-k"},"change_message_id":"414f36eef80b63829356ec0550e79446a7baa427","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            new_class \u003d type(name.replace(\"Test\", \"UrlPathTest\"),"},{"line_number":35,"context_line":"                             tuple(new_bases),"},{"line_number":36,"context_line":"                             {\u0027base_url\u0027: \u0027http://example.com/jenkins\u0027})"},{"line_number":37,"context_line":"            new_class.__module__ \u003d cls.__module__"},{"line_number":38,"context_line":"            setattr(sys.modules[cls.__module__], new_class.__name__, new_class)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        return cls"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a2fa921_187e7eae","line":37,"in_reply_to":"7a2fa921_1d9c3068","updated":"2015-10-07 16:09:10.000000000","message":"Thanks, will do.","commit_id":"ba66cc4ec4aef9e2aa2c4c6c0038a32547b4f457"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"98042a0f677b5d2b6401e83caf1bb0e043714640","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            new_class.__module__ \u003d cls.__module__"},{"line_number":38,"context_line":"            setattr(sys.modules[cls.__module__], new_class.__name__, new_class)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        return cls"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"@six.add_metaclass(_AddUrlPathMeta)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a2fa921_5d238805","line":40,"updated":"2015-10-07 15:31:48.000000000","message":"So, this is one way of doing this, but I wonder if you could do the same thing with a class decorator, which would have the advantage of being more explicit:\n\n    def multi_url(cls):\n        new_cls \u003d type(name.replace(\u0027Test\u0027, \u0027UrlPathTest\u0027),\n                       (cls,),\n                       {\n                           \u0027base_url\u0027: \u0027http://example.com/jenkins\u0027,\n                           \u0027__module__\u0027: cls.__module__,\n                       })\n        setattr(sys.modules(cls.__module__], new_cls.__name__, new_cls)\n        return cls\n\nFor that matter, doesn\u0027t testscenarios provide tooling for this sort of thing?  That\u0027s something I haven\u0027t used, so I don\u0027t know the syntax to perform the necessary modifications, but it may be worth checking into.","commit_id":"ba66cc4ec4aef9e2aa2c4c6c0038a32547b4f457"},{"author":{"_account_id":1054,"name":"Darragh Bailey","email":"daragh.bailey@gmail.com","username":"dbailey-k"},"change_message_id":"414f36eef80b63829356ec0550e79446a7baa427","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            new_class.__module__ \u003d cls.__module__"},{"line_number":38,"context_line":"            setattr(sys.modules[cls.__module__], new_class.__name__, new_class)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        return cls"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"@six.add_metaclass(_AddUrlPathMeta)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a2fa921_735b1388","line":40,"in_reply_to":"7a2fa921_5d238805","updated":"2015-10-07 16:09:10.000000000","message":"Didn\u0027t think of using a decorator. Will it be inherited to apply against subclasses or does it still only get applied against the base class each time it\u0027s encountered in the MRO? Otherwise we\u0027re relying on remembering to add the decorator when testing new API additions.\n\nI\u0027ll have to test anyway.\n\n\nI\u0027m not entirely sure how to ensure it is always applied with testscenarios. Presumably would have to make sure that the subclasses always applied the scenarios listed in the baseclass in addition to any others they might request?","commit_id":"ba66cc4ec4aef9e2aa2c4c6c0038a32547b4f457"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"73da3dd5977e5bd5429c64a64f5a3432a4b0e84f","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            new_class.__module__ \u003d cls.__module__"},{"line_number":38,"context_line":"            setattr(sys.modules[cls.__module__], new_class.__name__, new_class)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        return cls"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"@six.add_metaclass(_AddUrlPathMeta)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a2fa921_795bf12e","line":40,"in_reply_to":"7a2fa921_735b1388","updated":"2015-10-07 17:11:20.000000000","message":"No, the decorator I describe above wouldn\u0027t apply by way of inheritance.  The property I\u0027m going for by describing it is \"explicitness\".","commit_id":"ba66cc4ec4aef9e2aa2c4c6c0038a32547b4f457"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"6a59884ebe57c109344f747a889c831637a3f482","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        self.j \u003d jenkins.Jenkins(self.base_url, \u0027test\u0027, \u0027test\u0027)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def makeUrl(self, path):"},{"line_number":33,"context_line":"        return u\u0027{0}/{1}\u0027.format(self.base_url, path)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def _check_requests(self, requests):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_84e5fda4","line":32,"updated":"2015-12-02 18:54:33.000000000","message":"femtonit: I\u0027d prefer if we stick with snake_case everywhere we can; obviously we can\u0027t for setUp(), but this method we could easily name make_url().","commit_id":"9208f45ab06ecb4bfe621a23e77da86e3ff94b20"},{"author":{"_account_id":6987,"name":"Khai Do","email":"zaro0508@gmail.com","username":"zaro0508"},"change_message_id":"c2aa4a5999bdd67d71ba8b23bd64c40e17a04a6e","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        self.j \u003d jenkins.Jenkins(self.base_url, \u0027test\u0027, \u0027test\u0027)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def makeUrl(self, path):"},{"line_number":33,"context_line":"        return u\u0027{0}/{1}\u0027.format(self.base_url, path)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def _check_requests(self, requests):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_bb54dbc5","line":32,"in_reply_to":"9a8ffd7b_84e5fda4","updated":"2015-12-02 19:20:14.000000000","message":"Done","commit_id":"9208f45ab06ecb4bfe621a23e77da86e3ff94b20"}]}
