requirements.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. from sqlalchemy.testing.requirements import Requirements
  2. from alembic import util
  3. from ..testing import exclusions
  4. class SuiteRequirements(Requirements):
  5. @property
  6. def schemas(self):
  7. """Target database must support external schemas, and have one
  8. named 'test_schema'."""
  9. return exclusions.open()
  10. @property
  11. def autocommit_isolation(self):
  12. """target database should support 'AUTOCOMMIT' isolation level"""
  13. return exclusions.closed()
  14. @property
  15. def materialized_views(self):
  16. """needed for sqlalchemy compat"""
  17. return exclusions.closed()
  18. @property
  19. def unique_constraint_reflection(self):
  20. def doesnt_have_check_uq_constraints(config):
  21. from sqlalchemy import inspect
  22. insp = inspect(config.db)
  23. try:
  24. insp.get_unique_constraints("x")
  25. except NotImplementedError:
  26. return True
  27. except TypeError:
  28. return True
  29. except Exception:
  30. pass
  31. return False
  32. return exclusions.skip_if(doesnt_have_check_uq_constraints)
  33. @property
  34. def sequences(self):
  35. """Target database must support SEQUENCEs."""
  36. return exclusions.only_if(
  37. [lambda config: config.db.dialect.supports_sequences],
  38. "no sequence support",
  39. )
  40. @property
  41. def foreign_key_match(self):
  42. return exclusions.open()
  43. @property
  44. def foreign_key_constraint_reflection(self):
  45. return exclusions.open()
  46. @property
  47. def check_constraints_w_enforcement(self):
  48. """Target database must support check constraints
  49. and also enforce them."""
  50. return exclusions.open()
  51. @property
  52. def reflects_pk_names(self):
  53. return exclusions.closed()
  54. @property
  55. def reflects_fk_options(self):
  56. return exclusions.closed()
  57. @property
  58. def sqlalchemy_1x(self):
  59. return exclusions.skip_if(
  60. lambda config: util.sqla_2,
  61. "SQLAlchemy 1.x test",
  62. )
  63. @property
  64. def sqlalchemy_2(self):
  65. return exclusions.skip_if(
  66. lambda config: not util.sqla_2,
  67. "SQLAlchemy 2.x test",
  68. )
  69. @property
  70. def asyncio(self):
  71. def go(config):
  72. try:
  73. import greenlet # noqa: F401
  74. except ImportError:
  75. return False
  76. else:
  77. return True
  78. return exclusions.only_if(go)
  79. @property
  80. def comments(self):
  81. return exclusions.only_if(
  82. lambda config: config.db.dialect.supports_comments
  83. )
  84. @property
  85. def alter_column(self):
  86. return exclusions.open()
  87. @property
  88. def computed_columns(self):
  89. return exclusions.closed()
  90. @property
  91. def autoincrement_on_composite_pk(self):
  92. return exclusions.closed()
  93. @property
  94. def fk_ondelete_is_reflected(self):
  95. return exclusions.closed()
  96. @property
  97. def fk_onupdate_is_reflected(self):
  98. return exclusions.closed()
  99. @property
  100. def fk_onupdate(self):
  101. return exclusions.open()
  102. @property
  103. def fk_ondelete_restrict(self):
  104. return exclusions.open()
  105. @property
  106. def fk_onupdate_restrict(self):
  107. return exclusions.open()
  108. @property
  109. def fk_ondelete_noaction(self):
  110. return exclusions.open()
  111. @property
  112. def fk_initially(self):
  113. return exclusions.closed()
  114. @property
  115. def fk_deferrable(self):
  116. return exclusions.closed()
  117. @property
  118. def fk_deferrable_is_reflected(self):
  119. return exclusions.closed()
  120. @property
  121. def fk_names(self):
  122. return exclusions.open()
  123. @property
  124. def integer_subtype_comparisons(self):
  125. return exclusions.open()
  126. @property
  127. def no_name_normalize(self):
  128. return exclusions.skip_if(
  129. lambda config: config.db.dialect.requires_name_normalize
  130. )
  131. @property
  132. def identity_columns(self):
  133. return exclusions.closed()
  134. @property
  135. def identity_columns_alter(self):
  136. return exclusions.closed()