From: Mike Bayer Date: Fri, 4 Aug 2017 19:43:16 +0000 (-0400) Subject: Allow multiple versions of single backend X-Git-Tag: rel_1_1_14~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b63d815c21847e63014871ba6dd22bd5e7a26e34;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Allow multiple versions of single backend Improve screen output to illustrate which server version is running for a particular database config, and additionally allow full overriding for the backend-specific targets in tox.ini via environment variables, so that CI can inject multiple server urls for a particular database such as MySQL/MariaDB. Change-Id: Ibf443bb9fb82e4563efd1bb66058fa9989aa2fda (cherry picked from commit de1f8f8345ecd6af0ec1177703465e9471cfe862) --- diff --git a/lib/sqlalchemy/testing/config.py b/lib/sqlalchemy/testing/config.py index 64be3ac740..73d8a7de88 100644 --- a/lib/sqlalchemy/testing/config.py +++ b/lib/sqlalchemy/testing/config.py @@ -24,6 +24,7 @@ except ImportError: class Config(object): def __init__(self, db, db_opts, options, file_config): + self._set_name(db) self.db = db self.db_opts = db_opts self.options = options @@ -32,7 +33,14 @@ class Config(object): self.test_schema_2 = "test_schema_2" _stack = collections.deque() - _configs = {} + _configs = set() + + def _set_name(self, db): + if db.dialect.server_version_info: + svi = ".".join(str(tok) for tok in db.dialect.server_version_info) + self.name = "%s+%s_[%s]" % (db.name, db.driver, svi) + else: + self.name = "%s+%s" % (db.name, db.driver) @classmethod def register(cls, db, db_opts, options, file_config): @@ -42,10 +50,7 @@ class Config(object): gets set as the "_current". """ cfg = Config(db, db_opts, options, file_config) - - cls._configs[cfg.db.name] = cfg - cls._configs[(cfg.db.name, cfg.db.dialect)] = cfg - cls._configs[cfg.db] = cfg + cls._configs.add(cfg) return cfg @classmethod @@ -80,8 +85,7 @@ class Config(object): @classmethod def all_configs(cls): - for cfg in set(cls._configs.values()): - yield cfg + return cls._configs @classmethod def all_dbs(cls): diff --git a/lib/sqlalchemy/testing/plugin/plugin_base.py b/lib/sqlalchemy/testing/plugin/plugin_base.py index 18f5e03574..277e646007 100644 --- a/lib/sqlalchemy/testing/plugin/plugin_base.py +++ b/lib/sqlalchemy/testing/plugin/plugin_base.py @@ -425,12 +425,12 @@ def want_method(cls, fn): def generate_sub_tests(cls, module): if getattr(cls, '__backend__', False): for cfg in _possible_configs_for_cls(cls): - name = "%s_%s_%s" % (cls.__name__, cfg.db.name, cfg.db.driver) + name = "%s_%s" % (cls.__name__, cfg.name) subcls = type( name, (cls, ), { - "__only_on__": ("%s+%s" % (cfg.db.name, cfg.db.driver)), + "__only_on_config__": cfg } ) setattr(module, name, subcls) @@ -505,6 +505,9 @@ def _possible_configs_for_cls(cls, reasons=None): if not spec(config_obj): all_configs.remove(config_obj) + if getattr(cls, '__only_on_config__', None): + all_configs.intersection_update([cls.__only_on_config__]) + if hasattr(cls, '__requires__'): requirements = config.requirements for config_obj in list(all_configs): diff --git a/lib/sqlalchemy/testing/provision.py b/lib/sqlalchemy/testing/provision.py index 125479d315..52428f5a6f 100644 --- a/lib/sqlalchemy/testing/provision.py +++ b/lib/sqlalchemy/testing/provision.py @@ -60,6 +60,7 @@ def setup_config(db_url, options, file_config, follower_ident): eng = engines.testing_engine(db_url, db_opts) _post_configure_engine(db_url, eng, follower_ident) eng.connect().close() + cfg = config.Config.register(eng, db_opts, options, file_config) if follower_ident: _configure_follower(cfg, follower_ident)