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