Skip to content
This repository has been archived by the owner on Sep 24, 2019. It is now read-only.

Commit

Permalink
(MODULES-3704) Update gemfile template to be identical
Browse files Browse the repository at this point in the history
  • Loading branch information
hunner committed Nov 8, 2016
1 parent 864c1c9 commit 6e63f9a
Show file tree
Hide file tree
Showing 2 changed files with 201 additions and 53 deletions.
55 changes: 35 additions & 20 deletions config_defaults.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,25 @@
env: PUPPET_GEM_VERSION="~> 3.0"
bundler_args: --without system_tests
Gemfile:
supports_windows:
- puppetlabs-acl
- puppetlabs-chocolatey
- puppetlabs-dism
- puppetlabs-dsc
- puppetlabs-powershell
- puppetlabs-reboot
- puppetlabs-registry
- puppetlabs-sqlserver
- puppetlabs-wsus_client
required:
':development, :unit_tests':
':development':
- gem: puppet-lint
- gem: metadata-json-lint
- gem: puppet_facts
# newer version required for ruby 1.9 compat
- gem: puppet-blacksmith
version: '>= 3.4.0'
platforms: 'ruby'
- gem: puppetlabs_spec_helper
version: '>= 1.2.1'
# newer version required to PUP-5743
Expand All @@ -48,45 +60,48 @@ Gemfile:
- gem: simplecov
- gem: parallel_tests
version: '< 2.10.0'
ruby-operator: '<'
ruby-version: '2.0.0'
condition: "Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.0.0')"
- gem: parallel_tests
ruby-operator: '>='
ruby-version: '2.0.0'
condition: "Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.0.0')"
- gem: rubocop
version: '0.41.2'
ruby-operator: '<'
ruby-version: '2.0.0'
condition: "Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.0.0')"
- gem: rubocop
ruby-operator: '>='
ruby-version: '2.0.0'
condition: "Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.0.0')"
- gem: rubocop-rspec
version: '~> 1.6'
ruby-operator: '>='
ruby-version: '2.3.0'
condition: "Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.3.0')"
- gem: pry
# json_pure 2.0.2 added a requirement on ruby >= 2. We pin to json_pure <= 2.0.1
# if using ruby 1.x
- gem: json_pure
version: '<= 2.0.1'
ruby-operator: '<'
ruby-version: '2.0.0'
condition: "Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.0.0')"
':system_tests':
- gem: beaker
from_env: 'BEAKER_VERSION'
ruby-operator: '>='
ruby-version: '2.3.0'
version: '~> 2.20'
condition: "supports_windows"
- gem: beaker
from_env: 'BEAKER_VERSION'
condition: "Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.3.0') and ! supports_windows"
- gem: beaker
from_env: 'BEAKER_VERSION'
version: '< 3'
ruby-operator: '<'
ruby-version: '2.3.0'
condition: "Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.3.0') and ! supports_windows"
# beaker 3 requires this for PE installs
- gem: beaker-pe
ruby-operator: '>='
ruby-version: '2.3.0'
condition: "Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.3.0')"
- gem: beaker-rspec
from_env: 'BEAKER_RSPEC_VERSION'
# newer version required to avoid BKR-537
version: '>= 3.4'
- gem: serverspec
condition: "! supports_windows"
- gem: beaker-rspec
from_env: 'BEAKER_RSPEC_VERSION'
# newer version required to avoid BKR-537
version: '~> 5.1'
condition: "supports_windows"
- gem: beaker-puppet_install_helper
- gem: master_manipulator
- gem: beaker-hostgenerator
Expand Down
199 changes: 166 additions & 33 deletions moduleroot/Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,57 +2,190 @@

source ENV['GEM_SOURCE'] || "https://rubygems.org"

