]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Allow multiple versions of single backend
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 4 Aug 2017 19:43:16 +0000 (15:43 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 24 Aug 2017 13:33:42 +0000 (09:33 -0400)
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)

lib/sqlalchemy/testing/config.py
lib/sqlalchemy/testing/plugin/plugin_base.py
lib/sqlalchemy/testing/provision.py

index 64be3ac740082f9f0aaca1db116bd38c11b7c900..73d8a7de88823da18c7147acb199639ffe4a682a 100644 (file)
@@ -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):
index 18f5e035743938b8b667a979ebcf3b7b1ca42469..277e6460077aec3feb2db281072b6a5773aa7a67 100644 (file)
@@ -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):
index 125479d315931a83a026d8ebd1d4a0ded6d8dfa9..52428f5a6f8518576c80ff66dbaf9b663a7264ed 100644 (file)
@@ -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)