awesome_print_motion for RubyMotion
25 Nov 2013The Problem
Let’s say we’re building a version of Atari’s Pong in RubyMotion. We’re debugging an issue with the paddles; they don’t line up the way we want them to. Time to examine the playing field via the RubyMotion console.
pong-rm $ rake
Mouse over the playing field and Command-click
to grab the entire playing field object in the RubyMotion console. Confirm that you grabbed the object by typing self
at the console prompt.
(UIView(#9d820c0, [[0.0, 0.0], ...)> self
=> UIView(#9d820c0, [[0.0, 0.0], [480.0, 320.0]]), child of UIView(#c876920)
And then, to see what objects are on the playing field, use
self.subviews
to show the subviews array of the current object.
(UIView(#9d820c0, [[0.0, 0.0], ...)> self.subviews
=> [UIView(#9d82430, [[357.0, 175.0], [50.0, 50.0]]), child of
UIView(#9d820c0), PaddleView(#9d82580, [[410.0, 190.0], [20.0, 100.0]]),
child of UIView(#9d820c0), PaddleView(#9d82970, [[10.0, 190.0], [20.0,
100.0]]), child of UIView(#9d820c0), ScoreLabel(#9d82a80, [[110.0, 9.0],
[20.0, 42.0]], text: "1"), child of UIView(#9d820c0),
ScoreLabel(#9d83c90, [[350.0, 9.0], [20.0, 42.0]], text: "0"), child of
UIView(#9d820c0)]
(UIView(#9d820c0, [[0.0, 0.0], ...)>
This blob of text is difficult for the human brain to parse.
Solution: awesome_print_motion
Now, let’s try it with the awesome_print_motion
gem.
(UIView(#9d820c0, [[0.0, 0.0], ...)> ap(self.subviews)
[
[0] UIView(#9d82430, [[308.0, 118.0], [50.0, 50.0]]), child of UIView(#9d820c0),
[1] PaddleView(#9d82580, [[410.0, 190.0], [20.0, 100.0]]), child of UIView(#9d820c0),
[2] PaddleView(#9d82970, [[10.0, 190.0], [20.0, 100.0]]), child of UIView(#9d820c0),
[3] ScoreLabel(#9d82a80, [[110.0, 9.0], [39.0, 42.0]], text: "61"), child of UIView(#9d820c0),
[4] ScoreLabel(#9d83c90, [[350.0, 9.0], [20.0, 42.0]], text: "0"), child of UIView(#9d820c0)
]
=> nil
(UIView(#9d820c0, [[0.0, 0.0], ...)>
Much easier to read. The structure of the subviews
array is clear. Each element of the array has an easy-to-read index. Debugging time is reduced.
How to Install awesome_print_motion
RubyMotion uses bundler. So we start by refering to awesome_print_motion
in our gemfile.
gem 'awesome_print_motion'
In the app’s Rakefile
, there are two possible ways to proceed. The preferred way is to use the following lines to tell the app to require every gem mentioned in Bundler’s Gemfile:
begin
require 'bundler'
Bundler.require
rescue LoadError
end
The older way is to manually add a require
statement to the Rakefile.
require 'ap'
Personally, I prefer the newer way because it automatically
requires all of the gems mentioned in the Gemfile
. The odds of a
typo-induced error are reduced.
How to Use awesome_print_motion
To use the new gem, start the app and explore away. Any time you want to
run output through the awesome_print_motion
gem, send the code as a
parameter to the ap
method like so…
> ap(self.subviews)
… and the output will be easier to read.
Acknowledgements
Thank you Michael Dvorkin for adding RubyMotion support to your awesome_print gem.