##// END OF EJS Templates
Use single quotes in sql string literal (#13968)...
Use single quotes in sql string literal (#13968) the SQL spec requires that string literals use single quotes and column references (or other identifiers) use double quotes. sqlite permits the use of double quotes for string literals in "unambiguous cases". For some reason, its understanding of what constitutes unambiguous has changed recently - I'm on FreeBSD 14.0-CURRENT with sqlite 3.41.0 - and attempting to do anything with ipython throws a very strange sqlite operation error: ``` [+] ~% ipython --version (test) audrey@daisy [12:18:02 AM] 8.11.0 [+] ~% ipython (test) audrey@daisy [12:18:04 AM] [TerminalIPythonApp] ERROR | Failed to create history session in /usr/home/audrey/.ipython/profile_default/history.sqlite. History will not be saved. Traceback (most recent call last): File "/usr/home/audrey/.virtualenvs/test/lib/python3.9/site-packages/IPython/core/history.py", line 545, in __init__ self.new_session() File "/usr/home/audrey/.virtualenvs/test/lib/python3.9/site-packages/decorator.py", line 232, in fun return caller(func, *(extras + args), **kw) File "/usr/home/audrey/.virtualenvs/test/lib/python3.9/site-packages/IPython/core/history.py", line 60, in only_when_enabled return f(self, *a, **kw) File "/usr/home/audrey/.virtualenvs/test/lib/python3.9/site-packages/IPython/core/history.py", line 570, in new_session cur = conn.execute("""INSERT INTO sessions VALUES (NULL, ?, NULL, sqlite3.OperationalError: no such column: Python 3.9.16 (main, Feb 28 2023, 01:31:45) Type 'copyright', 'credits' or 'license' for more information IPython 8.11.0 -- An enhanced Interactive Python. Type '?' for help. ``` This patch fixes it. idk if this constitutes a bug in sqlite3, but this is, I guess, more correct.

File last commit:

r27549:44d64dc3
r28168:9a5baf06 merge
Show More
test_handlers.py
97 lines | 3.2 KiB | text/x-python | PythonLexer
"""Tests for input handlers.
"""
#-----------------------------------------------------------------------------
# Module imports
#-----------------------------------------------------------------------------
# our own packages
from IPython.core import autocall
from IPython.testing import tools as tt
#-----------------------------------------------------------------------------
# Globals
#-----------------------------------------------------------------------------
# Get the public instance of IPython
failures = []
num_tests = 0
#-----------------------------------------------------------------------------
# Test functions
#-----------------------------------------------------------------------------
class CallableIndexable(object):
def __getitem__(self, idx): return True
def __call__(self, *args, **kws): return True
class Autocallable(autocall.IPyAutocall):
def __call__(self):
return "called"
def run(tests):
"""Loop through a list of (pre, post) inputs, where pre is the string
handed to ipython, and post is how that string looks after it's been
transformed (i.e. ipython's notion of _i)"""
tt.check_pairs(ip.prefilter_manager.prefilter_lines, tests)
def test_handlers():
call_idx = CallableIndexable()
ip.user_ns['call_idx'] = call_idx
# For many of the below, we're also checking that leading whitespace
# turns off the esc char, which it should unless there is a continuation
# line.
run(
[('"no change"', '"no change"'), # normal
(u"lsmagic", "get_ipython().run_line_magic('lsmagic', '')"), # magic
#("a = b # PYTHON-MODE", '_i'), # emacs -- avoids _in cache
])
# Objects which are instances of IPyAutocall are *always* autocalled
autocallable = Autocallable()
ip.user_ns['autocallable'] = autocallable
# auto
ip.run_line_magic("autocall", "0")
# Only explicit escapes or instances of IPyAutocallable should get
# expanded
run(
[
('len "abc"', 'len "abc"'),
("autocallable", "autocallable()"),
# Don't add extra brackets (gh-1117)
("autocallable()", "autocallable()"),
]
)
ip.run_line_magic("autocall", "1")
run(
[
('len "abc"', 'len("abc")'),
('len "abc";', 'len("abc");'), # ; is special -- moves out of parens
# Autocall is turned off if first arg is [] and the object
# is both callable and indexable. Like so:
("len [1,2]", "len([1,2])"), # len doesn't support __getitem__...
("call_idx [1]", "call_idx [1]"), # call_idx *does*..
("call_idx 1", "call_idx(1)"),
("len", "len"), # only at 2 does it auto-call on single args
]
)
ip.run_line_magic("autocall", "2")
run(
[
('len "abc"', 'len("abc")'),
('len "abc";', 'len("abc");'),
("len [1,2]", "len([1,2])"),
("call_idx [1]", "call_idx [1]"),
("call_idx 1", "call_idx(1)"),
# This is what's different:
("len", "len()"), # only at 2 does it auto-call on single args
]
)
ip.run_line_magic("autocall", "1")
assert failures == []