rubymotion/BubbleWrap

View on GitHub
GEM.md

Summary

Maintainability
Test Coverage
# Creating a RubyMotion gem with BubbleWrap

Let's say we want to develop a simple library gem that lists the
people in a user's addressbook.

Let's start by initializing an empty gem directory:

```
$ gem install bundler
$ bundle gem bw-addressbook
```

Add BubbleWrap and Rake to your gem's dependencies in `bw-addressbook.gemspec`:

```ruby
Gem::Specification.new do |gem|
  gem.add_dependency 'bubble-wrap'
  gem.add_development_dependency 'rake'
end
```

Then run `bundler`:
```
$ bundle
Fetching gem metadata from https://rubygems.org/..
Using rake (0.9.2.2) 
Installing bubble-wrap (0.4.0) 
Using bw-addressbook (0.0.1) from source at /Users/jnh/Dev/tmp/bw-addressbook 
Using bundler (1.1.4) 
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
```

Modify your `lib/bw-addressbook.rb` to include:

```ruby
require 'bw-addressbook/version'
BW.require 'motion/address_book.rb'
```

Edit your project's `Rakefile` to include:

```ruby
#!/usr/bin/env rake
$:.unshift("/Library/RubyMotion/lib")
require 'motion/project'
require "bundler/gem_tasks"
Bundler.setup
Bundler.require
require 'bubble-wrap/test'
```

At this point we should have a working RubyMotion environment able to
compile our code as we write it.

Let's start by creating a spec for our address book gem in `spec/address_book_spec.rb`:

```ruby
describe AddressBook do
  describe '.list' do
    it 'returns an Enumerable' do
      AddressBook.list.is_a?(Enumerable).should == true
    end
  end
end
```

Now if you run `rake spec` you can watch the spec fail:

```
2012-06-07 11:19:35.506 Untitled[14987:f803] *** Terminating app due to uncaught exception 'NameError', reason: 'uninitialized constant AddressBook (NameError)'
*** First throw call stack:
(0x8f6022 0x286cd6 0x140054 0x291f 0x2645 0x1)
terminate called throwing an exception
```

Let's go and define ourselves an `AddressBook` class in `motion/address_book.rb`:

```ruby
class AddressBook
end
```

You'll now get a spec failure:

```
NoMethodError: undefined method `list' for AddressBook:Class
    spec.rb:156:in `block in run_spec_block': .list - returns an Enumerable
     4:in `execute_block'
    spec.rb:156:in `run_spec_block'
    spec.rb:171:in `run'
```

Well, we'd better go and define it then, eh?

```
class AddressBook
  def self.list
    []
  end
end
```

I'm going to leave it here for now, but you're welcome to take a look at the 
fully working demonstration project on [Github](http://github.com/jamesotron/bw-addressbook-demo).