h1. Cutter Two-methods-gem I use a lot for simple debugging & performance measuring purposes. Include it into Gemfile:
gem 'cutter'
h2. I) #inspect!
Insert #inspect! method into any of your methods:
def your_method *your_args
inspect! {} # this string exactly!
...
end
your_method(1,"foo",:bar) =>
method `your_method'
variables:
args: [1, "foo", :bar]
or in more rigorous way:
def your_another_method(first, second, third, &block)
inspect!(binding)
end
your_another_method(1,"foo",:bar) =>
method `your_another_method'
variables:
first: 1
second: "foo"
third: :bar
block:
Gives simple but nice trace for inspection: method's name and args that were passed to method
With :inspect => true we have self#inspect of class to which method belongs to:
def method_self_inspect
...
inspect!(:inspect => true) {}
end
method_self_inspect(1,2,3,4,5) =>
method: `method_self_inspect'
called from class: SelfInspectDemo
variables:
name: 1
args: [2, 3, 4, 5]
block:
self inspection:
#
And finally :level => N gives caller methods chain (N + 1 caller methods):
def method_caller_chain
...
inspect!(:level => 2)
end
method_caller_chain(1,2,3,4,5) =>
method: `method_caller_chain'
called from class: RSpec::Core::ExampleGroup::Nested_1::Nested_1
variables:
name: 1
args: [2, 3, 4, 5]
block:
caller methods:
/home/stanislaw/_work_/gems/cutter/spec/inspection/demo_spec.rb:33:in `method_caller_chain'
/home/stanislaw/_work_/gems/cutter/spec/inspection/demo_spec.rb:40:in `block (3 levels) in '
/home/stanislaw/.rvm/gems/ruby-1.9.2-p180@310/gems/rspec-core-2.6.4/lib/rspec/core/example.rb:48:in `instance_eval'
If you want all #inspect! methods fall silent at once, use
@Cutter::Inspection.quiet!@
To make them sound again do
@Cutter::Inspection.loud!@
You can clone it and try
@bundle exec rspec spec/inspection/demo_spec.rb@
Very! Very simple!
h2. II) #stamper
Stamper.scope :stan => "testing test_method" do |stan|
stan.msg _1: 'stamp1'
stan.msg _2: 'stamp2'
stan.msg _3: 'stamp3'
end
Stamper.scope :hello => "testing hello part" do |stan|
stan.msg _1: 'hello stan'
stan.msg _2: 'nice to see you'
end
v = 32
stamper :stan do |s|
s.stamp
s.stamp :_1
sleep 0.1
s.stamp :_2
s.stamp :hello_world
stamper :hello do |s|
s.stamp :_1
sleep 0.1
s.stamp :_2
end
sleep 0.1
s.stamp "hello world: #{v}" # access var before block
s.stamp :_3
sleep 0.1
end
=>
------------------------------
~ START "testing test_method"
~ stamp: 0 ms
~ stamp: 0 ms stamp1
~ stamp: 101 ms stamp2
~ stamp: 101 ms Hello world
------------------------------
~ START "testing hello part"
~ stamp: 0 ms hello stan
~ stamp: 101 ms nice to see you
~ END "testing hello part"
[101ms]
------------------------------
~ stamp: 305 ms Hello world: 32
~ stamp: 305 ms stamp3
~ END "testing test_method"
[406ms]
------------------------------
or simply:
def test_method
stamper {
piece of code
}
end
Acts as self.benchmark{} (in Rails) or Benchmark.measure{} (common Ruby) but with stamps in any position in block executed.
It is much simpler to write it quickly than all these Measure-dos.
h2. Contributors
* Stanislaw Pankevich
* Kristian Mandrup
h2. Copyright
Copyright (c) 2011 Stanislaw Pankevich