MotionBlender Build Status

MotionBlender enables to:

  • require Ruby files (must be RubyMotion-compatible) from RubyMotion files
  • require RubyMotion files from RubyMotion files as well

and then:

  • add required files to app.files
  • resolve dependencies following require tree and put it to app.files_dependencies

This is a sccessor of motion-require and MotionBundler.

motion-require is to resolve dependencies between RubyMotion files with motion_require method. This is only for RubyMotion files and not for using Ruby gems.

MotionBundler aims for using Ruby gems from RubyMotion. This is good for making an application but not for making a gem, because it requires to setup your application Gemfile explicitly.

So, MotionBlender is good for making RubyMotion-compatible gem which depends on other RubyMotion-compatible gems.

I made a fork of MotionSupport which is based on MotionBlender:

This is ready to use to make RubyMotion-compatible gems.

Installation

When making a gem

Add a dependency:

# in .gemspec file

Gem::Specification.new do |spec|
  # ...
  spec.add_runtime_dependency "motion_blender"
  # ...
end

When making an application

Add this line to your application's Gemfile:

gem 'motion_blender'

Usage

Add RubyMotion-compatible gem into your project (may be an application or a gem).

And just call require from anywhare:

require 'rubymotion_compatible_gem'

# your code goes on...

Writing a gem (motion_hoge), this idiom is handy:

# in lib/motion_hoge.rb
require 'motion_blender'
MotionBlender.incept

require 'motion_hoge/version'
require 'motion_hoge/simsim'
require 'motion_hoge/mishmish'
# ...

MotionBlender.incept adds this file to RubyMotion's app.files and targets for analyzing. To require this motion_hoge makes an application or a gem to load functionalities properly.

motion_blender itself is excepted for analyzing, so don't worry to require motion_blender in incept-ed files.

Parsing

It parses require statements properly in almost all the common cases.

Argument can be a string or an eval-able expression:

# Good
require 'something'
require File.join('path', 'to', 'feature')
require File.expand_path('../otherthing', __FILE__) # __FILE__ works properly

Wrapped in outer loop, works fine:

# Good
Dir.glob('lib/**/*.rb').each { |path| require path }
Dir[File.dirname(__FILE__) + '/lib/*.rb'].each { |file| require file }

Takes care of rescue clause:

# Good
begin
  require 'may_not_exist'
rescue LoadError
  require 'alternative'
end

How does it work?

In the RubyMotion application's Rakefile, motion_blender is to be required, typically via Bundler.require. Then it hooks build tasks. You can hit rake -P and see motion_blender:apply task is hooked.

In apply task, MotionBlender runs analyzer on all Motion::Project::Config#files. It uses parser and follows all require and require_relative. After that, add the newly encountered files to the head of Motion::Project::Config#files and put file dependencies to Motion::Project::Config#dependencies.

When compiling, require and require_relative is overwritten as noop.

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/kayhide/motion_blender. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

License

The gem is available as open source under the terms of the MIT License.