diff --git a/README.md b/README.md index 037f447..f77a337 100644 --- a/README.md +++ b/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 diff --git a/features/cli.feature b/features/cli.feature index 7e4dbe4..c3eaa1b 100644 --- a/features/cli.feature +++ b/features/cli.feature @@ -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 diff --git a/features/ruby_gemfile.feature b/features/ruby_gemfile.feature index 2a11fa3..3ea622b 100644 --- a/features/ruby_gemfile.feature +++ b/features/ruby_gemfile.feature @@ -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: """ diff --git a/lib/penchant/gemfile.rb b/lib/penchant/gemfile.rb index 8ff92e7..970ed94 100644 --- a/lib/penchant/gemfile.rb +++ b/lib/penchant/gemfile.rb @@ -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 diff --git a/lib/penchant/version.rb b/lib/penchant/version.rb index fe387bd..b94068a 100644 --- a/lib/penchant/version.rb +++ b/lib/penchant/version.rb @@ -1,3 +1,3 @@ module Penchant - VERSION = "0.2.22" + VERSION = "0.2.23" end