Show More
@@ -59,40 +59,43 b' def test_ipdb_magics():' | |||
|
59 | 59 | |
|
60 | 60 | First, set up some test functions and classes which we can inspect. |
|
61 | 61 | |
|
62 |
|
|
|
63 | ... """Docstring for ExampleClass.""" | |
|
64 | ... def __init__(self): | |
|
65 | ... """Docstring for ExampleClass.__init__""" | |
|
66 | ... pass | |
|
67 | ... def __str__(self): | |
|
68 | ... return "ExampleClass()" | |
|
69 | ||
|
70 | >>> def example_function(x, y, z="hello"): | |
|
71 | ... """Docstring for example_function.""" | |
|
72 | ... pass | |
|
62 | In [1]: class ExampleClass(object): | |
|
63 | ...: """Docstring for ExampleClass.""" | |
|
64 | ...: def __init__(self): | |
|
65 | ...: """Docstring for ExampleClass.__init__""" | |
|
66 | ...: pass | |
|
67 | ...: def __str__(self): | |
|
68 | ...: return "ExampleClass()" | |
|
73 | 69 | |
|
74 | >>> old_trace = sys.gettrace() | |
|
70 | In [2]: def example_function(x, y, z="hello"): | |
|
71 | ...: """Docstring for example_function.""" | |
|
72 | ...: pass | |
|
75 | 73 | |
|
76 | Create a function which triggers ipdb. | |
|
74 | In [3]: old_trace = sys.gettrace() | |
|
77 | 75 | |
|
78 | >>> def trigger_ipdb(): | |
|
79 | ... a = ExampleClass() | |
|
80 | ... debugger.Pdb().set_trace() | |
|
76 | Create a function which triggers ipdb. | |
|
81 | 77 | |
|
82 | >>> with PdbTestInput([ | |
|
83 | ... 'pdef example_function', | |
|
84 | ... 'pdoc ExampleClass', | |
|
85 | ... 'up', | |
|
86 | ... 'down', | |
|
87 | ... 'list', | |
|
88 | ... 'pinfo a', | |
|
89 | ... 'll', | |
|
90 | ... 'continue', | |
|
91 | ... ]): | |
|
92 | ... trigger_ipdb() | |
|
93 | --Return-- | |
|
94 | None | |
|
95 | > <doctest ...>(3)trigger_ipdb() | |
|
78 | In [4]: def trigger_ipdb(): | |
|
79 | ...: a = ExampleClass() | |
|
80 | ...: debugger.Pdb().set_trace() | |
|
81 | ||
|
82 | Run ipdb with faked input & check output. Because of a difference between | |
|
83 | Python 3.13 & older versions, the first bit of the output is inconsistent. | |
|
84 | We need to use ... to accommodate that, so the examples have to use IPython | |
|
85 | prompts so that ... is distinct from the Python PS2 prompt. | |
|
86 | ||
|
87 | In [5]: with PdbTestInput([ | |
|
88 | ...: 'pdef example_function', | |
|
89 | ...: 'pdoc ExampleClass', | |
|
90 | ...: 'up', | |
|
91 | ...: 'down', | |
|
92 | ...: 'list', | |
|
93 | ...: 'pinfo a', | |
|
94 | ...: 'll', | |
|
95 | ...: 'continue', | |
|
96 | ...: ]): | |
|
97 | ...: trigger_ipdb() | |
|
98 | ...> <doctest ...>(3)trigger_ipdb() | |
|
96 | 99 | 1 def trigger_ipdb(): |
|
97 | 100 | 2 a = ExampleClass() |
|
98 | 101 | ----> 3 debugger.Pdb().set_trace() |
@@ -112,8 +115,7 b' def test_ipdb_magics():' | |||
|
112 | 115 | 10 ]): |
|
113 | 116 | ---> 11 trigger_ipdb() |
|
114 | 117 | <BLANKLINE> |
|
115 | ipdb> down | |
|
116 | None | |
|
118 | ipdb> down... | |
|
117 | 119 | > <doctest ...>(3)trigger_ipdb() |
|
118 | 120 | 1 def trigger_ipdb(): |
|
119 | 121 | 2 a = ExampleClass() |
@@ -136,10 +138,10 b' def test_ipdb_magics():' | |||
|
136 | 138 | ----> 3 debugger.Pdb().set_trace() |
|
137 | 139 | <BLANKLINE> |
|
138 | 140 | ipdb> continue |
|
139 | ||
|
140 |
Restore previous trace function, e.g. for coverage.py |
|
|
141 | ||
|
142 |
|
|
|
141 | ||
|
142 | Restore previous trace function, e.g. for coverage.py | |
|
143 | ||
|
144 | In [6]: sys.settrace(old_trace) | |
|
143 | 145 | ''' |
|
144 | 146 | |
|
145 | 147 | def test_ipdb_magics2(): |
@@ -495,15 +497,26 b' def test_decorator_skip_with_breakpoint():' | |||
|
495 | 497 | child.expect_exact(line) |
|
496 | 498 | child.sendline("") |
|
497 | 499 | |
|
498 | # as the filename does not exists, we'll rely on the filename prompt | |
|
499 | child.expect_exact("47 bar(3, 4)") | |
|
500 | ||
|
501 | for input_, expected in [ | |
|
502 | (f"b {name}.py:3", ""), | |
|
503 | ("step", "1---> 3 pass # should not stop here except"), | |
|
504 | ("step", "---> 38 @pdb_skipped_decorator"), | |
|
505 | ("continue", ""), | |
|
506 | ]: | |
|
500 | # From 3.13, set_trace()/breakpoint() stop on the line where they're | |
|
501 | # called, instead of the next line. | |
|
502 | if sys.version_info >= (3, 13): | |
|
503 | child.expect_exact("--> 46 ipdb.set_trace()") | |
|
504 | extra_step = [("step", "--> 47 bar(3, 4)")] | |
|
505 | else: | |
|
506 | child.expect_exact("--> 47 bar(3, 4)") | |
|
507 | extra_step = [] | |
|
508 | ||
|
509 | for input_, expected in ( | |
|
510 | [ | |
|
511 | (f"b {name}.py:3", ""), | |
|
512 | ] | |
|
513 | + extra_step | |
|
514 | + [ | |
|
515 | ("step", "1---> 3 pass # should not stop here except"), | |
|
516 | ("step", "---> 38 @pdb_skipped_decorator"), | |
|
517 | ("continue", ""), | |
|
518 | ] | |
|
519 | ): | |
|
507 | 520 | child.expect("ipdb>") |
|
508 | 521 | child.sendline(input_) |
|
509 | 522 | child.expect_exact(input_) |
@@ -516,23 +516,23 b' def test_pinfo_docstring_dynamic(capsys):' | |||
|
516 | 516 | |
|
517 | 517 | ip.run_line_magic("pinfo", "b.prop") |
|
518 | 518 | captured = capsys.readouterr() |
|
519 |
assert "Docstring: |
|
|
519 | assert re.search(r"Docstring:\s+cdoc for prop", captured.out) | |
|
520 | 520 | |
|
521 | 521 | ip.run_line_magic("pinfo", "b.non_exist") |
|
522 | 522 | captured = capsys.readouterr() |
|
523 |
assert "Docstring: |
|
|
523 | assert re.search(r"Docstring:\s+cdoc for non_exist", captured.out) | |
|
524 | 524 | |
|
525 | 525 | ip.run_cell("b.prop?") |
|
526 | 526 | captured = capsys.readouterr() |
|
527 |
assert "Docstring: |
|
|
527 | assert re.search(r"Docstring:\s+cdoc for prop", captured.out) | |
|
528 | 528 | |
|
529 | 529 | ip.run_cell("b.non_exist?") |
|
530 | 530 | captured = capsys.readouterr() |
|
531 |
assert "Docstring: |
|
|
531 | assert re.search(r"Docstring:\s+cdoc for non_exist", captured.out) | |
|
532 | 532 | |
|
533 | 533 | ip.run_cell("b.undefined?") |
|
534 | 534 | captured = capsys.readouterr() |
|
535 | assert "Docstring: <no docstring>" in captured.out | |
|
535 | assert re.search(r"Type:\s+NoneType", captured.out) | |
|
536 | 536 | |
|
537 | 537 | |
|
538 | 538 | def test_pinfo_magic(): |
General Comments 0
You need to be logged in to leave comments.
Login now