invocation-tree 0.0.17__tar.gz → 0.0.19__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. {invocation_tree-0.0.17/invocation_tree.egg-info → invocation_tree-0.0.19}/PKG-INFO +1 -1
  2. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/invocation_tree/__init__.py +34 -9
  3. {invocation_tree-0.0.17 → invocation_tree-0.0.19/invocation_tree.egg-info}/PKG-INFO +1 -1
  4. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/pyproject.toml +1 -1
  5. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/LICENSE.txt +0 -0
  6. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/MANIFEST.in +0 -0
  7. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/README.md +0 -0
  8. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/images/compute.gif +0 -0
  9. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/images/compute.py +0 -0
  10. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/images/create_gif.sh +0 -0
  11. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/images/create_images.sh +0 -0
  12. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/images/factorial.gif +0 -0
  13. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/images/factorial.py +0 -0
  14. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/images/permutations.gif +0 -0
  15. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/images/permutations.py +0 -0
  16. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/images/students.gif +0 -0
  17. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/images/students.py +0 -0
  18. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/images/vscode.png +0 -0
  19. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/invocation_tree.egg-info/SOURCES.txt +0 -0
  20. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/invocation_tree.egg-info/dependency_links.txt +0 -0
  21. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/invocation_tree.egg-info/requires.txt +0 -0
  22. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/invocation_tree.egg-info/top_level.txt +0 -0
  23. {invocation_tree-0.0.17 → invocation_tree-0.0.19}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: invocation_tree
3
- Version: 0.0.17
3
+ Version: 0.0.19
4
4
  Summary: Generates an invocation tree of functions calls.
5
5
  Author-email: Bas Terwijn <bterwijn@gmail.com>
6
6
  License: BSD 2-Clause License
@@ -7,7 +7,7 @@ import html
7
7
  import sys
8
8
  import difflib
9
9
 
10
- __version__ = "0.0.17"
10
+ __version__ = "0.0.19"
11
11
  __author__ = 'Bas Terwijn'
12
12
 
13
13
  def highlight_diff(str1, str2):
@@ -107,6 +107,7 @@ class Invocation_Tree:
107
107
  self.edges = []
108
108
  self.is_highlighted = False
109
109
  self.graph = None
110
+ self.prev_global_tracer = None
110
111
  self.ignore_calls = {'Invocation_Tree.__exit__', 'Invocation_Tree.stop_trace'}
111
112
 
112
113
  def __repr__(self):
@@ -114,13 +115,11 @@ class Invocation_Tree:
114
115
 
115
116
  def __call__(self, fun, *args, **kwargs):
116
117
  try:
117
- sys.settrace(self.trace_calls)
118
- print('calling fun()')
118
+ self.prev_global_tracer = sys.gettrace()
119
+ sys.settrace(self.global_tracer)
119
120
  result = fun(*args, **kwargs)
120
- print('fun() ended')
121
121
  finally:
122
- sys.settrace(None)
123
- print('fun() finally')
122
+ sys.settrace(self.prev_global_tracer)
124
123
  return result
125
124
 
126
125
  def value_to_string(self, key, value, use_repr=False):
@@ -258,8 +257,7 @@ class Invocation_Tree:
258
257
  def get_graph(self):
259
258
  return self.graph
260
259
 
261
- def trace_calls(self, frame, event, arg):
262
- print('trace_calls file:', frame.f_code.co_filename, 'line:', frame.f_lineno)
260
+ def trace(self, frame, event, arg):
263
261
  class_fun_name = get_class_function_name(frame)
264
262
  if not class_fun_name in self.ignore_calls:
265
263
  if event == 'call':
@@ -274,7 +272,34 @@ class Invocation_Tree:
274
272
  self.output_graph(frame, event)
275
273
  elif event == 'line' and self.each_line:
276
274
  self.output_graph(frame, event)
277
- return self.trace_calls
275
+
276
+ def global_tracer(self, frame, event, arg):
277
+ """ Global trace function that chains to any previous global tracer so it works in a debugger too. """
278
+ self.trace(frame, event, arg)
279
+ # call previous global tracer if any existed
280
+ prev_local_tracer = self.prev_global_tracer(frame, event, arg) if self.prev_global_tracer else None
281
+
282
+ def local_tracer(frame, event, arg):
283
+ """ Global trace is for a 'call' event that signals a new frame, it returns a local tracer to
284
+ handle other events in that frame. """
285
+ self.trace(frame, event, arg)
286
+ return local_tracer
287
+
288
+ def local_multiplexer(frame, event, arg):
289
+ """ Multiplexes between the local tracer and any previous local tracer so it works in a debugger too. """
290
+ nonlocal prev_local_tracer
291
+ # call local tracer
292
+ new_local_tracer = local_tracer(frame, event, arg)
293
+ if prev_local_tracer is not None:
294
+ # call previous local tracer if any existed
295
+ prev_local_tracer = prev_local_tracer(frame, event, arg)
296
+ # if previous local tracer returns None, stop tracing this frame as debugger probably stopped it
297
+ if prev_local_tracer is None:
298
+ return None
299
+ return local_multiplexer
300
+
301
+ return local_multiplexer
302
+
278
303
 
279
304
  def blocking(filename='tree.pdf'):
280
305
  return Invocation_Tree(filename=filename)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: invocation_tree
3
- Version: 0.0.17
3
+ Version: 0.0.19
4
4
  Summary: Generates an invocation tree of functions calls.
5
5
  Author-email: Bas Terwijn <bterwijn@gmail.com>
6
6
  License: BSD 2-Clause License
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "invocation_tree"
7
- version = "0.0.17"
7
+ version = "0.0.19"
8
8
  description = "Generates an invocation tree of functions calls."
9
9
  authors = [
10
10
  {name = "Bas Terwijn", email = "bterwijn@gmail.com"}