Hello community,

here is the log from the commit of package python-SQLAlchemy-Utils for 
openSUSE:Factory checked in at 2018-10-15 09:46:43
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-SQLAlchemy-Utils (Old)
 and      /work/SRC/openSUSE:Factory/.python-SQLAlchemy-Utils.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-SQLAlchemy-Utils"

Mon Oct 15 09:46:43 2018 rev:13 rq:641950 version:0.33.6

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-SQLAlchemy-Utils/python-SQLAlchemy-Utils.changes
  2018-09-26 14:24:56.585776677 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-SQLAlchemy-Utils.new/python-SQLAlchemy-Utils.changes
     2018-10-15 09:47:56.871069559 +0200
@@ -1,0 +2,7 @@
+Sun Oct 14 15:24:01 UTC 2018 - Arun Persaud <[email protected]>
+
+- update to version 0.33.6:
+  * Fixed passlib compatibility issue (again) (#342)
+  * Added support for SQL VIEWs
+
+-------------------------------------------------------------------

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

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

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

Other differences:
------------------
++++++ python-SQLAlchemy-Utils.spec ++++++
--- /var/tmp/diff_new_pack.4ovrdq/_old  2018-10-15 09:47:59.411066735 +0200
+++ /var/tmp/diff_new_pack.4ovrdq/_new  2018-10-15 09:47:59.415066731 +0200
@@ -18,7 +18,7 @@
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-SQLAlchemy-Utils
-Version:        0.33.5
+Version:        0.33.6
 Release:        0
 Summary:        Various utility functions for SQLAlchemy
 License:        BSD-3-Clause

++++++ SQLAlchemy-Utils-0.33.5.tar.gz -> SQLAlchemy-Utils-0.33.6.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.33.5/CHANGES.rst 
new/SQLAlchemy-Utils-0.33.6/CHANGES.rst
--- old/SQLAlchemy-Utils-0.33.5/CHANGES.rst     2018-09-20 09:34:38.000000000 
+0200
+++ new/SQLAlchemy-Utils-0.33.6/CHANGES.rst     2018-10-14 09:08:52.000000000 
+0200
@@ -4,6 +4,13 @@
 Here you can see the full list of changes between each SQLAlchemy-Utils 
release.
 
 
+0.33.6 (2018-10-14)
+^^^^^^^^^^^^^^^^^^^
+
+- Fixed passlib compatibility issue (again) (#342)
+- Added support for SQL VIEWs
+
+
 0.33.5 (2018-09-19)
 ^^^^^^^^^^^^^^^^^^^
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.33.5/PKG-INFO 
new/SQLAlchemy-Utils-0.33.6/PKG-INFO
--- old/SQLAlchemy-Utils-0.33.5/PKG-INFO        2018-09-20 09:39:00.000000000 
+0200
+++ new/SQLAlchemy-Utils-0.33.6/PKG-INFO        2018-10-14 09:21:45.000000000 
+0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: SQLAlchemy-Utils
-Version: 0.33.5
+Version: 0.33.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.33.5/SQLAlchemy_Utils.egg-info/PKG-INFO 
new/SQLAlchemy-Utils-0.33.6/SQLAlchemy_Utils.egg-info/PKG-INFO
--- old/SQLAlchemy-Utils-0.33.5/SQLAlchemy_Utils.egg-info/PKG-INFO      
2018-09-20 09:39:00.000000000 +0200
+++ new/SQLAlchemy-Utils-0.33.6/SQLAlchemy_Utils.egg-info/PKG-INFO      
2018-10-14 09:21:45.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: SQLAlchemy-Utils
-Version: 0.33.5
+Version: 0.33.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.33.5/SQLAlchemy_Utils.egg-info/SOURCES.txt 
new/SQLAlchemy-Utils-0.33.6/SQLAlchemy_Utils.egg-info/SOURCES.txt
--- old/SQLAlchemy-Utils-0.33.5/SQLAlchemy_Utils.egg-info/SOURCES.txt   
2018-09-20 09:39:00.000000000 +0200
+++ new/SQLAlchemy-Utils-0.33.6/SQLAlchemy_Utils.egg-info/SOURCES.txt   
2018-10-14 09:21:45.000000000 +0200
@@ -41,7 +41,6 @@
 sqlalchemy_utils/generic.py
 sqlalchemy_utils/i18n.py
 sqlalchemy_utils/listeners.py
-sqlalchemy_utils/materialized_view.py
 sqlalchemy_utils/models.py
 sqlalchemy_utils/observer.py
 sqlalchemy_utils/operators.py
@@ -49,6 +48,7 @@
 sqlalchemy_utils/proxy_dict.py
 sqlalchemy_utils/query_chain.py
 sqlalchemy_utils/utils.py
+sqlalchemy_utils/view.py
 sqlalchemy_utils/functions/__init__.py
 sqlalchemy_utils/functions/database.py
 sqlalchemy_utils/functions/foreign_keys.py
@@ -99,13 +99,13 @@
 tests/test_expressions.py
 tests/test_instant_defaults_listener.py
 tests/test_instrumented_list.py
-tests/test_materialized_view.py
 tests/test_models.py
 tests/test_path.py
 tests/test_proxy_dict.py
 tests/test_query_chain.py
 tests/test_sort_query.py
 tests/test_translation_hybrid.py
+tests/test_views.py
 tests/aggregate/__init__.py
 tests/aggregate/test_backrefs.py
 tests/aggregate/test_custom_select_expressions.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.33.5/sqlalchemy_utils/__init__.py 
new/SQLAlchemy-Utils-0.33.6/sqlalchemy_utils/__init__.py
--- old/SQLAlchemy-Utils-0.33.5/sqlalchemy_utils/__init__.py    2018-09-20 
09:38:10.000000000 +0200
+++ new/SQLAlchemy-Utils-0.33.6/sqlalchemy_utils/__init__.py    2018-10-14 
09:09:03.000000000 +0200
@@ -53,10 +53,6 @@
     force_auto_coercion,
     force_instant_defaults
 )
-from .materialized_view import (  # noqa
-    create_materialized_view,
-    refresh_materialized_view
-)
 from .models import generic_repr, Timestamp  # noqa
 from .observer import observes  # noqa
 from .primitives import Country, Currency, Ltree, WeekDay, WeekDays  # noqa
@@ -98,5 +94,10 @@
     UUIDType,
     WeekDaysType
 )
