magic_path

A gem for dynamic file paths. Paths can be defined using strings with variable substitution. i.e. 'fixtures/:product/:state". When the path is resolved into a string any part that begins with a colon will be replaced with it's value from a params hash or resolver object.

Installation

Add this line to your application's Gemfile:

gem 'magic_path'

And then execute:

$ bundle

Or install it yourself as:

$ gem install magic_path

Usage

Define a path and pass params to resolve

# Create our path
MagicPath.create_path :my_path, { pattern: 'data/:state/fixtures' }

# use the path
MagicPath.my_path.resolve { state: 'ohio' }
# /data/ohio/fixtures

Define a path using initial params

# Create our path
MagicPath.create_path :my_path, { pattern: 'data/:state/:product/fixtures', params: { product: 'foobar' } }

# use the path
MagicPath.my_path.resolve { state: 'ohio' }
# /data/ohio/foobar/fixtures

Define a path using other paths as variables

## Create our base path
MagicPath.create_path :base_data, { pattern: 'data/:state/:product', params: { product: 'foobar' } }
# Create our path
MagicPath.create_path :my_path, { pattern: ':base_data/fixtures' }

# use the path
MagicPath.my_path.resolve { state: 'ohio' }
# /data/ohio/foobar/fixtures

Define a path using environment variables (via Nenv)

require 'Nenv' 

# Create our path
MagicPath.create_path :my_path, { pattern: 'data/:test_env/fixtures' }

# use the path (Assuming test_env has been set to "test" in the environment)
MagicPath.my_path.to_s # to_s is the same as calling resolve without an aditional params hash.
# /data/test/fixtures

Resolvers

A resolver is a simply an object that can respond to a variable name. You can create your own and add the to MagicPath like so:

class MyResolver
  def test_env
    "test"
  end
end

# Create our path
MagicPath.create_path :my_path, { pattern: 'data/:test_env/fixtures' }
MagicPath.add_resolver MyResolver.new
MagicPath.my_path.to_s # to_s is the same as calling resolve without an aditional params hash.
# /data/test/fixtures

If Nenv has already been required by your code, it will be automatically used as a resolver.