)]}'
{"oslo_db/sqlalchemy/enginefacade.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"d1b05df3ed10d3cf44eeb82ace15553ceb4bcb86","unresolved":false,"context_lines":[{"line_number":363,"context_line":"        if sql_connection is None:"},{"line_number":364,"context_line":"            raise exception.CantStartEngineError("},{"line_number":365,"context_line":"                \"No sql_connection parameter is established\")"},{"line_number":366,"context_line":"        engine_kwargs \u003d engine_kwargs.copy()"},{"line_number":367,"context_line":"        engine \u003d engines.create_engine("},{"line_number":368,"context_line":"            sql_connection\u003dsql_connection, **engine_kwargs)"},{"line_number":369,"context_line":"        if self.on_engine_create is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1aa78d24_dbe67643","line":366,"updated":"2016-07-15 00:49:10.000000000","message":"Why this change?","commit_id":"707881aae22474e381f7e3ad79d1173566eeb838"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"60d674e18b9e0a01b52494185136747a32c40325","unresolved":false,"context_lines":[{"line_number":363,"context_line":"        if sql_connection is None:"},{"line_number":364,"context_line":"            raise exception.CantStartEngineError("},{"line_number":365,"context_line":"                \"No sql_connection parameter is established\")"},{"line_number":366,"context_line":"        engine_kwargs \u003d engine_kwargs.copy()"},{"line_number":367,"context_line":"        engine \u003d engines.create_engine("},{"line_number":368,"context_line":"            sql_connection\u003dsql_connection, **engine_kwargs)"},{"line_number":369,"context_line":"        if self.on_engine_create is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1aa78d24_e4562ecd","line":366,"in_reply_to":"1aa78d24_dbe67643","updated":"2016-07-15 06:04:56.000000000","message":"oops, it was left from previous patch set.","commit_id":"707881aae22474e381f7e3ad79d1173566eeb838"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"5d7d2973742b3265925115eb0e698d6aa117dcb8","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        self._started \u003d False"},{"line_number":173,"context_line":"        self._legacy_facade \u003d None"},{"line_number":174,"context_line":"        self._start_lock \u003d threading.Lock()"},{"line_number":175,"context_line":"        self.on_engine_create \u003d on_engine_create"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def configure_defaults(self, **kw):"},{"line_number":178,"context_line":"        \"\"\"Apply default configurational options."}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_9c8e8d25","line":175,"updated":"2016-07-15 13:12:29.000000000","message":"hmmm... why not another config option?  part of _facade_cfg above.   These don\u0027t have to be in CONF, you can just pass them in as part of configure_defaults().   That gives us a way to set this up after the context already exists (such as if one is using the global enginefacade, which originally was how I thought this would work).  Plus in that case we can even make the \"hook\" a list of hooks.\n\nnote that I\u0027m working on the oslo.db test_base / enginefacade problem as well and that will involve the test passing out the existing enginefacade to be instrumented for testing.","commit_id":"b4e616f36b722498b3163b14918796c6101a5f92"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"0711f12149fe9b45cf052203fb51d273237ab704","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        self._started \u003d False"},{"line_number":173,"context_line":"        self._legacy_facade \u003d None"},{"line_number":174,"context_line":"        self._start_lock \u003d threading.Lock()"},{"line_number":175,"context_line":"        self.on_engine_create \u003d on_engine_create"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def configure_defaults(self, **kw):"},{"line_number":178,"context_line":"        \"\"\"Apply default configurational options."}],"source_content_type":"text/x-python","patch_set":7,"id":"dada55a8_fbb4d235","line":175,"in_reply_to":"1aa78d24_9c8e8d25","updated":"2016-07-20 12:09:27.000000000","message":"Done","commit_id":"b4e616f36b722498b3163b14918796c6101a5f92"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"b24ba9a2bb925bc9f6090b21a8c02b177f5c587a","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        self._started \u003d False"},{"line_number":173,"context_line":"        self._legacy_facade \u003d None"},{"line_number":174,"context_line":"        self._start_lock \u003d threading.Lock()"},{"line_number":175,"context_line":"        self.on_engine_create \u003d on_engine_create"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def configure_defaults(self, **kw):"},{"line_number":178,"context_line":"        \"\"\"Apply default configurational options."}],"source_content_type":"text/x-python","patch_set":7,"id":"fad55976_7edb2bee","line":175,"in_reply_to":"1aa78d24_9c8e8d25","updated":"2016-07-15 21:15:16.000000000","message":"This confused me at first :) passing a callback via a call to configure() seems to be a good idea","commit_id":"b4e616f36b722498b3163b14918796c6101a5f92"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"5d7d2973742b3265925115eb0e698d6aa117dcb8","unresolved":false,"context_lines":[{"line_number":366,"context_line":"        engine \u003d engines.create_engine("},{"line_number":367,"context_line":"            sql_connection\u003dsql_connection, **engine_kwargs)"},{"line_number":368,"context_line":"        if self.on_engine_create is not None:"},{"line_number":369,"context_line":"            self.on_engine_create(sqlalchemy, engine, \u0027oslo.db\u0027)"},{"line_number":370,"context_line":"        sessionmaker \u003d orm.get_maker(engine\u003dengine, **maker_kwargs)"},{"line_number":371,"context_line":"        return engine, sessionmaker"},{"line_number":372,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_dcfdb56f","line":369,"updated":"2016-07-15 13:12:29.000000000","message":"I\u0027d just have this pass \"engine\", the \"sqlalchemy\" module and \"oslo.db\" key can be added on the outside.   Any receiver of this hook already knows it\u0027s getting a SQLAlchemy engine.","commit_id":"b4e616f36b722498b3163b14918796c6101a5f92"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"0711f12149fe9b45cf052203fb51d273237ab704","unresolved":false,"context_lines":[{"line_number":366,"context_line":"        engine \u003d engines.create_engine("},{"line_number":367,"context_line":"            sql_connection\u003dsql_connection, **engine_kwargs)"},{"line_number":368,"context_line":"        if self.on_engine_create is not None:"},{"line_number":369,"context_line":"            self.on_engine_create(sqlalchemy, engine, \u0027oslo.db\u0027)"},{"line_number":370,"context_line":"        sessionmaker \u003d orm.get_maker(engine\u003dengine, **maker_kwargs)"},{"line_number":371,"context_line":"        return engine, sessionmaker"},{"line_number":372,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"dada55a8_5bda354d","line":369,"in_reply_to":"1aa78d24_dcfdb56f","updated":"2016-07-20 12:09:27.000000000","message":"Done","commit_id":"b4e616f36b722498b3163b14918796c6101a5f92"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"b24ba9a2bb925bc9f6090b21a8c02b177f5c587a","unresolved":false,"context_lines":[{"line_number":850,"context_line":"    \"\"\"Construct a local transaction context."},{"line_number":851,"context_line":""},{"line_number":852,"context_line":"       :param on_engine_create: function which enable users to take some"},{"line_number":853,"context_line":"       actions with newly created engines."},{"line_number":854,"context_line":"    \"\"\""},{"line_number":855,"context_line":"    return _TransactionContextManager(on_engine_create\u003don_engine_create)"},{"line_number":856,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fad55976_f648e589","line":853,"updated":"2016-07-15 21:15:16.000000000","message":"nit: let\u0027s document the signature of the callback here (i.e. what params it accepts)","commit_id":"b4e616f36b722498b3163b14918796c6101a5f92"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"95ab718b4130bc0b731affac5f7b52875b92c582","unresolved":false,"context_lines":[{"line_number":365,"context_line":"        engine \u003d engines.create_engine("},{"line_number":366,"context_line":"            sql_connection\u003dsql_connection, **engine_kwargs)"},{"line_number":367,"context_line":"        if self._facade_cfg[\u0027on_engine_create\u0027] is not None:"},{"line_number":368,"context_line":"            for hook in self._facade_cfg[\u0027on_engine_create\u0027]:"},{"line_number":369,"context_line":"                hook(engine)"},{"line_number":370,"context_line":"        sessionmaker \u003d orm.get_maker(engine\u003dengine, **maker_kwargs)"},{"line_number":371,"context_line":"        return engine, sessionmaker"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_66a95924","line":368,"updated":"2016-07-20 13:53:08.000000000","message":"OK, I know I said \"this could be a list\", but then I got myself into trouble :).   Passing as a list is less intuitive for a single function, and a list assumes that one would want to add new hooks without re-stating the whole list, e.g. \"append\".   \n\ncan we maybe add the fn below and have this be the front-facing API ?  Still keep the _facade_cfg as the mechanism.\n\n\t@@ -244,6 +244,11 @@ class _TransactionFactory(object):\n\t                 exception.NotSupportedWarning\n\t             )\n\t \n\t+    def append_on_engine_create(self, fn):\n\t+        \"\"\"append a listener function to _facade_cfg[\"on_engine_create\"]\"\"\"\n\t+\n\t+        # ...\n\t+\n\t     def get_legacy_facade(self):\n\t         \"\"\"Return a :class:`.LegacyEngineFacade` for this factory.","commit_id":"287b4ddd3e6625882e28e0f042362c8ba90c383c"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"4f5172c977801985e2366177aaae291ffe1a5e3d","unresolved":false,"context_lines":[{"line_number":365,"context_line":"        engine \u003d engines.create_engine("},{"line_number":366,"context_line":"            sql_connection\u003dsql_connection, **engine_kwargs)"},{"line_number":367,"context_line":"        if self._facade_cfg[\u0027on_engine_create\u0027] is not None:"},{"line_number":368,"context_line":"            for hook in self._facade_cfg[\u0027on_engine_create\u0027]:"},{"line_number":369,"context_line":"                hook(engine)"},{"line_number":370,"context_line":"        sessionmaker \u003d orm.get_maker(engine\u003dengine, **maker_kwargs)"},{"line_number":371,"context_line":"        return engine, sessionmaker"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_ec6b1f83","line":368,"in_reply_to":"dada55a8_66a95924","updated":"2016-07-21 18:18:20.000000000","message":"In this case we will have to call context_manager._factory.append_on_engine_create(fn), I don\u0027t think that this is OK as we will have to use private _factory.","commit_id":"287b4ddd3e6625882e28e0f042362c8ba90c383c"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"2b8c3dd8b07adc432ee05ea16a988f38fc7c0114","unresolved":false,"context_lines":[{"line_number":365,"context_line":"        engine \u003d engines.create_engine("},{"line_number":366,"context_line":"            sql_connection\u003dsql_connection, **engine_kwargs)"},{"line_number":367,"context_line":"        if self._facade_cfg[\u0027on_engine_create\u0027] is not None:"},{"line_number":368,"context_line":"            for hook in self._facade_cfg[\u0027on_engine_create\u0027]:"},{"line_number":369,"context_line":"                hook(engine)"},{"line_number":370,"context_line":"        sessionmaker \u003d orm.get_maker(engine\u003dengine, **maker_kwargs)"},{"line_number":371,"context_line":"        return engine, sessionmaker"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_55574bc9","line":368,"in_reply_to":"dada55a8_69755cc9","updated":"2016-07-21 19:42:36.000000000","message":"Done","commit_id":"287b4ddd3e6625882e28e0f042362c8ba90c383c"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"aaf60bcbd9892a9cb4700e2de6baa251ac88373f","unresolved":false,"context_lines":[{"line_number":365,"context_line":"        engine \u003d engines.create_engine("},{"line_number":366,"context_line":"            sql_connection\u003dsql_connection, **engine_kwargs)"},{"line_number":367,"context_line":"        if self._facade_cfg[\u0027on_engine_create\u0027] is not None:"},{"line_number":368,"context_line":"            for hook in self._facade_cfg[\u0027on_engine_create\u0027]:"},{"line_number":369,"context_line":"                hook(engine)"},{"line_number":370,"context_line":"        sessionmaker \u003d orm.get_maker(engine\u003dengine, **maker_kwargs)"},{"line_number":371,"context_line":"        return engine, sessionmaker"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_69755cc9","line":368,"in_reply_to":"dada55a8_ec6b1f83","updated":"2016-07-21 18:22:17.000000000","message":"that\u0027s OK, we can add an append_engine_create() on the ContextManager that calls into it","commit_id":"287b4ddd3e6625882e28e0f042362c8ba90c383c"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"d2133cfc8beb2c7ac7e0a0d7cf6e717e47e8ce13","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            }"},{"line_number":156,"context_line":"        self._facade_cfg \u003d {"},{"line_number":157,"context_line":"            \u0027synchronous_reader\u0027: True,"},{"line_number":158,"context_line":"            \u0027on_engine_create\u0027: None,"},{"line_number":159,"context_line":"        }"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        # other options that are defined in oslo.db.options.database_opts"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_f933fa5f","line":158,"updated":"2016-07-27 09:53:25.000000000","message":"nit: any reason not to use an empty list as a default value here? This would allow to remove \"if foo is not None\" checks below","commit_id":"749d3c7341f2b2b4b55658024f2826e2240b21c3"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"f575a5b767a0839b527544b895469f4e4e4c023f","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            }"},{"line_number":156,"context_line":"        self._facade_cfg \u003d {"},{"line_number":157,"context_line":"            \u0027synchronous_reader\u0027: True,"},{"line_number":158,"context_line":"            \u0027on_engine_create\u0027: None,"},{"line_number":159,"context_line":"        }"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        # other options that are defined in oslo.db.options.database_opts"}],"source_content_type":"text/x-python","patch_set":9,"id":"bacf61ea_973b6e9c","line":158,"in_reply_to":"dada55a8_f933fa5f","updated":"2016-07-27 15:13:17.000000000","message":"Done","commit_id":"749d3c7341f2b2b4b55658024f2826e2240b21c3"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"37f6e8f989a91f60205084591107aea4bfc68466","unresolved":false,"context_lines":[{"line_number":629,"context_line":""},{"line_number":630,"context_line":"        \"\"\""},{"line_number":631,"context_line":"        self._factory.configure(**kw)"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"    def append_on_engine_create(self, fn):"},{"line_number":634,"context_line":"        \"\"\"Append a listener function to _facade_cfg[\"on_engine_create\"]\"\"\""},{"line_number":635,"context_line":"        self._factory._facade_cfg[\u0027on_engine_create\u0027].append(fn)"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_3e867365","line":632,"updated":"2016-07-29 10:14:55.000000000","message":"nit: I wonder if we also want to have remove_on_engine_create() be added in the future","commit_id":"bd89ce98b38d32c187a25f382a572eeab537b028"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"37f6e8f989a91f60205084591107aea4bfc68466","unresolved":false,"context_lines":[{"line_number":630,"context_line":"        \"\"\""},{"line_number":631,"context_line":"        self._factory.configure(**kw)"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"    def append_on_engine_create(self, fn):"},{"line_number":634,"context_line":"        \"\"\"Append a listener function to _facade_cfg[\"on_engine_create\"]\"\"\""},{"line_number":635,"context_line":"        self._factory._facade_cfg[\u0027on_engine_create\u0027].append(fn)"},{"line_number":636,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_fe5e9b10","line":633,"updated":"2016-07-29 10:14:55.000000000","message":"nit: we could probably add this to docs, but this can be done in a separate change","commit_id":"bd89ce98b38d32c187a25f382a572eeab537b028"}],"oslo_db/tests/sqlalchemy/test_enginefacade.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"9e88a218bc7c735aa8cb844a2c028c0de2cbedb6","unresolved":false,"context_lines":[{"line_number":1842,"context_line":""},{"line_number":1843,"context_line":"class TestTransactionFactoryCallback(oslo_test_base.BaseTestCase):"},{"line_number":1844,"context_line":""},{"line_number":1845,"context_line":"    def setUp(self):"},{"line_number":1846,"context_line":"        super(TestTransactionFactoryCallback, self).setUp()"},{"line_number":1847,"context_line":"        self.callback \u003d mock.Mock()"},{"line_number":1848,"context_line":"        self.factory \u003d enginefacade._TransactionFactory()"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_9e5b1f87","line":1845,"updated":"2016-07-29 10:26:15.000000000","message":"on the second thought...\n\nPerhaps this would be more clear: http://xsnippet.org/361874/\n\nWhat do you think?","commit_id":"bd89ce98b38d32c187a25f382a572eeab537b028"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"706d0ab4e9a87ef542836ab22e330898f2c23eee","unresolved":false,"context_lines":[{"line_number":1842,"context_line":""},{"line_number":1843,"context_line":"class TestTransactionFactoryCallback(oslo_test_base.BaseTestCase):"},{"line_number":1844,"context_line":""},{"line_number":1845,"context_line":"    def setUp(self):"},{"line_number":1846,"context_line":"        super(TestTransactionFactoryCallback, self).setUp()"},{"line_number":1847,"context_line":"        self.callback \u003d mock.Mock()"},{"line_number":1848,"context_line":"        self.factory \u003d enginefacade._TransactionFactory()"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_d1d38fd3","line":1845,"in_reply_to":"bacf61ea_9e5b1f87","updated":"2016-07-31 16:11:15.000000000","message":"Done","commit_id":"bd89ce98b38d32c187a25f382a572eeab537b028"}]}
