)]}'
{"oslo/db/sqlalchemy/exc_filters.py":[{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"6246287c4fb3b4263a06dd15fe3d1e5bfe5ec98b","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    \"\"\"Raise MySQL error 1146 as is, so that it does not conflict with"},{"line_number":186,"context_line":"    the MySQL dialect\u0027s checking a table not existing."},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    raise error"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_0ff35d9f","line":188,"updated":"2014-07-28 12:31:07.000000000","message":"We can keep this file as is.","commit_id":"2b4e282c0f37965e7b1e6deed1b856a9ff6d45cf"}],"oslo/db/sqlalchemy/utils.py":[{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"e597520a6fca8801f3aacee20829b1a217a8ed5d","unresolved":false,"context_lines":[{"line_number":902,"context_line":"                if to_break:"},{"line_number":903,"context_line":"                    break"},{"line_number":904,"context_line":"            if to_break:"},{"line_number":905,"context_line":"                break"},{"line_number":906,"context_line":""},{"line_number":907,"context_line":"    def _dispatch_on(self, url, target, *arg):"},{"line_number":908,"context_line":"        dbname, driver \u003d self._db_plus_driver_reg.match("}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_01ee1b8b","line":905,"updated":"2014-07-25 01:44:24.000000000","message":"You can just \u0027return\u0027 early from the inside loop and skip the explicit to_break logic.\n\nHowever, from what I can see the self.multiple logic is already handled in _dispatch_on and this only needs to build the list of matches:\n\n def _matches(self, dbname, driver):\n    for db in (dbname, \u0027*\u0027):\n        subdict \u003d self.reg[db]\n        for drv in (driver, \u0027*\u0027):\n            for fn in subdict[drv]:\n               yield fn\n\n(You could also do a version involving itertools.chain too, but the explicit version above is perhaps easier to read)","commit_id":"f80219d04ba9e2418423e13303c191285fc13bf2"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"4f20f5c8407917d888bd962fa6c1a799edc9f96c","unresolved":false,"context_lines":[{"line_number":902,"context_line":"                if to_break:"},{"line_number":903,"context_line":"                    break"},{"line_number":904,"context_line":"            if to_break:"},{"line_number":905,"context_line":"                break"},{"line_number":906,"context_line":""},{"line_number":907,"context_line":"    def _dispatch_on(self, url, target, *arg):"},{"line_number":908,"context_line":"        dbname, driver \u003d self._db_plus_driver_reg.match("}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_64d285d2","line":905,"in_reply_to":"baada198_01ee1b8b","updated":"2014-07-25 02:46:04.000000000","message":"nope, it yields.  return isn\u0027t allowed.  the breaks you see there are so that if both \"dbname\" and \"*\" are in the dict, and we aren\u0027t in \"multiple\" mode, we only do the fn for \"dbname\".\n\nthis *could* however be moved around if we just had two different versions of _matches.   I\u0027ll probably do that, as this was being written the contract changed a bit such that the \"one iterator\" thing got kind of awkward.","commit_id":"f80219d04ba9e2418423e13303c191285fc13bf2"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"9db58d38b395d2da4c57d89b84da414e193cd6f8","unresolved":false,"context_lines":[{"line_number":902,"context_line":"                if to_break:"},{"line_number":903,"context_line":"                    break"},{"line_number":904,"context_line":"            if to_break:"},{"line_number":905,"context_line":"                break"},{"line_number":906,"context_line":""},{"line_number":907,"context_line":"    def _dispatch_on(self, url, target, *arg):"},{"line_number":908,"context_line":"        dbname, driver \u003d self._db_plus_driver_reg.match("}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_17d81952","line":905,"in_reply_to":"baada198_64d285d2","updated":"2014-07-25 03:37:53.000000000","message":"You can return (without an argument) from a generator just fine and it does the same as falling off the end of the function - raises StopIteration to signal the caller that you\u0027re done.\n\nYeah, I can see (now) why you need to exit early for !multiple, so in the interests of constructive cut+pastability:\n\n def _matches(self, dbname, driver):\n    for db in (dbname, \u0027*\u0027):\n        subdict \u003d self.reg[db]\n        for drv in (driver, \u0027*\u0027):\n            fns \u003d subdict[drv]\n            for fn in fns:\n               yield fn\n            if not self.multiple and fns:\n               return","commit_id":"f80219d04ba9e2418423e13303c191285fc13bf2"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"e597520a6fca8801f3aacee20829b1a217a8ed5d","unresolved":false,"context_lines":[{"line_number":929,"context_line":"            if retval is NONE:"},{"line_number":930,"context_line":"                raise ValueError("},{"line_number":931,"context_line":"                    \"No default function found for driver: %r\" %"},{"line_number":932,"context_line":"                    (\"%s+%s\" % (dbname, driver)))"},{"line_number":933,"context_line":"            else:"},{"line_number":934,"context_line":"                return retval"},{"line_number":935,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_6127d763","line":932,"updated":"2014-07-25 01:44:24.000000000","message":"These two ValueErrors will only occur when there is a coding error, so the common case (in regular operation) is always going to iterate through the full list of _matches.  Given this, I don\u0027t think the early-exit optimisation is worth the control flow obfuscation; consider just building the full list of matches up front and doing something simple, like:\n\n matches \u003d list(self._matches(dbname, driver))\n if self.multiple:\n   if any(fn(target, *arg) is not None for fn in matches):\n     raise TypeError(\"Return value not allowed\")\n elif len(matches) \u003d\u003d 1:\n   return matches[0](target, *arg)\n elif len(matches) \u003d\u003d 0:\n   raise ValueError(\"No default ...\")\n else:  # len(matches) \u003e 1\n   raise ValueError(\"Multiple found ...\")","commit_id":"f80219d04ba9e2418423e13303c191285fc13bf2"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"4f20f5c8407917d888bd962fa6c1a799edc9f96c","unresolved":false,"context_lines":[{"line_number":929,"context_line":"            if retval is NONE:"},{"line_number":930,"context_line":"                raise ValueError("},{"line_number":931,"context_line":"                    \"No default function found for driver: %r\" %"},{"line_number":932,"context_line":"                    (\"%s+%s\" % (dbname, driver)))"},{"line_number":933,"context_line":"            else:"},{"line_number":934,"context_line":"                return retval"},{"line_number":935,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_848879c7","line":932,"in_reply_to":"baada198_6127d763","updated":"2014-07-25 02:46:04.000000000","message":"I was going for a minimal number of fn calls.  the way I have it, there\u0027s the call to _matches(), and that\u0027s it, no list() created, no len(), no any().   At the moment this whole system isn\u0027t targeted at performance critical things though.\n\nI\u0027d rather just make two separate _matches() calls.  that way it will be simple to read and just have one conditional and that\u0027ll be it.","commit_id":"f80219d04ba9e2418423e13303c191285fc13bf2"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"9db58d38b395d2da4c57d89b84da414e193cd6f8","unresolved":false,"context_lines":[{"line_number":929,"context_line":"            if retval is NONE:"},{"line_number":930,"context_line":"                raise ValueError("},{"line_number":931,"context_line":"                    \"No default function found for driver: %r\" %"},{"line_number":932,"context_line":"                    (\"%s+%s\" % (dbname, driver)))"},{"line_number":933,"context_line":"            else:"},{"line_number":934,"context_line":"                return retval"},{"line_number":935,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_f78e4526","line":932,"in_reply_to":"baada198_848879c7","updated":"2014-07-25 03:37:53.000000000","message":"Yep.  Take my review as \"I had to think a bit to work out what the intended control flow was, and whether it was correct\" - and I realised you always(*) iterated over the full results of _match anyway so was using that as an angle to making it simpler.  Anything else you could do to make _dispatch_on clearer for the slow people like me would be appreciated :)\n\n(*) except for the first test run after someone has introduced a coding error.","commit_id":"f80219d04ba9e2418423e13303c191285fc13bf2"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"7a92549ccd1723db5621693cbeb76d44eff76cd3","unresolved":false,"context_lines":[{"line_number":784,"context_line":""},{"line_number":785,"context_line":"class DialectFunctionDispatcher(object):"},{"line_number":786,"context_line":"    @classmethod"},{"line_number":787,"context_line":"    def dispatch_for_dialect(cls, expr, multiple\u003dFalse, target_argument\u003dNone):"},{"line_number":788,"context_line":"        \"\"\"Provide dialect-specific functionality broken into"},{"line_number":789,"context_line":"        distinct functions."},{"line_number":790,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_03ebdf12","line":787,"updated":"2014-07-30 08:50:05.000000000","message":"Could you please document this new \u0027target_argument\u0027 parameter?\n\nI\u0027m not exactly sure why we might need it (as we could dispatch on the first argument), but maybe it\u0027ll become clear to me when you add docs :P","commit_id":"94708bde2ea71274506ea2f61ec2658eb211f1a0"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"0e0d7e76dd245d030328e083648e3ce7855cc943","unresolved":false,"context_lines":[{"line_number":784,"context_line":""},{"line_number":785,"context_line":"class DialectFunctionDispatcher(object):"},{"line_number":786,"context_line":"    @classmethod"},{"line_number":787,"context_line":"    def dispatch_for_dialect(cls, expr, multiple\u003dFalse, target_argument\u003dNone):"},{"line_number":788,"context_line":"        \"\"\"Provide dialect-specific functionality broken into"},{"line_number":789,"context_line":"        distinct functions."},{"line_number":790,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_a03777ae","line":787,"in_reply_to":"baada198_03ebdf12","updated":"2014-07-30 16:25:55.000000000","message":"dang was hoping i could slip that in :).\n\nI was going to use it on utils.get_connect_string() (which, do we even need this function?)  .  The tests in test_utils call it as: utils.get_connect_string(**self.full_credentials) hence we need named.\n\ncan we just change the signature of functions like that to receive a positional arg for sure?   then we can take target_argument out.","commit_id":"94708bde2ea71274506ea2f61ec2658eb211f1a0"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"018613cca811286002a0f39ba88111ea3fa252e7","unresolved":false,"context_lines":[{"line_number":784,"context_line":""},{"line_number":785,"context_line":"class DialectFunctionDispatcher(object):"},{"line_number":786,"context_line":"    @classmethod"},{"line_number":787,"context_line":"    def dispatch_for_dialect(cls, expr, multiple\u003dFalse, target_argument\u003dNone):"},{"line_number":788,"context_line":"        \"\"\"Provide dialect-specific functionality broken into"},{"line_number":789,"context_line":"        distinct functions."},{"line_number":790,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_035642ce","line":787,"in_reply_to":"baada198_a03777ae","updated":"2014-07-31 15:44:52.000000000","message":"\u003e\u003e\u003ecan we just change the signature of functions like that to receive a positional arg for sure? then we can take target_argument out.\n\n+1 on that!","commit_id":"94708bde2ea71274506ea2f61ec2658eb211f1a0"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9547a089e9b6305efe849dabf785d509ef6c8a5d","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import collections"},{"line_number":20,"context_line":"import logging"},{"line_number":21,"context_line":"import re"},{"line_number":22,"context_line":"import six"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"import sqlalchemy"},{"line_number":25,"context_line":"from sqlalchemy import Boolean"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_9e8f7d77","line":22,"updated":"2014-08-12 18:54:50.000000000","message":"nit: six is a 3rd party lib and so belongs right above:\n\n import sqlalchemy","commit_id":"1984fc208eb7f3483120b844bcf51200a0df2c5c"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"4c429eec13e29084666cfb4a7a2994b1d0be116c","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import collections"},{"line_number":20,"context_line":"import logging"},{"line_number":21,"context_line":"import re"},{"line_number":22,"context_line":"import six"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"import sqlalchemy"},{"line_number":25,"context_line":"from sqlalchemy import Boolean"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_0c4fc78d","line":22,"in_reply_to":"baada198_9e8f7d77","updated":"2014-08-12 20:01:01.000000000","message":"hm funny the flakers didn\u0027t report that, OK","commit_id":"1984fc208eb7f3483120b844bcf51200a0df2c5c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9547a089e9b6305efe849dabf785d509ef6c8a5d","unresolved":false,"context_lines":[{"line_number":910,"context_line":"        to a sub-function."},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"        \"\"\""},{"line_number":913,"context_line":""},{"line_number":914,"context_line":"        dbname, driver \u003d self._db_plus_driver_reg.match(drivername).group(1, 2)"},{"line_number":915,"context_line":""},{"line_number":916,"context_line":"        def go(*arg, **kw):"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_defc95b9","line":913,"updated":"2014-08-12 18:54:50.000000000","message":"nit: blank line not needed","commit_id":"1984fc208eb7f3483120b844bcf51200a0df2c5c"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"4c429eec13e29084666cfb4a7a2994b1d0be116c","unresolved":false,"context_lines":[{"line_number":910,"context_line":"        to a sub-function."},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"        \"\"\""},{"line_number":913,"context_line":""},{"line_number":914,"context_line":"        dbname, driver \u003d self._db_plus_driver_reg.match(drivername).group(1, 2)"},{"line_number":915,"context_line":""},{"line_number":916,"context_line":"        def go(*arg, **kw):"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_4c49bf8c","line":913,"in_reply_to":"baada198_defc95b9","updated":"2014-08-12 20:01:01.000000000","message":"Done","commit_id":"1984fc208eb7f3483120b844bcf51200a0df2c5c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9547a089e9b6305efe849dabf785d509ef6c8a5d","unresolved":false,"context_lines":[{"line_number":976,"context_line":"                    (driver, \u0027*\u0027) if driver !\u003d \u0027*\u0027 else (\u0027*\u0027,)"},{"line_number":977,"context_line":"                )"},{"line_number":978,"context_line":"            )"},{"line_number":979,"context_line":"            for fn in fns"},{"line_number":980,"context_line":"        )"},{"line_number":981,"context_line":""},{"line_number":982,"context_line":"    def _dispatch_on_db_driver(self, dbname, driver, arg, kw):"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_de981579","line":979,"updated":"2014-08-12 18:54:50.000000000","message":"The above is kinda mind-bending. Any chance you could add a code comment or two in there to explain what is going on?\n\nAlternately, if there isn\u0027t some performance-related reason for the above, you might want to rewrite the code into something a little less magical?","commit_id":"1984fc208eb7f3483120b844bcf51200a0df2c5c"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"4c429eec13e29084666cfb4a7a2994b1d0be116c","unresolved":false,"context_lines":[{"line_number":976,"context_line":"                    (driver, \u0027*\u0027) if driver !\u003d \u0027*\u0027 else (\u0027*\u0027,)"},{"line_number":977,"context_line":"                )"},{"line_number":978,"context_line":"            )"},{"line_number":979,"context_line":"            for fn in fns"},{"line_number":980,"context_line":"        )"},{"line_number":981,"context_line":""},{"line_number":982,"context_line":"    def _dispatch_on_db_driver(self, dbname, driver, arg, kw):"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_0c78a7c0","line":979,"in_reply_to":"baada198_de981579","updated":"2014-08-12 20:01:01.000000000","message":"heehee :).  yes let me just replace it with straight yields.  making it work the way you see was kind of a game i played for too long :)","commit_id":"1984fc208eb7f3483120b844bcf51200a0df2c5c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d986cf3c81632a0518de0c6ead3f0f621fed23f8","unresolved":false,"context_lines":[{"line_number":973,"context_line":"            subdict \u003d self.reg[db]"},{"line_number":974,"context_line":"            for drv in drivers:"},{"line_number":975,"context_line":"                for fn in subdict[drv]:"},{"line_number":976,"context_line":"                    yield fn"},{"line_number":977,"context_line":""},{"line_number":978,"context_line":"    def _dispatch_on_db_driver(self, dbname, driver, arg, kw):"},{"line_number":979,"context_line":"        for fn in self._matches(dbname, driver):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7ac7a964_030db890","line":976,"updated":"2014-08-14 14:16:17.000000000","message":"*much* clearer. Thanks, Mike! :)","commit_id":"ee176a82a4ca21a8a02478d219914f95028b798d"}],"tests/sqlalchemy/test_utils.py":[{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"6246287c4fb3b4263a06dd15fe3d1e5bfe5ec98b","unresolved":false,"context_lines":[{"line_number":860,"context_line":"        target \u003d mock.Mock()"},{"line_number":861,"context_line":""},{"line_number":862,"context_line":"        dispatcher \u003d utils.dispatch_for_dialect(\"*\")(target.default)"},{"line_number":863,"context_line":"        dispatcher \u003d dispatcher.dispatch_for(\"sqlite\")(target.sqlite)"},{"line_number":864,"context_line":"        dispatcher.dispatch_for(\"mysql+mysqldb\")(target.mysql_mysqldb)"},{"line_number":865,"context_line":"        dispatcher \u003d dispatcher.dispatch_for(\"postgresql\")(target.postgresql)"},{"line_number":866,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_2f73c116","line":863,"updated":"2014-07-28 12:31:07.000000000","message":"Why do you mention a driver for mysql and don\u0027t do it for postgres?","commit_id":"2b4e282c0f37965e7b1e6deed1b856a9ff6d45cf"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"65cd1cc520de16e2823385738bb67edfde38a19b","unresolved":false,"context_lines":[{"line_number":860,"context_line":"        target \u003d mock.Mock()"},{"line_number":861,"context_line":""},{"line_number":862,"context_line":"        dispatcher \u003d utils.dispatch_for_dialect(\"*\")(target.default)"},{"line_number":863,"context_line":"        dispatcher \u003d dispatcher.dispatch_for(\"sqlite\")(target.sqlite)"},{"line_number":864,"context_line":"        dispatcher.dispatch_for(\"mysql+mysqldb\")(target.mysql_mysqldb)"},{"line_number":865,"context_line":"        dispatcher \u003d dispatcher.dispatch_for(\"postgresql\")(target.postgresql)"},{"line_number":866,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_864d9274","line":863,"in_reply_to":"baada198_2f73c116","updated":"2014-07-28 14:01:18.000000000","message":"this test has nothing to do with the behavior of database drivers.  it is testing the matching of strings present in a SQLAlchemy URL object which in practice represent a particular database/drivername combination.","commit_id":"2b4e282c0f37965e7b1e6deed1b856a9ff6d45cf"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"7354146b97c982ebf4ee4eca4c72879ff0e0c045","unresolved":false,"context_lines":[{"line_number":861,"context_line":""},{"line_number":862,"context_line":"        dispatcher \u003d utils.dispatch_for_dialect(\"*\")(target.default)"},{"line_number":863,"context_line":"        dispatcher \u003d dispatcher.dispatch_for(\"sqlite\")(target.sqlite)"},{"line_number":864,"context_line":"        dispatcher.dispatch_for(\"mysql+mysqldb\")(target.mysql_mysqldb)"},{"line_number":865,"context_line":"        dispatcher \u003d dispatcher.dispatch_for(\"postgresql\")(target.postgresql)"},{"line_number":866,"context_line":""},{"line_number":867,"context_line":"        return dispatcher, target"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_c07e921a","line":864,"updated":"2014-07-28 14:02:07.000000000","message":"Not sure why we save previous return values and ignore this one.  But I guess my question really is, do we really need them? Can\u0027t we just return the result of utils.dispatch_for_dialect(...)?\n\nOr maybe it\u0027s the way you wanted to test that return value is correct :)","commit_id":"2b4e282c0f37965e7b1e6deed1b856a9ff6d45cf"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"5a93481fc5ccd372866bbda6289a85a53485aaca","unresolved":false,"context_lines":[{"line_number":861,"context_line":""},{"line_number":862,"context_line":"        dispatcher \u003d utils.dispatch_for_dialect(\"*\")(target.default)"},{"line_number":863,"context_line":"        dispatcher \u003d dispatcher.dispatch_for(\"sqlite\")(target.sqlite)"},{"line_number":864,"context_line":"        dispatcher.dispatch_for(\"mysql+mysqldb\")(target.mysql_mysqldb)"},{"line_number":865,"context_line":"        dispatcher \u003d dispatcher.dispatch_for(\"postgresql\")(target.postgresql)"},{"line_number":866,"context_line":""},{"line_number":867,"context_line":"        return dispatcher, target"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_06f982c7","line":864,"in_reply_to":"baada198_c07e921a","updated":"2014-07-28 14:03:48.000000000","message":"I wanted to test that whether we use the return value or not, it\u0027s the same dispatcher :)\n\nsuggestions on making this clearer are welcome.","commit_id":"2b4e282c0f37965e7b1e6deed1b856a9ff6d45cf"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"6246287c4fb3b4263a06dd15fe3d1e5bfe5ec98b","unresolved":false,"context_lines":[{"line_number":898,"context_line":"        dispatcher(\"sqlite://\", 1)"},{"line_number":899,"context_line":"        dispatcher(\"postgresql+psycopg2://u:p@h/t\", 2)"},{"line_number":900,"context_line":"        dispatcher(\"mysql://u:p@h/t\", 3)"},{"line_number":901,"context_line":"        dispatcher(\"mysql+mysqlconnector://u:p@h/t\", 4)"},{"line_number":902,"context_line":""},{"line_number":903,"context_line":"        self.assertEqual("},{"line_number":904,"context_line":"            ["}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_f239acd8","line":901,"updated":"2014-07-28 12:31:07.000000000","message":"You used different driver than above. What is the game with drivers? if I just missed something from the docstrings, just link me to a line with an answer.","commit_id":"2b4e282c0f37965e7b1e6deed1b856a9ff6d45cf"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"65cd1cc520de16e2823385738bb67edfde38a19b","unresolved":false,"context_lines":[{"line_number":898,"context_line":"        dispatcher(\"sqlite://\", 1)"},{"line_number":899,"context_line":"        dispatcher(\"postgresql+psycopg2://u:p@h/t\", 2)"},{"line_number":900,"context_line":"        dispatcher(\"mysql://u:p@h/t\", 3)"},{"line_number":901,"context_line":"        dispatcher(\"mysql+mysqlconnector://u:p@h/t\", 4)"},{"line_number":902,"context_line":""},{"line_number":903,"context_line":"        self.assertEqual("},{"line_number":904,"context_line":"            ["}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_66879e5b","line":901,"in_reply_to":"baada198_f239acd8","updated":"2014-07-28 14:01:18.000000000","message":"this is a unit test testing that the dispatcher system can send messages correctly based on any \"A+B://\" or \"A://\" string.  The specific contents of A and B are completely arbitrary.   The system is loading up the dialect class in the case of an \"A://\", but other than that we could use any random string for the A+B in these tests.  \n\nWould you prefer I create a series of fully mock database dialects for this test?  that would make it clear that this has nothing to do with actual database dialects.","commit_id":"2b4e282c0f37965e7b1e6deed1b856a9ff6d45cf"}]}
