2019-04-19 22:20:27 +00:00
|
|
|
# Copyright 2019 Ram Rachum.
|
|
|
|
# This program is distributed under the MIT license.
|
|
|
|
|
|
|
|
import io
|
|
|
|
import re
|
|
|
|
import abc
|
|
|
|
|
|
|
|
from python_toolbox import caching
|
|
|
|
from python_toolbox import sys_tools
|
2019-04-22 12:10:34 +00:00
|
|
|
from python_toolbox import temp_file_tools
|
2019-04-19 22:20:27 +00:00
|
|
|
|
|
|
|
import pysnooper
|
|
|
|
|
2019-04-21 13:53:18 +00:00
|
|
|
from .utils import (assert_output, VariableEntry, CallEntry, LineEntry,
|
|
|
|
ReturnEntry, OpcodeEntry, ExceptionEntry)
|
2019-04-19 22:20:27 +00:00
|
|
|
|
|
|
|
|
2019-04-21 13:53:18 +00:00
|
|
|
def test_string_io():
|
2019-04-19 22:20:27 +00:00
|
|
|
string_io = io.StringIO()
|
|
|
|
@pysnooper.snoop(string_io)
|
|
|
|
def my_function(foo):
|
|
|
|
x = 7
|
|
|
|
y = 8
|
|
|
|
return y + x
|
|
|
|
result = my_function('baba')
|
|
|
|
assert result == 15
|
|
|
|
output = string_io.getvalue()
|
2019-04-21 13:53:18 +00:00
|
|
|
assert_output(
|
2019-04-19 22:20:27 +00:00
|
|
|
output,
|
|
|
|
(
|
2019-04-21 13:53:18 +00:00
|
|
|
VariableEntry('foo', value_regex="u?'baba'"),
|
2019-04-19 22:20:27 +00:00
|
|
|
CallEntry(),
|
2019-04-21 18:39:32 +00:00
|
|
|
LineEntry('x = 7'),
|
|
|
|
VariableEntry('x', '7'),
|
|
|
|
LineEntry('y = 8'),
|
|
|
|
VariableEntry('y', '8'),
|
|
|
|
LineEntry('return y + x'),
|
|
|
|
ReturnEntry('return y + x'),
|
2019-04-19 22:20:27 +00:00
|
|
|
)
|
|
|
|
)
|
2019-04-21 18:39:32 +00:00
|
|
|
|
2019-04-19 22:20:27 +00:00
|
|
|
def test_variables():
|
|
|
|
|
2019-04-21 17:54:55 +00:00
|
|
|
class Foo(object):
|
2019-04-19 22:20:27 +00:00
|
|
|
def __init__(self):
|
|
|
|
self.x = 2
|
2019-04-21 18:39:32 +00:00
|
|
|
|
2019-04-19 22:20:27 +00:00
|
|
|
def square(self):
|
|
|
|
self.x **= 2
|
|
|
|
|
|
|
|
@pysnooper.snoop(variables=('foo.x', 're'))
|
|
|
|
def my_function():
|
|
|
|
foo = Foo()
|
|
|
|
for i in range(2):
|
|
|
|
foo.square()
|
|
|
|
|
|
|
|
with sys_tools.OutputCapturer(stdout=False,
|
|
|
|
stderr=True) as output_capturer:
|
|
|
|
result = my_function()
|
|
|
|
assert result is None
|
|
|
|
output = output_capturer.string_io.getvalue()
|
2019-04-21 13:53:18 +00:00
|
|
|
assert_output(
|
2019-04-19 22:20:27 +00:00
|
|
|
output,
|
|
|
|
(
|
2019-04-21 13:53:18 +00:00
|
|
|
VariableEntry(),
|
|
|
|
VariableEntry(),
|
2019-04-19 22:20:27 +00:00
|
|
|
CallEntry(),
|
2019-04-21 18:39:32 +00:00
|
|
|
LineEntry('foo = Foo()'),
|
2019-04-21 13:53:18 +00:00
|
|
|
VariableEntry(),
|
|
|
|
VariableEntry(),
|
2019-04-21 18:39:32 +00:00
|
|
|
LineEntry(),
|
2019-04-19 22:20:27 +00:00
|
|
|
VariableEntry('i', '0'),
|
2019-04-21 18:39:32 +00:00
|
|
|
LineEntry(),
|
2019-04-19 22:20:27 +00:00
|
|
|
VariableEntry('foo.x', '4'),
|
2019-04-21 18:39:32 +00:00
|
|
|
LineEntry(),
|
2019-04-19 22:20:27 +00:00
|
|
|
VariableEntry('i', '1'),
|
2019-04-21 18:39:32 +00:00
|
|
|
LineEntry(),
|
2019-04-19 22:20:27 +00:00
|
|
|
VariableEntry('foo.x', '16'),
|
2019-04-21 18:39:32 +00:00
|
|
|
LineEntry(),
|
|
|
|
ReturnEntry(),
|
2019-04-19 22:20:27 +00:00
|
|
|
)
|
2019-04-21 13:53:18 +00:00
|
|
|
)
|
2019-04-21 18:39:32 +00:00
|
|
|
|
2019-04-21 13:53:18 +00:00
|
|
|
def test_depth():
|
|
|
|
string_io = io.StringIO()
|
2019-04-21 18:39:32 +00:00
|
|
|
|
2019-04-21 13:53:18 +00:00
|
|
|
def f4(x4):
|
|
|
|
result4 = x4 * 2
|
|
|
|
return result4
|
2019-04-21 18:39:32 +00:00
|
|
|
|
2019-04-21 13:53:18 +00:00
|
|
|
def f3(x3):
|
|
|
|
result3 = f4(x3)
|
|
|
|
return result3
|
2019-04-21 18:39:32 +00:00
|
|
|
|
2019-04-21 13:53:18 +00:00
|
|
|
def f2(x2):
|
|
|
|
result2 = f3(x2)
|
|
|
|
return result2
|
2019-04-21 18:39:32 +00:00
|
|
|
|
2019-04-21 13:53:18 +00:00
|
|
|
@pysnooper.snoop(string_io, depth=3)
|
|
|
|
def f1(x1):
|
|
|
|
result1 = f2(x1)
|
|
|
|
return result1
|
2019-04-21 18:39:32 +00:00
|
|
|
|
2019-04-21 13:53:18 +00:00
|
|
|
result = f1(10)
|
|
|
|
assert result == 20
|
|
|
|
output = string_io.getvalue()
|
|
|
|
assert_output(
|
|
|
|
output,
|
|
|
|
(
|
|
|
|
VariableEntry(),
|
|
|
|
VariableEntry(),
|
|
|
|
CallEntry(),
|
2019-04-21 18:39:32 +00:00
|
|
|
LineEntry(),
|
|
|
|
|
2019-04-21 13:53:18 +00:00
|
|
|
VariableEntry(),
|
|
|
|
VariableEntry(),
|
|
|
|
CallEntry(),
|
2019-04-21 18:39:32 +00:00
|
|
|
LineEntry(),
|
|
|
|
|
2019-04-21 13:53:18 +00:00
|
|
|
VariableEntry(),
|
|
|
|
VariableEntry(),
|
|
|
|
CallEntry(),
|
|
|
|
LineEntry(),
|
2019-04-21 18:39:32 +00:00
|
|
|
|
2019-04-21 13:53:18 +00:00
|
|
|
VariableEntry(),
|
|
|
|
LineEntry(),
|
|
|
|
ReturnEntry(),
|
2019-04-21 18:39:32 +00:00
|
|
|
|
2019-04-21 13:53:18 +00:00
|
|
|
VariableEntry(),
|
|
|
|
LineEntry(),
|
|
|
|
ReturnEntry(),
|
2019-04-21 18:39:32 +00:00
|
|
|
|
2019-04-21 13:53:18 +00:00
|
|
|
VariableEntry(),
|
|
|
|
LineEntry(),
|
|
|
|
ReturnEntry(),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
2019-04-21 18:35:43 +00:00
|
|
|
|
|
|
|
def test_method_and_prefix():
|
|
|
|
|
|
|
|
class Baz(object):
|
|
|
|
def __init__(self):
|
|
|
|
self.x = 2
|
2019-04-21 18:39:32 +00:00
|
|
|
|
2019-04-21 18:35:43 +00:00
|
|
|
@pysnooper.snoop(variables=('self.x'), prefix='ZZZ')
|
|
|
|
def square(self):
|
|
|
|
foo = 7
|
|
|
|
self.x **= 2
|
|
|
|
return self
|
|
|
|
|
|
|
|
baz = Baz()
|
|
|
|
|
|
|
|
with sys_tools.OutputCapturer(stdout=False,
|
|
|
|
stderr=True) as output_capturer:
|
|
|
|
result = baz.square()
|
|
|
|
assert result is baz
|
|
|
|
assert result.x == 4
|
|
|
|
output = output_capturer.string_io.getvalue()
|
|
|
|
assert_output(
|
|
|
|
output,
|
|
|
|
(
|
|
|
|
VariableEntry(),
|
|
|
|
CallEntry(),
|
2019-04-21 18:39:32 +00:00
|
|
|
LineEntry('foo = 7'),
|
2019-04-21 18:35:43 +00:00
|
|
|
VariableEntry('foo', '7'),
|
2019-04-21 18:39:32 +00:00
|
|
|
LineEntry('self.x **= 2'),
|
|
|
|
LineEntry(),
|
|
|
|
ReturnEntry(),
|
2019-04-21 18:35:43 +00:00
|
|
|
),
|
|
|
|
prefix='ZZZ'
|
|
|
|
)
|
2019-04-22 12:10:34 +00:00
|
|
|
|
|
|
|
def test_file_output():
|
|
|
|
|
|
|
|
with temp_file_tools.create_temp_folder(prefix='pysnooper') as folder:
|
|
|
|
path = folder / 'foo.log'
|
|
|
|
@pysnooper.snoop(str(path))
|
|
|
|
def my_function(foo):
|
|
|
|
x = 7
|
|
|
|
y = 8
|
|
|
|
return y + x
|
|
|
|
result = my_function('baba')
|
|
|
|
assert result == 15
|
|
|
|
output = path.open().read()
|
|
|
|
assert_output(
|
|
|
|
output,
|
|
|
|
(
|
|
|
|
VariableEntry('foo', value_regex="u?'baba'"),
|
|
|
|
CallEntry(),
|
|
|
|
LineEntry('x = 7'),
|
|
|
|
VariableEntry('x', '7'),
|
|
|
|
LineEntry('y = 8'),
|
|
|
|
VariableEntry('y', '8'),
|
|
|
|
LineEntry('return y + x'),
|
|
|
|
ReturnEntry('return y + x'),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|