poise-boiler 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,96 @@
1
+ #
2
+ # Copyright 2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'kitchen'
18
+ require 'kitchen-sync'
19
+
20
+
21
+ module PoiseBoiler
22
+ # Helpers for Test-Kitchen and .kitchen.yml configuration.
23
+ #
24
+ # @since 1.0.0
25
+ module Kitchen
26
+ extend self
27
+ # Shorthand names for kitchen platforms.
28
+ #
29
+ # @see PoiseBoiler::Kitchen.kitchen
30
+ PLATFORM_ALIASES = {
31
+ 'ubuntu' => %w{ubuntu-12.04 ubuntu-14.04},
32
+ 'rhel' => %w{centos-6 centos-7},
33
+ 'centos' => %w{rhel},
34
+ 'linux' => %w{ubuntu rhel},
35
+ }
36
+
37
+ # Return a YAML string suitable for inclusion in a .kitchen.yml config. This
38
+ # will include the standard Poise/Halite boilerplate and some default values.
39
+ #
40
+ # @param platforms [String, Array<String>] Name(s) of platforms to use by default.
41
+ # @see PoiseBoiler::Kitchen::PLATFORM_ALIASES
42
+ # @example .kitchen.yml
43
+ # #<% require 'poise_boiler' %>
44
+ # <%= PoiseBoiler.kitchen %>
45
+ def kitchen(platforms: 'ubuntu-14.04')
46
+ # SPEC_BLOCK_CI is used to force non-locking behavior inside tests.
47
+ chef_version = ENV['CHEF_VERSION'] || if ENV['SPEC_BLOCK_CI'] != 'true'
48
+ # If there isn't a specific override, lock TK to use the same version of Chef as the Gemfile.
49
+ require 'chef/version'
50
+ Chef::VERSION
51
+ end
52
+ {
53
+ 'chef_versions' => %w{12},
54
+ 'driver' => {
55
+ 'name' => (ENV['TRAVIS'] == 'true' ? 'dummy' : 'vagrant'),
56
+ 'require_chef_omnibus' => chef_version || true,
57
+ 'provision_command' => [
58
+ # Run some installs at provision so they are cached in the image.
59
+ # Install Chef (with the correct verison).
60
+ "curl -L https://chef.io/chef/install.sh | bash -s --" + (chef_version ? " -v #{chef_version}" : '' ),
61
+ # Install some kitchen-related gems. Normally installed during the verify step but that is idempotent.
62
+ "env GEM_HOME=/tmp/verifier/gems GEM_PATH=/tmp/verifier/gems GEM_CACHE=/tmp/verifier/gems/cache /opt/chef/embedded/bin/gem install thor busser busser-serverspec serverspec bundler",
63
+ # Fix directory permissions.
64
+ "chown -R kitchen /tmp/verifier",
65
+ ],
66
+ },
67
+ 'platforms' => expand_kitchen_platforms(platforms).map {|p| {'name' => p, 'run_list' => platform_run_list(p)} },
68
+ }.to_yaml.gsub(/---[ \n]/, '')
69
+ end
70
+
71
+ private
72
+
73
+ # Expand aliases from PLATFORM_ALIASES.
74
+ def expand_kitchen_platforms(platforms)
75
+ platforms = Array(platforms)
76
+ last_platforms = []
77
+ while platforms != last_platforms
78
+ last_platforms = platforms
79
+ platforms = platforms.map {|p| PLATFORM_ALIASES[p] || p}.flatten.uniq
80
+ end
81
+ platforms
82
+ end
83
+
84
+ # Return the platform-level run list for a given platform.
85
+ #
86
+ # @param platform [String] Platform name.
87
+ # @return [Array<String>]
88
+ def platform_run_list(platform)
89
+ if platform.start_with?('debian') || platform.start_with?('ubuntu')
90
+ %w{apt}
91
+ else
92
+ []
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,18 @@
1
+ #
2
+ # Copyright 2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'poise_boiler/helpers/rake'
18
+ ::PoiseBoiler::Helpers::Rake.install
@@ -0,0 +1,18 @@
1
+ #
2
+ # Copyright 2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ # This is just an alias for rake.rb
18
+ require 'poise_boiler/rake'
@@ -0,0 +1,18 @@
1
+ #
2
+ # Copyright 2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'poise_boiler/helpers/spec_helper'
18
+ ::PoiseBoiler::Helpers::SpecHelper.install
@@ -0,0 +1,20 @@
1
+ #
2
+ # Copyright 2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+
18
+ module PoiseBoiler
19
+ VERSION = '1.0.0'
20
+ end
@@ -0,0 +1,69 @@
1
+ #
2
+ # Copyright 2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ lib = File.expand_path('../lib', __FILE__)
18
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
19
+ require 'poise_boiler/version'
20
+
21
+ Gem::Specification.new do |spec|
22
+ spec.name = 'poise-boiler'
23
+ spec.version = PoiseBoiler::VERSION
24
+ spec.authors = ['Noah Kantrowitz']
25
+ spec.email = %w{noah@coderanger.net}
26
+ spec.description = 'Boilerplate-reduction helpers for Poise/Halite-style gemss.'
27
+ spec.summary = spec.description
28
+ spec.homepage = 'https://github.com/poise/poise-boiler'
29
+ spec.license = 'Apache 2.0'
30
+ spec.metadata['halite_ignore'] = 'true'
31
+
32
+ spec.files = `git ls-files`.split($/)
33
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
34
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
35
+ spec.require_paths = %w{lib}
36
+
37
+ # Development gems
38
+ spec.add_dependency 'addressable', '~> 2.3'
39
+ spec.add_dependency 'rake', '~> 10.4'
40
+ spec.add_dependency 'travis', '~> 1.7'
41
+ spec.add_dependency 'yard', '~> 0.8'
42
+ spec.add_dependency 'yard-classmethods', '~> 1.0'
43
+ spec.add_dependency 'halite', '~> 1.0' # This is a circular dependency
44
+ spec.add_dependency 'mixlib-shellout', '>= 1.4', '< 3.0' # Chef 11 means shellout 1.4 :-(
45
+ spec.add_dependency 'pry' # Travis depends on old-ass pry, see https://github.com/travis-ci/travis.rb/issues/245
46
+
47
+ # Test gems
48
+ spec.add_dependency 'rspec', '~> 3.2'
49
+ spec.add_dependency 'rspec-its', '~> 1.2'
50
+ spec.add_dependency 'chefspec', '~> 4.2'
51
+ spec.add_dependency 'fuubar', '~> 2.0'
52
+ spec.add_dependency 'simplecov', '~> 0.9'
53
+ spec.add_dependency 'foodcritic', '~> 4.0'
54
+
55
+ # Integration gems
56
+ spec.add_dependency 'test-kitchen', '~> 1.3'
57
+ spec.add_dependency 'kitchen-vagrant'
58
+ spec.add_dependency 'vagrant-wrapper'
59
+ spec.add_dependency 'kitchen-docker'
60
+ spec.add_dependency 'kitchen-sync'
61
+ spec.add_dependency 'berkshelf', '~> 3.2'
62
+
63
+ # Travis gems
64
+ spec.add_dependency 'codeclimate-test-reporter', '~> 0.4'
65
+ spec.add_dependency 'codecov', '~> 0.0', '>= 0.0.2'
66
+
67
+ # Development dependencies (yo dawg)
68
+ spec.add_development_dependency 'rspec-command', '~> 1.0'
69
+ end
@@ -0,0 +1,100 @@
1
+ #
2
+ # Copyright 2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'spec_helper'
18
+
19
+ describe PoiseBoiler::Helpers::Rake::Badges do
20
+ describe '#detect_github' do
21
+ let(:instance) { described_class.new(gem_name: '', base: '') }
22
+ subject { instance.send(:detect_github) }
23
+
24
+ context 'with normal data' do
25
+ before do
26
+ expect(instance).to receive(:git_shell_out).with(%w{name-rev --name-only HEAD}).and_return('master')
27
+ expect(instance).to receive(:git_shell_out).with(%w{config --get branch.master.remote}).and_return('origin')
28
+ expect(instance).to receive(:git_shell_out).with(%w{ls-remote --get-url origin}).and_return('git@github.com:poise/example.git')
29
+ end
30
+ it { is_expected.to eq 'poise/example' }
31
+ end # /context with normal data
32
+
33
+ context 'with no default remote' do
34
+ before do
35
+ expect(instance).to receive(:git_shell_out).with(%w{name-rev --name-only HEAD}).and_return('master')
36
+ expect(instance).to receive(:git_shell_out).with(%w{config --get branch.master.remote}).and_return('')
37
+ expect(instance).to receive(:git_shell_out).with(%w{ls-remote --get-url origin}).and_return('git@github.com:poise/example.git')
38
+ end
39
+ it { is_expected.to eq 'poise/example' }
40
+ end # /context with no default remote
41
+
42
+ context 'with an HTTP remote' do
43
+ before do
44
+ expect(instance).to receive(:git_shell_out).with(%w{name-rev --name-only HEAD}).and_return('master')
45
+ expect(instance).to receive(:git_shell_out).with(%w{config --get branch.master.remote}).and_return('')
46
+ expect(instance).to receive(:git_shell_out).with(%w{ls-remote --get-url origin}).and_return('https://github.com/poise/example.git')
47
+ end
48
+ it { is_expected.to eq 'poise/example' }
49
+ end # /context with an HTTP remote
50
+ end # /describe #detect_github
51
+
52
+ describe 'integration' do
53
+ rakefile "require 'poise_boiler/rakefile'"
54
+ rake_task 'badges'
55
+ before do
56
+ command(%w{git init})
57
+ command(%w{git remote add origin git@github.com:poise/example.git})
58
+ end
59
+
60
+ context 'non-cookbook' do
61
+ file 'example.gemspec', <<-EOH
62
+ Gem::Specification.new do |s|
63
+ s.name = 'example'
64
+ s.version = '1.0.0'
65
+ end
66
+ EOH
67
+ its(:stdout) { is_expected.to eq <<-EOH }
68
+ [![Build Status](https://img.shields.io/travis/poise/example.svg)](https://travis-ci.org/poise/example)
69
+ [![Gem Version](https://img.shields.io/gem/v/example.svg)](https://rubygems.org/gems/example)
70
+ [![Code Climate](https://img.shields.io/codeclimate/github/poise/example.svg)](https://codeclimate.com/github/poise/example)
71
+ [![Coverage](https://img.shields.io/codecov/c/github/poise/example.svg)](https://codecov.io/github/poise/example)
72
+ [![Gemnasium](https://img.shields.io/gemnasium/poise/example.svg)](https://gemnasium.com/poise/example)
73
+ [![License](https://img.shields.io/badge/license-Apache_2-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
74
+ EOH
75
+ its(:stderr) { is_expected.to eq '' }
76
+ its(:exitstatus) { is_expected.to eq 0 }
77
+ end # /context non-cookbook
78
+
79
+ context 'cookbook' do
80
+ file 'example.gemspec', <<-EOH
81
+ Gem::Specification.new do |s|
82
+ s.name = 'example'
83
+ s.version = '1.0.0'
84
+ s.add_dependency 'halite'
85
+ end
86
+ EOH
87
+ its(:stdout) { is_expected.to eq <<-EOH }
88
+ [![Build Status](https://img.shields.io/travis/poise/example.svg)](https://travis-ci.org/poise/example)
89
+ [![Gem Version](https://img.shields.io/gem/v/example.svg)](https://rubygems.org/gems/example)
90
+ [![Cookbook Version](https://img.shields.io/cookbook/v/example.svg)](https://supermarket.chef.io/cookbooks/example)
91
+ [![Code Climate](https://img.shields.io/codeclimate/github/poise/example.svg)](https://codeclimate.com/github/poise/example)
92
+ [![Coverage](https://img.shields.io/codecov/c/github/poise/example.svg)](https://codecov.io/github/poise/example)
93
+ [![Gemnasium](https://img.shields.io/gemnasium/poise/example.svg)](https://gemnasium.com/poise/example)
94
+ [![License](https://img.shields.io/badge/license-Apache_2-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
95
+ EOH
96
+ its(:stderr) { is_expected.to eq '' }
97
+ its(:exitstatus) { is_expected.to eq 0 }
98
+ end # /context cookbook
99
+ end # /describe integration
100
+ end
@@ -0,0 +1,50 @@
1
+ #
2
+ # Copyright 2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'spec_helper'
18
+
19
+ describe PoiseBoiler::Helpers::Rake::Travis do
20
+ rakefile "require 'poise_boiler/rakefile'"
21
+ rake_task 'travis'
22
+ file 'example.gemspec', <<-EOH
23
+ Gem::Specification.new do |s|
24
+ s.name = 'example'
25
+ s.version = '1.0.0'
26
+ end
27
+ EOH
28
+ file '.kitchen.yml', <<-EOH
29
+ suites: []
30
+ EOH
31
+ file 'README.md'
32
+
33
+ context 'no secure vars' do
34
+ environment TRAVIS_SECURE_ENV_VARS: nil
35
+
36
+ its(:stdout) { is_expected.to include 'Running task spec' }
37
+ its(:stdout) { is_expected.to include 'Running task chef:foodcritic' }
38
+ its(:stdout) { is_expected.to_not include 'Running task travis:integration' }
39
+ its(:exitstatus) { is_expected.to eq 0 }
40
+ end # /context no secure vars
41
+
42
+ context 'secure vars' do
43
+ environment TRAVIS_SECURE_ENV_VARS: '1'
44
+
45
+ its(:stdout) { is_expected.to include 'Running task spec' }
46
+ its(:stdout) { is_expected.to include 'Running task chef:foodcritic' }
47
+ its(:stdout) { is_expected.to include 'Running task travis:integration' }
48
+ its(:exitstatus) { is_expected.to eq 0 }
49
+ end # /context secure vars
50
+ end
@@ -0,0 +1,92 @@
1
+ #
2
+ # Copyright 2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'spec_helper'
18
+ require 'chef/version'
19
+
20
+ describe 'poise_boiler/kitchen' do
21
+ environment SPEC_BLOCK_CI: true
22
+ file '.kitchen.yml', <<-EOH
23
+ ---
24
+ #<% require 'poise_boiler' %>
25
+ <%= PoiseBoiler.kitchen %>
26
+
27
+ suites:
28
+ - name: default
29
+ EOH
30
+
31
+ context 'with defaults' do
32
+ context 'kitchen list' do
33
+ command 'kitchen list'
34
+ its(:stdout) { is_expected.to match(/default-ubuntu-1404\s+(Vagrant|Dummy)\s+ChefSolo\s+(Busser\s+Ssh\s+)?<Not Created>/) }
35
+ end # /context kitchen list
36
+
37
+ context 'kitchen diagnose' do
38
+ command 'kitchen diagnose'
39
+ its(:stdout) { is_expected.to match(%r{- curl -L https://chef.io/chef/install.sh | bash -s --$}) }
40
+ its(:stdout) { is_expected.to include('/opt/chef/embedded/bin/gem install thor busser busser-serverspec serverspec') }
41
+ its(:stdout) { is_expected.to include('require_chef_omnibus: true') }
42
+ end # /context kitchen diagnose
43
+ end # /context with defaults
44
+
45
+ context 'with a platform alias' do
46
+ file '.kitchen.yml', <<-EOH
47
+ ---
48
+ #<% require 'poise_boiler' %>
49
+ <%= PoiseBoiler.kitchen(platforms: 'linux') %>
50
+
51
+ suites:
52
+ - name: default
53
+ EOH
54
+ command 'kitchen list'
55
+ its(:stdout) { is_expected.to match(/default-ubuntu-1404\s+(Vagrant|Dummy)\s+ChefSolo\s+(Busser\s+Ssh\s+)?<Not Created>/) }
56
+ its(:stdout) { is_expected.to match(/default-ubuntu-1204\s+(Vagrant|Dummy)\s+ChefSolo\s+(Busser\s+Ssh\s+)?<Not Created>/) }
57
+ its(:stdout) { is_expected.to match(/default-centos-6\s+(Vagrant|Dummy)\s+ChefSolo\s+(Busser\s+Ssh\s+)?<Not Created>/) }
58
+ its(:stdout) { is_expected.to match(/default-centos-7\s+(Vagrant|Dummy)\s+ChefSolo\s+(Busser\s+Ssh\s+)?<Not Created>/) }
59
+ end # /context with a platform alias
60
+
61
+ context 'with $CHEF_VERSION set' do
62
+ command 'kitchen diagnose'
63
+ environment CHEF_VERSION: 12
64
+ its(:stdout) { is_expected.to match(%r{- curl -L https://chef.io/chef/install.sh | bash -s -- -v 12$}) }
65
+ its(:stdout) { is_expected.to include("require_chef_omnibus: '12'") }
66
+ end # /context with $CHEF_VERSION set
67
+
68
+ context 'with $CI set' do
69
+ command 'kitchen diagnose'
70
+ environment CI: true, SPEC_BLOCK_CI: false
71
+ its(:stdout) { is_expected.to match(%r{- curl -L https://chef.io/chef/install.sh | bash -s -- -v #{Chef::VERSION}$}) }
72
+ its(:stdout) { is_expected.to include("require_chef_omnibus: #{Chef::VERSION}") }
73
+ end # /context with $CI set
74
+
75
+ context 'with a platform override' do
76
+ file '.kitchen.yml', <<-EOH
77
+ ---
78
+ #<% require 'poise_boiler' %>
79
+ <%= PoiseBoiler.kitchen %>
80
+
81
+ platforms:
82
+ - name: gentoo
83
+ - name: arch
84
+
85
+ suites:
86
+ - name: default
87
+ EOH
88
+ command 'kitchen list'
89
+ its(:stdout) { is_expected.to match(/default-gentoo\s+(Vagrant|Dummy)\s+ChefSolo\s+(Busser\s+Ssh\s+)?<Not Created>/) }
90
+ its(:stdout) { is_expected.to match(/default-arch\s+(Vagrant|Dummy)\s+ChefSolo\s+(Busser\s+Ssh\s+)?<Not Created>/) }
91
+ end # /context with a platform override
92
+ end