)]}'
{"keystone/catalog/backends/sql.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0ca26ac29a2816f7f3d79b162adadf3705878bfd","unresolved":false,"context_lines":[{"line_number":306,"context_line":"                catalog.setdefault(region, {})"},{"line_number":307,"context_line":"                catalog[region].setdefault(service_type, default_service)"},{"line_number":308,"context_line":"                interface_url \u003d \u0027%sURL\u0027 % endpoint[\u0027interface\u0027]"},{"line_number":309,"context_line":"                catalog[region][service_type][interface_url] \u003d url"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"            return catalog"},{"line_number":312,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_b0369f01","line":309,"updated":"2016-02-10 17:03:44.000000000","message":"all of this doesn\u0027t need to be in the\n\n    with sql.session_for_read() as session: \n\ndoes it?","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"0e761cded35ebb4f06f5692200142431a05320d9","unresolved":false,"context_lines":[{"line_number":306,"context_line":"                catalog.setdefault(region, {})"},{"line_number":307,"context_line":"                catalog[region].setdefault(service_type, default_service)"},{"line_number":308,"context_line":"                interface_url \u003d \u0027%sURL\u0027 % endpoint[\u0027interface\u0027]"},{"line_number":309,"context_line":"                catalog[region][service_type][interface_url] \u003d url"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"            return catalog"},{"line_number":312,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"dae33548_11bcc6b9","line":309,"in_reply_to":"3a57f1b5_b0369f01","updated":"2016-02-18 10:36:16.000000000","message":"it does not unless you use a lazy loaded field, but looks like Endpoint.service relationship is joinedloaded at #280","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0ca26ac29a2816f7f3d79b162adadf3705878bfd","unresolved":false,"context_lines":[{"line_number":337,"context_line":"                Service.enabled \u003d\u003d true()).options("},{"line_number":338,"context_line":"                    sql.joinedload(Service.endpoints)).all())"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"            def make_v3_endpoints(endpoints):"},{"line_number":341,"context_line":"                for endpoint in (ep.to_dict()"},{"line_number":342,"context_line":"                                 for ep in endpoints if ep.enabled):"},{"line_number":343,"context_line":"                    del endpoint[\u0027service_id\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_8b825851","line":340,"updated":"2016-02-10 17:03:44.000000000","message":"same comment here - these don\u0027t have to be in the context of the sql.session do they?\n\nI imagine that we only use the sql.session context to make calls to the backend. Once we have the data we need we don\u0027t need to be in the context anymore do we?","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"}],"keystone/common/sql/core.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"0e761cded35ebb4f06f5692200142431a05320d9","unresolved":false,"context_lines":[{"line_number":169,"context_line":"_main_context_manager \u003d None"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"def _get_main_context_manager():"},{"line_number":173,"context_line":"    global _main_context_manager"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    if not _main_context_manager:"}],"source_content_type":"text/x-python","patch_set":4,"id":"dae33548_71e712ac","line":172,"updated":"2016-02-18 10:36:16.000000000","message":"I believe this is unnecessary - EngineFacade is already lazy initialized.\n\nWhy not just create a context manager instance here? E.g. in Nova: https://github.com/openstack/nova/blob/master/nova/db/sqlalchemy/api.py#L134-L135","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"36bb6e31fb6e5ae944a302c9a6f21089279b265a","unresolved":false,"context_lines":[{"line_number":169,"context_line":"_main_context_manager \u003d None"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"def _get_main_context_manager():"},{"line_number":173,"context_line":"    global _main_context_manager"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    if not _main_context_manager:"}],"source_content_type":"text/x-python","patch_set":4,"id":"dae33548_34df2a3b","line":172,"in_reply_to":"dae33548_71e712ac","updated":"2016-02-18 14:19:23.000000000","message":"Seems that this logic is required for \u0027cleanup\u0027 method which is used for tests (for create/delete context_manager). \n\nDon\u0027t know is it necessary, maybe we can create and configure one context_manager for tests and remove these methods.","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"36bb6e31fb6e5ae944a302c9a6f21089279b265a","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    global _main_context_manager"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    if not _main_context_manager:"},{"line_number":176,"context_line":"        _main_context_manager \u003d enginefacade.transaction_context()"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    return _main_context_manager"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"dae33548_74ad32e8","line":176,"updated":"2016-02-18 14:19:23.000000000","message":"Seems that EngineFacade is not configured, it should use CONF options. \n\nPlease look the same part in Nova https://github.com/openstack/nova/blob/master/nova/db/sqlalchemy/api.py#L166-L168","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"6b5ccbc567465dec6d705f716bfe264c4d4a7c0b","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    global _main_context_manager"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    if not _main_context_manager:"},{"line_number":176,"context_line":"        _main_context_manager \u003d enginefacade.transaction_context()"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    return _main_context_manager"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bae84128_a0cc8135","line":176,"in_reply_to":"dae33548_67b3bd98","updated":"2016-02-24 16:11:42.000000000","message":"This is likely a bit of cleanup we should do as a followup.","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"660bdf9e1e632efc3a7cd81b852ccecd7627ecf4","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    global _main_context_manager"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    if not _main_context_manager:"},{"line_number":176,"context_line":"        _main_context_manager \u003d enginefacade.transaction_context()"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    return _main_context_manager"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"dae33548_bf4313ae","line":176,"in_reply_to":"dae33548_74ad32e8","updated":"2016-02-18 14:34:15.000000000","message":"This actually must be fine: you don\u0027t need to call configure() explicitly, if you don\u0027t want to pass custom options. If not called, options from the confIg will be used implicitly https://github.com/openstack/oslo.db/blob/master/oslo_db/sqlalchemy/enginefacade.py#L317-L318","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"76dbf56cb188c106abc2c81ed6c109fd05620aeb","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    global _main_context_manager"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    if not _main_context_manager:"},{"line_number":176,"context_line":"        _main_context_manager \u003d enginefacade.transaction_context()"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    return _main_context_manager"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"dae33548_67b3bd98","line":176,"in_reply_to":"dae33548_bf4313ae","updated":"2016-02-18 15:49:46.000000000","message":"I don\u0027t think there\u0027s a need here for the global lazy _get_main_context_manager() singleton function.  You can have right at the module level, main_context_manager \u003d enginefacade.transaction_context(), which should not do anything except create the object.  Everything regarding configuration, setting up engines, etc. should be lazy initializing.","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"0e761cded35ebb4f06f5692200142431a05320d9","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    _main_context_manager \u003d None"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"def get_engine():"},{"line_number":188,"context_line":"    return _get_main_context_manager().get_legacy_facade().get_engine()"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"dae33548_f1a96225","line":187,"updated":"2016-02-18 10:36:16.000000000","message":"These two functions must not be needed, if you use the context managers methods directly","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"10f84b608ab850ee35343d8ec0d764fbd6da7c70","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    _main_context_manager \u003d None"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"def get_engine():"},{"line_number":188,"context_line":"    return _get_main_context_manager().get_legacy_facade().get_engine()"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bae84128_ab2bc780","line":187,"in_reply_to":"dae33548_f1a96225","updated":"2016-02-24 15:43:50.000000000","message":"Correct, but for compatibility of out-of-tree drivers/custom drivers we can\u0027t remove them.","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"0e761cded35ebb4f06f5692200142431a05320d9","unresolved":false,"context_lines":[{"line_number":195,"context_line":"_CONTEXT \u003d threading.local()"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"def session_for_read():"},{"line_number":199,"context_line":"    return _get_main_context_manager().reader.using(_CONTEXT)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"dae33548_ac449d49","line":198,"updated":"2016-02-18 10:36:16.000000000","message":"These are ok, but I like the point Mike brought in the comments: EngineFacade actually offers more flexibility, like independent transactions,  save points, offloading to asynchronous replicas.\n\nMaybe it makes more sense to use the context manager directly.","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"385d46ceb4972af9a984e279b90d1745191b70cd","unresolved":false,"context_lines":[{"line_number":195,"context_line":"_CONTEXT \u003d threading.local()"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"def session_for_read():"},{"line_number":199,"context_line":"    return _get_main_context_manager().reader.using(_CONTEXT)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"dae33548_d4f07ecb","line":198,"in_reply_to":"dae33548_ac449d49","updated":"2016-02-18 14:19:13.000000000","message":"But if we will use context manager directly we get something like:\n\n with sql._get_main_context_manager().reader.using(sql._CONTEXT): \n      *****\n\n\nlooks ugly","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"76dbf56cb188c106abc2c81ed6c109fd05620aeb","unresolved":false,"context_lines":[{"line_number":195,"context_line":"_CONTEXT \u003d threading.local()"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"def session_for_read():"},{"line_number":199,"context_line":"    return _get_main_context_manager().reader.using(_CONTEXT)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"dae33548_8771a10e","line":198,"in_reply_to":"dae33548_d4f07ecb","updated":"2016-02-18 15:49:46.000000000","message":"which part, the underscore, or just the two dotted names?  You can have a fixed module-scope transaction context in sql and just use that.  transaction_context() is lazy-initializing.  this could be sql.ctxmgr.reader.using(sql.CONTEXT).","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"}],"keystone/tests/unit/test_backend_sql.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b660438cd1e40a46801644e8232d5d9da3503d90","unresolved":false,"context_lines":[{"line_number":455,"context_line":"        # other tests below test the differences between how they use the batch"},{"line_number":456,"context_line":"        # strategy"},{"line_number":457,"context_line":"        with mock.patch.object(token_sql, \u0027sql\u0027) as mock_sql:"},{"line_number":458,"context_line":"            mock_sql.session_for_write().__enter__("},{"line_number":459,"context_line":"            ).query().filter().delete.return_value \u003d 0"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"            mock_sql.session_for_write().__enter__("},{"line_number":462,"context_line":"            ).bind.dialect.name \u003d \u0027mysql\u0027"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"            tok \u003d token_sql.Token()"},{"line_number":465,"context_line":"            expiry_mock \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a5ae5dd_1ca86476","line":462,"range":{"start_line":458,"start_character":12,"end_line":462,"end_character":41},"updated":"2016-02-07 18:35:04.000000000","message":"not clear on these changes and why they were needed","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"e799e9e8f518fff1e822d68f8cfd43e59b855cf0","unresolved":false,"context_lines":[{"line_number":455,"context_line":"        # other tests below test the differences between how they use the batch"},{"line_number":456,"context_line":"        # strategy"},{"line_number":457,"context_line":"        with mock.patch.object(token_sql, \u0027sql\u0027) as mock_sql:"},{"line_number":458,"context_line":"            mock_sql.session_for_write().__enter__("},{"line_number":459,"context_line":"            ).query().filter().delete.return_value \u003d 0"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"            mock_sql.session_for_write().__enter__("},{"line_number":462,"context_line":"            ).bind.dialect.name \u003d \u0027mysql\u0027"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"            tok \u003d token_sql.Token()"},{"line_number":465,"context_line":"            expiry_mock \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":4,"id":"bae84128_8b6b6384","line":462,"range":{"start_line":458,"start_character":12,"end_line":462,"end_character":41},"in_reply_to":"5a5ae5dd_1ca86476","updated":"2016-02-24 15:45:53.000000000","message":"to identify this is a writer session and use the context manager correctly.","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7c6fd4626dece16cadd89fd2ce11850a8c7042c4","unresolved":false,"context_lines":[{"line_number":637,"context_line":"        # strategy"},{"line_number":638,"context_line":"        with mock.patch.object(token_sql, \u0027sql\u0027) as mock_sql:"},{"line_number":639,"context_line":"            mock_sql.session_for_write().__enter__("},{"line_number":640,"context_line":"            ).query().filter().delete.return_value \u003d 0"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"            mock_sql.session_for_write().__enter__("},{"line_number":643,"context_line":"            ).bind.dialect.name \u003d \u0027mysql\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"bae84128_cc10de02","line":640,"updated":"2016-02-24 16:58:39.000000000","message":"This indentation is allowed by pep8?!","commit_id":"0e156737d0e5aabb86c0fdb326dc9c95d52b3e32"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1bd46fd508647f722d29f669fa0d2df55abcf29b","unresolved":false,"context_lines":[{"line_number":637,"context_line":"        # strategy"},{"line_number":638,"context_line":"        with mock.patch.object(token_sql, \u0027sql\u0027) as mock_sql:"},{"line_number":639,"context_line":"            mock_sql.session_for_write().__enter__("},{"line_number":640,"context_line":"            ).query().filter().delete.return_value \u003d 0"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"            mock_sql.session_for_write().__enter__("},{"line_number":643,"context_line":"            ).bind.dialect.name \u003d \u0027mysql\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"bae84128_a2064183","line":640,"in_reply_to":"bae84128_cc10de02","updated":"2016-02-24 17:28:17.000000000","message":"Yep.","commit_id":"0e156737d0e5aabb86c0fdb326dc9c95d52b3e32"}],"keystone/tests/unit/test_sql_upgrade.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b660438cd1e40a46801644e8232d5d9da3503d90","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"5a5ae5dd_bcb910ce","updated":"2016-02-07 18:35:04.000000000","message":"both of these changes seem unrelated, but meh","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"e799e9e8f518fff1e822d68f8cfd43e59b855cf0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"bae84128_ab3107a4","in_reply_to":"5a5ae5dd_bcb910ce","updated":"2016-02-24 15:45:53.000000000","message":"These should be reverted in next patchset.","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"408a0e312aae1e52de5b8579593ecadbfc1edaee","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        self.schema \u003d versioning_api.ControlledSchema.create("},{"line_number":163,"context_line":"            self.engine,"},{"line_number":164,"context_line":"            self.repo_path,"},{"line_number":165,"context_line":"            self.initial_db_version)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        # auto-detect the highest available schema version in the migrate_repo"},{"line_number":168,"context_line":"        self.max_version \u003d self.schema.repository.version().version"}],"source_content_type":"text/x-python","patch_set":5,"id":"bae84128_73753130","line":165,"updated":"2016-02-24 16:22:22.000000000","message":"whoopse, this should be reverted if another patchset is needed.","commit_id":"0e156737d0e5aabb86c0fdb326dc9c95d52b3e32"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7c6fd4626dece16cadd89fd2ce11850a8c7042c4","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        self.schema \u003d versioning_api.ControlledSchema.create("},{"line_number":163,"context_line":"            self.engine,"},{"line_number":164,"context_line":"            self.repo_path,"},{"line_number":165,"context_line":"            self.initial_db_version)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        # auto-detect the highest available schema version in the migrate_repo"},{"line_number":168,"context_line":"        self.max_version \u003d self.schema.repository.version().version"}],"source_content_type":"text/x-python","patch_set":5,"id":"bae84128_0c1e460b","line":165,"in_reply_to":"bae84128_73753130","updated":"2016-02-24 16:58:39.000000000","message":"Meh, keep it.","commit_id":"0e156737d0e5aabb86c0fdb326dc9c95d52b3e32"}],"keystone/tests/unit/test_v3.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b660438cd1e40a46801644e8232d5d9da3503d90","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"5a5ae5dd_dcbc0cbd","updated":"2016-02-07 18:35:04.000000000","message":"also unrelated","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"e799e9e8f518fff1e822d68f8cfd43e59b855cf0","unresolved":false,"context_lines":[{"line_number":607,"context_line":"        if ref:"},{"line_number":608,"context_line":"            for k in keys:"},{"line_number":609,"context_line":"                msg \u003d \u0027%s not equal: %s !\u003d %s\u0027 % (k, ref[k], entity[k])"},{"line_number":610,"context_line":"                self.assertEqual(ref[k], entity[k], msg)"},{"line_number":611,"context_line":""},{"line_number":612,"context_line":"        return entity"},{"line_number":613,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bae84128_abbf47ce","line":610,"updated":"2016-02-24 15:45:53.000000000","message":"revert","commit_id":"941fffd8485f89d8bc4abda04c0a21172571490c"}]}
