SQLAlchemy-Utils 0.41.1__tar.gz → 0.41.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/CHANGES.rst +5 -0
  2. SQLAlchemy-Utils-0.41.2/PKG-INFO +96 -0
  3. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/README.rst +4 -4
  4. SQLAlchemy-Utils-0.41.2/SQLAlchemy_Utils.egg-info/PKG-INFO +96 -0
  5. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/SQLAlchemy_Utils.egg-info/requires.txt +2 -2
  6. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/data_types.rst +11 -0
  7. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/installation.rst +0 -1
  8. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/setup.py +2 -3
  9. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/__init__.py +1 -1
  10. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/functions/database.py +1 -1
  11. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/generic.py +18 -0
  12. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/encrypted/encrypted_type.py +17 -12
  13. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/view.py +17 -4
  14. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/aggregate/test_m2m.py +1 -0
  15. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/test_views.py +66 -9
  16. SQLAlchemy-Utils-0.41.1/PKG-INFO +0 -43
  17. SQLAlchemy-Utils-0.41.1/SQLAlchemy_Utils.egg-info/PKG-INFO +0 -43
  18. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/.isort.cfg +0 -0
  19. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/LICENSE +0 -0
  20. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/MANIFEST.in +0 -0
  21. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/SQLAlchemy_Utils.egg-info/SOURCES.txt +0 -0
  22. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/SQLAlchemy_Utils.egg-info/dependency_links.txt +0 -0
  23. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/SQLAlchemy_Utils.egg-info/not-zip-safe +0 -0
  24. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/SQLAlchemy_Utils.egg-info/top_level.txt +0 -0
  25. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/conftest.py +0 -0
  26. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/Makefile +0 -0
  27. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/aggregates.rst +0 -0
  28. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/conf.py +0 -0
  29. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/database_helpers.rst +0 -0
  30. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/foreign_key_helpers.rst +0 -0
  31. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/generic_relationship.rst +0 -0
  32. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/index.rst +0 -0
  33. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/internationalization.rst +0 -0
  34. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/license.rst +0 -0
  35. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/listeners.rst +0 -0
  36. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/make.bat +0 -0
  37. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/models.rst +0 -0
  38. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/observers.rst +0 -0
  39. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/orm_helpers.rst +0 -0
  40. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/range_data_types.rst +0 -0
  41. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/testing.rst +0 -0
  42. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/utility_classes.rst +0 -0
  43. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/docs/view.rst +0 -0
  44. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/setup.cfg +0 -0
  45. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/aggregates.py +0 -0
  46. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/asserts.py +0 -0
  47. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/compat.py +0 -0
  48. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/exceptions.py +0 -0
  49. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/expressions.py +0 -0
  50. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/functions/__init__.py +0 -0
  51. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/functions/foreign_keys.py +0 -0
  52. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/functions/mock.py +0 -0
  53. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/functions/orm.py +0 -0
  54. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/functions/render.py +0 -0
  55. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/functions/sort_query.py +0 -0
  56. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/i18n.py +0 -0
  57. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/listeners.py +0 -0
  58. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/models.py +0 -0
  59. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/observer.py +0 -0
  60. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/operators.py +0 -0
  61. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/path.py +0 -0
  62. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/primitives/__init__.py +0 -0
  63. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/primitives/country.py +0 -0
  64. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/primitives/currency.py +0 -0
  65. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/primitives/ltree.py +0 -0
  66. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/primitives/weekday.py +0 -0
  67. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/primitives/weekdays.py +0 -0
  68. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/proxy_dict.py +0 -0
  69. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/query_chain.py +0 -0
  70. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/relationships/__init__.py +0 -0
  71. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/relationships/chained_join.py +0 -0
  72. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/__init__.py +0 -0
  73. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/arrow.py +0 -0
  74. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/bit.py +0 -0
  75. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/choice.py +0 -0
  76. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/color.py +0 -0
  77. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/country.py +0 -0
  78. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/currency.py +0 -0
  79. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/email.py +0 -0
  80. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/encrypted/__init__.py +0 -0
  81. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/encrypted/padding.py +0 -0
  82. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/enriched_datetime/__init__.py +0 -0
  83. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/enriched_datetime/arrow_datetime.py +0 -0
  84. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/enriched_datetime/enriched_date_type.py +0 -0
  85. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/enriched_datetime/enriched_datetime_type.py +0 -0
  86. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/enriched_datetime/pendulum_date.py +0 -0
  87. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/enriched_datetime/pendulum_datetime.py +0 -0
  88. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/ip_address.py +0 -0
  89. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/json.py +0 -0
  90. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/locale.py +0 -0
  91. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/ltree.py +0 -0
  92. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/password.py +0 -0
  93. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/pg_composite.py +0 -0
  94. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/phone_number.py +0 -0
  95. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/range.py +0 -0
  96. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/scalar_coercible.py +0 -0
  97. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/scalar_list.py +0 -0
  98. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/timezone.py +0 -0
  99. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/ts_vector.py +0 -0
  100. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/url.py +0 -0
  101. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/uuid.py +0 -0
  102. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/types/weekdays.py +0 -0
  103. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/sqlalchemy_utils/utils.py +0 -0
  104. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/__init__.py +0 -0
  105. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/aggregate/__init__.py +0 -0
  106. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/aggregate/test_backrefs.py +0 -0
  107. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/aggregate/test_custom_select_expressions.py +0 -0
  108. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/aggregate/test_join_table_inheritance.py +0 -0
  109. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/aggregate/test_m2m_m2m.py +0 -0
  110. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/aggregate/test_multiple_aggregates_per_class.py +0 -0
  111. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/aggregate/test_o2m_m2m.py +0 -0
  112. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/aggregate/test_o2m_o2m.py +0 -0
  113. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/aggregate/test_o2m_o2m_o2m.py +0 -0
  114. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/aggregate/test_search_vectors.py +0 -0
  115. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/aggregate/test_simple_paths.py +0 -0
  116. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/aggregate/test_with_column_alias.py +0 -0
  117. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/aggregate/test_with_ondelete_cascade.py +0 -0
  118. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/__init__.py +0 -0
  119. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_cast_if.py +0 -0
  120. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_database.py +0 -0
  121. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_dependent_objects.py +0 -0
  122. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_escape_like.py +0 -0
  123. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_get_bind.py +0 -0
  124. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_get_class_by_table.py +0 -0
  125. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_get_column_key.py +0 -0
  126. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_get_columns.py +0 -0
  127. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_get_hybrid_properties.py +0 -0
  128. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_get_mapper.py +0 -0
  129. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_get_primary_keys.py +0 -0
  130. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_get_referencing_foreign_keys.py +0 -0
  131. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_get_tables.py +0 -0
  132. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_get_type.py +0 -0
  133. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_getdotattr.py +0 -0
  134. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_has_changes.py +0 -0
  135. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_has_index.py +0 -0
  136. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_has_unique_index.py +0 -0
  137. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_identity.py +0 -0
  138. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_is_loaded.py +0 -0
  139. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_json_sql.py +0 -0
  140. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_jsonb_sql.py +0 -0
  141. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_make_order_by_deterministic.py +0 -0
  142. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_merge_references.py +0 -0
  143. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_naturally_equivalent.py +0 -0
  144. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_non_indexed_foreign_keys.py +0 -0
  145. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_quote.py +0 -0
  146. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_render.py +0 -0
  147. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/functions/test_table_name.py +0 -0
  148. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/generic_relationship/__init__.py +0 -0
  149. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/generic_relationship/test_abstract_base_class.py +0 -0
  150. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/generic_relationship/test_column_aliases.py +0 -0
  151. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/generic_relationship/test_composite_keys.py +0 -0
  152. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/generic_relationship/test_hybrid_properties.py +0 -0
  153. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/generic_relationship/test_single_table_inheritance.py +0 -0
  154. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/mixins.py +0 -0
  155. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/observes/__init__.py +0 -0
  156. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/observes/test_column_property.py +0 -0
  157. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/observes/test_dynamic_relationship.py +0 -0
  158. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/observes/test_m2m_m2m_m2m.py +0 -0
  159. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/observes/test_o2m_o2m_o2m.py +0 -0
  160. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/observes/test_o2m_o2o_o2m.py +0 -0
  161. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/observes/test_o2o_o2o.py +0 -0
  162. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/observes/test_o2o_o2o_o2o.py +0 -0
  163. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/primitives/__init__.py +0 -0
  164. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/primitives/test_country.py +0 -0
  165. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/primitives/test_currency.py +0 -0
  166. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/primitives/test_ltree.py +0 -0
  167. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/primitives/test_weekdays.py +0 -0
  168. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/relationships/__init__.py +0 -0
  169. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/relationships/test_chained_join.py +0 -0
  170. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/relationships/test_select_correlated_expression.py +0 -0
  171. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/test_asserts.py +0 -0
  172. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/test_auto_delete_orphans.py +0 -0
  173. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/test_case_insensitive_comparator.py +0 -0
  174. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/test_compat.py +0 -0
  175. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/test_expressions.py +0 -0
  176. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/test_instant_defaults_listener.py +0 -0
  177. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/test_instrumented_list.py +0 -0
  178. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/test_models.py +0 -0
  179. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/test_path.py +0 -0
  180. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/test_proxy_dict.py +0 -0
  181. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/test_query_chain.py +0 -0
  182. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/test_translation_hybrid.py +0 -0
  183. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/__init__.py +0 -0
  184. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/encrypted/test_padding.py +0 -0
  185. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_arrow.py +0 -0
  186. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_choice.py +0 -0
  187. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_color.py +0 -0
  188. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_composite.py +0 -0
  189. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_country.py +0 -0
  190. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_currency.py +0 -0
  191. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_date_range.py +0 -0
  192. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_datetime_range.py +0 -0
  193. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_email.py +0 -0
  194. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_encrypted.py +0 -0
  195. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_enriched_date_pendulum.py +0 -0
  196. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_enriched_datetime_arrow.py +0 -0
  197. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_enriched_datetime_pendulum.py +0 -0
  198. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_int_range.py +0 -0
  199. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_ip_address.py +0 -0
  200. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_json.py +0 -0
  201. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_locale.py +0 -0
  202. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_ltree.py +0 -0
  203. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_numeric_range.py +0 -0
  204. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_password.py +0 -0
  205. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_phonenumber.py +0 -0
  206. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_scalar_list.py +0 -0
  207. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_timezone.py +0 -0
  208. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_tsvector.py +0 -0
  209. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_url.py +0 -0
  210. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_uuid.py +0 -0
  211. {SQLAlchemy-Utils-0.41.1 → SQLAlchemy-Utils-0.41.2}/tests/types/test_weekdays.py +0 -0
