Skip to content

Commit

Permalink
first pass at adding a class to capture the stats of traces, called T…
Browse files Browse the repository at this point in the history
…race_Call__Stats
  • Loading branch information
DinisCruz committed Jan 7, 2024
1 parent cabb444 commit 3f56b5c
Show file tree
Hide file tree
Showing 7 changed files with 59 additions and 50 deletions.
4 changes: 0 additions & 4 deletions osbot_utils/utils/trace/Trace_Call.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,3 @@ def start(self):

def stop(self):
sys.settrace(self.prev_trace_function) # Restore the previous trace function

# todo: replace or refactor this method
def stack_json(self):
return self.trace_call_handler.stack_json()
22 changes: 9 additions & 13 deletions osbot_utils/utils/trace/Trace_Call__Handler.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import linecache
from osbot_utils.base_classes.Kwargs_To_Self import Kwargs_To_Self
from osbot_utils.utils.trace.Trace_Call__Config import Trace_Call__Config
from osbot_utils.utils.trace.Trace_Call__Stack import Trace_Call__Stack
from osbot_utils.base_classes.Kwargs_To_Self import Kwargs_To_Self
from osbot_utils.utils.trace.Trace_Call__Config import Trace_Call__Config
from osbot_utils.utils.trace.Trace_Call__Stack import Trace_Call__Stack
from osbot_utils.utils.trace.Trace_Call__Stack_Node import Trace_Call__Stack_Node
from osbot_utils.utils.trace.Trace_Call__Stats import Trace_Call__Stats

DEFAULT_ROOT_NODE_NODE_TITLE = 'Trace Session'

class Trace_Call__Handler(Kwargs_To_Self):
stack : Trace_Call__Stack
config : Trace_Call__Config
config : Trace_Call__Config
stack : Trace_Call__Stack
stats : Trace_Call__Stats


def __init__(self, **kwargs):
Expand Down Expand Up @@ -56,14 +58,6 @@ def should_capture(self, module, func_name):
break
return capture

# todo: replace or remove this temp method to help with refactoring
def stack_json(self):
data = []
for stack_node in self.stack:
item = self.stack_json__parse_node(stack_node)
data.append(item)
return data

def stack_json__parse_node(self, stack_node: Trace_Call__Stack_Node):
node = stack_node.data()
new_children = []
Expand All @@ -78,7 +72,9 @@ def stack_top(self):

def trace_calls(self, frame, event, arg):
if event == 'call':
self.stats.event_call +=1
self.handle_event__call(frame)
elif event == 'return':
self.stats.event_return += 1
self.handle_event__return(frame)
return self.trace_calls
15 changes: 15 additions & 0 deletions osbot_utils/utils/trace/Trace_Call__Stats.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from osbot_utils.base_classes.Kwargs_To_Self import Kwargs_To_Self


class Trace_Call__Stats(Kwargs_To_Self):

event_call : int
event_return: int

def __repr__(self):
return str(self.__locals__())

def __eq__(self, target):
if self is target:
return True
return self.__locals__() == target
1 change: 0 additions & 1 deletion tests/utils/trace/test_Trace_Call.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@ def test___enter__exit__(self, builtins_print):
assert trace_view_model.view_model == [] , "view_model should be empty initially"
assert print_traces.config.print_on_exit is False , "print_traces_on_exit should be False initially"

assert trace_call.stack_json() == [Trace_Call__Stack_Node(name=handler.trace_title).data()]
assert trace_call.stack[0] == Trace_Call__Stack_Node(name=handler.trace_title)

# Test the enter and exit methods
Expand Down
18 changes: 18 additions & 0 deletions tests/utils/trace/test_Trace_Call_Stats.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from unittest import TestCase

from osbot_utils.utils.trace.Trace_Call__Stats import Trace_Call__Stats


class test_Trace_Call_Stats(TestCase):

def setUp(self):
self.trace_call_stats = Trace_Call__Stats()

def test___kwargs__(self):
expected_locals = dict(event_call = 0 ,
event_return = 0 )

assert Trace_Call__Stats.__cls_kwargs__ () == expected_locals
assert Trace_Call__Stats.__default_kwargs__() == expected_locals
assert Trace_Call__Stats().__kwargs__ () == expected_locals
assert Trace_Call__Stats().__locals__ () == expected_locals
31 changes: 14 additions & 17 deletions tests/utils/trace/test_Trace_Call__Handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from osbot_utils.utils.trace.Trace_Call__Handler import Trace_Call__Handler, DEFAULT_ROOT_NODE_NODE_TITLE
from osbot_utils.utils.trace.Trace_Call__Stack import Trace_Call__Stack
from osbot_utils.utils.trace.Trace_Call__Stack_Node import Trace_Call__Stack_Node

from osbot_utils.utils.trace.Trace_Call__Stats import Trace_Call__Stats


class test_Trace_Call__Handler(TestCase):
Expand All @@ -24,9 +24,10 @@ def setUp(self):

def test___default_kwargs(self):
default_kwargs = Trace_Call__Handler.__default_kwargs__()
assert list_set(default_kwargs) == ['config', 'stack']
assert list_set(default_kwargs) == ['config', 'stack', 'stats']
assert type(default_kwargs.get('config')) is Trace_Call__Config
assert type(default_kwargs.get('stack')) is Trace_Call__Stack
assert type(default_kwargs.get('stack' )) is Trace_Call__Stack
assert type(default_kwargs.get('stats' )) is Trace_Call__Stats