+from .view import (  # noqa
+    create_materialized_view,
+    create_view,
+    refresh_materialized_view
+)
 
-__version__ = '0.33.5'
+__version__ = '0.33.6'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.33.5/sqlalchemy_utils/materialized_view.py 
new/SQLAlchemy-Utils-0.33.6/sqlalchemy_utils/materialized_view.py
--- old/SQLAlchemy-Utils-0.33.5/sqlalchemy_utils/materialized_view.py   
2018-02-18 15:30:37.000000000 +0100
+++ new/SQLAlchemy-Utils-0.33.6/sqlalchemy_utils/materialized_view.py   
1970-01-01 01:00:00.000000000 +0100
@@ -1,92 +0,0 @@
-import sqlalchemy as sa
-from sqlalchemy.ext import compiler
-from sqlalchemy.schema import DDLElement, PrimaryKeyConstraint
-
-
-class CreateMaterializedView(DDLElement):
-    def __init__(self, name, selectable):
-        self.name = name
-        self.selectable = selectable
-
-
[email protected](CreateMaterializedView)
-def compile_create_materialized_view(element, compiler, **kw):
-    return 'CREATE MATERIALIZED VIEW %s AS %s' % (
-        element.name,
-        compiler.sql_compiler.process(element.selectable, literal_binds=True),
-    )
-
-
-class DropMateralizedView(DDLElement):
-    def __init__(self, name):
-        self.name = name
-
-
[email protected](DropMateralizedView)
-def compile_drop_materialized_view(element, compiler, **kw):
-    return 'DROP MATERIALIZED VIEW IF EXISTS {} CASCADE'.format(
-        element.name
-    )
-
-
-def create_table_from_selectable(
-    name,
-    selectable,
-    indexes=None,
-    metadata=None
-):
-    if indexes is None:
-        indexes = []
-    if metadata is None:
-        metadata = sa.MetaData()
-    args = [
-        sa.Column(c.name, c.type, primary_key=c.primary_key)
-        for c in selectable.c
-    ] + indexes
-    table = sa.Table(name, metadata, *args)
-
-    if not any([c.primary_key for c in selectable.c]):
-        table.append_constraint(
-            PrimaryKeyConstraint(*[c.name for c in selectable.c])
-        )
-    return table
-
-
-def create_materialized_view(
-    name,
-    selectable,
-    metadata,
-    indexes=None
-):
-    table = create_table_from_selectable(
-        name=name,
-        selectable=selectable,
-        indexes=indexes,
-        metadata=None
-    )
-
-    sa.event.listen(
-        metadata,
-        'after_create',
-        CreateMaterializedView(name, selectable)
-    )
-
-    @sa.event.listens_for(metadata, 'after_create')
-    def create_indexes(target, connection, **kw):
-        for idx in table.indexes:
-            idx.create(connection)
-
-    sa.event.listen(metadata, 'before_drop', DropMateralizedView(name))
-    return table
-
-
-def refresh_materialized_view(session, name, concurrently=False):
-    # Since session.execute() bypasses autoflush, we must manually flush in
-    # order to include newly-created/modified objects in the refresh.
-    session.flush()
-    session.execute(
-        'REFRESH MATERIALIZED VIEW {}{}'.format(
-            'CONCURRENTLY ' if concurrently else '',
-            name
-        )
-    )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.33.5/sqlalchemy_utils/types/password.py 
new/SQLAlchemy-Utils-0.33.6/sqlalchemy_utils/types/password.py
--- old/SQLAlchemy-Utils-0.33.5/sqlalchemy_utils/types/password.py      
2018-09-19 19:09:17.000000000 +0200
+++ new/SQLAlchemy-Utils-0.33.6/sqlalchemy_utils/types/password.py      
2018-10-14 09:13:47.000000000 +0200
@@ -158,10 +158,17 @@
 
         # 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
