amazing_tap

Labeled, chain-safe debugging built on amazing_print. tapp pretty-prints the receiver with a label inferred from the variable it was called on, plus its class and optional caller frames, then returns the receiver unchanged. Native Object#tap is not touched.

require "amazing_tap"

user = {
  id: 42,
  name: "Ada Lovelace",
  admin: true,
  roles: [:owner, :editor]
}

user.tapp
# user (Hash)
# {
#        id: 42,
#      name: "Ada Lovelace",
#     admin: true,
#     roles: [
#         [0] :owner,
#         [1] :editor
#     ]
# }

Output is colorized in a terminal: screenshot

Fork of shu0115/tap_amazing_print.

Installation

# Gemfile
gem "amazing_tap", group: :development

Or standalone:

gem install amazing_tap

Usage

Examples below use:

user = { id: 42, name: "Ada Lovelace" }

Chained receivers are inferred as written:

.owner.tapp
# account.owner (Hash)
# {
#       id: 42,
#     name: "Ada Lovelace"
# }

Explicit label instead of inference:

user.tapp(:after_update)
# after_update (Hash)
# { ... }

Label without the class:

user.tapp(type: false)
# user
# { ... }

Append the full caller as from lines:

user.tapp(backtrace: true)
# user (Hash)
# { ... }
#   from app/services/sync.rb:17:in 'Object#refresh'
#   from app/services/sync.rb:19:in '<main>'

Or only the first N frames:

user.tapp(backtrace: 3)
# user (Hash)
# { ... }
#   from app/services/sync.rb:22:in 'Object#persist'
#   from app/services/sync.rb:26:in 'Object#sync'
#   from app/services/sync.rb:28:in '<main>'

Label inference reads the receiver expression at the call site. It covers local variables, @ivars, $globals, dotted chains, and index access. When the source is not inferable (literals, parenthesized calls, multiline chains, REPL/eval), the header falls back to the class alone:

{ a: 1 }.tapp
# (Hash)
# { a: 1 }

Long output gets a closing marker so you can tell where each dump ends:

big_list.tapp
# big_list (Array)
# [
#   ... more than 24 lines ...
# ]
# /big_list

Configuration

AmazingTap.closing_threshold = 40   # lines before the closing "/label" appears; default 24
AmazingTap.show_type = false        # drop the class from headers globally; per-call type: overrides

Output is colorized whenever amazing_print would colorize (tty, or AmazingPrint.force_colors!).

tapap

tapap is an alias of tapp.

Development

bundle install
bundle exec rspec

License

MIT. See LICENSE.txt.