File: test_handlers.py

package info (click to toggle)
ipython 8.35.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 11,696 kB
  • sloc: python: 42,461; sh: 376; makefile: 243
file content (75 lines) | stat: -rw-r--r-- 2,931 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
"""Tests for input handlers.
"""
#-----------------------------------------------------------------------------
# Module imports
#-----------------------------------------------------------------------------

# our own packages
from IPython.core import autocall
from IPython.testing import tools as tt
import pytest
from collections.abc import Callable

#-----------------------------------------------------------------------------
# Globals
#-----------------------------------------------------------------------------

# 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"


@pytest.mark.parametrize(
    "autocall, input, output",
    [
        # 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.
        ("1", '"no change"', '"no change"'),  # normal
        ("1", "lsmagic", "get_ipython().run_line_magic('lsmagic', '')"),  # magic
        # Only explicit escapes or instances of IPyAutocallable should get
        # expanded
        ("0", 'len "abc"', 'len "abc"'),
        ("0", "autocallable", "autocallable()"),
        # Don't add extra brackets (gh-1117)
        ("0", "autocallable()", "autocallable()"),
        ("1", 'len "abc"', 'len("abc")'),
        ("1", '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:
        ("1", "len [1,2]", "len([1,2])"),  # len doesn't support __getitem__...
        ("1", "call_idx [1]", "call_idx [1]"),  # call_idx *does*..
        ("1", "call_idx 1", "call_idx(1)"),
        ("1", "len", "len"),  # only at 2 does it auto-call on single args
        ("2", 'len "abc"', 'len("abc")'),
        ("2", 'len "abc";', 'len("abc");'),
        ("2", "len [1,2]", "len([1,2])"),
        ("2", "call_idx [1]", "call_idx [1]"),
        ("2", "call_idx 1", "call_idx(1)"),
        # T his is what's different:
        ("2", "len", "len()"),  # only at 2 does it auto-call on single args
        ("0", "Callable[[int], None]", "Callable[[int], None]"),
        ("1", "Callable[[int], None]", "Callable[[int], None]"),
        ("1", "Callable[[int], None]", "Callable[[int], None]"),
    ],
)
def test_handlers_I(autocall, input, output):
    autocallable = Autocallable()
    ip.user_ns["autocallable"] = autocallable

    call_idx = CallableIndexable()
    ip.user_ns["call_idx"] = call_idx

    ip.user_ns["Callable"] = Callable

    ip.run_line_magic("autocall", autocall)
    assert ip.prefilter_manager.prefilter_lines(input) == output
    ip.run_line_magic("autocall", "1")