pass
+class _NoObject(operators.ColumnOperators):
+ def operate(self, *arg, **kw):
+ return None
+
+ def reverse_operate(self, *arg, **kw):
+ return None
+
+
+_NO_OBJECT = _NoObject()
+
_straight_ops = set(
getattr(operators, op)
for op in (
)
_extended_ops = {
- operators.in_op: (lambda a, b: a in b),
- operators.not_in_op: (lambda a, b: a not in b),
+ operators.in_op: (lambda a, b: a in b if a is not _NO_OBJECT else None),
+ operators.not_in_op: (
+ lambda a, b: a not in b if a is not _NO_OBJECT else None
+ ),
}
_notimplemented_ops = set(
raise UnevaluatableError("Cannot evaluate column: %s" % clause)
get_corresponding_attr = operator.attrgetter(key)
- return lambda obj: get_corresponding_attr(obj)
+ return (
+ lambda obj: get_corresponding_attr(obj)
+ if obj is not None
+ else _NO_OBJECT
+ )
def visit_tuple(self, clause):
return self.visit_clauselist(clause)
for sub_evaluate in evaluators:
value = sub_evaluate(obj)
if not value:
- if value is None:
+ if value is None or value is _NO_OBJECT:
return None
return False
return True
values = []
for sub_evaluate in evaluators:
value = sub_evaluate(obj)
- if value is None:
+ if value is None or value is _NO_OBJECT:
return None
values.append(value)
return tuple(values)
eval_eq(
User.name == None, # noqa
- testcases=[(User(name="foo"), False), (User(name=None), True)],
+ testcases=[
+ (User(name="foo"), False),
+ (User(name=None), True),
+ (None, None),
+ ],
)
def test_warn_on_unannotated_matched_column(self):
(User(name="foo"), False),
(User(name=True), False),
(User(name=False), True),
+ (None, None),
],
)
(User(name="foo"), False),
(User(name=True), True),
(User(name=False), False),
+ (None, None),
],
)
(User(id=1, name="bar"), False),
(User(id=2, name="bar"), False),
(User(id=1, name=None), None),
+ (None, None),
],
)
(User(id=2, name="bar"), False),
(User(id=1, name=None), True),
(User(id=2, name=None), None),
+ (None, None),
],
)
(User(id=2, name="bat"), False),
(User(id=1, name="bar"), True),
(User(id=1, name=None), None),
+ (None, None),
],
)
(User(id=2, name="bat"), True),
(User(id=1, name="bar"), False),
(User(id=1, name=None), None),
+ (None, None),
],
)
(User(id=1, name="bar"), False),
(User(id=2, name="bar"), True),
(User(id=1, name=None), None),
+ (None, None),
],
)
(User(id=1, name="bar"), True),
(User(id=2, name="bar"), False),
(User(id=1, name=None), None),
+ (None, None),
],
)
(User(id=2, name="bar"), True),
(User(id=None, name="foo"), None),
(User(id=None, name=None), None),
+ (None, None),
],
)