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
=== modified file 'NEWS'
--- NEWS 2020-06-12 10:37:06 +0000
+++ NEWS 2020-12-07 22:43:51 +0000
@@ -1,3 +1,13 @@
10.25
2====
3
4Improvements
5------------
6
7- Add optional case_sensitive argument to Comparable.startswith,
8 Comparable.endswith, and Comparable.contains_string. This is only
9 supported in the PostgreSQL backend.
10
10.24 (2020-06-12)110.24 (2020-06-12)
2=================12=================
313
414
=== modified file 'storm/expr.py'
--- storm/expr.py 2020-02-10 15:30:23 +0000
+++ storm/expr.py 2020-12-07 22:43:51 +0000
@@ -517,23 +517,23 @@
517 def upper(self):517 def upper(self):
518 return Upper(self)518 return Upper(self)
519519
520 def startswith(self, prefix):520 def startswith(self, prefix, case_sensitive=None):
521 if not isinstance(prefix, six.text_type):521 if not isinstance(prefix, six.text_type):
522 raise ExprError("Expected text argument, got %r" % type(prefix))522 raise ExprError("Expected text argument, got %r" % type(prefix))
523 pattern = prefix.translate(like_escape) + u"%"523 pattern = prefix.translate(like_escape) + u"%"
524 return Like(self, pattern, u"!")524 return Like(self, pattern, u"!", case_sensitive)
525525
526 def endswith(self, suffix):526 def endswith(self, suffix, case_sensitive=None):
527 if not isinstance(suffix, six.text_type):527 if not isinstance(suffix, six.text_type):
528 raise ExprError("Expected text argument, got %r" % type(suffix))528 raise ExprError("Expected text argument, got %r" % type(suffix))
529 pattern = u"%" + suffix.translate(like_escape)529 pattern = u"%" + suffix.translate(like_escape)
530 return Like(self, pattern, u"!")530 return Like(self, pattern, u"!", case_sensitive)
531531
532 def contains_string(self, substring):532 def contains_string(self, substring, case_sensitive=None):
533 if not isinstance(substring, six.text_type):533 if not isinstance(substring, six.text_type):
534 raise ExprError("Expected text argument, got %r" % type(substring))534 raise ExprError("Expected text argument, got %r" % type(substring))
535 pattern = u"%" + substring.translate(like_escape) + u"%"535 pattern = u"%" + substring.translate(like_escape) + u"%"
536 return Like(self, pattern, u"!")536 return Like(self, pattern, u"!", case_sensitive)
537537
538538
539class ComparableExpr(Expr, Comparable):539class ComparableExpr(Expr, Comparable):
540540
=== modified file 'storm/tests/expr.py'
--- storm/tests/expr.py 2020-02-10 15:30:23 +0000
+++ storm/tests/expr.py 2020-12-07 22:43:51 +0000
@@ -199,6 +199,15 @@
199 self.assertEqual(like_expr.expr2, u"abc!!!!!_!%%")199 self.assertEqual(like_expr.expr2, u"abc!!!!!_!%%")
200 self.assertEqual(like_expr.escape, u"!")200 self.assertEqual(like_expr.escape, u"!")
201201
202 def test_startswith_case(self):
203 expr = Func1()
204 like_expr = expr.startswith(u"abc!!_%")
205 self.assertIsNone(like_expr.case_sensitive)
206 like_expr = expr.startswith(u"abc!!_%", case_sensitive=True)
207 self.assertIs(True, like_expr.case_sensitive)
208 like_expr = expr.startswith(u"abc!!_%", case_sensitive=False)
209 self.assertIs(False, like_expr.case_sensitive)
210
202 def test_endswith(self):211 def test_endswith(self):
203 expr = Func1()212 expr = Func1()
204 self.assertRaises(ExprError, expr.startswith, b"not a unicode string")213 self.assertRaises(ExprError, expr.startswith, b"not a unicode string")
@@ -209,6 +218,15 @@
209 self.assertEqual(like_expr.expr2, u"%abc!!!!!_!%")218 self.assertEqual(like_expr.expr2, u"%abc!!!!!_!%")
210 self.assertEqual(like_expr.escape, u"!")219 self.assertEqual(like_expr.escape, u"!")
211220
221 def test_endswith_case(self):
222 expr = Func1()
223 like_expr = expr.endswith(u"abc!!_%")
224 self.assertIsNone(like_expr.case_sensitive)
225 like_expr = expr.endswith(u"abc!!_%", case_sensitive=True)
226 self.assertIs(True, like_expr.case_sensitive)
227 like_expr = expr.endswith(u"abc!!_%", case_sensitive=False)
228 self.assertIs(False, like_expr.case_sensitive)
229
212 def test_contains_string(self):230 def test_contains_string(self):
213 expr = Func1()231 expr = Func1()
214 self.assertRaises(232 self.assertRaises(
@@ -220,6 +238,15 @@
220 self.assertEqual(like_expr.expr2, u"%abc!!!!!_!%%")238 self.assertEqual(like_expr.expr2, u"%abc!!!!!_!%%")
221 self.assertEqual(like_expr.escape, u"!")239 self.assertEqual(like_expr.escape, u"!")
222240
241 def test_contains_string_case(self):
242 expr = Func1()
243 like_expr = expr.contains_string(u"abc!!_%")
244 self.assertIsNone(like_expr.case_sensitive)
245 like_expr = expr.contains_string(u"abc!!_%", case_sensitive=True)
246 self.assertIs(True, like_expr.case_sensitive)
247 like_expr = expr.contains_string(u"abc!!_%", case_sensitive=False)
248 self.assertIs(False, like_expr.case_sensitive)
249
223 def test_eq(self):250 def test_eq(self):
224 expr = Eq(elem1, elem2)251 expr = Eq(elem1, elem2)
225 self.assertEqual(expr.expr1, elem1)252 self.assertEqual(expr.expr1, elem1)

Subscribers

People subscribed via source and target branches

to status/vote changes: