add opposite env feature for less repetition

This commit is contained in:
John Bintz 2012-08-29 11:31:13 -04:00
parent d5403f1139
commit 635e07a112
4 changed files with 71 additions and 5 deletions

View File

@ -73,6 +73,15 @@ no_deployment do
gems dev_gems, :github => 'johnbintz' gems dev_gems, :github => 'johnbintz'
end end
# an even shorter way to specify environments!
# in remote env, expands to:
# gem 'bullseye', :git => 'git://github.com/johnbintz/bullseye.git'
# in local env, expands to:
# gem 'bullseye', :path => '../bullseye'
env :remote, :opposite => :local do
gem 'bullseye', :github => 'johnbintz'
end
# only expanded on Mac OS X # only expanded on Mac OS X
os :darwin do os :darwin do
gem 'rb-fsevent' gem 'rb-fsevent'

View File

@ -235,6 +235,34 @@ Feature: Gemfiles
gem "one", "1.2.3", {:path=>"../one"} gem "one", "1.2.3", {:path=>"../one"}
""" """
Scenario: Create opposite environment gem assumptions to cut down on repetition
Given I have the file "Gemfile.penchant" with the content:
"""
defaults_for env(:local), :path => '../%s'
property(:github) { |name| { :git => "git://github.com/#{name}/%s.git" } }
env :remote, :opposite => :local do
gem 'one', :github => 'johnbintz', :require => nil
end
env :local, :opposite => :remote 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 Scenario: Override defaults for an environment
Given I have the file "Gemfile.penchant" with the content: Given I have the file "Gemfile.penchant" with the content:
""" """

View File

@ -138,6 +138,9 @@ module Penchant
end end
def env(*args) def env(*args)
options = {}
options = args.pop if args.last.kind_of?(::Hash)
@available_environments += args @available_environments += args
if block_given? if block_given?
@ -145,6 +148,16 @@ module Penchant
@_current_env_defaults = _defaults_for(Env.new(environment)) @_current_env_defaults = _defaults_for(Env.new(environment))
yield yield
@_current_env_defaults = {} @_current_env_defaults = {}
else
if options[:opposite]
if for_environment?([ options[:opposite] ].flatten)
@_current_env_defaults = _defaults_for(Env.new(environment))
@_strip_pathing_options = true
yield
@_strip_pathing_options = false
@_current_env_defaults = {}
end
end
end end
else else
Penchant::Gemfile::Env.new(args.shift) Penchant::Gemfile::Env.new(args.shift)
@ -203,7 +216,22 @@ module Penchant
def process_options(gem_name, template = {}) def process_options(gem_name, template = {})
properties = {} properties = {}
property_stack = _defaults_for(gem_name).dup.merge(template).to_a property_stack = template.to_a
original_properties = process_option_stack(gem_name, property_stack)
if @_strip_pathing_options
[ :git, :branch, :path ].each { |key| original_properties.delete(key) }
end
properties = process_option_stack(gem_name, _defaults_for(gem_name).to_a).merge(original_properties)
Hash[properties.sort]
end
def process_option_stack(gem_name, stack)
property_stack = stack.dup
properties = {}
while !property_stack.empty? while !property_stack.empty?
key, value = property_stack.shift key, value = property_stack.shift
@ -228,7 +256,7 @@ module Penchant
end end
end end
Hash[properties.sort] properties
end end
def _defaults_for(gem_name) def _defaults_for(gem_name)
@ -322,12 +350,13 @@ module Penchant
args = [ gem_name.first ] args = [ gem_name.first ]
args << version if version args << version if version
args << options if !options.empty?
if options[:git] if options[:git]
@defined_git_repos << Penchant::Repo.new(options[:git]) @defined_git_repos << Penchant::Repo.new(options[:git])
end end
args << options if !options.empty?
@output << %{gem #{args_to_string(args)}} @output << %{gem #{args_to_string(args)}}
end end

View File

@ -1,3 +1,3 @@
module Penchant module Penchant
VERSION = "0.2.20" VERSION = "0.2.21"
end end