Skip to content

Commit

Permalink
Fix db_url to include blanks and convert types. Fixes #858
Browse files Browse the repository at this point in the history
  • Loading branch information
Charles Leifer committed May 24, 2016
1 parent 5be1bd3 commit 2b552a2
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 4 deletions.
18 changes: 17 additions & 1 deletion playhouse/db_url.py
Expand Up @@ -56,7 +56,23 @@ def parseresult_to_dict(parsed):
connect_kwargs['database'] = ':memory:'

# Get additional connection args from the query string
connect_kwargs.update(parse_qsl(query))
qs_args = parse_qsl(query, keep_blank_values=True)
for key, value in qs_args:
if value.lower() == 'false':
value = False
elif value.lower() == 'true':
value = True
elif value.isdigit():
value = int(value)
elif '.' in value and all(p.isdigit() for p in value.split('.', 1)):
try:
value = float(value)
except ValueError:
pass
elif value.lower() in ('null', 'none'):
value = None

connect_kwargs[key] = value

return connect_kwargs

Expand Down
10 changes: 7 additions & 3 deletions playhouse/tests/test_db_url.py
Expand Up @@ -15,14 +15,18 @@ def test_db_url_parse(self):
cfg = parse('postgresql://usr:pwd@hst/db')
self.assertEqual(cfg['password'], 'pwd')
cfg = parse('mysql+pool://usr:pwd@hst:123/db'
'?max_connections=42&stale_timeout=8001')
'?max_connections=42&stale_timeout=8001.2&zai=&baz=3.4.5'
'&boolz=false')
self.assertEqual(cfg['user'], 'usr')
self.assertEqual(cfg['password'], 'pwd')
self.assertEqual(cfg['host'], 'hst')
self.assertEqual(cfg['database'], 'db')
self.assertEqual(cfg['port'], 123)
self.assertEqual(cfg['max_connections'], '42')
self.assertEqual(cfg['stale_timeout'], '8001')
self.assertEqual(cfg['max_connections'], 42)
self.assertEqual(cfg['stale_timeout'], 8001.2)
self.assertEqual(cfg['zai'], '')
self.assertEqual(cfg['baz'], '3.4.5')
self.assertEqual(cfg['boolz'], False)

def test_db_url(self):
db = connect('sqlite:///:memory:')
Expand Down

0 comments on commit 2b552a2

Please sign in to comment.