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
=== modified file 'NEWS'
--- NEWS 2019-11-21 16:06:52 +0000
+++ NEWS 2019-12-09 17:40:55 +0000
@@ -1,6 +1,14 @@
10.23 (XXXX-XX-XX)10.23 (XXXX-XX-XX)
2=================2=================
33
4Improvements
5------------
6
7- Add whitespace around "<<", ">>", "+", "-", "*", "/", and "%" operators.
8 This helps to avoid confusion in tracers, since they run before parameter
9 substitution: for example, sqlparse parses "expr+%s" as "expr", "+%", "s"
10 rather than "expr", "+", "%s".
11
4Bug fixes12Bug fixes
5---------13---------
614
715
=== modified file 'storm/expr.py'
--- storm/expr.py 2019-09-17 09:35:10 +0000
+++ storm/expr.py 2019-12-09 17:40:55 +0000
@@ -1091,11 +1091,11 @@
10911091
1092class RShift(BinaryOper):1092class RShift(BinaryOper):
1093 __slots__ = ()1093 __slots__ = ()
1094 oper = ">>"1094 oper = " >> "
10951095
1096class LShift(BinaryOper):1096class LShift(BinaryOper):
1097 __slots__ = ()1097 __slots__ = ()
1098 oper = "<<"1098 oper = " << "
10991099
11001100
1101class Like(BinaryOper):1101class Like(BinaryOper):
@@ -1139,23 +1139,23 @@
11391139
1140class Add(CompoundOper):1140class Add(CompoundOper):
1141 __slots__ = ()1141 __slots__ = ()
1142 oper = "+"1142 oper = " + "
11431143
1144class Sub(NonAssocBinaryOper):1144class Sub(NonAssocBinaryOper):
1145 __slots__ = ()1145 __slots__ = ()
1146 oper = "-"1146 oper = " - "
11471147
1148class Mul(CompoundOper):1148class Mul(CompoundOper):
1149 __slots__ = ()1149 __slots__ = ()
1150 oper = "*"1150 oper = " * "
11511151
1152class Div(NonAssocBinaryOper):1152class Div(NonAssocBinaryOper):
1153 __slots__ = ()1153 __slots__ = ()
1154 oper = "/"1154 oper = " / "
11551155
1156class Mod(NonAssocBinaryOper):1156class Mod(NonAssocBinaryOper):
1157 __slots__ = ()1157 __slots__ = ()
1158 oper = "%"1158 oper = " % "
11591159
11601160
1161class And(CompoundOper):1161class And(CompoundOper):
11621162
=== modified file 'storm/tests/databases/postgres.py'
--- storm/tests/databases/postgres.py 2019-11-21 16:06:52 +0000
+++ storm/tests/databases/postgres.py 2019-12-09 17:40:55 +0000
@@ -285,7 +285,7 @@
285 self.assertEqual(statement,285 self.assertEqual(statement,
286 'SELECT * FROM '286 'SELECT * FROM '
287 '((SELECT 1 AS id) UNION ALL (SELECT 1)) AS "_1" '287 '((SELECT 1 AS id) UNION ALL (SELECT 1)) AS "_1" '
288 'ORDER BY id+? LIMIT 1 OFFSET 1')288 'ORDER BY id + ? LIMIT 1 OFFSET 1')
289 self.assertVariablesEqual(state.parameters, [Variable(1)])289 self.assertVariablesEqual(state.parameters, [Variable(1)])
290290
291 result = self.connection.execute(expr)291 result = self.connection.execute(expr)
292292
=== modified file 'storm/tests/expr.py'
--- storm/tests/expr.py 2019-11-21 16:06:52 +0000
+++ storm/tests/expr.py 2019-12-09 17:40:55 +0000
@@ -502,7 +502,8 @@
502 expr = And(e[1], Or(e[2], e[3]),502 expr = And(e[1], Or(e[2], e[3]),
503 Add(e[4], Mul(e[5], Sub(e[6], Div(e[7], Div(e[8], e[9]))))))503 Add(e[4], Mul(e[5], Sub(e[6], Div(e[7], Div(e[8], e[9]))))))
504 statement = compile(expr)504 statement = compile(expr)
505 self.assertEqual(statement, "1 AND (2 OR 3) AND 4+5*(6-7/(8/9))")505 self.assertEqual(statement,
506 "1 AND (2 OR 3) AND 4 + 5 * (6 - 7 / (8 / 9))")
506507
507 expr = Func1(Select(Count()), [Select(Count())])508 expr = Func1(Select(Count()), [Select(Count())])
508 statement = compile(expr)509 statement = compile(expr)
@@ -1196,26 +1197,26 @@
1196 expr = LShift(Func1(), Func2())1197 expr = LShift(Func1(), Func2())
1197 state = State()1198 state = State()
1198 statement = compile(expr, state)1199 statement = compile(expr, state)
1199 self.assertEqual(statement, "func1()<<func2()")1200 self.assertEqual(statement, "func1() << func2()")
1200 self.assertEqual(state.parameters, [])1201 self.assertEqual(state.parameters, [])
12011202
1202 expr = Func1() << "value"1203 expr = Func1() << "value"
1203 state = State()1204 state = State()
1204 statement = compile(expr, state)1205 statement = compile(expr, state)
1205 self.assertEqual(statement, "func1()<<?")1206 self.assertEqual(statement, "func1() << ?")
1206 self.assertVariablesEqual(state.parameters, [Variable("value")])1207 self.assertVariablesEqual(state.parameters, [Variable("value")])
12071208
1208 def test_rshift(self):1209 def test_rshift(self):
1209 expr = RShift(Func1(), Func2())1210 expr = RShift(Func1(), Func2())
1210 state = State()1211 state = State()
1211 statement = compile(expr, state)1212 statement = compile(expr, state)
1212 self.assertEqual(statement, "func1()>>func2()")1213 self.assertEqual(statement, "func1() >> func2()")
1213 self.assertEqual(state.parameters, [])1214 self.assertEqual(state.parameters, [])
12141215
1215 expr = Func1() >> "value"1216 expr = Func1() >> "value"
1216 state = State()1217 state = State()
1217 statement = compile(expr, state)1218 statement = compile(expr, state)
1218 self.assertEqual(statement, "func1()>>?")1219 self.assertEqual(statement, "func1() >> ?")
1219 self.assertVariablesEqual(state.parameters, [Variable("value")])1220 self.assertVariablesEqual(state.parameters, [Variable("value")])
12201221
1221 def test_like(self):1222 def test_like(self):
@@ -1311,83 +1312,83 @@
1311 expr = Add(elem1, elem2, Add(elem3, elem4))1312 expr = Add(elem1, elem2, Add(elem3, elem4))
1312 state = State()1313 state = State()
1313 statement = compile(expr, state)1314 statement = compile(expr, state)
1314 self.assertEqual(statement, "elem1+elem2+elem3+elem4")1315 self.assertEqual(statement, "elem1 + elem2 + elem3 + elem4")
1315 self.assertEqual(state.parameters, [])1316 self.assertEqual(state.parameters, [])
13161317
1317 expr = Func1() + "value"1318 expr = Func1() + "value"
1318 state = State()1319 state = State()
1319 statement = compile(expr, state)1320 statement = compile(expr, state)
1320 self.assertEqual(statement, "func1()+?")1321 self.assertEqual(statement, "func1() + ?")
1321 self.assertVariablesEqual(state.parameters, [Variable("value")])1322 self.assertVariablesEqual(state.parameters, [Variable("value")])
13221323
1323 def test_sub(self):1324 def test_sub(self):
1324 expr = Sub(elem1, Sub(elem2, elem3))1325 expr = Sub(elem1, Sub(elem2, elem3))
1325 state = State()1326 state = State()
1326 statement = compile(expr, state)1327 statement = compile(expr, state)
1327 self.assertEqual(statement, "elem1-(elem2-elem3)")1328 self.assertEqual(statement, "elem1 - (elem2 - elem3)")
1328 self.assertEqual(state.parameters, [])1329 self.assertEqual(state.parameters, [])
13291330
1330 expr = Sub(Sub(elem1, elem2), elem3)1331 expr = Sub(Sub(elem1, elem2), elem3)
1331 state = State()1332 state = State()
1332 statement = compile(expr, state)1333 statement = compile(expr, state)
1333 self.assertEqual(statement, "elem1-elem2-elem3")1334 self.assertEqual(statement, "elem1 - elem2 - elem3")
1334 self.assertVariablesEqual(state.parameters, [])1335 self.assertVariablesEqual(state.parameters, [])
13351336
1336 expr = Func1() - "value"1337 expr = Func1() - "value"
1337 state = State()1338 state = State()
1338 statement = compile(expr, state)1339 statement = compile(expr, state)
1339 self.assertEqual(statement, "func1()-?")1340 self.assertEqual(statement, "func1() - ?")
1340 self.assertVariablesEqual(state.parameters, [Variable("value")])1341 self.assertVariablesEqual(state.parameters, [Variable("value")])
13411342
1342 def test_mul(self):1343 def test_mul(self):
1343 expr = Mul(elem1, elem2, Mul(elem3, elem4))1344 expr = Mul(elem1, elem2, Mul(elem3, elem4))
1344 state = State()1345 state = State()
1345 statement = compile(expr, state)1346 statement = compile(expr, state)
1346 self.assertEqual(statement, "elem1*elem2*elem3*elem4")1347 self.assertEqual(statement, "elem1 * elem2 * elem3 * elem4")
1347 self.assertEqual(state.parameters, [])1348 self.assertEqual(state.parameters, [])
13481349
1349 expr = Func1() * "value"1350 expr = Func1() * "value"
1350 state = State()1351 state = State()
1351 statement = compile(expr, state)1352 statement = compile(expr, state)
1352 self.assertEqual(statement, "func1()*?")1353 self.assertEqual(statement, "func1() * ?")
1353 self.assertVariablesEqual(state.parameters, [Variable("value")])1354 self.assertVariablesEqual(state.parameters, [Variable("value")])
13541355
1355 def test_div(self):1356 def test_div(self):
1356 expr = Div(elem1, Div(elem2, elem3))1357 expr = Div(elem1, Div(elem2, elem3))
1357 state = State()1358 state = State()
1358 statement = compile(expr, state)1359 statement = compile(expr, state)
1359 self.assertEqual(statement, "elem1/(elem2/elem3)")1360 self.assertEqual(statement, "elem1 / (elem2 / elem3)")
1360 self.assertEqual(state.parameters, [])1361 self.assertEqual(state.parameters, [])
13611362
1362 expr = Div(Div(elem1, elem2), elem3)1363 expr = Div(Div(elem1, elem2), elem3)
1363 state = State()1364 state = State()
1364 statement = compile(expr, state)1365 statement = compile(expr, state)
1365 self.assertEqual(statement, "elem1/elem2/elem3")1366 self.assertEqual(statement, "elem1 / elem2 / elem3")
1366 self.assertEqual(state.parameters, [])1367 self.assertEqual(state.parameters, [])
13671368
1368 expr = Func1() / "value"1369 expr = Func1() / "value"
1369 state = State()1370 state = State()
1370 statement = compile(expr, state)1371 statement = compile(expr, state)
1371 self.assertEqual(statement, "func1()/?")1372 self.assertEqual(statement, "func1() / ?")
1372 self.assertVariablesEqual(state.parameters, [Variable("value")])1373 self.assertVariablesEqual(state.parameters, [Variable("value")])
13731374
1374 def test_mod(self):1375 def test_mod(self):
1375 expr = Mod(elem1, Mod(elem2, elem3))1376 expr = Mod(elem1, Mod(elem2, elem3))
1376 state = State()1377 state = State()
1377 statement = compile(expr, state)1378 statement = compile(expr, state)
1378 self.assertEqual(statement, "elem1%(elem2%elem3)")1379 self.assertEqual(statement, "elem1 % (elem2 % elem3)")
1379 self.assertEqual(state.parameters, [])1380 self.assertEqual(state.parameters, [])
13801381
1381 expr = Mod(Mod(elem1, elem2), elem3)1382 expr = Mod(Mod(elem1, elem2), elem3)
1382 state = State()1383 state = State()
1383 statement = compile(expr, state)1384 statement = compile(expr, state)
1384 self.assertEqual(statement, "elem1%elem2%elem3")1385 self.assertEqual(statement, "elem1 % elem2 % elem3")
1385 self.assertEqual(state.parameters, [])1386 self.assertEqual(state.parameters, [])
13861387
1387 expr = Func1() % "value"1388 expr = Func1() % "value"
1388 state = State()1389 state = State()
1389 statement = compile(expr, state)1390 statement = compile(expr, state)
1390 self.assertEqual(statement, "func1()%?")1391 self.assertEqual(statement, "func1() % ?")
1391 self.assertVariablesEqual(state.parameters, [Variable("value")])1392 self.assertVariablesEqual(state.parameters, [Variable("value")])
13921393
1393 def test_func(self):1394 def test_func(self):
@@ -2138,7 +2139,8 @@
2138 expr = And(e[1], Or(e[2], e[3]),2139 expr = And(e[1], Or(e[2], e[3]),
2139 Add(e[4], Mul(e[5], Sub(e[6], Div(e[7], Div(e[8], e[9]))))))2140 Add(e[4], Mul(e[5], Sub(e[6], Div(e[7], Div(e[8], e[9]))))))
2140 py_expr = compile_python(expr)2141 py_expr = compile_python(expr)
2141 self.assertEqual(py_expr, "1 and (2 or 3) and 4+5*(6-7/(8/9))")2142 self.assertEqual(py_expr,
2143 "1 and (2 or 3) and 4 + 5 * (6 - 7 / (8 / 9))")
21422144
2143 def test_get_precedence(self):2145 def test_get_precedence(self):
2144 self.assertTrue(compile_python.get_precedence(Or) <2146 self.assertTrue(compile_python.get_precedence(Or) <
@@ -2290,14 +2292,14 @@
2290 expr = LShift(Variable(1), Variable(2))2292 expr = LShift(Variable(1), Variable(2))
2291 state = State()2293 state = State()
2292 py_expr = compile_python(expr, state)2294 py_expr = compile_python(expr, state)
2293 self.assertEqual(py_expr, "_0<<_1")2295 self.assertEqual(py_expr, "_0 << _1")
2294 self.assertEqual(state.parameters, [1, 2])2296 self.assertEqual(state.parameters, [1, 2])
22952297
2296 def test_rshift(self):2298 def test_rshift(self):
2297 expr = RShift(Variable(1), Variable(2))2299 expr = RShift(Variable(1), Variable(2))
2298 state = State()2300 state = State()
2299 py_expr = compile_python(expr, state)2301 py_expr = compile_python(expr, state)
2300 self.assertEqual(py_expr, "_0>>_1")2302 self.assertEqual(py_expr, "_0 >> _1")
2301 self.assertEqual(state.parameters, [1, 2])2303 self.assertEqual(state.parameters, [1, 2])
23022304
2303 def test_in(self):2305 def test_in(self):
@@ -2320,7 +2322,7 @@
2320 def test_add(self):2322 def test_add(self):
2321 expr = Add(elem1, elem2, Add(elem3, elem4))2323 expr = Add(elem1, elem2, Add(elem3, elem4))
2322 py_expr = compile_python(expr)2324 py_expr = compile_python(expr)
2323 self.assertEqual(py_expr, "elem1+elem2+elem3+elem4")2325 self.assertEqual(py_expr, "elem1 + elem2 + elem3 + elem4")
23242326
2325 def test_neg(self):2327 def test_neg(self):
2326 expr = Neg(elem1)2328 expr = Neg(elem1)
@@ -2330,34 +2332,34 @@
2330 def test_sub(self):2332 def test_sub(self):
2331 expr = Sub(elem1, Sub(elem2, elem3))2333 expr = Sub(elem1, Sub(elem2, elem3))
2332 py_expr = compile_python(expr)2334 py_expr = compile_python(expr)
2333 self.assertEqual(py_expr, "elem1-(elem2-elem3)")2335 self.assertEqual(py_expr, "elem1 - (elem2 - elem3)")
23342336
2335 expr = Sub(Sub(elem1, elem2), elem3)2337 expr = Sub(Sub(elem1, elem2), elem3)
2336 py_expr = compile_python(expr)2338 py_expr = compile_python(expr)
2337 self.assertEqual(py_expr, "elem1-elem2-elem3")2339 self.assertEqual(py_expr, "elem1 - elem2 - elem3")
23382340
2339 def test_mul(self):2341 def test_mul(self):
2340 expr = Mul(elem1, elem2, Mul(elem3, elem4))2342 expr = Mul(elem1, elem2, Mul(elem3, elem4))
2341 py_expr = compile_python(expr)2343 py_expr = compile_python(expr)
2342 self.assertEqual(py_expr, "elem1*elem2*elem3*elem4")2344 self.assertEqual(py_expr, "elem1 * elem2 * elem3 * elem4")
23432345
2344 def test_div(self):2346 def test_div(self):
2345 expr = Div(elem1, Div(elem2, elem3))2347 expr = Div(elem1, Div(elem2, elem3))
2346 py_expr = compile_python(expr)2348 py_expr = compile_python(expr)
2347 self.assertEqual(py_expr, "elem1/(elem2/elem3)")2349 self.assertEqual(py_expr, "elem1 / (elem2 / elem3)")
23482350
2349 expr = Div(Div(elem1, elem2), elem3)2351 expr = Div(Div(elem1, elem2), elem3)
2350 py_expr = compile_python(expr)2352 py_expr = compile_python(expr)
2351 self.assertEqual(py_expr, "elem1/elem2/elem3")2353 self.assertEqual(py_expr, "elem1 / elem2 / elem3")
23522354
2353 def test_mod(self):2355 def test_mod(self):
2354 expr = Mod(elem1, Mod(elem2, elem3))2356 expr = Mod(elem1, Mod(elem2, elem3))
2355 py_expr = compile_python(expr)2357 py_expr = compile_python(expr)
2356 self.assertEqual(py_expr, "elem1%(elem2%elem3)")2358 self.assertEqual(py_expr, "elem1 % (elem2 % elem3)")
23572359
2358 expr = Mod(Mod(elem1, elem2), elem3)2360 expr = Mod(Mod(elem1, elem2), elem3)
2359 py_expr = compile_python(expr)2361 py_expr = compile_python(expr)
2360 self.assertEqual(py_expr, "elem1%elem2%elem3")2362 self.assertEqual(py_expr, "elem1 % elem2 % elem3")
23612363
2362 def test_match(self):2364 def test_match(self):
2363 col1 = Column(column1)2365 col1 = Column(column1)

Subscribers

People subscribed via source and target branches

to status/vote changes: