)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"9f041bef89305a9fecb07640d51e6f4abe2fbea3","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Clay Gerrard \u003cclay.gerrard@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-10-27 12:03:30 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"better capture output"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I50ad2a736b2bb550ab83f6a43fb5a0fb5393573e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"9aa7fdbe_6766d6bc","line":7,"updated":"2014-10-28 06:35:34.000000000","message":"I would choose a better commit message that explains what is happening:\n\n  Capture test output better\n\n  This change adds some new classes to test.unit.utils which wrap\n  up the collection and mocking of the std err and std out.\n  This will make the testing code easier to write and maintain.","commit_id":"dd2b425a91cb383695e8f68dba98fba82a91d715"}],"tests/unit/utils.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b1518bae44358940b1ca4275f7c1fede4de7a41b","unresolved":false,"context_lines":[{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        WrappedOutputManager \u003d functools.partial(s.OutputManager,"},{"line_number":246,"context_line":"                                                 print_stream\u003dself._out,"},{"line_number":247,"context_line":"                                                 error_stream\u003dself._err)"},{"line_number":248,"context_line":"        self.patchers \u003d ["},{"line_number":249,"context_line":"            mock.patch(\u0027swiftclient.shell.OutputManager\u0027,"},{"line_number":250,"context_line":"                       WrappedOutputManager),"}],"source_content_type":"text/x-python","patch_set":2,"id":"9aa7fdbe_94283434","line":247,"updated":"2014-10-28 16:44:16.000000000","message":"now why didn\u0027t i think of that?","commit_id":"dd2b425a91cb383695e8f68dba98fba82a91d715"},{"author":{"_account_id":13777,"name":"Nicolas Trangez","email":"ikke@nicolast.be","username":"nicolast"},"change_message_id":"afab4beff73b15b7ca8400fe099eadd8db356c3f","unresolved":false,"context_lines":[{"line_number":277,"context_line":"    def __str__(self):"},{"line_number":278,"context_line":"        return self.out"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    def __len__(self, other):"},{"line_number":281,"context_line":"        return len(self.out)"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def __eq__(self, other):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_a7855a08","line":280,"updated":"2014-11-14 15:01:35.000000000","message":"I\u0027m somewhat confused by `__len__` taking a 2nd argument:\n\n```\nclass C:\n    def __len__(self, other):\n        return 1\n\nc \u003d C()\nprint len(c)\n```\n\nyields (as expected)\n\n```\nTraceback (most recent call last):\n  File \"t131238a.py\", line 6, in \u003cmodule\u003e\n    print len(c)\nTypeError: __len__() takes exactly 2 arguments (1 given)\n```","commit_id":"8b07d522f7c3ca7752312dc678856e7d442cfc7b"},{"author":{"_account_id":13777,"name":"Nicolas Trangez","email":"ikke@nicolast.be","username":"nicolast"},"change_message_id":"afab4beff73b15b7ca8400fe099eadd8db356c3f","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        return self.out \u003d\u003d other"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def __getattr__(self, name):"},{"line_number":287,"context_line":"        return getattr(object.__getattribute__(self, \u0027out\u0027), name)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_a70f1a87","line":287,"updated":"2014-11-14 15:01:35.000000000","message":"Is the round-trip through `__getattribute__` required?\n\nSomething like\n\n```\nclass C(object):\n    def __init__(self, out):\n        self._out \u003d out\n\n    @property\n    def out(self):\n        return self._out.getvalue()\n\n    def __getattr__(self, name):\n        return getattr(self.out, name)\n\nimport StringIO\n\nc \u003d C(StringIO.StringIO(\u0027abcd\u0027))\n\nprint c.upper()\n```\n\nyields \u0027ABCD\u0027 as expected.","commit_id":"8b07d522f7c3ca7752312dc678856e7d442cfc7b"},{"author":{"_account_id":13777,"name":"Nicolas Trangez","email":"ikke@nicolast.be","username":"nicolast"},"change_message_id":"f163c5a5983f3b765d471c4962e42cfab471e923","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        reload_module(c)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"class CaptureStream(object):"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    def __init__(self, stream):"},{"line_number":226,"context_line":"        self.stream \u003d stream"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_4c5c8e19","line":223,"updated":"2014-11-18 09:37:15.000000000","message":"Minor nit-pick: maybe call this \u0027CapturedStream\u0027 i.s.o. \u0027CaptureStream\u0027?","commit_id":"8e35d5ff046b389ba58b2b9243e73a8dff515fb2"}]}