+    def hashing_method(self):
+        return (
+            'hash'
+            if hasattr(self.context, 'hash')
+            else 'encrypt'
+        )
+
+    @property
     def length(self):
         """Get column length."""
         if self._max_length is None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.33.5/sqlalchemy_utils/view.py 
new/SQLAlchemy-Utils-0.33.6/sqlalchemy_utils/view.py
--- old/SQLAlchemy-Utils-0.33.5/sqlalchemy_utils/view.py        1970-01-01 
01:00:00.000000000 +0100
+++ new/SQLAlchemy-Utils-0.33.6/sqlalchemy_utils/view.py        2018-10-14 
09:07:28.000000000 +0200
@@ -0,0 +1,122 @@
+import sqlalchemy as sa
+from sqlalchemy.ext import compiler
+from sqlalchemy.schema import DDLElement, PrimaryKeyConstraint
+
+
+class CreateView(DDLElement):
+    def __init__(self, name, selectable, materialized=False):
+        self.name = name
+        self.selectable = selectable
+        self.materialized = materialized
+
+
[email protected](CreateView)
+def compile_create_materialized_view(element, compiler, **kw):
+    return 'CREATE {}VIEW {} AS {}'.format(
+        'MATERIALIZED ' if element.materialized else '',
+        element.name,
+        compiler.sql_compiler.process(element.selectable, literal_binds=True),
+    )
+
+
+class DropView(DDLElement):
+    def __init__(self, name, materialized=False):
+        self.name = name
+        self.materialized = materialized
+
+
[email protected](DropView)
+def compile_drop_materialized_view(element, compiler, **kw):
+    return 'DROP {}VIEW IF EXISTS {} CASCADE'.format(
+        'MATERIALIZED ' if element.materialized else '',
+        element.name
+    )
+
+
+def create_table_from_selectable(
+    name,
+    selectable,
+    indexes=None,
+    metadata=None
+):
+    if indexes is None:
+        indexes = []
+    if metadata is None:
+        metadata = sa.MetaData()
+    args = [
+        sa.Column(c.name, c.type, primary_key=c.primary_key)
+        for c in selectable.c
+    ] + indexes
+    table = sa.Table(name, metadata, *args)
+
+    if not any([c.primary_key for c in selectable.c]):
+        table.append_constraint(
+            PrimaryKeyConstraint(*[c.name for c in selectable.c])
+        )
+    return table
+
+
+def create_materialized_view(
+    name,
+    selectable,
+    metadata,
+    indexes=None
+):
+    table = create_table_from_selectable(
+        name=name,
+        selectable=selectable,
+        indexes=indexes,
+        metadata=None
+    )
+
+    sa.event.listen(
+        metadata,
+        'after_create',
+        CreateView(name, selectable, materialized=True)
+    )
+
+    @sa.event.listens_for(metadata, 'after_create')
+    def create_indexes(target, connection, **kw):
+        for idx in table.indexes:
+            idx.create(connection)
+
+    sa.event.listen(
+        metadata,
+        'before_drop',
+        DropView(name, materialized=True)
+    )
+    return table
+
+
+def create_view(
+    name,
+    selectable,
+    metadata
+):
+    table = create_table_from_selectable(
+        name=name,
+        selectable=selectable,
+        metadata=None
+    )
+
+    sa.event.listen(metadata, 'after_create', CreateView(name, selectable))
+
+    @sa.event.listens_for(metadata, 'after_create')
+    def create_indexes(target, connection, **kw):
+        for idx in table.indexes:
+            idx.create(connection)
+
+    sa.event.listen(metadata, 'before_drop', DropView(name))
+    return table
+
+
+def refresh_materialized_view(session, name, concurrently=False):
+    # Since session.execute() bypasses autoflush, we must manually flush in
+    # order to include newly-created/modified objects in the refresh.
+    session.flush()
+    session.execute(
+        'REFRESH MATERIALIZED VIEW {}{}'.format(
+            'CONCURRENTLY ' if concurrently else '',
+            name
+        )
+    )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SQLAlchemy-Utils-0.33.5/tests/test_materialized_view.py 
new/SQLAlchemy-Utils-0.33.6/tests/test_materialized_view.py
--- old/SQLAlchemy-Utils-0.33.5/tests/test_materialized_view.py 2018-02-18 
15:32:21.000000000 +0100
+++ new/SQLAlchemy-Utils-0.33.6/tests/test_materialized_view.py 1970-01-01 
01:00:00.000000000 +0100
@@ -1,76 +0,0 @@
-import pytest
-import sqlalchemy as sa
-
-from sqlalchemy_utils import (
-    create_materialized_view,
-    refresh_materialized_view
-)
-
-
[email protected]
-def Article(Base, User):
-    class Article(Base):
-        __tablename__ = 'article'
-        id = sa.Column(sa.Integer, primary_key=True)
-        name = sa.Column(sa.String)
-        author_id = sa.Column(sa.Integer, sa.ForeignKey(User.id))
-        author = sa.orm.relationship(User)
-    return Article
-
-
[email protected]
-def User(Base):
-    class User(Base):
-        __tablename__ = 'user'
-        id = sa.Column(sa.Integer, primary_key=True)
-        name = sa.Column(sa.String)
-    return User
-
-
[email protected]
-def ArticleMV(Base, Article, User):
-    class ArticleMV(Base):
-        __table__ = create_materialized_view(
-            name='article_mv',
-            selectable=sa.select(
-                [
-                    Article.id,
-                    Article.name,
-                    User.id.label('author_id'),
-                    User.name.label('author_name')
-                ],
-                from_obj=(
-                    Article.__table__
-                    .join(User, Article.author_id == User.id)
-                )
-            ),
-            metadata=Base.metadata,
-            indexes=[sa.Index('article_mv_id_idx', 'id')]
-        )
-    return ArticleMV
-
-
[email protected]
-def init_models(ArticleMV):
-    pass
-
-
[email protected]('postgresql_dsn')
-class TestMaterializedViews:
-    def test_refresh_materialized_view(
-        self,
-        session,
-        Article,
-        User,
-        ArticleMV
-    ):
-        article = Article(
-            name='Some article',
-            author=User(name='Some user')
-        )
-        session.add(article)
-        session.commit()
-        refresh_materialized_view(session, 'article_mv')
-        materialized = session.query(ArticleMV).first()
-        assert materialized.name == 'Some article'
-        assert materialized.author_name == 'Some user'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SQLAlchemy-Utils-0.33.5/tests/test_views.py 
new/SQLAlchemy-Utils-0.33.6/tests/test_views.py
--- old/SQLAlchemy-Utils-0.33.5/tests/test_views.py     1970-01-01 
01:00:00.000000000 +0100
+++ new/SQLAlchemy-Utils-0.33.6/tests/test_views.py     2018-10-14 
09:07:28.000000000 +0200
@@ -0,0 +1,116 @@
+import pytest
+import sqlalchemy as sa
+
+from sqlalchemy_utils import (
+    create_materialized_view,
+    create_view,
+    refresh_materialized_view
+)
+
+
[email protected]
+def Article(Base, User):
+    class Article(Base):
+        __tablename__ = 'article'
+        id = sa.Column(sa.Integer, primary_key=True)
+        name = sa.Column(sa.String)
+        author_id = sa.Column(sa.Integer, sa.ForeignKey(User.id))
+        author = sa.orm.relationship(User)
+    return Article
+
+
[email protected]
+def User(Base):
+    class User(Base):
+        __tablename__ = 'user'
+        id = sa.Column(sa.Integer, primary_key=True)
+        name = sa.Column(sa.String)
+    return User
+
+
[email protected]
+def ArticleMV(Base, Article, User):
+    class ArticleMV(Base):
+        __table__ = create_materialized_view(
+            name='article_mv',
+            selectable=sa.select(
+                [
+                    Article.id,
+                    Article.name,
+                    User.id.label('author_id'),
+                    User.name.label('author_name')
+                ],
+                from_obj=(
+                    Article.__table__
+                    .join(User, Article.author_id == User.id)
+                )
+            ),
+            metadata=Base.metadata,
+            indexes=[sa.Index('article_mv_id_idx', 'id')]
+        )
+    return ArticleMV
+
+
[email protected]
+def ArticleView(Base, Article, User):
+    class ArticleView(Base):
+        __table__ = create_view(
+            name='article_view',
+            selectable=sa.select(
+                [
+                    Article.id,
+                    Article.name,
+                    User.id.label('author_id'),
+                    User.name.label('author_name')
+                ],
+                from_obj=(
+                    Article.__table__
+                    .join(User, Article.author_id == User.id)
+                )
+            ),
+            metadata=Base.metadata
+        )
+    return ArticleView
+
+
[email protected]
+def init_models(ArticleMV, ArticleView):
+    pass
+
+
[email protected]('postgresql_dsn')
+class TestMaterializedViews:
+    def test_refresh_materialized_view(
+        self,
+        session,
+        Article,
+        User,
+        ArticleMV
+    ):
+        article = Article(
+            name='Some article',
+            author=User(name='Some user')
+        )
+        session.add(article)
+        session.commit()
+        refresh_materialized_view(session, 'article_mv')
+        materialized = session.query(ArticleMV).first()
+        assert materialized.name == 'Some article'
+        assert materialized.author_name == 'Some user'
+
+    def test_querying_view(
+        self,
+        session,
+        Article,
+        User,
+        ArticleView
+    ):
+        article = Article(
+            name='Some article',
+            author=User(name='Some user')
+        )
+        session.add(article)
+        session.commit()
+        row = session.query(ArticleView).first()
+        assert row.name == 'Some article'
+        assert row.author_name == 'Some user'


Reply via email to