def location_from_env(env, default_location = [])
if location = ENV[env]
if location =~ /^((?:git|https?)[:@][^#]*)#(.*)/
[{ :git => $1, :branch => $2, :require => false }]
elsif location =~ /^file:\/\/(.*)/
['>= 0', { :path => File.expand_path($1), :require => false }]
else
[location, { :require => false }]
end
# Determines what type of gem is requested based on place_or_version.
def gem_type(place_or_version)
if place_or_version =~ /^git:/
:git
elsif place_or_version =~ /^file:/
:file
else
default_location
:gem
end
end

<%
def build_location(gem)
tags = []
tags << "'#{gem['version']}'" if gem['version']
tags << ":git => '#{gem['git']}'" if gem['git']
tags << ":branch => '#{gem['branch']}'" if gem['branch']
tags << ":platforms => #{gem['platforms']}" if gem['platforms']
ruby_expr = if (gem['ruby-operator'] && gem['ruby-version'])
" if RUBY_VERSION #{gem['ruby-operator']} '#{gem['ruby-version']}'"
else
nil
end
if gem['from_env']
", *location_from_env('#{gem['from_env']}', [#{tags.join(", ")}])#{ruby_expr}"
elsif tags.length > 0
", #{tags.join(", ")}#{ruby_expr}"
# Find a location or specific version for a gem. place_or_version can be a
# version, which is most often used. It can also be git, which is specified as
# `git://somewhere.git#branch`. You can also use a file source location, which
# is specified as `file://some/location/on/disk`.
def location_for(place_or_version, fake_version = nil)
if place_or_version =~ /^(git[:@][^#]*)#(.*)/
[fake_version, { :git => $1, :branch => $2, :require => false }].compact
elsif place_or_version =~ /^file:\/\/(.*)/
['>= 0', { :path => File.expand_path($1), :require => false }]
else
ruby_expr
[place_or_version, { :require => false }]
end
end
-%>

<%# Workaround to support boolean and array supports_windows settings until one form is no longer used %>
<% if @configs['supports_windows'] == true or (@configs['supports_windows'].is_a?(Array) and @configs['supports_windows'].include? @configs[:puppet_module]) -%>
# The following gems are not included by default as they require DevKit on Windows.
# You should probably include them in a Gemfile.local or a ~/.gemfile
#gem 'pry' #this may already be included in the gemfile
#gem 'pry-stack_explorer', :require => false
#if RUBY_VERSION =~ /^2/
# gem 'pry-byebug'
#else
# gem 'pry-debugger'
#end

# Used for gem conditionals
supports_windows = true
<% else -%>
# Used for gem conditionals
supports_windows = false
<% end -%>

<% groups = {} -%>
<% (@configs['required'].keys + ((@configs['optional'] || {}).keys)).uniq.each do |key| -%>
<% groups[key] = (@configs['required'][key] || []) + ((@configs['optional'] || {})[key] || []) -%>
<% end -%>
<% -%>
<% groups.each do |group, gems| -%>
group <%= group %> do
<% gems.each do |gem| -%>
gem '<%= gem['gem'] %>'<%= build_location(gem) %>
<% end -%>
<% maxlen = gems.map! do |gem| -%>
<% { -%>
<% 'gem' => gem['gem'], -%>
<% 'version' => gem['version'], -%>
<% 'git' => gem['git'], -%>
<% 'branch' => gem['branch'], -%>
<% 'ref' => gem['ref'], -%>
<% 'platforms' => gem['platforms'], -%>
<% 'length' => (gem['gem'].length + (
if gem['from_env']
" *location_for(ENV['#{gem['from_env']}'])".length + ((" || '#{gem['version']}'".length if gem['version']) || 0)
else
(", '#{gem['version']}'".length if gem['version']) || 0
end)), -%>
<% 'from_env' => gem['from_env'], -%>
<% 'condition' => gem['condition'] -%>
<% } -%>
<% end.map do |gem| -%>
<% gem['length'] -%>
<% end.max -%>
<% gems.each do |gem| -%>
gem '<%=
gem['gem'] %>', <%
if gem['from_env'] %>*location_for(ENV['<%= gem['from_env'] %>']<%= " || '#{gem['version']}'" if gem['version'] %>)<%
else -%><%= "'#{gem['version']}', " if gem['version'] %><%
end %><%=
' ' * (maxlen - gem['length']) %><%=
":require => false" if ! gem['from_env'] %><%=
", :git => '#{gem['git']}'" if gem['git'] %><%=
", :branch => '#{gem['branch']}'" if gem['branch'] %><%=
", :ref => '#{gem['ref']}'" if gem['ref'] %><%=
", :platforms => '#{gem['platforms']}'" if gem['platforms'] %><%=
" if #{gem['condition']}" if gem['condition'] %>
<% end -%>
end
<% end -%>
gem 'puppet', *location_for(ENV['PUPPET_GEM_VERSION'])

gem 'facter', *location_from_env('FACTER_GEM_VERSION')
gem 'puppet', *location_from_env('PUPPET_GEM_VERSION')
# Only explicitly specify Facter/Hiera if a version has been specified.
# Otherwise it can lead to strange bundler behavior. If you are seeing weird
# gem resolution behavior, try setting `DEBUG_RESOLVER` environment variable
# to `1` and then run bundle install.
gem 'facter', *location_for(ENV['FACTER_GEM_VERSION']) if ENV['FACTER_GEM_VERSION']
gem 'hiera', *location_for(ENV['HIERA_GEM_VERSION']) if ENV['HIERA_GEM_VERSION']

# json_pure 2.0.2 added a requirement on ruby >= 2. We pin to json_pure 2.0.1
# if using ruby 1.x
gem 'json_pure', '<=2.0.1', :require => false if RUBY_VERSION =~ /^1\./

<%# Workaround to support boolean and array supports_windows settings until one form is no longer used %>
<% if @configs['supports_windows'] == true or (@configs['supports_windows'].is_a?(Array) and @configs['supports_windows'].include? @configs[:puppet_module]) -%>
# For Windows dependencies, these could be required based on the version of
# Puppet you are requiring. Anything greater than v3.5.0 is going to have
# Windows-specific dependencies dictated by the gem itself. The other scenario
# is when you are faking out Puppet to use a local file path / git path.
explicitly_require_windows_gems = false
puppet_gem_location = gem_type(ENV['PUPPET_GEM_VERSION'])
# This is not a perfect answer to the version check
if puppet_gem_location != :gem or (! ENV['PUPPET_GEM_VERSION'].nil? and Gem::Requirement.new('< 3.5.0').satisfied_by?(Gem::Version.new(ENV['PUPPET_GEM_VERSION'])))
if Gem::Platform.local.os == 'mingw32'
explicitly_require_windows_gems = true
end
if puppet_gem_location == :gem
# If facterversion hasn't been specified and we are
# looking for a Puppet Gem version less than 3.5.0, we
# need to ensure we get a good Facter for specs.
gem "facter",">= 1.6.11","<= 1.7.5",:require => false unless ENV['FACTER_GEM_VERSION']
# If hieraversion hasn't been specified and we are
# looking for a Puppet Gem version less than 3.5.0, we
# need to ensure we get a good Hiera for specs.
gem "hiera",">= 1.0.0","<= 1.3.0",:require => false unless ENV['HIERA_GEM_VERSION']
end
end

if explicitly_require_windows_gems
# This also means Puppet Gem less than 3.5.0 - this has been tested back
# to 3.0.0. Any further back is likely not supported.
if puppet_gem_location == :gem
gem "ffi", "1.9.0", :require => false
gem "win32-eventlog", "0.5.3","<= 0.6.5", :require => false
gem "win32-process", "0.6.5","<= 0.7.5", :require => false
gem "win32-security", "~> 0.1.2","<= 0.2.5", :require => false
gem "win32-service", "0.7.2","<= 0.8.8", :require => false
gem "minitar", "0.5.4", :require => false
else
gem "ffi", "~> 1.9.0", :require => false
gem "win32-eventlog", "~> 0.5","<= 0.6.5", :require => false
gem "win32-process", "~> 0.6","<= 0.7.5", :require => false
gem "win32-security", "~> 0.1","<= 0.2.5", :require => false
gem "win32-service", "~> 0.7","<= 0.8.8", :require => false
gem "minitar", "~> 0.5.4", :require => false
end

gem "win32-dir", "~> 0.3","<= 0.4.9", :require => false
gem "win32console", "1.3.2", :require => false if RUBY_VERSION =~ /^1\./

# sys-admin was removed in Puppet 3.7.0+, and doesn't compile
# under Ruby 2.3 - so restrict it to Ruby 1.x
gem "sys-admin", "1.5.6", :require => false if RUBY_VERSION =~ /^1\./

# Puppet less than 3.7.0 requires these.
# Puppet 3.5.0+ will control the actual requirements.
# These are listed in formats that work with all versions of
# Puppet from 3.0.0 to 3.6.x. After that, these were no longer used.
# We do not want to allow newer versions than what came out after
# 3.6.x to be used as they constitute some risk in breaking older
# functionality. So we set these to exact versions.
gem "win32-api", "1.4.8", :require => false
gem "win32-taskscheduler", "0.2.2", :require => false
gem "windows-api", "0.4.3", :require => false
gem "windows-pr", "1.2.3", :require => false
else
if Gem::Platform.local.os == 'mingw32'
# If we're using a Puppet gem on windows, which handles its own win32-xxx gem dependencies (Pup 3.5.0 and above), set maximum versions
# Required due to PUP-6445
gem "win32-dir", "<= 0.4.9", :require => false
gem "win32-eventlog", "<= 0.6.5", :require => false
gem "win32-process", "<= 0.7.5", :require => false
gem "win32-security", "<= 0.2.5", :require => false
gem "win32-service", "<= 0.8.8", :require => false
end
end
<% end -%>
# Evaluate Gemfile.local if it exists
if File.exists? "#{__FILE__}.local"
eval(File.read("#{__FILE__}.local"), binding)
end

# Evaluate ~/.gemfile if it exists
if File.exists?(File.join(Dir.home, '.gemfile'))
eval(File.read(File.join(Dir.home, '.gemfile')), binding)
end

# vim:ft=ruby

0 comments on commit 6e63f9a

Please sign in to comment.