Sync ENV variables between Rakefile and RubyMotion
Ruby
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
app
lib
resources
spec
.gitignore
Gemfile
Gemfile.lock
README.md
Rakefile
motion-env.gemspec

README.md

motion-env

gem install motion-env

In your Rakefile:

require 'motion-env'

Motion::Project::App.setup do |app|
  app.env['string'] = "Sup dog"
  app.env["int"] = 3
  app.env["bool"] = false
  app.env['hash'] = {herp: "derp"}
  app.env["array"] = [1,2,3]
  app.env["complex"] = [{hello: "world", array: [1,2,3]}, {something: :else}]
end

(app.ENV will also work, if you prefer symmetry)

In your app:

> ENV['string']
=> "Sup dog"
> ENV['int']
=> 3
> ENV['bool']
=> false
> ENV['hash']
=> {:herp=>"derp"}
> ENV['array']
=> [1, 2, 3]
> ENV['complex']
=> [{:hello=>"world", :array=>[1, 2, 3]}, {:something=>:else}]

How?

wtf

motion-env takes whatever you put in app.env and Marshal's the contents into ENV via code generation. At the same time, it swizzles [](key) to un-marshal the value (if appropriate). See builder.rb for implementation.

That means you can also Marshal POROs, assuming the class exists on both sides of the compilation:

class Person
  attr_accessor :name, :age

  def initialize(name, age)
    @name = name
    @age = age
  end
end

Motion::Project::App.setup do |app|
  app.env["object"] = Person.new("clay", 3)
end
> ENV["object"] # assumes you have Person defined somewhere
=> #<Person:0x8e62da0 @name="clay" @age=3>

Support

Big thanks to motion-my_env and @ainame for the inspiration.

Clay Allsopp