Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

disabled logging, removed temporary prints, removed support for multiple statements #26

Merged
merged 6 commits into from
Jul 6, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 19 additions & 12 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -15,18 +15,25 @@ before_script:
- mysql -e 'CREATE DATABASE IF NOT EXISTS test;'
- psql -c 'create database test;' -U postgres
script: python tests/sqltests.py
deploy:
- provider: script
script: 'curl --fail --data "{ \"tag_name\": \"v$(python setup.py --version)\",
\"target_commitish\": \"$TRAVIS_COMMIT\", \"name\": \"v$(python setup.py --version)\"
}" --user bot50:$GITHUB_TOKEN https://api.github.com/repos/$TRAVIS_REPO_SLUG/releases'
on:
branch: master
- provider: pypi
user: "$PYPI_USERNAME"
password: "$PYPI_PASSWORD"
on:
branch: master
jobs:
include:
- stage: deploy
python: '3.4'
install: skip
before_script: skip
script: skip
deploy:
- provider: script
script: 'curl --fail --data "{ \"tag_name\": \"v$(python setup.py --version)\",
\"target_commitish\": \"$TRAVIS_COMMIT\", \"name\": \"v$(python setup.py --version)\"
}" --user bot50:$GITHUB_TOKEN https://api.github.com/repos/$TRAVIS_REPO_SLUG/releases'
on:
branch: master
- provider: pypi
user: "$PYPI_USERNAME"
password: "$PYPI_PASSWORD"
on:
branch: master
notifications:
slack:
secure: lJklhcBVjDT6KzUNa3RFHXdXSeH7ytuuGrkZ5ZcR72CXMoTf2pMJTzPwRLWOp6lCSdDC9Y8MWLrcg/e33dJga4Jlp9alOmWqeqesaFjfee4st8vAsgNbv8/RajPH1gD2bnkt8oIwUzdHItdb5AucKFYjbH2g0d8ndoqYqUeBLrnsT1AP5G/Vi9OHC9OWNpR0FKaZIJE0Wt52vkPMH3sV2mFeIskByPB+56U5y547mualKxn61IVR/dhYBEtZQJuSvnwKHPOn9Pkk7cCa+SSSeTJ4w5LboY8T17otaYNauXo46i1bKIoGiBcCcrJyQHHiPQmcq/YU540MC5Wzt9YXUycmJzRi347oyQeDee27wV3XJlWMXuuhbtJiKCFny7BTQ160VATlj/dbwIzN99Ra6/BtTumv/6LyTdKIuVjdAkcN8dtdDW1nlrQ29zuPNCcXXzJ7zX7kQaOCUV1c2OrsbiH/0fE9nknUORn97txqhlYVi0QMS7764wFo6kg0vpmFQRkkQySsJl+TmgcZ01AlsJc2EMMWVuaj9Af9JU4/4yalqDiXIh1fOYYUZnLfOfWS+MsnI+/oLfqJFyMbrsQQTIjs+kTzbiEdhd2R4EZgusU/xRFWokS2NAvahexrRhRQ6tpAI+LezPrkNOR3aHiykBf+P9BkUa0wPp6V2Ayc6q0=
4 changes: 2 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
@@ -10,11 +10,11 @@
"Topic :: Software Development :: Libraries :: Python Modules"
],
description="CS50 library for Python",
install_requires=["SQLAlchemy"],
install_requires=["SQLAlchemy", "sqlparse"],
keywords="cs50",
name="cs50",
package_dir={"": "src"},
packages=["cs50"],
url="https://github.com/cs50/python-cs50",
version="2.0.0"
version="2.1.0"
)
7 changes: 6 additions & 1 deletion src/cs50/sql.py
Original file line number Diff line number Diff line change
@@ -3,6 +3,7 @@
import logging
import re
import sqlalchemy
import sqlparse
import sys
import warnings

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

# allow only one statement at a time
if len(sqlparse.split(text)) > 1:
raise RuntimeError("too many statements at once")

# raise exceptions for warnings
warnings.filterwarnings("error")

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

# if INSERT, return primary key value for a newly inserted row
elif re.search(r"^\s*INSERT\s+", statement, re.I):
if self.engine.url.get_backend_name() == "postgresql":
if self.engine.url.get_backend_name() in ["postgres", "postgresql"]:
result = self.engine.execute(sqlalchemy.text("SELECT LASTVAL()"))
return result.first()[0]
else:
18 changes: 7 additions & 11 deletions tests/sqltests.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
from cs50.sql import SQL
import logging
import sys
import unittest
import warnings

from cs50.sql import SQL

class SQLTests(unittest.TestCase):
def multi_inserts_enabled(self):
return True

def test_multiple_statements(self):
self.assertRaises(RuntimeError, self.db.execute, "INSERT INTO cs50(val) VALUES('baz'); INSERT INTO cs50(val) VALUES('qux')")

def test_delete_returns_affected_rows(self):
rows = [
@@ -15,20 +18,13 @@ def test_delete_returns_affected_rows(self):
]
for row in rows:
self.db.execute("INSERT INTO cs50(val) VALUES(:val);", val=row["val"])

print(self.db.execute("DELETE FROM cs50 WHERE id = :id", id=rows[0]["id"]))
print(self.db.execute("SELECT * FROM cs50"))
return

self.assertEqual(self.db.execute("DELETE FROM cs50 WHERE id = :id", id=rows[0]["id"]), 1)
self.assertEqual(self.db.execute("DELETE FROM cs50 WHERE id = :a or id = :b", a=rows[1]["id"], b=rows[2]["id"]), 2)
self.assertEqual(self.db.execute("DELETE FROM cs50 WHERE id = -50"), 0)

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

def test_select_all(self):
self.assertEqual(self.db.execute("SELECT * FROM cs50"), [])
@@ -122,5 +118,5 @@ def multi_inserts_enabled(self):
unittest.TestLoader().loadTestsFromTestCase(MySQLTests),
unittest.TestLoader().loadTestsFromTestCase(PostgresTests)
])

logging.getLogger("cs50.sql").disabled = True
sys.exit(not unittest.TextTestRunner(verbosity=2).run(suite).wasSuccessful())