Skip to content

Commit f3cb2d1

Browse files
authored
Revert "chore: cleanup compliance tests for sqlalchemy migration" (#1015)
1 parent 67cb7bd commit f3cb2d1

File tree

9 files changed

+560
-258
lines changed

9 files changed

+560
-258
lines changed

sqlalchemy_bigquery/_struct.py

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,20 @@
1717
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
1818
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1919

20+
import packaging.version
2021
import sqlalchemy.sql.default_comparator
2122
import sqlalchemy.sql.sqltypes
2223
import sqlalchemy.types
2324

2425
from . import base
2526

26-
import sqlalchemy.sql.coercions
27-
import sqlalchemy.sql.roles
27+
sqlalchemy_1_4_or_more = packaging.version.parse(
28+
sqlalchemy.__version__
29+
) >= packaging.version.parse("1.4")
30+
31+
if sqlalchemy_1_4_or_more:
32+
import sqlalchemy.sql.coercions
33+
import sqlalchemy.sql.roles
2834

2935

3036
def _get_subtype_col_spec(type_):
@@ -103,14 +109,30 @@ def __getattr__(self, name):
103109
comparator_factory = Comparator
104110

105111

106-
def _field_index(self, name, operator):
107-
return sqlalchemy.sql.coercions.expect(
108-
sqlalchemy.sql.roles.BinaryElementRole,
109-
name,
110-
expr=self.expr,
111-
operator=operator,
112-
bindparam_type=sqlalchemy.types.String(),
113-
)
112+
# In the implementations of _field_index below, we're stealing from
113+
# the JSON type implementation, but the code to steal changed in
114+
# 1.4. :/
115+
116+
if sqlalchemy_1_4_or_more:
117+
118+
def _field_index(self, name, operator):
119+
return sqlalchemy.sql.coercions.expect(
120+
sqlalchemy.sql.roles.BinaryElementRole,
121+
name,
122+
expr=self.expr,
123+
operator=operator,
124+
bindparam_type=sqlalchemy.types.String(),
125+
)
126+
127+
else:
128+
129+
def _field_index(self, name, operator):
130+
return sqlalchemy.sql.default_comparator._check_literal(
131+
self.expr,
132+
operator,
133+
name,
134+
bindparam_type=sqlalchemy.types.String(),
135+
)
114136

115137

116138
def struct_getitem_op(a, b):

sqlalchemy_bigquery/base.py

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ def get_insert_default(self, column): # pragma: NO COVER
163163
""",
164164
flags=re.IGNORECASE | re.VERBOSE,
165165
)
166-
def __distribute_types_to_expanded_placeholders(self, m): # pragma: NO COVER
166+
def __distribute_types_to_expanded_placeholders(self, m):
167167
# If we have an in parameter, it sometimes gets expaned to 0 or more
168168
# parameters and we need to move the type marker to each
169169
# parameter.
@@ -174,8 +174,6 @@ def __distribute_types_to_expanded_placeholders(self, m): # pragma: NO COVER
174174
# suffixes refect that when an array parameter is expanded,
175175
# numeric suffixes are added. For example, a placeholder like
176176
# `%(foo)s` gets expaneded to `%(foo_0)s, `%(foo_1)s, ...`.
177-
178-
# Coverage: despite our best efforts, never recognized this segment of code as being tested.
179177
placeholders, type_ = m.groups()
180178
if placeholders:
181179
placeholders = placeholders.replace(")", f":{type_})")
@@ -358,7 +356,11 @@ def group_by_clause(self, select, **kw):
358356

359357
__sqlalchemy_version_info = packaging.version.parse(sqlalchemy.__version__)
360358

361-
__expanding_text = "POSTCOMPILE"
359+
__expanding_text = (
360+
"EXPANDING"
361+
if __sqlalchemy_version_info < packaging.version.parse("1.4")
362+
else "POSTCOMPILE"
363+
)
362364

363365
# https://github.com/sqlalchemy/sqlalchemy/commit/f79df12bd6d99b8f6f09d4bf07722638c4b4c159
364366
__expanding_conflict = (
@@ -386,6 +388,9 @@ def visit_in_op_binary(self, binary, operator_, **kw):
386388
self._generate_generic_binary(binary, " IN ", **kw)
387389
)
388390

391+
def visit_empty_set_expr(self, element_types, **kw):
392+
return ""
393+
389394
def visit_not_in_op_binary(self, binary, operator, **kw):
390395
return (
391396
"("
@@ -419,16 +424,31 @@ def visit_contains_op_binary(self, binary, operator, **kw):
419424
self._maybe_reescape(binary), operator, **kw
420425
)
421426

427+
def visit_notcontains_op_binary(self, binary, operator, **kw):
428+
return super(BigQueryCompiler, self).visit_notcontains_op_binary(
429+
self._maybe_reescape(binary), operator, **kw
430+
)
431+
422432
def visit_startswith_op_binary(self, binary, operator, **kw):
423433
return super(BigQueryCompiler, self).visit_startswith_op_binary(
424434
self._maybe_reescape(binary), operator, **kw
425435
)
426436

437+
def visit_notstartswith_op_binary(self, binary, operator, **kw):
438+
return super(BigQueryCompiler, self).visit_notstartswith_op_binary(
439+
self._maybe_reescape(binary), operator, **kw
440+
)
441+
427442
def visit_endswith_op_binary(self, binary, operator, **kw):
428443
return super(BigQueryCompiler, self).visit_endswith_op_binary(
429444
self._maybe_reescape(binary), operator, **kw
430445
)
431446

447+
def visit_notendswith_op_binary(self, binary, operator, **kw):
448+
return super(BigQueryCompiler, self).visit_notendswith_op_binary(
449+
self._maybe_reescape(binary), operator, **kw
450+
)
451+
432452
############################################################################
433453

434454
__placeholder = re.compile(r"%\(([^\]:]+)(:[^\]:]+)?\)s$").match
@@ -490,8 +510,7 @@ def visit_bindparam(
490510
# here, because then we can't do a recompile later (e.g., first
491511
# print the statment, then execute it). See issue #357.
492512
#
493-
# Coverage: despite our best efforts, never recognized this segment of code as being tested.
494-
if getattr(bindparam, "expand_op", None) is not None: # pragma: NO COVER
513+
if getattr(bindparam, "expand_op", None) is not None:
495514
assert bindparam.expand_op.__name__.endswith("in_op") # in in
496515
bindparam = bindparam._clone(maintain_key=True)
497516
bindparam.expanding = False
@@ -1259,6 +1278,10 @@ def do_rollback(self, dbapi_connection):
12591278
# BigQuery has no support for transactions.
12601279
pass
12611280

1281+
def _check_unicode_returns(self, connection, additional_tests=None):
1282+
# requests gives back Unicode strings
1283+
return True
1284+
12621285
def get_view_definition(self, connection, view_name, schema=None, **kw):
12631286
if isinstance(connection, Engine):
12641287
connection = connection.connect()

sqlalchemy_bigquery/requirements.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import sqlalchemy.testing.requirements
2626
import sqlalchemy.testing.exclusions
27+
from sqlalchemy.testing.exclusions import against, only_on
2728

2829
supported = sqlalchemy.testing.exclusions.open
2930
unsupported = sqlalchemy.testing.exclusions.closed

0 commit comments

Comments
 (0)