Expand Down Expand Up @@ -69,21 +70,13 @@ def test_handle_event__call(self):
config.trace_capture_start_with = [module]

assert should_capture(module, func_name) is True # confirm that the function should be captured
assert len(stack) == 1
assert len(stack) == 1
new_node = handle_event__call(frame=sample_frame)
assert type(new_node) is Trace_Call__Stack_Node
assert stack[-1] == new_node
assert len(stack) == 2
assert stack[-1] == new_node
assert len(stack) == 2
assert new_node == Trace_Call__Stack_Node(call_index=1, frame=sample_frame, func_name='test_handle_event__call', name= 'test_Trace_Call__Handler.test_Trace_Call__Handler.test_handle_event__call', module='test_Trace_Call__Handler')
# assert new_node.data() == { 'call_index' : 1 ,
# 'children' : [] ,
# 'locals' : {} ,
# 'func_name' : 'test_handle_event__call' ,
# 'name' : 'test_Trace_Call__Handler.test_Trace_Call__Handler.test_handle_event__call',
# 'module' : 'test_Trace_Call__Handler',
# 'source_code' : '' ,
# 'source_code_caller' : '' ,
# 'source_code_location': '' }


def test_handle_event__return(self):
config = self.handler.config
Expand Down Expand Up @@ -118,7 +111,6 @@ def test_handle_event__return(self):
assert node_1 == Trace_Call__Stack_Node(call_index=1, children=[ ], frame=sample_frame, func_name='test_handle_event__return', name= 'test_Trace_Call__Handler.test_Trace_Call__Handler.test_handle_event__return', module='test_Trace_Call__Handler')



def test_should_capture(self):
should_capture = self.handler.should_capture
config = self.handler.config
Expand Down Expand Up @@ -231,7 +223,8 @@ def test_trace_calls(self):
assert type(frame_2).__name__ == 'frame'
assert type(frame_3).__name__ == 'frame'

assert len(stack) == 1
assert len(stack) == 1
assert self.handler.stats == Trace_Call__Stats()

# case 1: with bad data
assert trace_calls(frame=frame_1, event=None , arg=None) == trace_calls
Expand All @@ -248,6 +241,7 @@ def test_trace_calls(self):
# case 3: with valid frame and event buy with no capture
assert stack[0].data() == Trace_Call__Stack_Node(name=DEFAULT_ROOT_NODE_NODE_TITLE).data()
root_node = stack[0]
assert self.handler.stats == Trace_Call__Stats(event_call= 2, event_return=1)

config.trace_capture_all = True
assert trace_calls(frame_1, 'call', None) == trace_calls
Expand Down Expand Up @@ -321,6 +315,7 @@ def test_trace_calls(self):
frame = frame_3 ,
module = 'test_Trace_Call__Handler' ,
name = 'test_Trace_Call__Handler.test_Trace_Call__Handler.test_trace_calls' )
assert self.handler.stats == Trace_Call__Stats(event_call=6, event_return=2)


assert trace_calls(frame_3, 'return', None) == trace_calls
Expand All @@ -332,6 +327,7 @@ def test_trace_calls(self):
assert node_1_a.children == [node_2]
assert node_2.children == [node_3]
assert node_3.children == []
assert self.handler.stats == Trace_Call__Stats(event_call=6, event_return=3)

assert trace_calls(frame_2, 'return', None) == trace_calls
assert len(stack) == 2
Expand All @@ -352,6 +348,7 @@ def test_trace_calls(self):
assert node_1_a.children == [node_2]
assert node_2.children == [node_3]
assert node_3.children == []
assert self.handler.stats == Trace_Call__Stats(event_call=6, event_return=5)



Expand Down
18 changes: 3 additions & 15 deletions tests/utils/trace/test_Trace_Call__Stack.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,26 +179,14 @@ def test_stack_top(self):
new_node = stack.add_frame(test_data.frame_1)
assert len(stack) == 2
assert stack == [root_node, new_node]
#handler.config.trace_capture_all = True
#assert handler.add_frame(frame=test_data.frame_1) is True

#pprint(self.handler.stack)
#self.handler.stack[0].print()

#pprint(frames_test_data.__locals__())

# frame_1, frame_2, frame_3 = test_frame_1()
#
# frame_1, frame_2, frame_3 = test_frame_1()
# pprint(frame_1, frame_2, frame_3)

def test_bug__pop_doesnt_remove_node(self):
def test_regression__pop_doesnt_remove_node(self):
sample_frame = call_stack_current_frame()
stack = self.stack
node_1 = stack.push(sample_frame) # add frame to the stack
assert stack == [node_1]
assert stack.pop(sample_frame) is True # pop frame from stack
assert stack == [] # check that stack is empyty
assert stack.pop(sample_frame) is True # pop frame from stack | bug was here
assert stack == [] # check that stack is empyty | bug was here

class Frames_Test_Data(Kwargs_To_Self):
frame_1 = None
Expand Down

0 comments on commit 3f56b5c

Please sign in to comment.