)]}'
{"swift/account/server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"28f7de760691e44d0f349512c47df8e1a0b0fbab","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from swift.common.db import DatabaseConnectionError, DatabaseAlreadyExists"},{"line_number":23,"context_line":"from swift.common.request_helpers import get_param, get_listing_content_type, \\"},{"line_number":24,"context_line":"    split_and_validate_path"},{"line_number":25,"context_line":"from swift.common.base_server import BaseController"},{"line_number":26,"context_line":"from swift.common.utils import hash_path, public, \\"},{"line_number":27,"context_line":"    normalize_timestamp, storage_directory, config_true_value, \\"},{"line_number":28,"context_line":"    json, timing_stats, replication"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWn%2F%2F4uw%3D","line":25,"updated":"2014-04-08 18:20:10.000000000","message":"maybe just \u0027from swift.common.server import BaseController\u0027 unless you think we may have another module in common called server that\u0027s not a common base server?","commit_id":"8d0b9b82e8753ac4c46c849164a51a99ec04388a"},{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"b52c59ded63016cdc7d2743825338ade38b69ced","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from swift.common.db import DatabaseConnectionError, DatabaseAlreadyExists"},{"line_number":23,"context_line":"from swift.common.request_helpers import get_param, get_listing_content_type, \\"},{"line_number":24,"context_line":"    split_and_validate_path"},{"line_number":25,"context_line":"from swift.common.base_server import BaseController"},{"line_number":26,"context_line":"from swift.common.utils import hash_path, public, \\"},{"line_number":27,"context_line":"    normalize_timestamp, storage_directory, config_true_value, \\"},{"line_number":28,"context_line":"    json, timing_stats, replication"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2F5Bc%3D","line":25,"in_reply_to":"AAAAWn%2F%2F4uw%3D","updated":"2014-04-09 17:21:12.000000000","message":"Done","commit_id":"8d0b9b82e8753ac4c46c849164a51a99ec04388a"}],"swift/common/base_server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"28f7de760691e44d0f349512c47df8e1a0b0fbab","unresolved":false,"context_lines":[{"line_number":24,"context_line":"class BaseController(object):"},{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":"    Abstract Base Class for implementing the WSGI application for the various"},{"line_number":27,"context_line":"    Swift Storage Servers."},{"line_number":28,"context_line":"    \"\"\""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    log_route \u003d None"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWn%2F%2F4sY%3D","line":27,"updated":"2014-04-08 18:20:10.000000000","message":"Since python has an abc module I think term \"Abstract Base Class\" might be confusing.  Particularly because this class isn\u0027t all that abstract, it doesn\u0027t call any methods on itself that raise not implemented, it seems at a glance that it could happily be spun up passed to paste and spew out 405 all day long!  Maybe it\u0027s just a plain old \"base\" class that you can sublcass to add functionality to?  Or maybe it should define GET, PUT, HEAD, POST, REPLICATE and raise NotImplemented/501?","commit_id":"8d0b9b82e8753ac4c46c849164a51a99ec04388a"},{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"b52c59ded63016cdc7d2743825338ade38b69ced","unresolved":false,"context_lines":[{"line_number":24,"context_line":"class BaseController(object):"},{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":"    Abstract Base Class for implementing the WSGI application for the various"},{"line_number":27,"context_line":"    Swift Storage Servers."},{"line_number":28,"context_line":"    \"\"\""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    log_route \u003d None"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2F4z4%3D","line":27,"in_reply_to":"AAAAWn%2F%2F4sY%3D","updated":"2014-04-09 17:21:12.000000000","message":"Yes, I think you are right, it is kind-of confusing. I\u0027ll try out the fleshed out base class and see how that works, might be easier for testing.","commit_id":"8d0b9b82e8753ac4c46c849164a51a99ec04388a"}],"swift/obj/server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"91fd43bd86275647f6c880a0b7cdf5117b859b60","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        except DiskFileCollision:"},{"line_number":63,"context_line":"            res \u003d HTTPForbidden(request\u003dreq)"},{"line_number":64,"context_line":"        return res"},{"line_number":65,"context_line":"    return wrapped"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"class ObjectController(BaseController):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2F4Ng%3D","line":65,"updated":"2014-04-09 18:19:25.000000000","message":"Can POST not raise DiskFileCollision?\n\nI wonder if it wouldn\u0027t be more true to the spirt of the existing implementation for ObjectController to define a __call__ like:\n\n    def __call__(self, *args, **kwargs):\n        try:\n            return super().__call___(*args, **kwargs)\n        except DiskFileCollision:\n            return HTTPForbidden()\n\noh hrmm... I guess that would bypass logging.  Maybe the BaseController needs a \"handle_request\" method for wrapping in-between __call__ and the verb methods?  I don\u0027t dislike the decorator either tho, so maybe it\u0027s six-one-way half-a-dozen the other...","commit_id":"640294c2d68f51861e46f6394bd01880d402ab52"},{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"0ed23cab1a30dbeceb7a6eb463a749399ae1b200","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        except DiskFileCollision:"},{"line_number":63,"context_line":"            res \u003d HTTPForbidden(request\u003dreq)"},{"line_number":64,"context_line":"        return res"},{"line_number":65,"context_line":"    return wrapped"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"class ObjectController(BaseController):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2F3T8%3D","line":65,"in_reply_to":"AAAAW3%2F%2F4Ng%3D","updated":"2014-04-09 20:41:13.000000000","message":"Yes, I opted for the decorator so that we could still leverage all the functionality of the base class\u0027s __call__.  If you think of a better way to do that, I\u0027m all ears.","commit_id":"640294c2d68f51861e46f6394bd01880d402ab52"}],"test/unit/common/test_base_server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"28f7de760691e44d0f349512c47df8e1a0b0fbab","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from swift.common.swob import Request, Response"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class TestBaseServedr(unittest.TestCase):"},{"line_number":22,"context_line":"    \"\"\"Tests for swift.common.base_server \"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWn%2F%2F4vI%3D","line":21,"updated":"2014-04-08 18:20:10.000000000","message":"typo","commit_id":"8d0b9b82e8753ac4c46c849164a51a99ec04388a"},{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"b52c59ded63016cdc7d2743825338ade38b69ced","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from swift.common.swob import Request, Response"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class TestBaseServedr(unittest.TestCase):"},{"line_number":22,"context_line":"    \"\"\"Tests for swift.common.base_server \"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2F5BU%3D","line":21,"in_reply_to":"AAAAWn%2F%2F4vI%3D","updated":"2014-04-09 17:21:12.000000000","message":"Done","commit_id":"8d0b9b82e8753ac4c46c849164a51a99ec04388a"}],"test/unit/common/test_server.py":[{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"617312d0ff455d544265faaffd615e938354b380","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                mock.MagicMock(side_effect\u003d[time.gmtime(10001.0)])):"},{"line_number":43,"context_line":"            self.assertEquals("},{"line_number":44,"context_line":"                exp_line,"},{"line_number":45,"context_line":"                utils.get_log_line(req, res, trans_time, additional_info))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2F4zY%3D","line":45,"updated":"2014-04-09 17:22:05.000000000","message":"This will still fail, have to work this into a proper test still.","commit_id":"640294c2d68f51861e46f6394bd01880d402ab52"},{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"9f0282648cae0116d3708de15f57fbc5b584aa96","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        utils.HASH_PATH_SUFFIX \u003d \u0027endcap\u0027"},{"line_number":28,"context_line":"        utils.HASH_PATH_PREFIX \u003d \u0027startcap\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def verify(self, controller_class, conf, path\u003dNone, status_int\u003dNone,"},{"line_number":31,"context_line":"               resp_size\u003dNone, addedinfo\u003dNone):"},{"line_number":32,"context_line":"        replication_server \u003d utils.config_true_value("},{"line_number":33,"context_line":"            conf.get(\u0027replication_server\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAW3%2F%2F294%3D","line":30,"updated":"2014-04-09 21:44:57.000000000","message":"When I started writing this, I thought it might be good to have a central place to test things, avoiding duplicate code in each test. However, this is convoluted. :(\n\nIf folks care, I can break this up, or we can just heavily comment it.","commit_id":"236c5ded23550ec048e9ccf660cea1786ebface5"}]}
