Skip to content

Commit d362732

Browse files
authoredJul 6, 2017
Merge pull request #26 from cs50/develop
disabled logging, removed temporary prints, removed support for multiple statements
2 parents 3a66dc9 + 893cb90 commit d362732

File tree

4 files changed

+34
-26
lines changed

4 files changed

+34
-26
lines changed
 

‎.travis.yml

+19-12
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,25 @@ before_script:
1515
- mysql -e 'CREATE DATABASE IF NOT EXISTS test;'
1616
- psql -c 'create database test;' -U postgres
1717
script: python tests/sqltests.py
18-
deploy:
19-
- provider: script
20-
script: 'curl --fail --data "{ \"tag_name\": \"v$(python setup.py --version)\",
21-
\"target_commitish\": \"$TRAVIS_COMMIT\", \"name\": \"v$(python setup.py --version)\"
22-
}" --user bot50:$GITHUB_TOKEN https://api.github.com/repos/$TRAVIS_REPO_SLUG/releases'
23-
on:
24-
branch: master
25-
- provider: pypi
26-
user: "$PYPI_USERNAME"
27-
password: "$PYPI_PASSWORD"
28-
on:
29-
branch: master
18+
jobs:
19+
include:
20+
- stage: deploy
21+
python: '3.4'
22+
install: skip
23+
before_script: skip
24+
script: skip
25+
deploy:
26+
- provider: script
27+
script: 'curl --fail --data "{ \"tag_name\": \"v$(python setup.py --version)\",
28+
\"target_commitish\": \"$TRAVIS_COMMIT\", \"name\": \"v$(python setup.py --version)\"
29+
}" --user bot50:$GITHUB_TOKEN https://api.github.com/repos/$TRAVIS_REPO_SLUG/releases'
30+
on:
31+
branch: master
32+
- provider: pypi
33+
user: "$PYPI_USERNAME"
34+
password: "$PYPI_PASSWORD"
35+
on:
36+
branch: master
3037
notifications:
3138
slack:
3239
secure: lJklhcBVjDT6KzUNa3RFHXdXSeH7ytuuGrkZ5ZcR72CXMoTf2pMJTzPwRLWOp6lCSdDC9Y8MWLrcg/e33dJga4Jlp9alOmWqeqesaFjfee4st8vAsgNbv8/RajPH1gD2bnkt8oIwUzdHItdb5AucKFYjbH2g0d8ndoqYqUeBLrnsT1AP5G/Vi9OHC9OWNpR0FKaZIJE0Wt52vkPMH3sV2mFeIskByPB+56U5y547mualKxn61IVR/dhYBEtZQJuSvnwKHPOn9Pkk7cCa+SSSeTJ4w5LboY8T17otaYNauXo46i1bKIoGiBcCcrJyQHHiPQmcq/YU540MC5Wzt9YXUycmJzRi347oyQeDee27wV3XJlWMXuuhbtJiKCFny7BTQ160VATlj/dbwIzN99Ra6/BtTumv/6LyTdKIuVjdAkcN8dtdDW1nlrQ29zuPNCcXXzJ7zX7kQaOCUV1c2OrsbiH/0fE9nknUORn97txqhlYVi0QMS7764wFo6kg0vpmFQRkkQySsJl+TmgcZ01AlsJc2EMMWVuaj9Af9JU4/4yalqDiXIh1fOYYUZnLfOfWS+MsnI+/oLfqJFyMbrsQQTIjs+kTzbiEdhd2R4EZgusU/xRFWokS2NAvahexrRhRQ6tpAI+LezPrkNOR3aHiykBf+P9BkUa0wPp6V2Ayc6q0=

‎setup.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
"Topic :: Software Development :: Libraries :: Python Modules"
1111
],
1212
description="CS50 library for Python",
13-
install_requires=["SQLAlchemy"],
13+
install_requires=["SQLAlchemy", "sqlparse"],
1414
keywords="cs50",
1515
name="cs50",
1616
package_dir={"": "src"},
1717
packages=["cs50"],
1818
url="https://github.com/cs50/python-cs50",
19-
version="2.0.0"
19+
version="2.1.0"
2020
)

‎src/cs50/sql.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import logging
44
import re
55
import sqlalchemy
6+
import sqlparse
67
import sys
78
import warnings
89

@@ -86,6 +87,10 @@ def process(value):
8687
else:
8788
return process(value)
8889

90+
# allow only one statement at a time
91+
if len(sqlparse.split(text)) > 1:
92+
raise RuntimeError("too many statements at once")
93+
8994
# raise exceptions for warnings
9095
warnings.filterwarnings("error")
9196

@@ -123,7 +128,7 @@ def process(value):
123128

124129
# if INSERT, return primary key value for a newly inserted row
125130
elif re.search(r"^\s*INSERT\s+", statement, re.I):
126-
if self.engine.url.get_backend_name() == "postgresql":
131+
if self.engine.url.get_backend_name() in ["postgres", "postgresql"]:
127132
result = self.engine.execute(sqlalchemy.text("SELECT LASTVAL()"))
128133
return result.first()[0]
129134
else:

‎tests/sqltests.py

+7-11
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1-
from cs50.sql import SQL
1+
import logging
22
import sys
33
import unittest
44
import warnings
55

6+
from cs50.sql import SQL
7+
68
class SQLTests(unittest.TestCase):
7-
def multi_inserts_enabled(self):
8-
return True
9+
10+
def test_multiple_statements(self):
11+
self.assertRaises(RuntimeError, self.db.execute, "INSERT INTO cs50(val) VALUES('baz'); INSERT INTO cs50(val) VALUES('qux')")
912

1013
def test_delete_returns_affected_rows(self):
1114
rows = [
@@ -15,20 +18,13 @@ def test_delete_returns_affected_rows(self):
1518
]
1619
for row in rows:
1720
self.db.execute("INSERT INTO cs50(val) VALUES(:val);", val=row["val"])
18-
19-
print(self.db.execute("DELETE FROM cs50 WHERE id = :id", id=rows[0]["id"]))
20-
print(self.db.execute("SELECT * FROM cs50"))
21-
return
22-
2321
self.assertEqual(self.db.execute("DELETE FROM cs50 WHERE id = :id", id=rows[0]["id"]), 1)
2422
self.assertEqual(self.db.execute("DELETE FROM cs50 WHERE id = :a or id = :b", a=rows[1]["id"], b=rows[2]["id"]), 2)
2523
self.assertEqual(self.db.execute("DELETE FROM cs50 WHERE id = -50"), 0)
2624

2725
def test_insert_returns_last_row_id(self):
2826
self.assertEqual(self.db.execute("INSERT INTO cs50(val) VALUES('foo')"), 1)
2927
self.assertEqual(self.db.execute("INSERT INTO cs50(val) VALUES('bar')"), 2)
30-
if self.multi_inserts_enabled():
31-
self.assertEqual(self.db.execute("INSERT INTO cs50(val) VALUES('baz'); INSERT INTO cs50(val) VALUES('qux')"), 4)
3228

3329
def test_select_all(self):
3430
self.assertEqual(self.db.execute("SELECT * FROM cs50"), [])
@@ -122,5 +118,5 @@ def multi_inserts_enabled(self):
122118
unittest.TestLoader().loadTestsFromTestCase(MySQLTests),
123119
unittest.TestLoader().loadTestsFromTestCase(PostgresTests)
124120
])
125-
121+
logging.getLogger("cs50.sql").disabled = True
126122
sys.exit(not unittest.TextTestRunner(verbosity=2).run(suite).wasSuccessful())

0 commit comments

Comments
 (0)
Please sign in to comment.