Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-SQLAlchemy-Utils for 
openSUSE:Factory checked in at 2021-06-19 23:03:05
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-SQLAlchemy-Utils (Old)
 and      /work/SRC/openSUSE:Factory/.python-SQLAlchemy-Utils.new.2625 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-SQLAlchemy-Utils"

Sat Jun 19 23:03:05 2021 rev:30 rq:900657 version:0.37.6

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-SQLAlchemy-Utils/python-SQLAlchemy-Utils.changes
  2021-05-15 23:17:29.644425051 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-SQLAlchemy-Utils.new.2625/python-SQLAlchemy-Utils.changes
        2021-06-19 23:03:36.139723309 +0200
@@ -1,0 +2,10 @@
+Thu Jun 17 20:49:07 UTC 2021 - Dirk M??ller <dmuel...@suse.com>
+
+- update to 0.37.6:
+  * Added `cache_ok=True` for TSVectorType
+  * Fixed instant_defaults_listener to respect constructor supplied kwargs
+  * Fixed incorrect Ltree.lca behaviour
+  * Added `cache_ok=True` for all custom types
+  * Added CockroachDB support for UUIDType
+
+-------------------------------------------------------------------

Old:
----
  SQLAlchemy-Utils-0.37.2.tar.gz

New:
----
  SQLAlchemy-Utils-0.37.6.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-SQLAlchemy-Utils.spec ++++++
--- /var/tmp/diff_new_pack.rffyoM/_old  2021-06-19 23:03:36.607724031 +0200
+++ /var/tmp/diff_new_pack.rffyoM/_new  2021-06-19 23:03:36.611724037 +0200
@@ -19,7 +19,7 @@
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 %define skip_python2 1
 Name:           python-SQLAlchemy-Utils
-Version:        0.37.2
+Version:        0.37.6
 Release:        0
 Summary:        Various utility functions for SQLAlchemy
 License:        BSD-3-Clause

++++++ SQLAlchemy-Utils-0.37.2.tar.gz -> SQLAlchemy-Utils-0.37.6.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.37.2/CHANGES.rst 
new/SQLAlchemy-Utils-0.37.6/CHANGES.rst
--- old/SQLAlchemy-Utils-0.37.2/CHANGES.rst     2021-05-05 08:03:52.000000000 
+0200
+++ new/SQLAlchemy-Utils-0.37.6/CHANGES.rst     2021-06-02 17:21:28.000000000 
+0200
@@ -4,6 +4,31 @@
 Here you can see the full list of changes between each SQLAlchemy-Utils 
