add opposites feature to cut down on repetition
This commit is contained in:
parent
832ec8f30c
commit
a1e9874b30
16
README.md
16
README.md
@ -107,6 +107,22 @@ ensuring that hooks are always installed when `penchant gemfile` is executed, an
|
||||
that lets you pass in the username of the repo to reference that repo:
|
||||
`gem 'penchant', :github => 'johnbintz'`.
|
||||
|
||||
### Stupid-simple local/remote setup
|
||||
|
||||
Use `opposites :local, :remote` and environment settings for local/remote gems will be set accordingly depending
|
||||
on environment:
|
||||
|
||||
``` ruby
|
||||
defaults_for env(:local), :path => '../%s'
|
||||
opposites :local, :remote
|
||||
|
||||
env :remote do
|
||||
gem 'my-gem', :git => 'git://github.com/johnbintz/my-gem.git'
|
||||
end
|
||||
```
|
||||
|
||||
In `remote`, the Git repo version is used. In `local`, the path is used. Only one gem definition needed!
|
||||
|
||||
### Deployment mode
|
||||
|
||||
Use `no_deployment` blocks to indicate gems that shouldn't even appear in `Gemfiles` destined for
|
||||
|
@ -62,7 +62,6 @@ Feature: CLI
|
||||
When I run "bin/penchant gemfile remote" in the "tmp" directory
|
||||
Then the output should not include "git hooks not installed"
|
||||
|
||||
@wip
|
||||
Scenario: Install Penchant into a directory with no Gemfile
|
||||
Given I have the directory "tmp"
|
||||
When I run "bin/penchant install" in the "tmp" directory
|
||||
|
@ -263,6 +263,65 @@ Feature: Gemfiles
|
||||
gem "two", {:require=>nil}
|
||||
"""
|
||||
|
||||
Scenario: Set the opposite environment in the environment defaults
|
||||
Given I have the file "Gemfile.penchant" with the content:
|
||||
"""
|
||||
defaults_for env(:local), :path => '../%s', :opposite => :remote
|
||||
defaults_for env(:remote), :opposite => :local
|
||||
property(:github) { |name| { :git => "git://github.com/#{name}/%s.git" } }
|
||||
|
||||
env :remote do
|
||||
gem 'one', :github => 'johnbintz', :require => nil
|
||||
end
|
||||
env :local do
|
||||
gem 'two', :path => '../%s', :require => nil
|
||||
end
|
||||
"""
|
||||
When I rebuild the Gemfile for "local" mode
|
||||
Then the file "Gemfile" should have the following content:
|
||||
"""
|
||||
# generated by penchant, environment: local
|
||||
gem "one", {:path=>"../one", :require=>nil}
|
||||
gem "two", {:path=>"../two", :require=>nil}
|
||||
"""
|
||||
When I rebuild the Gemfile for "remote" mode
|
||||
Then the file "Gemfile" should have the following content:
|
||||
"""
|
||||
# generated by penchant, environment: remote
|
||||
gem "one", {:git=>"git://github.com/johnbintz/one.git", :require=>nil}
|
||||
gem "two", {:require=>nil}
|
||||
"""
|
||||
|
||||
Scenario: Define a pair of opposites
|
||||
Given I have the file "Gemfile.penchant" with the content:
|
||||
"""
|
||||
defaults_for env(:local), :path => '../%s'
|
||||
opposites :local, :remote
|
||||
|
||||
property(:github) { |name| { :git => "git://github.com/#{name}/%s.git" } }
|
||||
|
||||
env :remote do
|
||||
gem 'one', :github => 'johnbintz', :require => nil
|
||||
end
|
||||
env :local do
|
||||
gem 'two', :path => '../%s', :require => nil
|
||||
end
|
||||
"""
|
||||
When I rebuild the Gemfile for "local" mode
|
||||
Then the file "Gemfile" should have the following content:
|
||||
"""
|
||||
# generated by penchant, environment: local
|
||||
gem "one", {:path=>"../one", :require=>nil}
|
||||
gem "two", {:path=>"../two", :require=>nil}
|
||||
"""
|
||||
When I rebuild the Gemfile for "remote" mode
|
||||
Then the file "Gemfile" should have the following content:
|
||||
"""
|
||||
# generated by penchant, environment: remote
|
||||
gem "one", {:git=>"git://github.com/johnbintz/one.git", :require=>nil}
|
||||
gem "two", {:require=>nil}
|
||||
"""
|
||||
|
||||
Scenario: Override defaults for an environment
|
||||
Given I have the file "Gemfile.penchant" with the content:
|
||||
"""
|
||||
|
@ -143,15 +143,17 @@ module Penchant
|
||||
|
||||
@available_environments += args
|
||||
|
||||
requested_env_defaults = _defaults_for(Env.new(environment))
|
||||
|
||||
if block_given?
|
||||
if for_environment?(args)
|
||||
@_current_env_defaults = _defaults_for(Env.new(environment))
|
||||
@_current_env_defaults = requested_env_defaults
|
||||
yield
|
||||
@_current_env_defaults = {}
|
||||
else
|
||||
if options[:opposite]
|
||||
if for_environment?([ options[:opposite] ].flatten)
|
||||
@_current_env_defaults = _defaults_for(Env.new(environment))
|
||||
if opposite_environment = (options[:opposite] or requested_env_defaults[:opposite])
|
||||
if for_environment?([ environment, args, opposite_environment ].flatten.uniq)
|
||||
@_current_env_defaults = requested_env_defaults
|
||||
@_strip_pathing_options = true
|
||||
yield
|
||||
@_strip_pathing_options = false
|
||||
@ -160,7 +162,7 @@ module Penchant
|
||||
end
|
||||
end
|
||||
else
|
||||
Penchant::Gemfile::Env.new(args.shift)
|
||||
Env.new(args.shift)
|
||||
end
|
||||
end
|
||||
|
||||
@ -168,6 +170,14 @@ module Penchant
|
||||
@properties[name] = hash || block
|
||||
end
|
||||
|
||||
def opposites(left, right)
|
||||
@defaults[Env.new(left).to_s] ||= {}
|
||||
@defaults[Env.new(left).to_s][:opposite] = right
|
||||
|
||||
@defaults[Env.new(right).to_s] ||= {}
|
||||
@defaults[Env.new(right).to_s][:opposite] = left
|
||||
end
|
||||
|
||||
def for_environment?(envs)
|
||||
envs.include?(environment) || environment == ANY_ENVIRONMENT
|
||||
end
|
||||
@ -226,6 +236,8 @@ module Penchant
|
||||
|
||||
properties = process_option_stack(gem_name, _defaults_for(gem_name).to_a).merge(original_properties)
|
||||
|
||||
properties.delete(:opposite)
|
||||
|
||||
Hash[properties.sort]
|
||||
end
|
||||
|
||||
|
@ -1,3 +1,3 @@
|
||||
module Penchant
|
||||
VERSION = "0.2.22"
|
||||
VERSION = "0.2.23"
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user