DBT

DBT (Dependencies and deBugging Tool) is a RubyMotion tool that works for iOS, OSX, and Android to detect classes and dependencies. It will declare them in your config so you don't have to manually manage them.

iOS/OSX Dependency Analysis

DBT will look for break, require, and provides commands (and does a teensy bit of code analyzing - it will detect VERY basic class and module declarations) to make your RubyMotion debugger_cmds file easy to create, and declaring your file dependencies stupid simple.

CAUTION: It overwrites the debugger_cmds file!

To use, include this gem (gem 'dbt'), and add DBT.analyze(app) to your Rakefile, after you have added your own files to app.files. It looks at app.files and scans those files, so I mean it when I say "after you have added your own files". In your source code you add DBT commands:

# @provides Foo
# @requires module:Bar
class Foo
  include Bar

  def scary_method
#-----> break
    doing
    interesting
    stuff
  end

end

When you run rake, these commands will be found and translated into directives for app.files_dependencies and debugger_cmds. Run rake or rake debug=1, and off you go!

Your files will be grep'd for ^\w*(class|module), and these will be registered automatically as:

# you DON'T need to add these 'provides' lines!
# @provides class:ClassName
class ClassName
end

# @provides module:ModuleName
module ModuleName
end


# @provides module:Foo
module Foo
  # Sorry, no support for Foo::Bar... I do intend to add it, though!
  #
  # @provides class:Bar
  class Bar
  end
end


# ...in another file...
# @requires class:ClassName
# @requires module:ModuleName
class AnotherClass < ClassName
  include ModuleName
end

So right out of the box, you can add # @requires class:Foo if you're having trouble with dependencies and want a quick fix without having to add # @provides declarations all over the place.

Which begs the question, when would you need to declare an explicit # @provides? Examples:

Splitting up a class across multiple files:
controller.rb
# @provides Controller
class Controller < UIViewController
end
controller_table_view.rb
# provides table view methods
#
# @requires Controller
class Controller

  def numberOfSectionsInTableView(table_view)
    1
  end

end
Not-easily-greppable syntax
# @provides module:Foo::Bar
module Foo ; module Bar
end end

Android

In Android, dependencies are handled automatically, but you need to declare your Android::App::Activity classes in your config. Normally, you'd do something like this:

app.sub_activities = [
  "FirstActivity",
  "SecondActivity",
  # etc
]

With DBT, you can now add these declarations to the top of your activities:

# @activity FirstActivity
class FirstActivity < Android::App::Activity
  # ...
end

That's all the functionality we have for Android at the moment, but it's pretty helpful!

Breakpoints

Breakpoints are created using the syntax #--> break, with two or more dashes before the >. There must not be any whitespace before or after the #.

  def method
    do_something
#---> break
    do_dangerous_thing
  end

# you can also provide a line number
#--------> break 102
101:   def method
102:     do_something
103:     do_dangerous_thing
104:   end

If a line number is given to the break command, a breakpoint will be added at that line, otherwise it will be added to the line below break. It's better to insert the #--> break where you NEED it, rather than hardcode line numbers, since line numbers are not constant.

Running Tests

We have two simple test files, so just run them manually.

$ ruby spec/ios_spec.rb && ruby spec/android_spec.rb