Merge lp:~cjwatson/storm/case-sensitive-like-helpers into lp:storm

Proposed by Colin Watson
Status: Merged
Merged at revision: 566
Proposed branch: lp:~cjwatson/storm/case-sensitive-like-helpers
Merge into: lp:storm
Diff against target: 103 lines (+43/-6)
3 files modified
NEWS (+10/-0)
storm/expr.py (+6/-6)
storm/tests/expr.py (+27/-0)
To merge this branch: bzr merge lp:~cjwatson/storm/case-sensitive-like-helpers
Reviewer Review Type Date Requested Status
Ioana Lasc (community) Approve
Storm Developers Pending
Review via email: mp+394982@code.launchpad.net

Commit message

Add optional case_sensitive argument to several Like helpers.

Description of the change

Comparable.startswith, Comparable.endswith, and Comparable.contains_string are convenience wrappers around Like, but none of them supported the case_sensitive option which Like supports on PostgreSQL. This made using PostgreSQL's ILIKE extension somewhat cumbersome in places: see https://code.launchpad.net/~cjwatson/launchpad/+git/launchpad/+merge/394702 for a verbose workaround that would be simpler with the aid of this patch (e.g. `POMsgID.msgid.contains_string(text, case_sensitive=False)`).

To post a comment you must log in.
Revision history for this message
Ioana Lasc (ilasc) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'NEWS'
2--- NEWS 2020-06-12 10:37:06 +0000
3+++ NEWS 2020-12-07 22:43:51 +0000
4@@ -1,3 +1,13 @@
5+0.25
6+====
7+
8+Improvements
9+------------
10+
11+- Add optional case_sensitive argument to Comparable.startswith,
12+ Comparable.endswith, and Comparable.contains_string. This is only
13+ supported in the PostgreSQL backend.
14+
15 0.24 (2020-06-12)
16 =================
17
18
19=== modified file 'storm/expr.py'
20--- storm/expr.py 2020-02-10 15:30:23 +0000
21+++ storm/expr.py 2020-12-07 22:43:51 +0000
22@@ -517,23 +517,23 @@
23 def upper(self):
24 return Upper(self)
25
26- def startswith(self, prefix):
27+ def startswith(self, prefix, case_sensitive=None):
28 if not isinstance(prefix, six.text_type):
29 raise ExprError("Expected text argument, got %r" % type(prefix))
30 pattern = prefix.translate(like_escape) + u"%"
31- return Like(self, pattern, u"!")
32+ return Like(self, pattern, u"!", case_sensitive)
33
34- def endswith(self, suffix):
35+ def endswith(self, suffix, case_sensitive=None):
36 if not isinstance(suffix, six.text_type):
37 raise ExprError("Expected text argument, got %r" % type(suffix))
38 pattern = u"%" + suffix.translate(like_escape)
39- return Like(self, pattern, u"!")
40+ return Like(self, pattern, u"!", case_sensitive)
41
42- def contains_string(self, substring):
43+ def contains_string(self, substring, case_sensitive=None):
44 if not isinstance(substring, six.text_type):
45 raise ExprError("Expected text argument, got %r" % type(substring))
46 pattern = u"%" + substring.translate(like_escape) + u"%"
47- return Like(self, pattern, u"!")
48+ return Like(self, pattern, u"!", case_sensitive)
49
50
51 class ComparableExpr(Expr, Comparable):
52
53=== modified file 'storm/tests/expr.py'
54--- storm/tests/expr.py 2020-02-10 15:30:23 +0000
55+++ storm/tests/expr.py 2020-12-07 22:43:51 +0000
56@@ -199,6 +199,15 @@
57 self.assertEqual(like_expr.expr2, u"abc!!!!!_!%%")
58 self.assertEqual(like_expr.escape, u"!")
59
60+ def test_startswith_case(self):
61+ expr = Func1()
62+ like_expr = expr.startswith(u"abc!!_%")
63+ self.assertIsNone(like_expr.case_sensitive)
64+ like_expr = expr.startswith(u"abc!!_%", case_sensitive=True)
65+ self.assertIs(True, like_expr.case_sensitive)
66+ like_expr = expr.startswith(u"abc!!_%", case_sensitive=False)
67+ self.assertIs(False, like_expr.case_sensitive)
68+
69 def test_endswith(self):
70 expr = Func1()
71 self.assertRaises(ExprError, expr.startswith, b"not a unicode string")
72@@ -209,6 +218,15 @@
73 self.assertEqual(like_expr.expr2, u"%abc!!!!!_!%")
74 self.assertEqual(like_expr.escape, u"!")
75
76+ def test_endswith_case(self):
77+ expr = Func1()
78+ like_expr = expr.endswith(u"abc!!_%")
79+ self.assertIsNone(like_expr.case_sensitive)
80+ like_expr = expr.endswith(u"abc!!_%", case_sensitive=True)
81+ self.assertIs(True, like_expr.case_sensitive)
82+ like_expr = expr.endswith(u"abc!!_%", case_sensitive=False)
83+ self.assertIs(False, like_expr.case_sensitive)
84+
85 def test_contains_string(self):
86 expr = Func1()
87 self.assertRaises(
88@@ -220,6 +238,15 @@
89 self.assertEqual(like_expr.expr2, u"%abc!!!!!_!%%")
90 self.assertEqual(like_expr.escape, u"!")
91
92+ def test_contains_string_case(self):
93+ expr = Func1()
94+ like_expr = expr.contains_string(u"abc!!_%")
95+ self.assertIsNone(like_expr.case_sensitive)
96+ like_expr = expr.contains_string(u"abc!!_%", case_sensitive=True)
97+ self.assertIs(True, like_expr.case_sensitive)
98+ like_expr = expr.contains_string(u"abc!!_%", case_sensitive=False)
99+ self.assertIs(False, like_expr.case_sensitive)
100+
101 def test_eq(self):
102 expr = Eq(elem1, elem2)
103 self.assertEqual(expr.expr1, elem1)

Subscribers

People subscribed via source and target branches

to status/vote changes: