History

0.0.90 (2026-07-03)

  • Add custom-rewrite extension point to the augmentation framework;

  • Harden freevar frame walks;

0.0.87 (2026-06-24)

  • Add unary-op events (before_unaryop / after_unaryop and before_unaryop_arg / after_unaryop_arg), mirroring the binary-op event family;

  • Make BaseTracer.instrumented / pyc.instrumented non-mutating by default (build a fresh instrumented function via copy_function_with_code); add opt-in mutate=True to restore the old in-place rewrite;

  • Preserve captured closures when instrumenting a function, so a recompiled closure resolves its free variables instead of raising NameError;

  • Re-instrument syntax-augmented functions from their retained, augmentation-annotated AST rather than from inspect.getsource, preserving augmentations through the recompile;

  • Support instrumenting lambdas;

  • Fix instrumented() evicting sibling bookkeeping when its co_filename is shared (e.g. multiple defs/lambdas in one notebook cell);

  • Fix multi-tracer instrumentation: always retain self in the rewrite so a function instrumented for one tracer still fires its events when a second tracer is co-active;

  • Add position-aware transform(code, positions=...) and untransform to remap positions into transformed source and reverse the rewrite on an annotated AST; add parse(..., instrument=False);

  • Add a traceback-visibility registry so cooperating tracers can agree on which sandbox frames carry user-authored source and should survive frame-filtering;

  • Add opt-in keep_sandbox_source so inspect.getsource / tracebacks work for sandbox-compiled code with no on-disk source;

  • Add reverse-mode autodiff and concolic-execution examples;

0.0.86 (2026-06-12)

  • Support composition with transformational (global_guards_enabled = False) tracers: treat all of their handlers as guard-exempt when composed with a guard-using tracer;

  • Emit a guard-exempt fallback for comprehension elements so guard-exempt handlers still fire after the first iteration;

  • Only instrument for tracers that are not currently hard-disabled, keeping code rewritten while a tracer is disabled free of its unused guard machinery;

  • Add paired-delimiter augmentation for brace-block (NAME{...}) syntax, generalizing syntax augmentation beyond single-token replacement;

  • Add parse_fragment / exec_fragment for re-entrant instrumentation;

  • Allow scoping parse / parse_fragment instrumentation to a subset of tracers;

  • Share the sandbox-filename counter across tracer subclasses;

0.0.85 (2026-01-20)

  • Expose code transformation API;

0.0.84 (2026-01-19)

  • Better syntax augmentation support on fstrings;

0.0.83 (2026-01-15)

  • Optimize syntax augmentation application;

0.0.82 (2026-01-09)

  • Improve reliability of augmentation detection for BinOp / BoolOp by using ranges;

0.0.81 (2026-01-08)

  • Onboard subscripts to dot_prefix augmentation types;

0.0.80 (2026-01-06)

  • Bugfix to ensure event handler predicates use bookkeeping AST nodes;

0.0.78 (2026-01-03)

  • Bugfix to ensure complex symbol events are emitted in more contexts;

0.0.77 (2025-12-26)

  • Add mechanism to register additional AST bookkeeping fields;

0.0.76 (2025-12-25)

  • Add call augmentation spec type;

0.0.75 (2025-12-22)

  • Optimization for subscript slice when before_subscript_ events not used;

  • Add PipelineTracer and requisite event / library changes;

  • Optimize PipelineTracer / QuickLambdaTracer by turning off global guards;

0.0.73 (2025-11-21)

  • convenience events for before / after assert;

  • make compatible with Python 3.14;

0.0.72 (2025-04-10)

  • improve default tracer options;

  • bugfixes for coverage example;

  • for guard exempt handlers, only instrument exprs;

0.0.71 (2025-03-16)

  • suppress false positive deprecation warnings;

0.0.70 (2025-01-04)

  • add before / after for iter ast events

0.0.69 (2024-12-19)

  • Automatic bookkeeping for return expressions from after_module_stmt events;

0.0.68 (2024-12-12)

  • Always track containing statement during bookkeeping;

  • Improve recursion efficiency;

0.0.67 (2024-10-13)

  • Make AST bookkeeping garbage collection optional;

0.0.66 (2024-10-06)

  • Small configuration simplification;

0.0.65 (2024-08-25)

  • Implement garbage collection for invalidated AST bookkeeping;

0.0.64 (2024-07-21)

  • Implement guard exemption for event handlers;

  • Bugfix to ensure only applicable tracers transform ASTs of files instrumented in import hooks;

0.0.63 (2024-07-19)

  • Add py.typed;

0.0.58 (2024-07-12)

  • Support exception type instrumentation;

  • Add support for bytecode caching;

0.0.55 (2024-06-24)

  • Remove bare except;

  • Be robust to undefined builtins;

0.0.54 (2024-02-29)

  • Hoist global / nonlocal declarations above instrumentation branch;

0.0.53 (2024-02-24)

  • Add decorator trace event;

0.0.52 (2023-12-21)

  • Skip pyccolo frames in pdb;

0.0.51 (2023-12-19)

  • Improve ergonomics of trace stack get_field() with height param;

  • Add option to disable tracing for non-main threads;

  • Add is_initial_frame_stmt utility;

0.0.50 (2023-12-07)

  • Fix a bug in the optional chainer example;

0.0.49 (2023-08-19)

  • Fix a bug around trace stack field initialization;

0.0.48 (2023-07-15)

  • Fixes for 3.12 compat;

  • Improve composability of sys tracing;

0.0.45 (2023-01-02)

  • Environment var for developer mode with more verbose logging;

0.0.44 (2022-12-14)

  • Bugfix for circular deps;

  • Add events for various literal comprehensions;

0.0.43 (2022-12-06)

  • Bugfix to ensure that patched sys.settrace does no override behavior on new threads;

  • Bugfix to ensure that custom finder does not override behavior on new threads;

0.0.41 (2022-12-04)

  • Fix degraded performance of deepcopy when ast nodes have parent pointers;

0.0.39 (2022-11-19)

  • Use Python tokenizer for syntax extensions;

0.0.38 (2022-10-30)

  • Better meta_path fallback behavior;

0.0.37 (2022-10-26)

  • Bugfix for 3.11;

0.0.36 (2022-10-24)

  • Preserve global / nonlocal declarations in copy source;

0.0.35 (2022-08-06)

  • Record when passed argument is the last one

0.0.34 (2022-07-18)

  • Add enable / disable non-context convenience classmethods;

0.0.33 (2022-07-12)

  • Allow before_import handler to overwrite source_path;

  • Allow tracer classes to themselves be used as context managers;

0.0.32 (2022-07-02)

  • Disable tracing in import_hooks where applicable;

0.0.31 (2022-07-02)

  • Support for before / after import events;

0.0.30 (2022-07-02)

  • Better version handling;

  • Add NoopTracer just for use with exec / eval;

0.0.28 (2022-05-30)

  • Add ‘before_argument’ event;

  • OptionalChainer improvements;

0.0.27 (2022-05-30)

  • NullCoalescer -> OptionalChainer;

0.0.26 (2022-05-21)

  • Get rid of phantom dependency on pytest;

0.0.25 (2022-04-18)

  • Allow prefix / suffix augmentations for importfrom statements;

0.0.24 (2022-04-18)

  • Allow prefix / suffix augmentations for import statements;

0.0.23 (2022-03-18)

  • Support configuring whether global guards enabled;

  • Lazy importer: support unwrapping lazy symbols that result from subscripts;

0.0.22 (2022-03-17)

  • Preserve docstring in function definitions;

  • Perform __future__ imports first;

  • Add local guard functionality;

  • Add lazy import example;

0.0.21 (2022-03-02)

  • Bugfixes and improvements to FutureTracer example;

0.0.20 (2022-02-14)

  • Provide non-context manager variants of tracing-related contexts;

0.0.19 (2022-02-14)

  • Add ‘exit_module’ event;

  • Use deferred evaluation variants for all ‘before expr’ events;

  • Improve AST bookkeeping;

  • Add FutureTracer under pyccolo.examples;

  • Fix bug where starred expressions weren’t traced if used as literal elements;

0.0.17 (2022-02-03)

  • Fix packaging issue after new configuration;

0.0.14 (2022-02-02)

  • Move configuration out of setup.py;

0.0.13 (2022-01-31)

  • Default to all tracers in stack for package-level tracing enabled / disabled context managers;

  • Omit instrumentating the AST of statements underneath “with pyc.tracing_disabled()” bocks;

  • Add SkipAll return value;

  • Improve reentrancy for sys events;

0.0.12 (2022-01-30)

  • Expose logic for resolving tracer class based on module path;

0.0.11 (2022-01-30)

  • Expanded predicate functionality;

  • New events for after if / while test, after expr stmts, after lambda body, before / after augassign rhs;

  • Disambiguate between user and generated lambdas (e.g. used for before expr events);

0.0.10 (2022-01-26)

  • Simplify binop events;

  • Add compare events;

0.0.9 (2022-01-24)

  • Allow per-handler reentrancy;

0.0.8 (2022-01-23)

  • Add eval helper;

  • Add syntactic macro examples (quasiquotes and quick lambdas);

  • Add support for conditional handlers;

0.0.7 (2022-01-06)

  • Add cli;

  • Add basic readme documentation;

  • Allow returning pyc.Skip for skipping subsequent handlers for same event;

  • Misc improvements to file filter hooks;

  • Allow returning lambdas for before_expr events;

0.0.6 (2022-01-06)

  • Misc ergonomics improvements;

  • Enable for Python 3.10;

  • Enable linting and fix package-level imports;

0.0.5 (2021-12-29)

  • Get rid of future-annotations dependency;

  • Fix memory leak in sandbox exec;

0.0.4 (2021-12-26)

  • Misc composability improvements and fixes;

  • Improve file filter handling;

0.0.3 (2021-12-23)

  • Misc ergonomics improvements;

  • Misc composability improvements and fixes;

0.0.2 (2021-12-22)

  • Initial internal release;

0.0.1 (2020-10-25)

  • Initial placeholder release;