Merge lp:~cjwatson/storm/expr-spacing into lp:storm

Proposed by Colin Watson
Status: Merged
Merged at revision: 542
Proposed branch: lp:~cjwatson/storm/expr-spacing
Merge into: lp:storm
Diff against target: 298 lines (+47/-37)
4 files modified
NEWS (+8/-0)
storm/expr.py (+7/-7)
storm/tests/databases/postgres.py (+1/-1)
storm/tests/expr.py (+31/-29)
To merge this branch: bzr merge lp:~cjwatson/storm/expr-spacing
Reviewer Review Type Date Requested Status
Simon Poirier (community) Approve
Review via email: mp+376529@code.launchpad.net

Commit message

Add whitespace around "<<", ">>", "+", "-", "*", "/", and "%" operators.

Description of the change

I ran into this when using flask-storm's RequestTracer, which uses sqlparse to help it substitute parameters in its trace output; it was getting confused because sqlparse parses "expr+%s" as "expr", "+%", "s" rather than "expr", "+", "%s". Adding surrounding whitespace removes the ambiguity here.

To post a comment you must log in.
Revision history for this message
Simon Poirier (simpoir) wrote :

+1 LGTM

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 2019-11-21 16:06:52 +0000
3+++ NEWS 2019-12-09 17:40:55 +0000
4@@ -1,6 +1,14 @@
5 0.23 (XXXX-XX-XX)
6 =================
7
8+Improvements
9+------------
10+
11+- Add whitespace around "<<", ">>", "+", "-", "*", "/", and "%" operators.
12+ This helps to avoid confusion in tracers, since they run before parameter
13+ substitution: for example, sqlparse parses "expr+%s" as "expr", "+%", "s"
14+ rather than "expr", "+", "%s".
15+
16 Bug fixes
17 ---------
18
19
20=== modified file 'storm/expr.py'
21--- storm/expr.py 2019-09-17 09:35:10 +0000
22+++ storm/expr.py 2019-12-09 17:40:55 +0000
23@@ -1091,11 +1091,11 @@
24
25 class RShift(BinaryOper):
26 __slots__ = ()
27- oper = ">>"
28+ oper = " >> "
29
30 class LShift(BinaryOper):
31 __slots__ = ()
32- oper = "<<"
33+ oper = " << "
34
35
36 class Like(BinaryOper):
37@@ -1139,23 +1139,23 @@
38
39 class Add(CompoundOper):
40 __slots__ = ()
41- oper = "+"
42+ oper = " + "
43
44 class Sub(NonAssocBinaryOper):
45 __slots__ = ()
46- oper = "-"
47+ oper = " - "
48
49 class Mul(CompoundOper):
50 __slots__ = ()
51- oper = "*"
52+ oper = " * "
53
54 class Div(NonAssocBinaryOper):
55 __slots__ = ()
56- oper = "/"
57+ oper = " / "
58
59 class Mod(NonAssocBinaryOper):
60 __slots__ = ()
61- oper = "%"
62+ oper = " % "
63
64
65 class And(CompoundOper):
66
67=== modified file 'storm/tests/databases/postgres.py'
68--- storm/tests/databases/postgres.py 2019-11-21 16:06:52 +0000
69+++ storm/tests/databases/postgres.py 2019-12-09 17:40:55 +0000
70@@ -285,7 +285,7 @@
71 self.assertEqual(statement,
72 'SELECT * FROM '
73 '((SELECT 1 AS id) UNION ALL (SELECT 1)) AS "_1" '
74- 'ORDER BY id+? LIMIT 1 OFFSET 1')
75+ 'ORDER BY id + ? LIMIT 1 OFFSET 1')
76 self.assertVariablesEqual(state.parameters, [Variable(1)])
77
78 result = self.connection.execute(expr)
79
80=== modified file 'storm/tests/expr.py'
81--- storm/tests/expr.py 2019-11-21 16:06:52 +0000
82+++ storm/tests/expr.py 2019-12-09 17:40:55 +0000
83@@ -502,7 +502,8 @@
84 expr = And(e[1], Or(e[2], e[3]),
85 Add(e[4], Mul(e[5], Sub(e[6], Div(e[7], Div(e[8], e[9]))))))
86 statement = compile(expr)
87- self.assertEqual(statement, "1 AND (2 OR 3) AND 4+5*(6-7/(8/9))")
88+ self.assertEqual(statement,
89+ "1 AND (2 OR 3) AND 4 + 5 * (6 - 7 / (8 / 9))")
90
91 expr = Func1(Select(Count()), [Select(Count())])
92 statement = compile(expr)
93@@ -1196,26 +1197,26 @@
94 expr = LShift(Func1(), Func2())
95 state = State()
96 statement = compile(expr, state)
97- self.assertEqual(statement, "func1()<<func2()")
98+ self.assertEqual(statement, "func1() << func2()")
99 self.assertEqual(state.parameters, [])
100
101 expr = Func1() << "value"
102 state = State()
103 statement = compile(expr, state)
104- self.assertEqual(statement, "func1()<<?")
105+ self.assertEqual(statement, "func1() << ?")
106 self.assertVariablesEqual(state.parameters, [Variable("value")])
107
108 def test_rshift(self):
109 expr = RShift(Func1(), Func2())
110 state = State()
111 statement = compile(expr, state)
112- self.assertEqual(statement, "func1()>>func2()")
113+ self.assertEqual(statement, "func1() >> func2()")
114 self.assertEqual(state.parameters, [])
115
116 expr = Func1() >> "value"
117 state = State()
118 statement = compile(expr, state)
119- self.assertEqual(statement, "func1()>>?")
120+ self.assertEqual(statement, "func1() >> ?")
121 self.assertVariablesEqual(state.parameters, [Variable("value")])
122
123 def test_like(self):
124@@ -1311,83 +1312,83 @@
125 expr = Add(elem1, elem2, Add(elem3, elem4))
126 state = State()
127 statement = compile(expr, state)
128- self.assertEqual(statement, "elem1+elem2+elem3+elem4")
129+ self.assertEqual(statement, "elem1 + elem2 + elem3 + elem4")
130 self.assertEqual(state.parameters, [])
131
132 expr = Func1() + "value"
133 state = State()
134 statement = compile(expr, state)
135- self.assertEqual(statement, "func1()+?")
136+ self.assertEqual(statement, "func1() + ?")
137 self.assertVariablesEqual(state.parameters, [Variable("value")])
138
139 def test_sub(self):
140 expr = Sub(elem1, Sub(elem2, elem3))
141 state = State()
142 statement = compile(expr, state)
143- self.assertEqual(statement, "elem1-(elem2-elem3)")
144+ self.assertEqual(statement, "elem1 - (elem2 - elem3)")
145 self.assertEqual(state.parameters, [])
146
147 expr = Sub(Sub(elem1, elem2), elem3)
148 state = State()
149 statement = compile(expr, state)
150- self.assertEqual(statement, "elem1-elem2-elem3")
151+ self.assertEqual(statement, "elem1 - elem2 - elem3")
152 self.assertVariablesEqual(state.parameters, [])
153
154 expr = Func1() - "value"
155 state = State()
156 statement = compile(expr, state)
157- self.assertEqual(statement, "func1()-?")
158+ self.assertEqual(statement, "func1() - ?")
159 self.assertVariablesEqual(state.parameters, [Variable("value")])
160
161 def test_mul(self):
162 expr = Mul(elem1, elem2, Mul(elem3, elem4))
163 state = State()
164 statement = compile(expr, state)
165- self.assertEqual(statement, "elem1*elem2*elem3*elem4")
166+ self.assertEqual(statement, "elem1 * elem2 * elem3 * elem4")
167 self.assertEqual(state.parameters, [])
168
169 expr = Func1() * "value"
170 state = State()
171 statement = compile(expr, state)
172- self.assertEqual(statement, "func1()*?")
173+ self.assertEqual(statement, "func1() * ?")
174 self.assertVariablesEqual(state.parameters, [Variable("value")])
175
176 def test_div(self):
177 expr = Div(elem1, Div(elem2, elem3))
178 state = State()
179 statement = compile(expr, state)
180- self.assertEqual(statement, "elem1/(elem2/elem3)")
181+ self.assertEqual(statement, "elem1 / (elem2 / elem3)")
182 self.assertEqual(state.parameters, [])
183
184 expr = Div(Div(elem1, elem2), elem3)
185 state = State()
186 statement = compile(expr, state)
187- self.assertEqual(statement, "elem1/elem2/elem3")
188+ self.assertEqual(statement, "elem1 / elem2 / elem3")
189 self.assertEqual(state.parameters, [])
190
191 expr = Func1() / "value"
192 state = State()
193 statement = compile(expr, state)
194- self.assertEqual(statement, "func1()/?")
195+ self.assertEqual(statement, "func1() / ?")
196 self.assertVariablesEqual(state.parameters, [Variable("value")])
197
198 def test_mod(self):
199 expr = Mod(elem1, Mod(elem2, elem3))
200 state = State()
201 statement = compile(expr, state)
202- self.assertEqual(statement, "elem1%(elem2%elem3)")
203+ self.assertEqual(statement, "elem1 % (elem2 % elem3)")
204 self.assertEqual(state.parameters, [])
205
206 expr = Mod(Mod(elem1, elem2), elem3)
207 state = State()
208 statement = compile(expr, state)
209- self.assertEqual(statement, "elem1%elem2%elem3")
210+ self.assertEqual(statement, "elem1 % elem2 % elem3")
211 self.assertEqual(state.parameters, [])
212
213 expr = Func1() % "value"
214 state = State()
215 statement = compile(expr, state)
216- self.assertEqual(statement, "func1()%?")
217+ self.assertEqual(statement, "func1() % ?")
218 self.assertVariablesEqual(state.parameters, [Variable("value")])
219
220 def test_func(self):
221@@ -2138,7 +2139,8 @@
222 expr = And(e[1], Or(e[2], e[3]),
223 Add(e[4], Mul(e[5], Sub(e[6], Div(e[7], Div(e[8], e[9]))))))
224 py_expr = compile_python(expr)
225- self.assertEqual(py_expr, "1 and (2 or 3) and 4+5*(6-7/(8/9))")
226+ self.assertEqual(py_expr,
227+ "1 and (2 or 3) and 4 + 5 * (6 - 7 / (8 / 9))")
228
229 def test_get_precedence(self):
230 self.assertTrue(compile_python.get_precedence(Or) <
231@@ -2290,14 +2292,14 @@
232 expr = LShift(Variable(1), Variable(2))
233 state = State()
234 py_expr = compile_python(expr, state)
235- self.assertEqual(py_expr, "_0<<_1")
236+ self.assertEqual(py_expr, "_0 << _1")
237 self.assertEqual(state.parameters, [1, 2])
238
239 def test_rshift(self):
240 expr = RShift(Variable(1), Variable(2))
241 state = State()
242 py_expr = compile_python(expr, state)
243- self.assertEqual(py_expr, "_0>>_1")
244+ self.assertEqual(py_expr, "_0 >> _1")
245 self.assertEqual(state.parameters, [1, 2])
246
247 def test_in(self):
248@@ -2320,7 +2322,7 @@
249 def test_add(self):
250 expr = Add(elem1, elem2, Add(elem3, elem4))
251 py_expr = compile_python(expr)
252- self.assertEqual(py_expr, "elem1+elem2+elem3+elem4")
253+ self.assertEqual(py_expr, "elem1 + elem2 + elem3 + elem4")
254
255 def test_neg(self):
256 expr = Neg(elem1)
257@@ -2330,34 +2332,34 @@
258 def test_sub(self):
259 expr = Sub(elem1, Sub(elem2, elem3))
260 py_expr = compile_python(expr)
261- self.assertEqual(py_expr, "elem1-(elem2-elem3)")
262+ self.assertEqual(py_expr, "elem1 - (elem2 - elem3)")
263
264 expr = Sub(Sub(elem1, elem2), elem3)
265 py_expr = compile_python(expr)
266- self.assertEqual(py_expr, "elem1-elem2-elem3")
267+ self.assertEqual(py_expr, "elem1 - elem2 - elem3")
268
269 def test_mul(self):
270 expr = Mul(elem1, elem2, Mul(elem3, elem4))
271 py_expr = compile_python(expr)
272- self.assertEqual(py_expr, "elem1*elem2*elem3*elem4")
273+ self.assertEqual(py_expr, "elem1 * elem2 * elem3 * elem4")
274
275 def test_div(self):
276 expr = Div(elem1, Div(elem2, elem3))
277 py_expr = compile_python(expr)
278- self.assertEqual(py_expr, "elem1/(elem2/elem3)")
279+ self.assertEqual(py_expr, "elem1 / (elem2 / elem3)")
280
281 expr = Div(Div(elem1, elem2), elem3)
282 py_expr = compile_python(expr)
283- self.assertEqual(py_expr, "elem1/elem2/elem3")
284+ self.assertEqual(py_expr, "elem1 / elem2 / elem3")
285
286 def test_mod(self):
287 expr = Mod(elem1, Mod(elem2, elem3))
288 py_expr = compile_python(expr)
289- self.assertEqual(py_expr, "elem1%(elem2%elem3)")
290+ self.assertEqual(py_expr, "elem1 % (elem2 % elem3)")
291
292 expr = Mod(Mod(elem1, elem2), elem3)
293 py_expr = compile_python(expr)
294- self.assertEqual(py_expr, "elem1%elem2%elem3")
295+ self.assertEqual(py_expr, "elem1 % elem2 % elem3")
296
297 def test_match(self):
298 col1 = Column(column1)

Subscribers

People subscribed via source and target branches

to status/vote changes: