An easy way to track Ruby objects. Logs class and instance method calls with arguments, file name, line number and execution time. Helpful for debugging and learning the language.
- Ruby 2+
Add this line to your application's Gemfile:
gem 'object_tracker', '~> 2.1'
class Person
extend ObjectTracker
def greet(name)
"ello, #{name}!"
end
end
Track a single method:
Person.track_all! :greet
Or track all methods (such as to_s
, object_id
, respond_to?
, etc):
Person.track_all!
Or track an instance:
obj = Person.new.extend ObjectTracker
obj.track_all!
Or track an object without extending the class:
ObjectTracker.(Person)
ObjectTracker.(Person, :greet)
ObjectTracker.(Person, except: :respond_to?)
ObjectTracker.(me = Person.new)
Pass a proc (or anything that responds to #call
) to the :before
or :after
options and they will be called before and after the method call,
respectively. This allows you to do things like track the number of methods calls.
method_calls = Hash.new 0
slow_methods = Set.new []
hooks = [
before: ->(context, name, args) { method_calls[name] += 1 },
after: ->(context, name, args, duration) { slow_methods << name if duration > 0.05 }
]
ObjectTracker.(Person, *hooks)
ObjectTracker
uses the default Ruby logger with a default DEBUG
level
Silence logging
ObjectTracker.logger.level = Logger::ERROR
Tracking an ActiveRecord 3.2 model
ObjectTracker.(u = User.first).audits;nil
#=> User Load (0.3ms) SELECT `users`.* FROM `users` LIMIT 1
#=> [2017-04-13T21:45:48.827952] INFO -- ObjectTracker: following #<User:0x007f838d8cf560>
#=> [2017-04-13T21:45:48.828223] DEBUG -- ObjectTracker: User#class [RUBY CORE] (0.00000)
#=> [2017-04-13T21:45:48.838797] DEBUG -- ObjectTracker: User#association with [audits] [lib/active_record/associations.rb:155] (0.01073)
#=> [2017-04-13T21:45:48.838853] DEBUG -- ObjectTracker: User#audits [lib/active_record/associations/builder/association.rb:43] (0.01082)
Having problems? Maybe a specific method is throwing some obscure error? Try ignoring that method, so we can get back on track!
Person.track_all! except: :bad_method
- Fork it
- Run tests with
rake
(just kidding, there are no tests) - Boot a console with
bin/console
- Make sure things still work
- Make changes and submit a PR to https://github.com/ridiculous/object_tracker
MIT