release.
 
 
+0.37.6 (2021-06-02)
+^^^^^^^^^^^^^^^^^^^
+
+- Added `cache_ok=True` for TSVectorType
+
+
+0.37.5 (2021-05-31)
+^^^^^^^^^^^^^^^^^^^
+
+- Fixed instant_defaults_listener to respect constructor supplied kwargs 
(#516, pull request courtesy of soundstripe)
+
+
+0.37.4 (2021-05-21)
+^^^^^^^^^^^^^^^^^^^
+
+- Fixed incorrect Ltree.lca behaviour (#468, pull request courtesy of slymit)
+
+
+0.37.3 (2021-05-16)
+^^^^^^^^^^^^^^^^^^^
+
+- Added `cache_ok=True` for all custom types
+- Added CockroachDB support for UUIDType (#526, pull request courtesy of 
chrishemmings)
+
+
 0.37.2 (2021-05-05)
 ^^^^^^^^^^^^^^^^^^^
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.37.2/PKG-INFO 
new/SQLAlchemy-Utils-0.37.6/PKG-INFO
--- old/SQLAlchemy-Utils-0.37.2/PKG-INFO        2021-05-05 08:05:19.000000000 
+0200
+++ new/SQLAlchemy-Utils-0.37.6/PKG-INFO        2021-06-02 17:25:03.000000000 
+0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: SQLAlchemy-Utils
-Version: 0.37.2
+Version: 0.37.6
 Summary: Various utility functions for SQLAlchemy.
 Home-page: https://github.com/kvesteri/sqlalchemy-utils
 Author: Konsta Vesterinen, Ryan Leckey, Janne Vanhala, Vesa Uimonen
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/SQLAlchemy_Utils.egg-info/PKG-INFO 
new/SQLAlchemy-Utils-0.37.6/SQLAlchemy_Utils.egg-info/PKG-INFO
--- old/SQLAlchemy-Utils-0.37.2/SQLAlchemy_Utils.egg-info/PKG-INFO      
2021-05-05 08:05:18.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/SQLAlchemy_Utils.egg-info/PKG-INFO      
2021-06-02 17:25:03.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: SQLAlchemy-Utils
-Version: 0.37.2
+Version: 0.37.6
 Summary: Various utility functions for SQLAlchemy.
 Home-page: https://github.com/kvesteri/sqlalchemy-utils
 Author: Konsta Vesterinen, Ryan Leckey, Janne Vanhala, Vesa Uimonen
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/__init__.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/__init__.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/__init__.py    2021-05-05 
08:04:07.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/__init__.py    2021-06-02 
17:21:47.000000000 +0200
@@ -102,4 +102,4 @@
     refresh_materialized_view
 )
 
-__version__ = '0.37.2'
+__version__ = '0.37.6'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/listeners.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/listeners.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/listeners.py   2021-04-12 
14:12:57.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/listeners.py   2021-05-31 
14:42:25.000000000 +0200
@@ -22,17 +22,24 @@
 
 
 def instant_defaults_listener(target, args, kwargs):
+    # insertion order of kwargs matters
+    # copy and clear so that we can add back later at the end of the dict
+    original = kwargs.copy()
+    kwargs.clear()
+
     for key, column in sa.inspect(target.__class__).columns.items():
         if (
             hasattr(column, 'default') and
-            column.default is not None and
-            key not in kwargs
+            column.default is not None
         ):
             if callable(column.default.arg):
                 kwargs[key] = column.default.arg(target)
             else:
                 kwargs[key] = column.default.arg
 
+    # supersede w/initial in case target uses setters overriding defaults
+    kwargs.update(original)
+
 
 def force_auto_coercion(mapper=None):
     """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/primitives/ltree.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/primitives/ltree.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/primitives/ltree.py    
2019-02-02 12:03:24.000000000 +0100
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/primitives/ltree.py    
2021-05-21 12:24:40.000000000 +0200
@@ -173,7 +173,7 @@
         parts = self.path.split('.')
         for index, element in enumerate(parts):
             if any((
-                other[index] != element or len(other) <= index + 1
+                other[index] != element or len(other) <= index + 1 or 
len(parts) == index + 1
                 for other in other_parts
             )):
                 if index == 0:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/arrow.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/arrow.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/arrow.py 2021-03-21 
17:35:59.000000000 +0100
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/arrow.py 2021-05-16 
10:51:24.000000000 +0200
@@ -55,5 +55,8 @@
                 "'arrow' package is required to use 'ArrowType'"
             )
 
-        super(ArrowType, self).__init__(datetime_processor=ArrowDateTime,
-                                        *args, **kwargs)
+        super(ArrowType, self).__init__(
+            datetime_processor=ArrowDateTime,
+            *args,
+            **kwargs
+        )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/bit.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/bit.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/bit.py   2016-04-25 
16:20:06.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/bit.py   2021-05-16 
10:51:24.000000000 +0200
@@ -8,6 +8,8 @@
     """
     impl = sa.types.BINARY
 
+    cache_ok = True
+
     def __init__(self, length=1, **kwargs):
         self.length = length
         sa.types.TypeDecorator.__init__(self, **kwargs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/choice.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/choice.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/choice.py        
2019-11-01 11:18:12.000000000 +0100
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/choice.py        
2021-05-16 10:51:24.000000000 +0200
@@ -1,14 +1,11 @@
+from enum import Enum
+
 import six
 from sqlalchemy import types
 
 from ..exceptions import ImproperlyConfigured
 from .scalar_coercible import ScalarCoercible
 
-try:
-    from enum import Enum
-except ImportError:
-    Enum = None
-
 
 class Choice(object):
     def __init__(self, code, value):
@@ -39,7 +36,7 @@
         )
 
 
-class ChoiceType(types.TypeDecorator, ScalarCoercible):
+class ChoiceType(ScalarCoercible, types.TypeDecorator):
     """
     ChoiceType offers way of having fixed set of choices for given column. It
     could work with a list of tuple (a collection of key-value pairs), or
@@ -147,7 +144,7 @@
     impl = types.Unicode(255)
 
     def __init__(self, choices, impl=None):
-        self.choices = choices
+        self.choices = tuple(choices)
 
         if (
             Enum is not None and
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/color.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/color.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/color.py 2016-04-25 
16:20:06.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/color.py 2021-05-16 
10:51:24.000000000 +0200
@@ -12,7 +12,7 @@
     python_colour_type = None
 
 
-class ColorType(types.TypeDecorator, ScalarCoercible):
+class ColorType(ScalarCoercible, types.TypeDecorator):
     """
     ColorType provides a way for saving Color (from colour_ package) objects
     into database. ColorType saves Color objects as strings on the way in and
@@ -49,7 +49,7 @@
 
     .. _colour: https://github.com/vaab/colour
     """
-    STORE_FORMAT = u'hex'
+    STORE_FORMAT = 'hex'
     impl = types.Unicode(20)
     python_type = python_colour_type
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/country.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/country.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/country.py       
2016-04-25 16:20:06.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/country.py       
2021-05-16 10:51:24.000000000 +0200
@@ -5,7 +5,7 @@
 from .scalar_coercible import ScalarCoercible
 
 
-class CountryType(types.TypeDecorator, ScalarCoercible):
+class CountryType(ScalarCoercible, types.TypeDecorator):
     """
     Changes :class:`.Country` objects to a string representation on the way in
     and changes them back to :class:`.Country objects on the way out.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/currency.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/currency.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/currency.py      
2016-04-25 16:20:06.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/currency.py      
2021-05-16 10:51:24.000000000 +0200
@@ -6,7 +6,7 @@
 from .scalar_coercible import ScalarCoercible
 
 
-class CurrencyType(types.TypeDecorator, ScalarCoercible):
+class CurrencyType(ScalarCoercible, types.TypeDecorator):
     """
     Changes :class:`.Currency` objects to a string representation on the way in
     and changes them back to :class:`.Currency` objects on the way out.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/email.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/email.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/email.py 2016-10-20 
08:55:26.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/email.py 2021-05-16 
10:51:24.000000000 +0200
@@ -33,6 +33,7 @@
     """
     impl = sa.Unicode
     comparator_factory = CaseInsensitiveComparator
+    cache_ok = True
 
     def __init__(self, length=255, *args, **kwargs):
         super(EmailType, self).__init__(length=length, *args, **kwargs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/encrypted/encrypted_type.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/encrypted/encrypted_type.py
--- 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/encrypted/encrypted_type.py  
    2020-09-20 18:38:00.000000000 +0200
+++ 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/encrypted/encrypted_type.py  
    2021-05-16 10:51:24.000000000 +0200
@@ -40,7 +40,7 @@
     pass
 
 
-class EncryptionDecryptionBaseEngine(object):
+class EncryptionDecryptionBaseEngine:
     """A base encryption and decryption engine.
 
     This class must be sub-classed in order to create
@@ -347,11 +347,17 @@
                 sa.Unicode, get_key))
 
     """
-
     impl = String
+    cache_ok = True
 
-    def __init__(self, type_in=None, key=None,
-                 engine=None, padding=None, **kwargs):
+    def __init__(
+        self,
+        type_in=None,
+        key=None,
+        engine=None,
+        padding=None,
+        **kwargs
+    ):
         """Initialization."""
         if not cryptography:
             raise ImproperlyConfigured(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/enriched_datetime/arrow_datetime.py
 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/enriched_datetime/arrow_datetime.py
--- 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/enriched_datetime/arrow_datetime.py
      2020-05-03 19:55:01.000000000 +0200
+++ 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/enriched_datetime/arrow_datetime.py
      2021-05-16 10:51:24.000000000 +0200
@@ -1,14 +1,10 @@
+from collections.abc import Iterable
 from datetime import datetime
 
 import six
 
 from ...exceptions import ImproperlyConfigured
 
-try:
-    from collections.abc import Iterable
-except ImportError:  # For python 2.7 support
-    from collections import Iterable
-
 arrow = None
 try:
     import arrow
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/enriched_datetime/enriched_date_type.py
 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/enriched_datetime/enriched_date_type.py
--- 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/enriched_datetime/enriched_date_type.py
  2020-05-03 19:55:01.000000000 +0200
+++ 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/enriched_datetime/enriched_date_type.py
  2021-05-16 10:51:24.000000000 +0200
@@ -27,6 +27,7 @@
         session.commit()
     """
     impl = types.Date
+    cache_ok = True
 
     def __init__(self, date_processor=PendulumDate, *args, **kwargs):
         super(EnrichedDateType, self).__init__(*args, **kwargs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/enriched_datetime/enriched_datetime_type.py
 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/enriched_datetime/enriched_datetime_type.py
--- 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/enriched_datetime/enriched_datetime_type.py
      2020-05-03 19:55:01.000000000 +0200
+++ 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/enriched_datetime/enriched_datetime_type.py
      2021-05-16 10:51:24.000000000 +0200
@@ -28,6 +28,7 @@
         session.commit()
     """
     impl = types.DateTime
+    cache_ok = True
 
     def __init__(self, datetime_processor=PendulumDateTime, *args, **kwargs):
         super(EnrichedDateTimeType, self).__init__(*args, **kwargs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/enriched_datetime/pendulum_datetime.py
 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/enriched_datetime/pendulum_datetime.py
--- 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/enriched_datetime/pendulum_datetime.py
   2020-05-03 19:55:01.000000000 +0200
+++ 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/enriched_datetime/pendulum_datetime.py
   2021-05-16 10:51:24.000000000 +0200
@@ -27,17 +27,22 @@
             elif isinstance(value, six.string_types) and value.isdigit():
                 value = pendulum.from_timestamp(int(value))
             elif isinstance(value, datetime):
-                value = pendulum.datetime(value.year,
-                                          value.month, value.day,
-                                          value.hour, value.minute,
-                                          value.second, value.microsecond)
+                value = pendulum.datetime(
+                    value.year,
+                    value.month,
+                    value.day,
+                    value.hour,
+                    value.minute,
+                    value.second,
+                    value.microsecond
+                )
             else:
                 value = pendulum.parse(value)
         return value
 
     def process_bind_param(self, impl, value, dialect):
         if value:
-            return self._coerce(impl, value).in_tz("UTC")
+            return self._coerce(impl, value).in_tz('UTC')
         return value
 
     def process_result_value(self, impl, value, dialect):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/ip_address.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/ip_address.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/ip_address.py    
2016-04-25 16:20:06.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/ip_address.py    
2021-05-16 10:51:24.000000000 +0200
@@ -1,20 +1,13 @@
+from ipaddress import ip_address
+
 import six
 from sqlalchemy import types
 
 from ..exceptions import ImproperlyConfigured
 from .scalar_coercible import ScalarCoercible
 
-ip_address = None
-try:
-    from ipaddress import ip_address
-except ImportError:
-    try:
-        from ipaddr import IPAddress as ip_address
-    except ImportError:
-        pass
-
 
-class IPAddressType(types.TypeDecorator, ScalarCoercible):
+class IPAddressType(ScalarCoercible, types.TypeDecorator):
     """
     Changes IPAddress objects to a string representation on the way in and
     changes them back to IPAddress objects on the way out.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/json.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/json.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/json.py  2016-04-25 
16:20:06.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/json.py  2021-05-16 
10:51:24.000000000 +0200
@@ -55,6 +55,7 @@
         session.commit()
     """
     impl = sa.UnicodeText
+    cache_ok = True
 
     def __init__(self, *args, **kwargs):
         if json is None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/locale.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/locale.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/locale.py        
2016-04-25 16:20:06.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/locale.py        
2021-05-16 10:51:24.000000000 +0200
@@ -11,7 +11,7 @@
     pass
 
 
-class LocaleType(types.TypeDecorator, ScalarCoercible):
+class LocaleType(ScalarCoercible, types.TypeDecorator):
     """
     LocaleType saves Babel_ Locale objects into database. The Locale objects
     are converted to string on the way in and back to object on the way out.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/password.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/password.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/password.py      
2018-10-14 09:13:47.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/password.py      
2021-05-16 10:51:24.000000000 +0200
@@ -76,7 +76,7 @@
         return not (self == value)
 
 
-class PasswordType(types.TypeDecorator, ScalarCoercible):
+class PasswordType(ScalarCoercible, types.TypeDecorator):
     """
     PasswordType hashes passwords as they come into the database and allows
     verifying them using a Pythonic interface. This Pythonic interface
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/pg_composite.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/pg_composite.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/pg_composite.py  
2020-09-20 18:38:00.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/pg_composite.py  
2021-05-21 12:24:40.000000000 +0200
@@ -58,7 +58,7 @@
     account1.balance = ('USD', 15)
 
     account2 = Account()
-    account2.balance = {'currency': 'USD', 'balance': 15}
+    account2.balance = {'currency': 'USD', 'amount': 15}
 
     session.add(account1)
     session.add(account2)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/phone_number.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/phone_number.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/phone_number.py  
2020-03-18 10:24:41.000000000 +0100
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/phone_number.py  
2021-05-16 10:51:24.000000000 +0200
@@ -140,7 +140,7 @@
         return hash(self.e164)
 
 
-class PhoneNumberType(types.TypeDecorator, ScalarCoercible):
+class PhoneNumberType(ScalarCoercible, types.TypeDecorator):
     """
     Changes PhoneNumber objects to a string representation on the way in and
     changes them back to PhoneNumber objects on the way out. If E164 is used
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/range.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/range.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/range.py 2019-12-08 
18:38:14.000000000 +0100
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/range.py 2021-05-16 
10:51:24.000000000 +0200
@@ -134,10 +134,7 @@
 
 .. _intervals: https://github.com/kvesteri/intervals
 """
-try:
-    from collections.abc import Iterable
-except ImportError:  # For python 2.7 support
-    from collections import Iterable
+from collections.abc import Iterable
 from datetime import timedelta
 
 import six
@@ -265,7 +262,7 @@
     )
 
 
-class RangeType(types.TypeDecorator, ScalarCoercible):
+class RangeType(ScalarCoercible, types.TypeDecorator):
     comparator_factory = RangeComparator
 
     def __init__(self, *args, **kwargs):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/scalar_coercible.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/scalar_coercible.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/scalar_coercible.py      
2018-11-19 08:53:23.000000000 +0100
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/scalar_coercible.py      
2021-05-16 10:51:24.000000000 +0200
@@ -1,4 +1,6 @@
-class ScalarCoercible(object):
+class ScalarCoercible:
+    cache_ok = True
+
     def _coerce(self, value):
         raise NotImplementedError
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/scalar_list.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/scalar_list.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/scalar_list.py   
2016-04-25 16:20:06.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/scalar_list.py   
2021-05-21 12:24:40.000000000 +0200
@@ -50,10 +50,23 @@
         session.commit()
 
 
-    """
+    ScalarListType is always stored as text. To use an array field on 
PostgreSQL
+    database use variant construct::
+
+        from sqlalchemy_utils import ScalarListType
+
+
+        class Player(Base):
+            __tablename__ = 'player'
+            id = sa.Column(sa.Integer, autoincrement=True)
+            points = 
sa.Column(ARRAY(Integer).with_variant(ScalarListType(int), 'sqlite'))
 
+
+    """
     impl = sa.UnicodeText()
 
+    cache_ok = True
+
     def __init__(self, coerce_func=six.text_type, separator=u','):
         self.separator = six.text_type(separator)
         self.coerce_func = coerce_func
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/timezone.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/timezone.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/timezone.py      
2019-06-09 14:59:02.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/timezone.py      
2021-05-16 10:51:24.000000000 +0200
@@ -5,7 +5,7 @@
 from .scalar_coercible import ScalarCoercible
 
 
-class TimezoneType(types.TypeDecorator, ScalarCoercible):
+class TimezoneType(ScalarCoercible, types.TypeDecorator):
     """
     TimezoneType provides a way for saving timezones (from either the pytz or
     the dateutil package) objects into database. TimezoneType saves timezone
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/ts_vector.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/ts_vector.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/ts_vector.py     
2016-04-25 16:20:06.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/ts_vector.py     
2021-06-02 17:21:35.000000000 +0200
@@ -82,6 +82,7 @@
 
     """
     impl = TSVECTOR
+    cache_ok = True
 
     class comparator_factory(TSVECTOR.Comparator):
         def match(self, other, **kwargs):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/url.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/url.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/url.py   2016-04-25 
16:20:06.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/url.py   2021-05-16 
10:51:24.000000000 +0200
@@ -10,7 +10,7 @@
     pass
 
 
-class URLType(types.TypeDecorator, ScalarCoercible):
+class URLType(ScalarCoercible, types.TypeDecorator):
     """
     URLType stores furl_ objects into database.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/uuid.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/uuid.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/uuid.py  2020-05-03 
19:55:01.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/uuid.py  2021-05-16 
10:51:24.000000000 +0200
@@ -8,7 +8,7 @@
 from .scalar_coercible import ScalarCoercible
 
 
-class UUIDType(types.TypeDecorator, ScalarCoercible):
+class UUIDType(ScalarCoercible, types.TypeDecorator):
     """
     Stores a UUID in the database natively when it can and falls back to
     a BINARY(16) or a CHAR(32) when it can't.
@@ -28,7 +28,7 @@
 
     python_type = uuid.UUID
 
-    def __init__(self, binary=True, native=True, **kwargs):
+    def __init__(self, binary=True, native=True):
         """
         :param binary: Whether to use a BINARY(16) or CHAR(32) fallback.
         """
@@ -39,7 +39,7 @@
         return util.generic_repr(self)
 
     def load_dialect_impl(self, dialect):
-        if dialect.name == 'postgresql' and self.native:
+        if self.native and dialect.name in ('postgresql', 'cockroachdb'):
             # Use the native UUID type.
             return dialect.type_descriptor(postgresql.UUID())
 
@@ -70,7 +70,7 @@
         if not isinstance(value, uuid.UUID):
             value = self._coerce(value)
 
-        if self.native and dialect.name in ('postgresql', 'mssql'):
+        if self.native and dialect.name in ('postgresql', 'mssql', 
'cockroachdb'):
             return str(value)
 
         return value.bytes if self.binary else value.hex
@@ -79,7 +79,7 @@
         if value is None:
             return value
 
-        if self.native and dialect.name in ('postgresql', 'mssql'):
+        if self.native and dialect.name in ('postgresql', 'mssql', 
'cockroachdb'):
             if isinstance(value, uuid.UUID):
                 # Some drivers convert PostgreSQL's uuid values to
                 # Python's uuid.UUID objects by themselves
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/weekdays.py 
new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/weekdays.py
--- old/SQLAlchemy-Utils-0.37.2/sqlalchemy_utils/types/weekdays.py      
2016-04-25 16:20:06.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/sqlalchemy_utils/types/weekdays.py      
2021-05-16 10:51:24.000000000 +0200
@@ -51,6 +51,8 @@
 
     impl = BitType(WeekDay.NUM_WEEK_DAYS)
 
+    cache_ok = True
+
     def __init__(self, *args, **kwargs):
         if i18n.babel is None:
             raise ImproperlyConfigured(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/tests/primitives/test_ltree.py 
new/SQLAlchemy-Utils-0.37.6/tests/primitives/test_ltree.py
--- old/SQLAlchemy-Utils-0.37.2/tests/primitives/test_ltree.py  2018-02-18 
15:34:52.000000000 +0100
+++ new/SQLAlchemy-Utils-0.37.6/tests/primitives/test_ltree.py  2021-05-21 
12:24:40.000000000 +0200
@@ -92,6 +92,7 @@
             ('1.2.3', ['1.2.3', '1.2'], '1'),
             ('1.2.3.4.5', ['1.2.3', '1.2.3.4'], '1.2'),
             ('1.2.3.4.5', ['3.4', '1.2.3.4'], None),
+            ('1.2', ['1.2.3', '1.2.4'], '1')
         )
     )
     def test_lca(self, path, others, result):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/tests/test_instant_defaults_listener.py 
new/SQLAlchemy-Utils-0.37.6/tests/test_instant_defaults_listener.py
--- old/SQLAlchemy-Utils-0.37.2/tests/test_instant_defaults_listener.py 
2021-04-12 14:12:57.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/test_instant_defaults_listener.py 
2021-05-31 14:42:25.000000000 +0200
@@ -15,6 +15,16 @@
         id = sa.Column(sa.Integer, primary_key=True)
         name = sa.Column(sa.Unicode(255), default='Some article')
         created_at = sa.Column(sa.DateTime, default=datetime.now)
+        _byline = sa.Column(sa.Unicode(255), default='Default byline')
+
+        @property
+        def byline(self):
+            return self._byline
+
+        @byline.setter
+        def byline(self, value):
+            self._byline = value
+
     return Article
 
 
@@ -26,3 +36,7 @@
     def test_callables_as_defaults(self, Article):
         article = Article()
         assert isinstance(article.created_at, datetime)
+
+    def test_override_default_with_setter_function(self, Article):
+        article = Article(byline='provided byline')
+        assert article.byline == 'provided byline'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.37.2/tests/types/test_arrow.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_arrow.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_arrow.py       2020-04-27 
12:45:14.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_arrow.py       2021-05-16 
10:51:24.000000000 +0200
@@ -25,7 +25,6 @@
 
 @pytest.mark.skipif('arrow.arrow is None')
 class TestArrowDateTimeType(object):
-
     def test_parameter_processing(self, session, Article):
         article = Article(
             created_at=arrow.arrow.get(datetime(2000, 11, 1))
@@ -78,3 +77,8 @@
         item = session.query(Article).one()
         assert item.published_at.datetime == item.published_at_dt
         assert item.published_at.to(timezone) == dt
+
+    def test_compilation(self, Article, session):
+        query = sa.select([Article.created_at])
+        # the type should be cacheable and not throw exception
+        session.execute(query)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.37.2/tests/types/test_choice.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_choice.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_choice.py      2017-11-05 
16:23:59.000000000 +0100
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_choice.py      2021-05-16 
10:51:24.000000000 +0200
@@ -21,10 +21,8 @@
 
 
 class TestChoiceType(object):
-
     @pytest.fixture
     def User(self, Base):
-
         class User(Base):
             TYPES = [
                 ('admin', 'Admin'),
@@ -82,6 +80,11 @@
         with pytest.raises(ImproperlyConfigured):
             ChoiceType([])
 
+    def test_compilation(self, User, session):
+        query = sa.select([User.type])
+        # the type should be cacheable and not throw exception
+        session.execute(query)
+
 
 class TestChoiceTypeWithCustomUnderlyingType(object):
     def test_init_type(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.37.2/tests/types/test_color.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_color.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_color.py       2016-04-25 
16:20:07.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_color.py       2021-05-16 
10:51:24.000000000 +0200
@@ -60,3 +60,8 @@
         clause = Document.bg_color == 'white'
         compiled = str(clause.compile(compile_kwargs={'literal_binds': True}))
         assert compiled == "document.bg_color = 'white'"
+
+    def test_compilation(self, Document, session):
+        query = sa.select([Document.bg_color])
+        # the type should be cacheable and not throw exception
+        session.execute(query)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.37.2/tests/types/test_country.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_country.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_country.py     2016-04-25 
16:20:07.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_country.py     2021-05-16 
10:51:24.000000000 +0200
@@ -43,3 +43,8 @@
         clause = User.country == 'FI'
         compiled = str(clause.compile(compile_kwargs={'literal_binds': True}))
         assert compiled == '"user".country = \'FI\''
+
+    def test_compilation(self, User, session):
+        query = sa.select([User.country])
+        # the type should be cacheable and not throw exception
+        session.execute(query)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.37.2/tests/types/test_currency.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_currency.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_currency.py    2016-04-25 
20:10:56.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_currency.py    2021-05-16 
10:51:24.000000000 +0200
@@ -29,7 +29,6 @@
 
 @pytest.mark.skipif('i18n.babel is None')
 class TestCurrencyType(object):
-
     def test_parameter_processing(self, session, User, set_get_locale):
         user = User(
             currency=Currency('USD')
@@ -53,3 +52,8 @@
         clause = User.currency == 'USD'
         compiled = str(clause.compile(compile_kwargs={'literal_binds': True}))
         assert compiled == '"user".currency = \'USD\''
+
+    def test_compilation(self, User, session):
+        query = sa.select([User.currency])
+        # the type should be cacheable and not throw exception
+        session.execute(query)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/tests/types/test_date_range.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_date_range.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_date_range.py  2016-04-25 
16:20:07.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_date_range.py  2021-05-16 
10:51:24.000000000 +0200
@@ -42,8 +42,7 @@
 
 
 @pytest.mark.skipif('intervals is None')
-class DateRangeTestCase(object):
-
+class DateRangeTestCase:
     def test_nullify_range(self, create_booking):
         booking = create_booking(None)
         assert booking.during is None
@@ -85,8 +84,7 @@
 
 
 @pytest.mark.usefixtures('postgresql_dsn')
-class TestDateRangeOnPostgres(object):
-
+class TestDateRangeOnPostgres(DateRangeTestCase):
     @pytest.mark.parametrize(
         ('date_range', 'length'),
         (
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/tests/types/test_datetime_range.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_datetime_range.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_datetime_range.py      
2016-04-25 16:20:07.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_datetime_range.py      
2021-05-16 10:51:24.000000000 +0200
@@ -42,8 +42,7 @@
 
 
 @pytest.mark.skipif('intervals is None')
-class DateRangeTestCase(object):
-
+class DateTimeRangeTestCase:
     def test_nullify_range(self, create_booking):
         booking = create_booking(None)
         assert booking.during is None
@@ -85,8 +84,7 @@
 
 
 @pytest.mark.usefixtures('postgresql_dsn')
-class TestDateRangeOnPostgres(object):
-
+class TestDateTimeRangeOnPostgres(DateTimeRangeTestCase):
     @pytest.mark.parametrize(
         ('date_range', 'length'),
         (
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.37.2/tests/types/test_email.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_email.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_email.py       2016-07-10 
11:03:30.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_email.py       2021-05-16 
10:51:24.000000000 +0200
@@ -34,3 +34,8 @@
 
     def test_custom_length(self, session, User):
         assert User.short_email.type.impl.length == 70
+
+    def test_compilation(self, User, session):
+        query = sa.select([User.email])
+        # the type should be cacheable and not throw exception
+        session.execute(query)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/tests/types/test_encrypted.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_encrypted.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_encrypted.py   2021-04-12 
14:12:57.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_encrypted.py   2021-05-16 
10:51:24.000000000 +0200
@@ -338,7 +338,6 @@
 
 
 class AesEncryptedTypeTestCase(EncryptedTypeTestCase):
-
     @pytest.fixture
     def encryption_engine(self):
         return AesEngine
@@ -352,28 +351,24 @@
 
 
 class TestAesEncryptedTypeWithPKCS5Padding(AesEncryptedTypeTestCase):
-
     @pytest.fixture
     def padding_mechanism(self):
         return 'pkcs5'
 
 
 class TestAesEncryptedTypeWithOneAndZeroesPadding(AesEncryptedTypeTestCase):
-
     @pytest.fixture
     def padding_mechanism(self):
         return 'oneandzeroes'
 
 
 class TestAesEncryptedTypeWithZeroesPadding(AesEncryptedTypeTestCase):
-
     @pytest.fixture
     def padding_mechanism(self):
         return 'zeroes'
 
 
 class TestAesEncryptedTypeTestcaseWithNaivePadding(AesEncryptedTypeTestCase):
-
     @pytest.fixture
     def padding_mechanism(self):
         return 'naive'
@@ -390,7 +385,6 @@
 
 
 class TestFernetEncryptedTypeTestCase(EncryptedTypeTestCase):
-
     @pytest.fixture
     def encryption_engine(self):
         return FernetEngine
@@ -400,8 +394,7 @@
         return None
 
 
-class TestDatetimeHandler(object):
-
+class TestDatetimeHandler:
     def test_datetime_with_micro_and_timezone(
         self, datetime_with_micro_and_timezone
     ):
@@ -533,7 +526,6 @@
 
 
 class TestAesGcmEncryptedType(EncryptedTypeTestCase):
-
     @pytest.fixture
     def encryption_engine(self):
         return AesGcmEngine
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/tests/types/test_enriched_date_pendulum.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_enriched_date_pendulum.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_enriched_date_pendulum.py      
2020-05-03 20:15:41.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_enriched_date_pendulum.py      
2021-05-16 10:51:24.000000000 +0200
@@ -19,7 +19,8 @@
         birthday = sa.Column(
             enriched_date_type.EnrichedDateType(
                 date_processor=pendulum_date.PendulumDate
-            ))
+            )
+        )
     return User
 
 
@@ -30,7 +31,6 @@
 
 @pytest.mark.skipif('pendulum_date.pendulum is None')
 class TestPendulumDateType(object):
-
     def test_parameter_processing(self, session, User):
         user = User(
             birthday=pendulum_date.pendulum.date(1995, 7, 11)
@@ -66,3 +66,8 @@
         clause = User.birthday > '2015-01-01'
         compiled = str(clause.compile(compile_kwargs={"literal_binds": True}))
         assert compiled == "users.birthday > '2015-01-01'"
+
+    def test_compilation(self, User, session):
+        query = sa.select([User.birthday])
+        # the type should be cacheable and not throw exception
+        session.execute(query)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/tests/types/test_enriched_datetime_arrow.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_enriched_datetime_arrow.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_enriched_datetime_arrow.py     
2020-05-03 20:15:55.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_enriched_datetime_arrow.py     
2021-05-16 10:51:24.000000000 +0200
@@ -35,7 +35,6 @@
 
 @pytest.mark.skipif('arrow_datetime.arrow is None')
 class TestArrowDateTimeType(object):
-
     def test_parameter_processing(self, session, Article):
         article = Article(
             created_at=arrow_datetime.arrow.get(datetime(2000, 11, 1))
@@ -89,3 +88,8 @@
         item = session.query(Article).one()
         assert item.published_at.datetime == item.published_at_dt
         assert item.published_at.to(timezone) == dt
+
+    def test_compilation(self, Article, session):
+        query = sa.select([Article.published_at])
+        # the type should be cacheable and not throw exception
+        session.execute(query)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/tests/types/test_ip_address.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_ip_address.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_ip_address.py  2016-04-25 
16:20:07.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_ip_address.py  2021-05-16 
10:51:24.000000000 +0200
@@ -24,7 +24,6 @@
 
 @pytest.mark.skipif('ip_address.ip_address is None')
 class TestIPAddressType(object):
-
     def test_parameter_processing(self, session, Visitor):
         visitor = Visitor(
             ip_address=u'111.111.111.111'
@@ -35,3 +34,8 @@
 
         visitor = session.query(Visitor).first()
         assert six.text_type(visitor.ip_address) == u'111.111.111.111'
+
+    def test_compilation(self, Visitor, session):
+        query = sa.select([Visitor.ip_address])
+        # the type should be cacheable and not throw exception
+        session.execute(query)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.37.2/tests/types/test_json.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_json.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_json.py        2016-04-25 
16:20:07.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_json.py        2021-05-16 
10:51:24.000000000 +0200
@@ -20,7 +20,6 @@
 
 
 class JSONTestCase(object):
-
     def test_list(self, session, Document):
         document = Document(
             json=[1, 2, 3]
@@ -54,6 +53,11 @@
         document = session.query(Document).first()
         assert document.json == {'something': u'????????????'}
 
+    def test_compilation(self, Document, session):
+        query = sa.select([Document.json])
+        # the type should be cacheable and not throw exception
+        session.execute(query)
+
 
 @pytest.mark.skipif('json.json is None')
 @pytest.mark.usefixtures('sqlite_memory_dsn')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.37.2/tests/types/test_locale.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_locale.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_locale.py      2016-04-25 
16:20:07.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_locale.py      2021-05-16 
10:51:24.000000000 +0200
@@ -23,7 +23,6 @@
 
 @pytest.mark.skipif('locale.babel is None')
 class TestLocaleType(object):
-
     def test_parameter_processing(self, session, User):
         user = User(
             locale=locale.babel.Locale(u'fi')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.37.2/tests/types/test_ltree.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_ltree.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_ltree.py       2016-04-25 
20:10:56.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_ltree.py       2021-05-16 
10:51:24.000000000 +0200
@@ -39,3 +39,8 @@
         clause = Section.path == 'path'
         compiled = str(clause.compile(compile_kwargs={'literal_binds': True}))
         assert compiled == 'section.path = \'path\''
+
+    def test_compilation(self, Section, session):
+        query = sa.select([Section.path])
+        # the type should be cacheable and not throw exception
+        session.execute(query)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.37.2/tests/types/test_password.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_password.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_password.py    2019-07-15 
14:44:13.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_password.py    2021-05-16 
10:51:24.000000000 +0200
@@ -55,7 +55,6 @@
 
 @pytest.mark.skipif('types.password.passlib is None')
 class TestPasswordType(object):
-
     @pytest.mark.parametrize('dialect_module,impl', [
         (sqlalchemy.dialects.sqlite, sa.dialects.sqlite.BLOB),
         (sqlalchemy.dialects.postgresql, sa.dialects.postgresql.BYTEA),
@@ -255,3 +254,8 @@
         onload = mock.Mock(return_value={})
         PasswordType(onload=onload)
         assert not onload.called
+
+    def test_compilation(self, User, session):
+        query = sa.select([User.password])
+        # the type should be cacheable and not throw exception
+        session.execute(query)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/tests/types/test_phonenumber.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_phonenumber.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_phonenumber.py 2020-03-18 
10:24:41.000000000 +0100
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_phonenumber.py 2021-05-16 
10:51:24.000000000 +0200
@@ -54,8 +54,7 @@
 
 
 @pytest.mark.skipif('types.phone_number.phonenumbers is None')
-class TestPhoneNumber(object):
-
+class TestPhoneNumber:
     @pytest.mark.parametrize('raw_number', VALID_PHONE_NUMBERS)
     def test_valid_phone_numbers(self, raw_number):
         number = PhoneNumber(raw_number, 'FI')
@@ -119,8 +118,7 @@
 
 
 @pytest.mark.skipif('types.phone_number.phonenumbers is None')
-class TestPhoneNumberType(object):
-
+class TestPhoneNumberType:
     def test_query_returns_phone_number_object(
         self,
         session,
@@ -178,9 +176,14 @@
 
         assert isinstance(user.phone_number, PhoneNumber)
 
+    def test_compilation(self, User, session):
+        query = sa.select([User.phone_number])
+        # the type should be cacheable and not throw exception
+        session.execute(query)
+
 
 @pytest.mark.skipif('types.phone_number.phonenumbers is None')
-class TestPhoneNumberComposite(object):
+class TestPhoneNumberComposite:
     @pytest.fixture
     def User(self, Base):
         class User(Base):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.37.2/tests/types/test_scalar_list.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_scalar_list.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_scalar_list.py 2016-04-25 
16:20:07.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_scalar_list.py 2021-05-16 
10:51:24.000000000 +0200
@@ -92,3 +92,8 @@
 
         user = session.query(User).first()
         assert user.some_list == []
+
+    def test_compilation(self, User, session):
+        query = sa.select([User.some_list])
+        # the type should be cacheable and not throw exception
+        session.execute(query)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.37.2/tests/types/test_timezone.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_timezone.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_timezone.py    2017-08-31 
14:50:46.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_timezone.py    2021-05-16 
10:51:24.000000000 +0200
@@ -28,8 +28,7 @@
     pass
 
 
-class TestTimezoneType(object):
-
+class TestTimezoneType:
     def test_parameter_processing(self, session, Visitor):
         visitor = Visitor(
             timezone_dateutil=u'America/Los_Angeles',
@@ -49,6 +48,11 @@
         assert visitor_dateutil is not None
         assert visitor_pytz is not None
 
+    def test_compilation(self, Visitor, session):
+        query = sa.select([Visitor.timezone_pytz])
+        # the type should be cacheable and not throw exception
+        session.execute(query)
+
 
 TIMEZONE_BACKENDS = ['dateutil', 'pytz']
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.37.2/tests/types/test_tsvector.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_tsvector.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_tsvector.py    2016-04-25 
16:20:07.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_tsvector.py    2021-05-16 
10:51:24.000000000 +0200
@@ -26,8 +26,7 @@
 
 
 @pytest.mark.usefixtures('postgresql_dsn')
-class TestTSVector(object):
-
+class TestTSVector:
     def test_generates_table(self, User):
         assert 'search_index' in User.__table__.c
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.37.2/tests/types/test_url.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_url.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_url.py 2016-04-25 
16:20:07.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_url.py 2021-05-16 
10:51:24.000000000 +0200
@@ -23,7 +23,6 @@
 
 @pytest.mark.skipif('url.furl is None')
 class TestURLType(object):
-
     def test_color_parameter_processing(self, session, User):
         user = User(
             website=url.furl(u'www.example.com')
@@ -39,3 +38,8 @@
         user = User(website=u'www.example.com')
 
         assert isinstance(user.website, url.furl)
+
+    def test_compilation(self, User, session):
+        query = sa.select([User.website])
+        # the type should be cacheable and not throw exception
+        session.execute(query)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.37.2/tests/types/test_uuid.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_uuid.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_uuid.py        2020-03-16 
12:56:33.000000000 +0100
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_uuid.py        2021-05-16 
10:51:24.000000000 +0200
@@ -23,7 +23,6 @@
 
 
 class TestUUIDType(object):
-
     def test_repr(self):
         plain = UUIDType()
         assert repr(plain) == 'UUIDType()'
@@ -56,3 +55,8 @@
 
         assert isinstance(obj.id, uuid.UUID)
         assert obj.id.bytes == identifier
+
+    def test_compilation(self, User, session):
+        query = sa.select([User.id])
+        # the type should be cacheable and not throw exception
+        session.execute(query)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.37.2/tests/types/test_weekdays.py 
new/SQLAlchemy-Utils-0.37.6/tests/types/test_weekdays.py
--- old/SQLAlchemy-Utils-0.37.2/tests/types/test_weekdays.py    2016-04-25 
16:20:07.000000000 +0200
+++ new/SQLAlchemy-Utils-0.37.6/tests/types/test_weekdays.py    2021-05-16 
10:51:24.000000000 +0200
@@ -32,7 +32,6 @@
 @pytest.mark.usefixtures('set_get_locale')
 @pytest.mark.skipif('i18n.babel is None')
 class WeekDaysTypeTestCase(object):
-
     def test_color_parameter_processing(self, session, Schedule):
         schedule = Schedule(
             working_days=b'0001111'
@@ -48,6 +47,11 @@
 
         assert isinstance(schedule.working_days, WeekDays)
 
+    def test_compilation(self, Schedule, session):
+        query = sa.select([Schedule.working_days])
+        # the type should be cacheable and not throw exception
+        session.execute(query)
+
 
 @pytest.mark.usefixtures('sqlite_memory_dsn')
 class TestWeekDaysTypeOnSQLite(WeekDaysTypeTestCase):

Reply via email to