@@ -3,6 +3,11 @@ Changelog
3
3
 
4
4
  Here you can see the full list of changes between each SQLAlchemy-Utils release.
5
5
 
6
+ 0.41.2 (2024-03-22)
7
+ ^^^^^^^^^^^^^^^^^^^
8
+
9
+ - Fix breaking change introduced on SQLAlchemy 2.0.22 changes to `attributes.AttributeImpl` constructor (#733)
10
+
6
11
 
7
12
  0.41.1 (2023-04-27)
8
13
  ^^^^^^^^^^^^^^^^^^^
@@ -0,0 +1,96 @@
1
+ Metadata-Version: 2.1
2
+ Name: SQLAlchemy-Utils
3
+ Version: 0.41.2
4
+ Summary: Various utility functions for SQLAlchemy.
5
+ Home-page: https://github.com/kvesteri/sqlalchemy-utils
6
+ Author: Konsta Vesterinen, Ryan Leckey, Janne Vanhala, Vesa Uimonen
7
+ Author-email: konsta@fastmonkeys.com
8
+ License: BSD
9
+ Platform: any
10
+ Classifier: Environment :: Web Environment
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: BSD License
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.7
17
+ Classifier: Programming Language :: Python :: 3.8
18
+ Classifier: Programming Language :: Python :: 3.9
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
22
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
23
+ Requires-Python: >=3.7
24
+ License-File: LICENSE
25
+ Requires-Dist: SQLAlchemy>=1.3
26
+ Requires-Dist: importlib_metadata; python_version < "3.8"
27
+ Provides-Extra: test
28
+ Requires-Dist: pytest==7.4.4; extra == "test"
29
+ Requires-Dist: Pygments>=1.2; extra == "test"
30
+ Requires-Dist: Jinja2>=2.3; extra == "test"
31
+ Requires-Dist: docutils>=0.10; extra == "test"
32
+ Requires-Dist: flexmock>=0.9.7; extra == "test"
33
+ Requires-Dist: psycopg>=3.1.8; extra == "test"
34
+ Requires-Dist: psycopg2>=2.5.1; extra == "test"
35
+ Requires-Dist: psycopg2cffi>=2.8.1; extra == "test"
36
+ Requires-Dist: pg8000>=1.12.4; extra == "test"
37
+ Requires-Dist: pytz>=2014.2; extra == "test"
38
+ Requires-Dist: python-dateutil>=2.6; extra == "test"
39
+ Requires-Dist: backports.zoneinfo; python_version < "3.9" and extra == "test"
40
+ Requires-Dist: pymysql; extra == "test"
41
+ Requires-Dist: flake8>=2.4.0; extra == "test"
42
+ Requires-Dist: isort>=4.2.2; extra == "test"
43
+ Requires-Dist: pyodbc; extra == "test"
44
+ Provides-Extra: babel
45
+ Requires-Dist: Babel>=1.3; extra == "babel"
46
+ Provides-Extra: arrow
47
+ Requires-Dist: arrow>=0.3.4; extra == "arrow"
48
+ Provides-Extra: pendulum
49
+ Requires-Dist: pendulum>=2.0.5; extra == "pendulum"
50
+ Provides-Extra: intervals
51
+ Requires-Dist: intervals>=0.7.1; extra == "intervals"
52
+ Provides-Extra: phone
53
+ Requires-Dist: phonenumbers>=5.9.2; extra == "phone"
54
+ Provides-Extra: password
55
+ Requires-Dist: passlib<2.0,>=1.6; extra == "password"
56
+ Provides-Extra: color
57
+ Requires-Dist: colour>=0.0.4; extra == "color"
58
+ Provides-Extra: timezone
59
+ Requires-Dist: python-dateutil; extra == "timezone"
60
+ Provides-Extra: url
61
+ Requires-Dist: furl>=0.4.1; extra == "url"
62
+ Provides-Extra: encrypted
63
+ Requires-Dist: cryptography>=0.6; extra == "encrypted"
64
+ Provides-Extra: test-all
65
+ Requires-Dist: Babel>=1.3; extra == "test-all"
66
+ Requires-Dist: Jinja2>=2.3; extra == "test-all"
67
+ Requires-Dist: Pygments>=1.2; extra == "test-all"
68
+ Requires-Dist: arrow>=0.3.4; extra == "test-all"
69
+ Requires-Dist: backports.zoneinfo; python_version < "3.9" and extra == "test-all"
70
+ Requires-Dist: colour>=0.0.4; extra == "test-all"
71
+ Requires-Dist: cryptography>=0.6; extra == "test-all"
72
+ Requires-Dist: docutils>=0.10; extra == "test-all"
73
+ Requires-Dist: flake8>=2.4.0; extra == "test-all"
74
+ Requires-Dist: flexmock>=0.9.7; extra == "test-all"
75
+ Requires-Dist: furl>=0.4.1; extra == "test-all"
76
+ Requires-Dist: intervals>=0.7.1; extra == "test-all"
77
+ Requires-Dist: isort>=4.2.2; extra == "test-all"
78
+ Requires-Dist: passlib<2.0,>=1.6; extra == "test-all"
79
+ Requires-Dist: pendulum>=2.0.5; extra == "test-all"
80
+ Requires-Dist: pg8000>=1.12.4; extra == "test-all"
81
+ Requires-Dist: phonenumbers>=5.9.2; extra == "test-all"
82
+ Requires-Dist: psycopg2>=2.5.1; extra == "test-all"
83
+ Requires-Dist: psycopg2cffi>=2.8.1; extra == "test-all"
84
+ Requires-Dist: psycopg>=3.1.8; extra == "test-all"
85
+ Requires-Dist: pymysql; extra == "test-all"
86
+ Requires-Dist: pyodbc; extra == "test-all"
87
+ Requires-Dist: pytest==7.4.4; extra == "test-all"
88
+ Requires-Dist: python-dateutil; extra == "test-all"
89
+ Requires-Dist: python-dateutil>=2.6; extra == "test-all"
90
+ Requires-Dist: pytz>=2014.2; extra == "test-all"
91
+
92
+
93
+ SQLAlchemy-Utils
94
+ ----------------
95
+
96
+ Various utility functions and custom data types for SQLAlchemy.
@@ -1,8 +1,7 @@
1
1
  SQLAlchemy-Utils
2
2
  ================
3
3
 
4
- |Build Status| |Version Status| |Downloads|
5
-
4
+ |Build| |Version Status| |Downloads|
6
5
 
7
6
  Various utility functions, new data types and helpers for SQLAlchemy.
8
7
 
@@ -14,8 +13,9 @@ Resources
14
13
  - `Issue Tracker <https://github.com/kvesteri/sqlalchemy-utils/issues>`_
15
14
  - `Code <https://github.com/kvesteri/sqlalchemy-utils/>`_
16
15
 
17
- .. |Build Status| image:: https://travis-ci.org/kvesteri/sqlalchemy-utils.svg?branch=master
18
- :target: https://travis-ci.org/kvesteri/sqlalchemy-utils
16
+ .. |Build| image:: https://github.com/kvesteri/sqlalchemy-utils/actions/workflows/test.yaml/badge.svg?branch=master
17
+ :target: https://github.com/kvesteri/sqlalchemy-utils/actions/workflows/test.yaml
18
+ :alt: Tests
19
19
  .. |Version Status| image:: https://img.shields.io/pypi/v/SQLAlchemy-Utils.svg
20
20
  :target: https://pypi.python.org/pypi/SQLAlchemy-Utils/
21
21
  .. |Downloads| image:: https://img.shields.io/pypi/dm/SQLAlchemy-Utils.svg
@@ -0,0 +1,96 @@
1
+ Metadata-Version: 2.1
2
+ Name: SQLAlchemy-Utils
3
+ Version: 0.41.2
4
+ Summary: Various utility functions for SQLAlchemy.
5
+ Home-page: https://github.com/kvesteri/sqlalchemy-utils
6
+ Author: Konsta Vesterinen, Ryan Leckey, Janne Vanhala, Vesa Uimonen
7
+ Author-email: konsta@fastmonkeys.com
8
+ License: BSD
9
+ Platform: any
10
+ Classifier: Environment :: Web Environment
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: BSD License
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.7
17
+ Classifier: Programming Language :: Python :: 3.8
18
+ Classifier: Programming Language :: Python :: 3.9
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
22
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
23
+ Requires-Python: >=3.7
24
+ License-File: LICENSE
25
+ Requires-Dist: SQLAlchemy>=1.3
26
+ Requires-Dist: importlib_metadata; python_version < "3.8"
27
+ Provides-Extra: test
28
+ Requires-Dist: pytest==7.4.4; extra == "test"
29
+ Requires-Dist: Pygments>=1.2; extra == "test"
30
+ Requires-Dist: Jinja2>=2.3; extra == "test"
31
+ Requires-Dist: docutils>=0.10; extra == "test"
32
+ Requires-Dist: flexmock>=0.9.7; extra == "test"
33
+ Requires-Dist: psycopg>=3.1.8; extra == "test"
34
+ Requires-Dist: psycopg2>=2.5.1; extra == "test"
35
+ Requires-Dist: psycopg2cffi>=2.8.1; extra == "test"
36
+ Requires-Dist: pg8000>=1.12.4; extra == "test"
37
+ Requires-Dist: pytz>=2014.2; extra == "test"
38
+ Requires-Dist: python-dateutil>=2.6; extra == "test"
39
+ Requires-Dist: backports.zoneinfo; python_version < "3.9" and extra == "test"
40
+ Requires-Dist: pymysql; extra == "test"
41
+ Requires-Dist: flake8>=2.4.0; extra == "test"
42
+ Requires-Dist: isort>=4.2.2; extra == "test"
43
+ Requires-Dist: pyodbc; extra == "test"
44
+ Provides-Extra: babel
45
+ Requires-Dist: Babel>=1.3; extra == "babel"
46
+ Provides-Extra: arrow
47
+ Requires-Dist: arrow>=0.3.4; extra == "arrow"
48
+ Provides-Extra: pendulum
49
+ Requires-Dist: pendulum>=2.0.5; extra == "pendulum"
50
+ Provides-Extra: intervals
51
+ Requires-Dist: intervals>=0.7.1; extra == "intervals"
52
+ Provides-Extra: phone
53
+ Requires-Dist: phonenumbers>=5.9.2; extra == "phone"
54
+ Provides-Extra: password
55
+ Requires-Dist: passlib<2.0,>=1.6; extra == "password"
56
+ Provides-Extra: color
57
+ Requires-Dist: colour>=0.0.4; extra == "color"
58
+ Provides-Extra: timezone
59
+ Requires-Dist: python-dateutil; extra == "timezone"
60
+ Provides-Extra: url
61
+ Requires-Dist: furl>=0.4.1; extra == "url"
62
+ Provides-Extra: encrypted
63
+ Requires-Dist: cryptography>=0.6; extra == "encrypted"
64
+ Provides-Extra: test-all
65
+ Requires-Dist: Babel>=1.3; extra == "test-all"
66
+ Requires-Dist: Jinja2>=2.3; extra == "test-all"
67
+ Requires-Dist: Pygments>=1.2; extra == "test-all"
68
+ Requires-Dist: arrow>=0.3.4; extra == "test-all"
69
+ Requires-Dist: backports.zoneinfo; python_version < "3.9" and extra == "test-all"
70
+ Requires-Dist: colour>=0.0.4; extra == "test-all"
71
+ Requires-Dist: cryptography>=0.6; extra == "test-all"
72
+ Requires-Dist: docutils>=0.10; extra == "test-all"
73
+ Requires-Dist: flake8>=2.4.0; extra == "test-all"
74
+ Requires-Dist: flexmock>=0.9.7; extra == "test-all"
75
+ Requires-Dist: furl>=0.4.1; extra == "test-all"
76
+ Requires-Dist: intervals>=0.7.1; extra == "test-all"
77
+ Requires-Dist: isort>=4.2.2; extra == "test-all"
78
+ Requires-Dist: passlib<2.0,>=1.6; extra == "test-all"
79
+ Requires-Dist: pendulum>=2.0.5; extra == "test-all"
80
+ Requires-Dist: pg8000>=1.12.4; extra == "test-all"
81
+ Requires-Dist: phonenumbers>=5.9.2; extra == "test-all"
82
+ Requires-Dist: psycopg2>=2.5.1; extra == "test-all"
83
+ Requires-Dist: psycopg2cffi>=2.8.1; extra == "test-all"
84
+ Requires-Dist: psycopg>=3.1.8; extra == "test-all"
85
+ Requires-Dist: pymysql; extra == "test-all"
86
+ Requires-Dist: pyodbc; extra == "test-all"
87
+ Requires-Dist: pytest==7.4.4; extra == "test-all"
88
+ Requires-Dist: python-dateutil; extra == "test-all"
89
+ Requires-Dist: python-dateutil>=2.6; extra == "test-all"
90
+ Requires-Dist: pytz>=2014.2; extra == "test-all"
91
+
92
+
93
+ SQLAlchemy-Utils
94
+ ----------------
95
+
96
+ Various utility functions and custom data types for SQLAlchemy.
@@ -28,7 +28,7 @@ pendulum>=2.0.5
28
28
  phonenumbers>=5.9.2
29
29
 
30
30
  [test]
31
- pytest>=2.7.1
31
+ pytest==7.4.4
32
32
  Pygments>=1.2
33
33
  Jinja2>=2.3
34
34
  docutils>=0.10
@@ -69,7 +69,7 @@ psycopg2cffi>=2.8.1
69
69
  psycopg>=3.1.8
70
70
  pymysql
71
71
  pyodbc
72
- pytest>=2.7.1
72
+ pytest==7.4.4
73
73
  python-dateutil
74
74
  python-dateutil>=2.6
75
75
  pytz>=2014.2
@@ -76,6 +76,9 @@ EncryptedType
76
76
 
77
77
  .. module:: sqlalchemy_utils.types.encrypted.encrypted_type
78
78
 
79
+ .. deprecated:: 0.36.6
80
+ Use StringEncryptedType instead
81
+
79
82
  .. autoclass:: EncryptedType
80
83
 
81
84
  JSONType
@@ -142,6 +145,14 @@ ScalarListType
142
145
  .. autoclass:: ScalarListType
143
146
 
144
147
 
148
+ StringEncryptedType
149
+ -------------------
150
+
151
+ .. module:: sqlalchemy_utils.types.encrypted.encrypted_type
152
+
153
+ .. autoclass:: StringEncryptedType
154
+
155
+
145
156
  TimezoneType
146
157
  ------------
147
158
 
@@ -8,7 +8,6 @@ Supported platforms
8
8
 
9
9
  SQLAlchemy-Utils is currently tested against the following Python platforms.
10
10
 
11
- - cPython 3.6
12
11
  - cPython 3.7
13
12
  - cPython 3.8
14
13
  - cPython 3.9
@@ -22,7 +22,7 @@ def get_version():
22
22
 
23
23
  extras_require = {
24
24
  'test': [
25
- 'pytest>=2.7.1',
25
+ 'pytest==7.4.4',
26
26
  'Pygments>=1.2',
27
27
  'Jinja2>=2.3',
28
28
  'docutils>=0.10',
@@ -79,7 +79,7 @@ setup(
79
79
  "importlib_metadata ; python_version<'3.8'",
80
80
  ],
81
81
  extras_require=extras_require,
82
- python_requires='>=3.6',
82
+ python_requires='>=3.7',
83
83
  classifiers=[
84
84
  'Environment :: Web Environment',
85
85
  'Intended Audience :: Developers',
@@ -87,7 +87,6 @@ setup(
87
87
  'Operating System :: OS Independent',
88
88
  'Programming Language :: Python',
89
89
  'Programming Language :: Python :: 3',
90
- 'Programming Language :: Python :: 3.6',
91
90
  'Programming Language :: Python :: 3.7',
92
91
  'Programming Language :: Python :: 3.8',
93
92
  'Programming Language :: Python :: 3.9',
@@ -101,4 +101,4 @@ from .view import ( # noqa
101
101
  refresh_materialized_view
102
102
  )
103
103
 
104
- __version__ = '0.41.1'
104
+ __version__ = '0.41.2'
@@ -13,7 +13,7 @@ from .orm import quote
13
13
 
14
14
  def escape_like(string, escape_char='*'):
15
15
  """
16
- Escape the string paremeter used in SQL LIKE expressions.
16
+ Escape the string parameter used in SQL LIKE expressions.
17
17
 
18
18
  ::
19
19
 
@@ -13,6 +13,24 @@ from .functions.orm import _get_class_registry
13
13
 
14
14
 
15
15
  class GenericAttributeImpl(attributes.ScalarAttributeImpl):
16
+ def __init__(self, *args, **kwargs):
17
+ """
18
+ The constructor of attributes.AttributeImpl changed in SQLAlchemy 2.0.22,
19
+ adding a 'default_function' required positional argument before 'dispatch'.
20
+ This adjustment ensures compatibility across versions by inserting None for
21
+ 'default_function' in versions >= 2.0.22.
22
+
23
+ Arguments received: (class, key, dispatch)
24
+ Required by AttributeImpl: (class, key, default_function, dispatch)
25
+ Setting None as default_function here.
26
+ """
27
+ # Adjust for SQLAlchemy version change
28
+ sqlalchemy_version = tuple(map(int, sa.__version__.split('.')))
29
+ if sqlalchemy_version >= (2, 0, 22):
30
+ args = (*args[:2], None, *args[2:])
31
+
32
+ super().__init__(*args, **kwargs)
33
+
16
34
  def get(self, state, dict_, passive=attributes.PASSIVE_OFF):
17
35
  if self.key in dict_:
18
36
  return dict_[self.key]
@@ -223,15 +223,15 @@ class FernetEngine(EncryptionDecryptionBaseEngine):
223
223
 
224
224
  class StringEncryptedType(TypeDecorator, ScalarCoercible):
225
225
  """
226
- EncryptedType provides a way to encrypt and decrypt values,
226
+ StringEncryptedType provides a way to encrypt and decrypt values,
227
227
  to and from databases, that their type is a basic SQLAlchemy type.
228
228
  For example Unicode, String or even Boolean.
229
229
  On the way in, the value is encrypted and on the way out the stored value
230
230
  is decrypted.
231
231
 
232
- EncryptedType needs Cryptography_ library in order to work.
232
+ StringEncryptedType needs Cryptography_ library in order to work.
233
233
 
234
- When declaring a column which will be of type EncryptedType
234
+ When declaring a column which will be of type StringEncryptedType
235
235
  it is better to be as precise as possible and follow the pattern
236
236
  below.
237
237
 
@@ -240,11 +240,11 @@ class StringEncryptedType(TypeDecorator, ScalarCoercible):
240
240
  ::
241
241
 
242
242
 
243
- a_column = sa.Column(EncryptedType(sa.Unicode,
243
+ a_column = sa.Column(StringEncryptedType(sa.Unicode,
244
244
  secret_key,
245
245
  FernetEngine))
246
246
 
247
- another_column = sa.Column(EncryptedType(sa.Unicode,
247
+ another_column = sa.Column(StringEncryptedType(sa.Unicode,
248
248
  secret_key,
249
249
  AesEngine,
250
250
  'pkcs5'))
@@ -264,7 +264,7 @@ class StringEncryptedType(TypeDecorator, ScalarCoercible):
264
264
  from sqlalchemy.ext.declarative import declarative_base
265
265
  from sqlalchemy.orm import sessionmaker
266
266
 
267
- from sqlalchemy_utils import EncryptedType
267
+ from sqlalchemy_utils import StringEncryptedType
268
268
  from sqlalchemy_utils.types.encrypted.encrypted_type import AesEngine
269
269
 
270
270
  secret_key = 'secretkey1234'
@@ -277,19 +277,19 @@ class StringEncryptedType(TypeDecorator, ScalarCoercible):
277
277
  class User(Base):
278
278
  __tablename__ = "user"
279
279
  id = sa.Column(sa.Integer, primary_key=True)
280
- username = sa.Column(EncryptedType(sa.Unicode,
280
+ username = sa.Column(StringEncryptedType(sa.Unicode,
281
281
  secret_key,
282
282
  AesEngine,
283
283
  'pkcs5'))
284
- access_token = sa.Column(EncryptedType(sa.String,
284
+ access_token = sa.Column(StringEncryptedType(sa.String,
285
285
  secret_key,
286
286
  AesEngine,
287
287
  'pkcs5'))
288
- is_active = sa.Column(EncryptedType(sa.Boolean,
288
+ is_active = sa.Column(StringEncryptedType(sa.Boolean,
289
289
  secret_key,
290
290
  AesEngine,
291
291
  'zeroes'))
292
- number_of_accounts = sa.Column(EncryptedType(sa.Integer,
292
+ number_of_accounts = sa.Column(StringEncryptedType(sa.Integer,
293
293
  secret_key,
294
294
  AesEngine,
295
295
  'oneandzeroes'))
@@ -345,7 +345,7 @@ class StringEncryptedType(TypeDecorator, ScalarCoercible):
345
345
  class User(Base):
346
346
  __tablename__ = 'user'
347
347
  id = sa.Column(sa.Integer, primary_key=True)
348
- username = sa.Column(EncryptedType(
348
+ username = sa.Column(StringEncryptedType(
349
349
  sa.Unicode, get_key))
350
350
 
351
351
  """
@@ -363,7 +363,7 @@ class StringEncryptedType(TypeDecorator, ScalarCoercible):
363
363
  """Initialization."""
364
364
  if not cryptography:
365
365
  raise ImproperlyConfigured(
366
- "'cryptography' is required to use EncryptedType"
366
+ "'cryptography' is required to use StringEncryptedType"
367
367
  )
368
368
  super().__init__(**kwargs)
369
369
  # set the underlying type
@@ -457,6 +457,11 @@ class StringEncryptedType(TypeDecorator, ScalarCoercible):
457
457
 
458
458
 
459
459
  class EncryptedType(StringEncryptedType):
460
+ """
461
+ The 'EncryptedType' class will change implementation from
462
+ 'LargeBinary' to 'String' in a future version. Use
463
+ 'StringEncryptedType' to use the 'String' implementation.
464
+ """
460
465
  impl = LargeBinary
461
466
 
462
467
  def __init__(self, *args, **kwargs):
@@ -7,15 +7,19 @@ from sqlalchemy_utils.functions import get_columns
7
7
 
8
8
 
9
9
  class CreateView(DDLElement):
10
- def __init__(self, name, selectable, materialized=False):
10
+ def __init__(self, name, selectable, materialized=False, replace=False):
11
+ if materialized and replace:
12
+ raise ValueError("Cannot use CREATE OR REPLACE with materialized views")
11
13
  self.name = name
12
14
  self.selectable = selectable
13
15
  self.materialized = materialized
16
+ self.replace = replace
14
17
 
15
18
 
16
19
  @compiler.compiles(CreateView)
17
20
  def compile_create_materialized_view(element, compiler, **kw):
18
- return 'CREATE {}VIEW {} AS {}'.format(
21
+ return 'CREATE {}{}VIEW {} AS {}'.format(
22
+ 'OR REPLACE ' if element.replace else '',
19
23
  'MATERIALIZED ' if element.materialized else '',
20
24
  compiler.dialect.identifier_preparer.quote(element.name),
21
25
  compiler.sql_compiler.process(element.selectable, literal_binds=True),
@@ -124,7 +128,8 @@ def create_view(
124
128
  name,
125
129
  selectable,
126
130
  metadata,
127
- cascade_on_drop=True
131
+ cascade_on_drop=True,
132
+ replace=False,
128
133
  ):
129
134
  """ Create a view on a given metadata
130
135
 
@@ -133,6 +138,10 @@ def create_view(
133
138
  :param metadata:
134
139
  An SQLAlchemy Metadata instance that stores the features of the
135
140
  database being described.
141
+ :param cascade_on_drop: If ``True`` the view will be dropped with
142
+ ``CASCADE``, deleting all dependent objects as well.
143
+ :param replace: If ``True`` the view will be created with ``OR REPLACE``,
144
+ replacing an existing view with the same name.
136
145
 
137
146
  The process for creating a view is similar to the standard way that a
138
147
  table is constructed, except that a selectable is provided instead of
@@ -164,7 +173,11 @@ def create_view(
164
173
  metadata=None
165
174
  )
166
175
 
167
- sa.event.listen(metadata, 'after_create', CreateView(name, selectable))
176
+ sa.event.listen(
177
+ metadata,
178
+ 'after_create',
179
+ CreateView(name, selectable, replace=replace),
180
+ )
168
181
 
169
182
  @sa.event.listens_for(metadata, 'after_create')
170
183
  def create_indexes(target, connection, **kw):
@@ -44,6 +44,7 @@ def init_models(User, Group):
44
44
  pass
45
45
 
46
46
 
47
+ @pytest.mark.skip
47
48
  @pytest.mark.usefixtures('postgresql_dsn')
48
49
  class TestAggregatesWithManyToManyRelationships:
49
50
 
@@ -8,6 +8,7 @@ from sqlalchemy_utils import (
8
8
  refresh_materialized_view
9
9
  )
10
10
  from sqlalchemy_utils.compat import _select_args
11
+ from sqlalchemy_utils.view import CreateView
11
12
 
12
13
 
13
14
  @pytest.fixture
@@ -15,7 +16,7 @@ def Article(Base, User):
15
16
  class Article(Base):
16
17
  __tablename__ = 'article'
17
18
  id = sa.Column(sa.Integer, primary_key=True)
18
- name = sa.Column(sa.String)
19
+ name = sa.Column(sa.String(128))
19
20
  author_id = sa.Column(sa.Integer, sa.ForeignKey(User.id))
20
21
  author = sa.orm.relationship(User)
21
22
  return Article
@@ -26,7 +27,7 @@ def User(Base):
26
27
  class User(Base):
27
28
  __tablename__ = 'user'
28
29
  id = sa.Column(sa.Integer, primary_key=True)
29
- name = sa.Column(sa.String)
30
+ name = sa.Column(sa.String(128))
30
31
  return User
31
32
 
32
33
 
@@ -121,16 +122,18 @@ class TrivialViewTestCases:
121
122
  engine,
122
123
  metadata,
123
124
  column,
124
- cascade_on_drop
125
+ cascade_on_drop,
126
+ replace=False,
125
127
  ):
126
- __table__ = create_view(
128
+ create_view(
127
129
  name='trivial_view',
128
130
  selectable=sa.select(*_select_args(column)),
129
131
  metadata=metadata,
130
- cascade_on_drop=cascade_on_drop
132
+ cascade_on_drop=cascade_on_drop,
133
+ replace=replace,
131
134
  )
132
- __table__.create(engine)
133
- __table__.drop(engine)
135
+ metadata.create_all(engine)
136
+ metadata.drop_all(engine)
134
137
 
135
138
 
136
139
  class SupportsCascade(TrivialViewTestCases):
@@ -164,13 +167,67 @@ class SupportsNoCascade(TrivialViewTestCases):
164
167
  self.life_cycle(engine, Base.metadata, User.id, cascade_on_drop=False)
165
168
 
166
169
 
170
+ class SupportsReplace(TrivialViewTestCases):
171
+ def test_life_cycle_replace(
172
+ self,
173
+ connection,
174
+ engine,
175
+ Base,
176
+ User
177
+ ):
178
+ self.life_cycle(
179
+ engine,
180
+ Base.metadata,
181
+ User.id,
182
+ cascade_on_drop=False,
183
+ replace=True,
184
+ )
185
+
186
+ def test_life_cycle_replace_existing(
187
+ self,
188
+ connection,
189
+ engine,
190
+ Base,
191
+ User
192
+ ):
193
+ create_view(
194
+ name='trivial_view',
195
+ selectable=sa.select(*_select_args(User.id)),
196
+ metadata=Base.metadata,
197
+ )
198
+ Base.metadata.create_all(engine)
199
+ view = CreateView(
200
+ name='trivial_view',
201
+ selectable=sa.select(*_select_args(User.id)),
202
+ replace=True,
203
+ )
204
+ with connection.begin():
205
+ connection.execute(view)
206
+ Base.metadata.drop_all(engine)
207
+
208
+ def test_replace_materialized(
209
+ self,
210
+ connection,
211
+ engine,
212
+ Base,
213
+ User
214
+ ):
215
+ with pytest.raises(ValueError):
216
+ CreateView(
217
+ name='trivial_view',
218
+ selectable=sa.select(*_select_args(User.id)),
219
+ materialized=True,
220
+ replace=True,
221
+ )
222
+
223
+
167
224
  @pytest.mark.usefixtures('postgresql_dsn')
168
- class TestPostgresTrivialView(SupportsCascade, SupportsNoCascade):
225
+ class TestPostgresTrivialView(SupportsCascade, SupportsNoCascade, SupportsReplace):
169
226
  pass
170
227
 
171
228
 
172
229
  @pytest.mark.usefixtures('mysql_dsn')
173
- class TestMySqlTrivialView(SupportsCascade, SupportsNoCascade):
230
+ class TestMySqlTrivialView(SupportsCascade, SupportsNoCascade, SupportsReplace):
174
231
  pass
175
232
 
176
233
 
@@ -1,43 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: SQLAlchemy-Utils
3
- Version: 0.41.1
4
- Summary: Various utility functions for SQLAlchemy.
5
- Home-page: https://github.com/kvesteri/sqlalchemy-utils
6
- Author: Konsta Vesterinen, Ryan Leckey, Janne Vanhala, Vesa Uimonen
7
- Author-email: konsta@fastmonkeys.com
8
- License: BSD
9
- Platform: any
10
- Classifier: Environment :: Web Environment
11
- Classifier: Intended Audience :: Developers
12
- Classifier: License :: OSI Approved :: BSD License
13
- Classifier: Operating System :: OS Independent
14
- Classifier: Programming Language :: Python
15
- Classifier: Programming Language :: Python :: 3
16
- Classifier: Programming Language :: Python :: 3.6
17
- Classifier: Programming Language :: Python :: 3.7
18
- Classifier: Programming Language :: Python :: 3.8
19
- Classifier: Programming Language :: Python :: 3.9
20
- Classifier: Programming Language :: Python :: 3.10
21
- Classifier: Programming Language :: Python :: 3.11
22
- Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
23
- Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
- Requires-Python: >=3.6
25
- Provides-Extra: test
26
- Provides-Extra: babel
27
- Provides-Extra: arrow
28
- Provides-Extra: pendulum
29
- Provides-Extra: intervals
30
- Provides-Extra: phone
31
- Provides-Extra: password
32
- Provides-Extra: color
33
- Provides-Extra: timezone
34
- Provides-Extra: url
35
- Provides-Extra: encrypted
36
- Provides-Extra: test_all
37
- License-File: LICENSE
38
-
39
-
40
- SQLAlchemy-Utils
41
- ----------------
42
-
43
- Various utility functions and custom data types for SQLAlchemy.