)]}'
{"swift/common/middleware/recon.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"caf36bda5f0fe781d393692e006a198c20b1cb77","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        while block:"},{"line_number":253,"context_line":"            md5sum.update(block)"},{"line_number":254,"context_line":"            block \u003d f.read(4096)"},{"line_number":255,"context_line":"        return md5sum.hexdigest()"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"    def get_ring_md5(self, openr\u003dopen):"},{"line_number":258,"context_line":"        \"\"\"get all ring md5sum\u0027s\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a74a57a_0618c383","line":255,"updated":"2016-11-30 20:16:37.000000000","message":"I think I prefer\n\n md5sum \u003d md5()\n for block in iter(lambda: f.read(4096), \u0027\u0027):\n     md5sum.update(block)\n return md5sum.hexdigest()\n\n...only now we don\u0027t have any tests to verify that it\u0027s actually functionally equivalent, do we?","commit_id":"7773daa9cc39c9316e3b9dca694e0eb46d39ab9a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cad38cca241b3bdaef0e777eb0cb1bca29785ca1","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        while block:"},{"line_number":253,"context_line":"            md5sum.update(block)"},{"line_number":254,"context_line":"            block \u003d f.read(4096)"},{"line_number":255,"context_line":"        return md5sum.hexdigest()"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"    def get_ring_md5(self, openr\u003dopen):"},{"line_number":258,"context_line":"        \"\"\"get all ring md5sum\u0027s\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a74a57a_49cacca2","line":255,"in_reply_to":"5a74a57a_0618c383","updated":"2016-11-30 20:24:15.000000000","message":"shit, that\u0027s a really good point :\\","commit_id":"7773daa9cc39c9316e3b9dca694e0eb46d39ab9a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ceab10faad7731c83a0407282be2f33a4c8cea33","unresolved":false,"context_lines":[{"line_number":32,"context_line":"MD5_BLOCK_READ_BYTES \u003d 4096"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def _hash_for_ringfile(f):"},{"line_number":36,"context_line":"    md5sum \u003d md5()"},{"line_number":37,"context_line":"    for block in iter(lambda: f.read(MD5_BLOCK_READ_BYTES), \u0027\u0027):"},{"line_number":38,"context_line":"        md5sum.update(block)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_e9d3885d","line":35,"updated":"2016-12-02 16:11:42.000000000","message":"there\u0027s a bunch of other places in recon.py m/ware and cli where we have similar code to md5 file contents, I may follow up with a refactor to use a common helper funntion","commit_id":"053b625f42e2d1d90e18ad72e16099a5b62447dd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ceab10faad7731c83a0407282be2f33a4c8cea33","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def _hash_for_ringfile(f):"},{"line_number":36,"context_line":"    md5sum \u003d md5()"},{"line_number":37,"context_line":"    for block in iter(lambda: f.read(MD5_BLOCK_READ_BYTES), \u0027\u0027):"},{"line_number":38,"context_line":"        md5sum.update(block)"},{"line_number":39,"context_line":"    return md5sum.hexdigest()"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_51698c24","line":37,"updated":"2016-12-02 16:11:42.000000000","message":"nice","commit_id":"053b625f42e2d1d90e18ad72e16099a5b62447dd"}],"test/unit/common/middleware/test_recon.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ab7a11cc496bebd4312a32bdb3d16266ec183072","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        # object-{1,2}.ring.gz should both appear as they are present on disk"},{"line_number":329,"context_line":"        # and were configured as policies."},{"line_number":330,"context_line":"        app \u003d recon.ReconMiddleware(FakeApp(), {\u0027swift_dir\u0027: self.tempdir})"},{"line_number":331,"context_line":"        app._hash_for_ringfile \u003d lambda f: \u0027hash-\u0027 + os.path.basename(f.name)"},{"line_number":332,"context_line":"        self.assertEqual(sorted(app.get_ring_md5().items()),"},{"line_number":333,"context_line":"                         sorted(expt_out.items()))"},{"line_number":334,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_25bec3d4","line":331,"range":{"start_line":331,"start_character":33,"end_line":331,"end_character":77},"updated":"2016-11-30 04:44:19.000000000","message":"I don\u0027t like the repeating of the same lambda a bazillion times.. so this should be helper methoded out:\n\n  @staticmethod\n  def stubbed_hash_for_ringfile(f):\n      return \u0027hash-\u0027 + os.path.basename(f.name)\n\n  ...\n  \n     app._hash_for_ringfile \u003d stubbed_hash_for_ringfile\n\nOr simply make the lambda global in the setup.\n\nI was going to raise a NIT about possibly using a try/finally to monkey patch safely.. but in most cases the app scope is the test, and where we use the self.app it\u0027ll be recreated in setup each time anyway. But if you wanted to for completeness then cool.","commit_id":"913b0ec399d4f4977509dcc7ba381687e38475b1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ceab10faad7731c83a0407282be2f33a4c8cea33","unresolved":false,"context_lines":[{"line_number":333,"context_line":"                    \u0027%s/object-1.ring.gz\u0027 % self.tempdir:"},{"line_number":334,"context_line":"                    \u0027hash-object-1.ring.gz\u0027,"},{"line_number":335,"context_line":"                    \u0027%s/object-2.ring.gz\u0027 % self.tempdir:"},{"line_number":336,"context_line":"                    \u0027hash-object-2.ring.gz\u0027}"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"        # We need to instantiate app after overriding the configured policies."},{"line_number":339,"context_line":"        app \u003d self._get_app()"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_c8340dfd","line":336,"updated":"2016-12-02 16:11:42.000000000","message":"ok, this change makes sense in conjunction with new test_hash_for_ringfile_* tests","commit_id":"053b625f42e2d1d90e18ad72e16099a5b62447dd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ceab10faad7731c83a0407282be2f33a4c8cea33","unresolved":false,"context_lines":[{"line_number":1418,"context_line":"        self.assertIsNone(resp[\u0027/etc/swift/swift.conf\u0027])"},{"line_number":1419,"context_line":""},{"line_number":1420,"context_line":""},{"line_number":1421,"context_line":"class TestReconUtilityFunctions(unittest.TestCase):"},{"line_number":1422,"context_line":""},{"line_number":1423,"context_line":"    def test_hash_for_ringfile_on_filelike_smallish(self):"},{"line_number":1424,"context_line":"        stub_data \u003d \u0027some data\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_690f782e","line":1421,"updated":"2016-12-02 16:11:42.000000000","message":"ok these tests fail when i tried various ways to break _hash_for_ringfile","commit_id":"053b625f42e2d1d90e18ad72e16099a5b62447dd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ed7a7a4edece3f9119e1870229494aaa96c155d8","unresolved":false,"context_lines":[{"line_number":1449,"context_line":"        self.assertTrue(mock_hasher.hexdigest.called)"},{"line_number":1450,"context_line":"        self.assertEqual(rv, mock_hasher.hexdigest.return_value)"},{"line_number":1451,"context_line":"        self.assertEqual(num_blocks, len(mock_hasher.update.call_args_list))"},{"line_number":1452,"context_line":"        expected_block \u003d \u0027a\u0027 * block_size"},{"line_number":1453,"context_line":"        found_blocks \u003d []"},{"line_number":1454,"context_line":"        for i, (expected_block, call) in enumerate(zip("},{"line_number":1455,"context_line":"                expected_blocks, mock_hasher.update.call_args_list)):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_b4cf30b2","line":1452,"range":{"start_line":1452,"start_character":8,"end_line":1452,"end_character":22},"updated":"2016-12-01 01:18:14.000000000","message":"Is this value used?","commit_id":"053b625f42e2d1d90e18ad72e16099a5b62447dd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ceab10faad7731c83a0407282be2f33a4c8cea33","unresolved":false,"context_lines":[{"line_number":1449,"context_line":"        self.assertTrue(mock_hasher.hexdigest.called)"},{"line_number":1450,"context_line":"        self.assertEqual(rv, mock_hasher.hexdigest.return_value)"},{"line_number":1451,"context_line":"        self.assertEqual(num_blocks, len(mock_hasher.update.call_args_list))"},{"line_number":1452,"context_line":"        expected_block \u003d \u0027a\u0027 * block_size"},{"line_number":1453,"context_line":"        found_blocks \u003d []"},{"line_number":1454,"context_line":"        for i, (expected_block, call) in enumerate(zip("},{"line_number":1455,"context_line":"                expected_blocks, mock_hasher.update.call_args_list)):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_d59581e4","line":1452,"range":{"start_line":1452,"start_character":8,"end_line":1452,"end_character":22},"in_reply_to":"5a74a57a_b4cf30b2","updated":"2016-12-02 16:11:42.000000000","message":"no","commit_id":"053b625f42e2d1d90e18ad72e16099a5b62447dd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ed7a7a4edece3f9119e1870229494aaa96c155d8","unresolved":false,"context_lines":[{"line_number":1457,"context_line":"            self.assertEqual(kwargs, {})"},{"line_number":1458,"context_line":"            self.assertEqual(1, len(args))"},{"line_number":1459,"context_line":"            block \u003d args[0]"},{"line_number":1460,"context_line":"            if i \u003c num_blocks - 1:"},{"line_number":1461,"context_line":"                self.assertEqual(block, expected_block)"},{"line_number":1462,"context_line":"            else:"},{"line_number":1463,"context_line":"                self.assertEqual(block, expected_block[:-truncate])"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_344b202d","line":1460,"updated":"2016-12-01 01:18:14.000000000","message":"Would it be better to just say\n\n expected_blocks[-1] \u003d expected_blocks[-1][:-truncate]\n\nbefore join()ing above?","commit_id":"053b625f42e2d1d90e18ad72e16099a5b62447dd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ed7a7a4edece3f9119e1870229494aaa96c155d8","unresolved":false,"context_lines":[{"line_number":1462,"context_line":"            else:"},{"line_number":1463,"context_line":"                self.assertEqual(block, expected_block[:-truncate])"},{"line_number":1464,"context_line":"            found_blocks.append(block)"},{"line_number":1465,"context_line":"        self.assertEqual(\u0027\u0027.join(found_blocks), trimmed_data)"},{"line_number":1466,"context_line":""},{"line_number":1467,"context_line":"    def test_hash_for_ringfile_on_filelike_empty(self):"},{"line_number":1468,"context_line":"        stub_filelike \u003d StringIO(\u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_546dfc97","line":1465,"updated":"2016-12-01 01:18:14.000000000","message":"This seems redundant given the construction of trimmed_data...","commit_id":"053b625f42e2d1d90e18ad72e16099a5b62447dd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ed7a7a4edece3f9119e1870229494aaa96c155d8","unresolved":false,"context_lines":[{"line_number":1485,"context_line":"        # they\u0027re probably doing the right thing"},{"line_number":1486,"context_line":"        failures \u003d []"},{"line_number":1487,"context_line":"        for stub_data, expected_hash in data_to_expected_hash.items():"},{"line_number":1488,"context_line":"            rv \u003d recon._hash_for_ringfile(StringIO(stub_data))"},{"line_number":1489,"context_line":"            try:"},{"line_number":1490,"context_line":"                self.assertEqual(expected_hash, rv)"},{"line_number":1491,"context_line":"            except AssertionError:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_d1659e1d","line":1488,"updated":"2016-12-01 01:18:14.000000000","message":"Might want to use BytesIO and explicitly specify b\u0027\u0027, b\u0027some data\u0027, and b\u0027a\u0027 above. Can\u0027t hash Unicode when we get to py3...","commit_id":"053b625f42e2d1d90e18ad72e16099a5b62447dd"}]}
