diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2020-08-21 14:44:04 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2020-08-25 20:10:16 -0400 |
commit | 3668b3a30c4b9a9f4af13457f43bfc34c28cf448 (patch) | |
tree | 6be6b991de7f3eb06181fd045b003e1b6d7e250e /lib/sqlalchemy/testing/provision.py | |
parent | 9b6b867fe59d74c23edca782dcbba9af99b62817 (diff) | |
download | sqlalchemy-3668b3a30c4b9a9f4af13457f43bfc34c28cf448.tar.gz |
make URL immutable
it's not really correct that URL is mutable and doesn't do
any argument checking. propose replacing it with an immutable
named tuple with rich copy-and-mutate methods.
At the moment this makes a hard change to the CreateEnginePlugin
docs that previously recommended url.query.pop(). I can't find
any plugins on github other than my own that are using this
feature, so see if we can just make a hard change on this one.
Fixes: #5526
Change-Id: I28a0a471d80792fa8c28f4fa573d6352966a4a79
Diffstat (limited to 'lib/sqlalchemy/testing/provision.py')
-rw-r--r-- | lib/sqlalchemy/testing/provision.py | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/lib/sqlalchemy/testing/provision.py b/lib/sqlalchemy/testing/provision.py index 094d1ea94..0edaae490 100644 --- a/lib/sqlalchemy/testing/provision.py +++ b/lib/sqlalchemy/testing/provision.py @@ -1,5 +1,4 @@ import collections -import copy import logging from . import config @@ -7,12 +6,14 @@ from . import engines from .. import exc from ..engine import url as sa_url from ..util import compat -from ..util import parse_qsl log = logging.getLogger(__name__) FOLLOWER_IDENT = None +if compat.TYPE_CHECKING: + from ..engine import URL + class register(object): def __init__(self): @@ -140,7 +141,7 @@ def _generate_driver_urls(url, extra_drivers): main_driver = url.get_driver_name() extra_drivers.discard(main_driver) - url = generate_driver_url(url, main_driver, {}) + url = generate_driver_url(url, main_driver, "") yield str(url) for drv in list(extra_drivers): @@ -149,12 +150,11 @@ def _generate_driver_urls(url, extra_drivers): driver_only, query_str = drv.split("?", 1) - query = parse_qsl(query_str) else: driver_only = drv - query = {} + query_str = None - new_url = generate_driver_url(url, driver_only, query) + new_url = generate_driver_url(url, driver_only, query_str) if new_url: extra_drivers.remove(drv) @@ -162,12 +162,13 @@ def _generate_driver_urls(url, extra_drivers): @register.init -def generate_driver_url(url, driver, query): +def generate_driver_url(url, driver, query_str): + # type: (URL, str, str) -> URL backend = url.get_backend_name() - new_url = copy.copy(url) - new_url.query = dict(new_url.query) - new_url.drivername = "%s+%s" % (backend, driver) - new_url.query.update(query) + + new_url = url.set(drivername="%s+%s" % (backend, driver),) + new_url = new_url.update_query_string(query_str) + try: new_url.get_dialect() except exc.NoSuchModuleError: @@ -236,8 +237,7 @@ def follower_url_from_main(url, ident): database name """ url = sa_url.make_url(url) - url.database = ident - return url + return url.set(database=ident) @register.init |