commit python-SQLAlchemy-Utils for openSUSE:Factory
Hello community, here is the log from the commit of package python-SQLAlchemy-Utils for openSUSE:Factory checked in at 2018-09-26 14:24:34 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-SQLAlchemy-Utils (Old) and /work/SRC/openSUSE:Factory/.python-SQLAlchemy-Utils.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "python-SQLAlchemy-Utils" Wed Sep 26 14:24:34 2018 rev:12 rq:638277 version:0.33.5 Changes: -------- --- /work/SRC/openSUSE:Factory/python-SQLAlchemy-Utils/python-SQLAlchemy-Utils.changes 2018-09-18 11:44:20.623853770 +0200 +++ /work/SRC/openSUSE:Factory/.python-SQLAlchemy-Utils.new/python-SQLAlchemy-Utils.changes 2018-09-26 14:24:56.585776677 +0200 @@ -1,0 +2,9 @@ +Sat Sep 22 05:30:08 UTC 2018 - Arun Persaud <arun@gmx.de> + +- update to version 0.33.5: + * Added optional attr parameter for locale calleble in + TranslationHybrid + * Fixed an issue with PasswordType so that it is compatible with + older versions of passlib (#342) + +------------------------------------------------------------------- Old: ---- SQLAlchemy-Utils-0.33.4.tar.gz New: ---- SQLAlchemy-Utils-0.33.5.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-SQLAlchemy-Utils.spec ++++++ --- /var/tmp/diff_new_pack.lc6n86/_old 2018-09-26 14:24:57.073775901 +0200 +++ /var/tmp/diff_new_pack.lc6n86/_new 2018-09-26 14:24:57.077775895 +0200 @@ -18,7 +18,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-SQLAlchemy-Utils -Version: 0.33.4 +Version: 0.33.5 Release: 0 Summary: Various utility functions for SQLAlchemy License: BSD-3-Clause ++++++ SQLAlchemy-Utils-0.33.4.tar.gz -> SQLAlchemy-Utils-0.33.5.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/SQLAlchemy-Utils-0.33.4/CHANGES.rst new/SQLAlchemy-Utils-0.33.5/CHANGES.rst --- old/SQLAlchemy-Utils-0.33.4/CHANGES.rst 2018-09-11 09:51:09.000000000 +0200 +++ new/SQLAlchemy-Utils-0.33.5/CHANGES.rst 2018-09-20 09:34:38.000000000 +0200 @@ -3,6 +3,14 @@ Here you can see the full list of changes between each SQLAlchemy-Utils release. + +0.33.5 (2018-09-19) +^^^^^^^^^^^^^^^^^^^ + +- Added optional attr parameter for locale calleble in TranslationHybrid +- Fixed an issue with PasswordType so that it is compatible with older versions of passlib (#342) + + 0.33.4 (2018-09-11) ^^^^^^^^^^^^^^^^^^^ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/SQLAlchemy-Utils-0.33.4/PKG-INFO new/SQLAlchemy-Utils-0.33.5/PKG-INFO --- old/SQLAlchemy-Utils-0.33.4/PKG-INFO 2018-09-11 09:52:29.000000000 +0200 +++ new/SQLAlchemy-Utils-0.33.5/PKG-INFO 2018-09-20 09:39:00.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: SQLAlchemy-Utils -Version: 0.33.4 +Version: 0.33.5 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.33.4/SQLAlchemy_Utils.egg-info/PKG-INFO new/SQLAlchemy-Utils-0.33.5/SQLAlchemy_Utils.egg-info/PKG-INFO --- old/SQLAlchemy-Utils-0.33.4/SQLAlchemy_Utils.egg-info/PKG-INFO 2018-09-11 09:52:29.000000000 +0200 +++ new/SQLAlchemy-Utils-0.33.5/SQLAlchemy_Utils.egg-info/PKG-INFO 2018-09-20 09:39:00.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: SQLAlchemy-Utils -Version: 0.33.4 +Version: 0.33.5 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.33.4/docs/internationalization.rst new/SQLAlchemy-Utils-0.33.5/docs/internationalization.rst --- old/SQLAlchemy-Utils-0.33.4/docs/internationalization.rst 2015-08-16 10:02:59.000000000 +0200 +++ new/SQLAlchemy-Utils-0.33.5/docs/internationalization.rst 2018-09-20 09:34:12.000000000 +0200 @@ -120,7 +120,9 @@ --------------- Sometimes locales need to be dynamic. The following example illustrates how to setup -dynamic locales. +dynamic locales. You can pass a callable of either 0, 1 or 2 args as a constructor parameter for TranslationHybrid. + +The first argument should be the associated object and second parameter the name of the translations attribute. :: @@ -142,12 +144,24 @@ article = Article(name_translations={'en': 'Some article'}) + article.locale = 'en' session.add(article) session.commit() article.name # Some article (even if current locale is other than 'en') +The locales can also be attribute dependent so you can set up translation hybrid in a way that +it is guaranteed to return a translation. + +:: + + translation_hybrid.default_locale = lambda obj, attr: sorted(getattr(obj, attr).keys())[0] + + + article.name # Some article + + .. _SQLAlchemy-i18n: https://github.com/kvesteri/sqlalchemy-i18n diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/SQLAlchemy-Utils-0.33.4/sqlalchemy_utils/__init__.py new/SQLAlchemy-Utils-0.33.5/sqlalchemy_utils/__init__.py --- old/SQLAlchemy-Utils-0.33.4/sqlalchemy_utils/__init__.py 2018-09-11 09:51:22.000000000 +0200 +++ new/SQLAlchemy-Utils-0.33.5/sqlalchemy_utils/__init__.py 2018-09-20 09:38:10.000000000 +0200 @@ -99,4 +99,4 @@ WeekDaysType ) -__version__ = '0.33.4' +__version__ = '0.33.5' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/SQLAlchemy-Utils-0.33.4/sqlalchemy_utils/i18n.py new/SQLAlchemy-Utils-0.33.5/sqlalchemy_utils/i18n.py --- old/SQLAlchemy-Utils-0.33.4/sqlalchemy_utils/i18n.py 2016-04-25 16:20:06.000000000 +0200 +++ new/SQLAlchemy-Utils-0.33.5/sqlalchemy_utils/i18n.py 2018-09-20 09:34:12.000000000 +0200 @@ -1,3 +1,5 @@ +import inspect + import six import sqlalchemy as sa from sqlalchemy.ext.compiler import compiles @@ -23,7 +25,22 @@ ) -def cast_locale(obj, locale): +if six.PY2: + def get_args_count(func): + if ( + callable(func) and + not inspect.isfunction(func) and + not inspect.ismethod(func) + ): + func = func.__call__ + args = inspect.getargspec(func).args + return len(args) - 1 if inspect.ismethod(func) else len(args) +else: + def get_args_count(func): + return len(inspect.signature(func).parameters) + + +def cast_locale(obj, locale, attr): """ Cast given locale to string. Supports also callbacks that return locales. @@ -33,24 +50,28 @@ Locale object or string or callable that returns a locale. """ if callable(locale): - try: + args_count = get_args_count(locale) + if args_count == 0: locale = locale() - except TypeError: + elif args_count == 1: locale = locale(obj) + elif args_count == 2: + locale = locale(obj, attr.key) if isinstance(locale, babel.Locale): return str(locale) return locale class cast_locale_expr(ColumnElement): - def __init__(self, cls, locale): + def __init__(self, cls, locale, attr): self.cls = cls self.locale = locale + self.attr = attr @compiles(cast_locale_expr) def compile_cast_locale_expr(element, compiler, **kw): - locale = cast_locale(element.cls, element.locale) + locale = cast_locale(element.cls, element.locale, element.attr) if isinstance(locale, six.string_types): return "'{0}'".format(locale) return compiler.process(locale) @@ -74,13 +95,11 @@ is no translation found for default locale it returns None. """ def getter(obj): - current_locale = cast_locale(obj, self.current_locale) + current_locale = cast_locale(obj, self.current_locale, attr) try: return getattr(obj, attr.key)[current_locale] except (TypeError, KeyError): - default_locale = cast_locale( - obj, self.default_locale - ) + default_locale = cast_locale(obj, self.default_locale, attr) try: return getattr(obj, attr.key)[default_locale] except (TypeError, KeyError): @@ -91,15 +110,15 @@ def setter(obj, value): if getattr(obj, attr.key) is None: setattr(obj, attr.key, {}) - locale = cast_locale(obj, self.current_locale) + locale = cast_locale(obj, self.current_locale, attr) getattr(obj, attr.key)[locale] = value return setter def expr_factory(self, attr): def expr(cls): cls_attr = getattr(cls, attr.key) - current_locale = cast_locale_expr(cls, self.current_locale) - default_locale = cast_locale_expr(cls, self.default_locale) + current_locale = cast_locale_expr(cls, self.current_locale, attr) + default_locale = cast_locale_expr(cls, self.default_locale, attr) return sa.func.coalesce( cls_attr[current_locale], cls_attr[default_locale] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/SQLAlchemy-Utils-0.33.4/sqlalchemy_utils/types/password.py new/SQLAlchemy-Utils-0.33.5/sqlalchemy_utils/types/password.py --- old/SQLAlchemy-Utils-0.33.4/sqlalchemy_utils/types/password.py 2018-09-11 09:49:17.000000000 +0200 +++ new/SQLAlchemy-Utils-0.33.5/sqlalchemy_utils/types/password.py 2018-09-19 19:09:17.000000000 +0200 @@ -158,7 +158,7 @@ # Construct the passlib crypt context. self.context = LazyCryptContext(**kwargs) - + self.hashing_method = 'hash' if hasattr(self, 'hash') else 'encrypt' self._max_length = max_length @property @@ -207,19 +207,22 @@ if isinstance(value, Password): # If were given a password secret; hash it. if value.secret is not None: - return self.context.hash(value.secret).encode('utf8') + return self._hash(value.secret).encode('utf8') # Value has already been hashed. return value.hash if isinstance(value, six.string_types): # Assume value has not been hashed. - return self.context.hash(value).encode('utf8') + return self._hash(value).encode('utf8') def process_result_value(self, value, dialect): if value is not None: return Password(value, self.context) + def _hash(self, value): + return getattr(self.context, self.hashing_method)(value) + def _coerce(self, value): if value is None: @@ -227,7 +230,7 @@ if not isinstance(value, Password): # Hash the password using the default scheme. - value = self.context.hash(value).encode('utf8') + value = self._hash(value).encode('utf8') return Password(value, context=self.context) else: @@ -236,7 +239,7 @@ # If were given a password secret; hash it. if value.secret is not None: - value.hash = self.context.hash(value.secret).encode('utf8') + value.hash = self._hash(value.secret).encode('utf8') value.secret = None return value diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/SQLAlchemy-Utils-0.33.4/tests/test_translation_hybrid.py new/SQLAlchemy-Utils-0.33.5/tests/test_translation_hybrid.py --- old/SQLAlchemy-Utils-0.33.4/tests/test_translation_hybrid.py 2016-10-20 09:57:03.000000000 +0200 +++ new/SQLAlchemy-Utils-0.33.5/tests/test_translation_hybrid.py 2018-09-20 09:34:12.000000000 +0200 @@ -59,6 +59,17 @@ assert city.name == 'Helsinki' + def test_fallback_to_attr_dependent_locale(self, City, translation_hybrid): + translation_hybrid.current_locale = 'en' + translation_hybrid.default_locale = ( + lambda obj, attr: sorted(getattr(obj, attr).keys())[0] + ) + city = City(name_translations={}) + city.name_translations['fi'] = 'Helsinki' + assert city.name == 'Helsinki' + city.name_translations['de'] = 'Stadt Helsinki' + assert city.name == 'Stadt Helsinki' + @pytest.mark.parametrize( ('name_translations', 'name'), (
participants (1)
-
root