From bdfd06da3ac38caf2d93348c22b0aac711810acb Mon Sep 17 00:00:00 2001 From: Lloyd Philbrook Date: Wed, 27 Sep 2017 17:41:21 -0500 Subject: [PATCH 1/3] First run --- .circleci/config.yml | 124 ++++++++++++++++++ .gitignore | 3 + .kitchen.yml | 28 ++++ .rubocop.yml | 33 +++++ .travis.yml | 6 + Berksfile | 7 + Gemfile | 35 +++++ Guardfile | 21 +++ LICENSE | 21 +++ README.md | 52 ++++++++ VERSION | 1 + chefignore | 96 ++++++++++++++ files/default/bashrc | 6 + libraries/matchers.rb | 9 ++ metadata.rb | 16 +++ recipes/default.rb | 4 + resources/bashrc_manager.rb | 69 ++++++++++ spec/bashrc_manager_spec.rb | 101 ++++++++++++++ spec/spec_helper.rb | 7 + spec/support/cookbooks/test/LICENSE | 0 spec/support/cookbooks/test/README.md | 0 spec/support/cookbooks/test/metadata.rb | 9 ++ .../cookbooks/test/recipes/bashrc_manager.rb | 9 ++ .../support/cookbooks/test/recipes/default.rb | 3 + 24 files changed, 660 insertions(+) create mode 100644 .circleci/config.yml create mode 100644 .kitchen.yml create mode 100644 .rubocop.yml create mode 100644 .travis.yml create mode 100644 Berksfile create mode 100644 Gemfile create mode 100644 Guardfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 VERSION create mode 100644 chefignore create mode 100644 files/default/bashrc create mode 100644 libraries/matchers.rb create mode 100644 metadata.rb create mode 100644 recipes/default.rb create mode 100644 resources/bashrc_manager.rb create mode 100644 spec/bashrc_manager_spec.rb create mode 100644 spec/spec_helper.rb create mode 100644 spec/support/cookbooks/test/LICENSE create mode 100644 spec/support/cookbooks/test/README.md create mode 100644 spec/support/cookbooks/test/metadata.rb create mode 100644 spec/support/cookbooks/test/recipes/bashrc_manager.rb create mode 100644 spec/support/cookbooks/test/recipes/default.rb diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..7a49ecd --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,124 @@ +version: 2 + +defaults: + env_setup: &env_setup + working_directory: ~/chef-bashrc_manager + docker: + - image: circleci/ruby:2.4.1 + + bundle_cache_name: &bundle_cache_name + bundler-cache-v1-{{ checksum "Gemfile.lock" }} + + install_bundle: &install_bundle + run: + name: Bundle install + command: bundle install --path vendor/bundle + + restore_bundle: &restore_bundle + restore_cache: + key: *bundle_cache_name + +jobs: + build: + <<: *env_setup + steps: + - checkout + - *restore_bundle + - *install_bundle + - save_cache: + key: *bundle_cache_name + paths: + - ./vendor/bundle + + test: + <<: *env_setup + steps: + - checkout + - *restore_bundle + - *install_bundle + - run: + name: Berks install + command: bundle exec berks install + - run: + name: Test rubocop + command: bundle exec rubocop + - run: + name: Test foodcritic + command: bundle exec foodcritic . + - run: + name: Test rspec + command: bundle exec rspec + + version_and_changelog_update: + <<: *env_setup + steps: + - checkout + - *restore_bundle + - *install_bundle + - add-ssh-keys: + fingerprints: + - "20:16:b9:4b:09:15:74:d5:8d:9c:1e:b2:33:47:9c:1c" + - run: + name: setup git for push + command: | + git push --set-upstream origin ${CIRCLE_BRANCH} + git config --global user.email "ci@tablexi.com" + git config --global user.name "CircleCI" + - run: + name: bump version + command: bundle exec bump patch --tag --no-bundle + - deploy: + name: push version to github + command: | + git push origin --tags + - run: + name: update changelog + command: bundle exec github_changelog_generator + - deploy: + name: push changelog to github + command: | + VERSION=`git describe --tags` + git add CHANGELOG.md + git commit --amend --no-edit + git push origin :$VERSION + git tag -f $VERSION + git push origin --tags + git push origin --force-with-lease + +workflows: + version: 2 + test_and_bump: + jobs: + - build: + filters: + tags: + ignore: + - /^v[0-9].*/ + - test: + requires: + - build + filters: + tags: + ignore: + - /^v[0-9].*/ + - hold: + type: approval + requires: + - test + filters: + branches: + only: + - master + tags: + ignore: + - /^v[0-9].*/ + - version_and_changelog_update: + requires: + - hold + filters: + branches: + only: + - master + tags: + ignore: + - /^v[0-9].*/ diff --git a/.gitignore b/.gitignore index cd3b225..ec304c0 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,6 @@ bin/* # RVM .rvmrc .ruby-* + +# Test Kitchen +.kitchen/* diff --git a/.kitchen.yml b/.kitchen.yml new file mode 100644 index 0000000..8331412 --- /dev/null +++ b/.kitchen.yml @@ -0,0 +1,28 @@ +--- +driver: + name: docker + privileged: true + use_sudo: false + +provisioner: + require_chef_omnibus: 12 + name: chef_zero + +platforms: + - name: amazonlinux + driver_config: + image: amazonlinux + platform: rhel + - name: centos-6 + - name: centos-7 + - name: debian-7 + - name: debian-8 + - name: debian-9 + - name: ubuntu-14.04 + - name: ubuntu-16.04 + +suites: + - name: default + run_list: + - recipe[test::default] + - recipe[test::bashrc_manager] diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 0000000..c6a8cd4 --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,33 @@ +AllCops: + Include: + - Berksfile + - Gemfile + - Rakefile + - Guardfile + Exclude: + - vendor/**/* + - cookbooks/**/* + +ClassLength: + Enabled: false +Documentation: + Enabled: false +Encoding: + Enabled: false +HashSyntax: + Enabled: false +LineLength: + Enabled: false +MethodLength: + Enabled: false +SignalException: + Enabled: false +WordArray: + Enabled: false +Style/FrozenStringLiteralComment: + Enabled: false +Metrics/BlockLength: + Exclude: + - spec/*.rb +Layout/IndentHeredoc: + Enabled: false diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..03b52ae --- /dev/null +++ b/.travis.yml @@ -0,0 +1,6 @@ +rvm: + - 1.9.3 + - 2.0.0 +script: + - bundle exec foodcritic -f any . + - bundle exec rspec --color --format progress \ No newline at end of file diff --git a/Berksfile b/Berksfile new file mode 100644 index 0000000..160a8f7 --- /dev/null +++ b/Berksfile @@ -0,0 +1,7 @@ +source 'https://supermarket.getchef.com' + +metadata + +group :unit do + cookbook 'test', path: 'spec/support/cookbooks/test' +end diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..8d06a01 --- /dev/null +++ b/Gemfile @@ -0,0 +1,35 @@ +source 'http://rubygems.org' + +ruby '2.4.1' + +gem 'berkshelf' +gem 'chef', '~> 12' + +group :ci do + gem 'bump' + gem 'github_changelog_generator' +end + +group :dev do + gem 'chefspec' + gem 'foodcritic' + gem 'rubocop' + gem 'stove' +end + +group :guard do + gem 'guard' + gem 'guard-foodcritic' + gem 'guard-kitchen' + gem 'guard-rspec' + gem 'guard-rubocop' + gem 'ruby_gntp' +end + +group :kitchen do + gem 'chef-zero' + gem 'kitchen-docker' + gem 'kitchen-ec2' + gem 'kitchen-transport-rsync' + gem 'test-kitchen' +end diff --git a/Guardfile b/Guardfile new file mode 100644 index 0000000..fd8628a --- /dev/null +++ b/Guardfile @@ -0,0 +1,21 @@ +group :red_green_refactor, halt_on_fail: true do + guard :rspec, cmd: 'bundle exec rspec', :all_on_start => true do + watch(%r{^spec\/(.+)_spec\.rb$}) + watch(%r{^recipes\/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" } + watch('spec/spec_helper.rb') { 'spec' } + end + + guard :foodcritic, :cli => '', :cookbook_paths => '.' do + watch(%r{attributes\/.+\.rb$}) + watch(%r{providers\/.+\.rb$}) + watch(%r{recipes\/.+\.rb$}) + watch(%r{resources\/.+\.rb$}) + watch(%r{^templates\/(.+)}) + watch('metadata.rb') + end + + guard :rubocop, :all_on_start => true do + watch(/.+\.rb$/) + watch(%r{(?:.+\/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) } + end +end diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..993e2c6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Table XI + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..74a2595 --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# bashrc_manager cookbook + +[![Circle CI](https://circleci.com/gh/tablexi/chef-bashrc_manager.svg?style=svg)](https://circleci.com/gh/tablexi/chef-bashrc_manager) + +This cookbook provides a simple `bashrc_manager` LWRP. + +It create multiple files in bashrc.d folder and merge them into bashrc file without loosing any local existing version. + +This cookbook was heavily influenced by the [bash cookbook](https://github.com/guilhem-cookbooks/bash). + +## Usage +Just add `bashrc_manager` to your cookbook dependency list. + +## Requirement + +* Chef 12.5 +* Linux Distro (Tested on CentOS, Debian, Amazon, & Ubuntu) + +## Resource / Provider +* `bashrc_manager` : does the init/setup/parse/merge process. This LWRP will create bashrc.d folder if not present. + +If an existing bashrc file exists in user home folder, it will be saved in a permanent init file at the very first run and then will be merged each time LWRP is called. + +### Action +* `add:` (default) - add a specified file to bashrc.d folder and merge all files from this folder to given user bashrc file. +* `remove:` - remove a specified file from bashrc.d folder. + +## Attributes + +* `filename` - name of the file + +* `user` - user to interact with. Group and home folder will be automaticly resolved from system informations. + +* `content` - String to be set on the new profile file. It easily works with simple string, multiline string, or strings loaded from a file. + +#### Syntax + + bashrc_manager 'profile.addin' do + user 'jdoe' + content "PATH=/home/jdoe/my_bin:$PATH" + end + +## Testing + +Includes basic [chefspec](sethvargo/chefspec) support and matchers. + +1. `bundle install` +2. `rspec` + +## Author + +Author:: Table XI () diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..3eefcb9 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.0.0 diff --git a/chefignore b/chefignore new file mode 100644 index 0000000..a6de142 --- /dev/null +++ b/chefignore @@ -0,0 +1,96 @@ +# Put files/directories that should be ignored in this file when uploading +# or sharing to the community site. +# Lines that start with '# ' are comments. + +# OS generated files # +###################### +.DS_Store +Icon? +nohup.out +ehthumbs.db +Thumbs.db + +# SASS # +######## +.sass-cache + +# EDITORS # +########### +\#* +.#* +*~ +*.sw[a-z] +*.bak +REVISION +TAGS* +tmtags +*_flymake.* +*_flymake +*.tmproj +.project +.settings +mkmf.log + +## COMPILED ## +############## +a.out +*.o +*.pyc +*.so +*.com +*.class +*.dll +*.exe +*/rdoc/ + +# Testing # +########### +.watchr +.rspec +spec/* +spec/fixtures/* +test/* +features/* +Guardfile +Procfile + +# SCM # +####### +.git +*/.git +.gitignore +.gitmodules +.gitconfig +.gitattributes +.svn +*/.bzr/* +*/.hg/* +*/.svn/* + +# Berkshelf # +############# +Berksfile +Berksfile.lock +cookbooks/* +tmp + +# Cookbooks # +############# +CONTRIBUTING +CHANGELOG* + +# Strainer # +############ +Colanderfile +Strainerfile +.colander +.strainer + +# Vagrant # +########### +.vagrant +Vagrantfile + +# Travis # +########## +.travis.yml diff --git a/files/default/bashrc b/files/default/bashrc new file mode 100644 index 0000000..f8248ec --- /dev/null +++ b/files/default/bashrc @@ -0,0 +1,6 @@ +# Managed by Chef. Local changes will be overwritten. +# To manually add resources to the bashrc, create a file in the ~/.bashrc.d folder and add your changes there. + +for file in ~/.bashrc.d/* ; do + source ${file} +done diff --git a/libraries/matchers.rb b/libraries/matchers.rb new file mode 100644 index 0000000..157cbd5 --- /dev/null +++ b/libraries/matchers.rb @@ -0,0 +1,9 @@ +if defined?(ChefSpec) + def add_bashrc(resource_name) + ChefSpec::Matchers::ResourceMatcher.new(:bashrc, :add, resource_name) + end + + def remove_bashrc(resource_name) + ChefSpec::Matchers::ResourceMatcher.new(:bashrc, :remove, resource_name) + end +end diff --git a/metadata.rb b/metadata.rb new file mode 100644 index 0000000..bfb97df --- /dev/null +++ b/metadata.rb @@ -0,0 +1,16 @@ +name 'bashrc_manager' +maintainer 'TableXI' +maintainer_email 'sysadmins@tablexi.com' +license 'MIT' +description 'Installs/Configures .bashrc file/s' +long_description IO.read(File.join(File.dirname(__FILE__), 'README.md')) +version IO.read(File.join(File.dirname(__FILE__), 'VERSION')) +issues_url 'https://github.com/tablexi/chef-bashrc_manager/issues' +source_url 'https://github.com/tablexi/chef-bashrc_manager' + +chef_version '~> 12' + +# Operating systems supported +%w[centos redhat amazon ubuntu].each do |os| + supports os +end diff --git a/recipes/default.rb b/recipes/default.rb new file mode 100644 index 0000000..9b5f1e7 --- /dev/null +++ b/recipes/default.rb @@ -0,0 +1,4 @@ +# +# Cookbook Name:: bashrc +# Recipe:: default +# diff --git a/resources/bashrc_manager.rb b/resources/bashrc_manager.rb new file mode 100644 index 0000000..d5656e1 --- /dev/null +++ b/resources/bashrc_manager.rb @@ -0,0 +1,69 @@ +resource_name :bashrc_manager + +property :filename, String, name_property: true +property :user, String, required: true +property :content, String, default: '' + +default_action :add + +action_class do + require 'etc' + + def group_gid + Etc.getpwnam(new_resource.user).gid + end + + def initial_config? + ::File.directory?(bashrc_d) + end + + def bashrc_d + ::File.join(::Dir.home(new_resource.user), '.bashrc.d') + end + + def bashrc + ::File.join(::Dir.home(new_resource.user), '.bashrc') + end +end + +action :add do # rubocop:disable Metrics/BlockLength + directory bashrc_d do + owner new_resource.user + group group_gid + mode 0o755 + end + + file ::File.join(bashrc_d, 'init') do + if ::File.exist?(::File.join(bashrc)) + content ::IO.read(::File.join(bashrc)) + else + action :touch + end + mode 0o444 + not_if { ::File.exist?(::File.join(bashrc_d, 'init')) } + end + + cookbook_file bashrc do + cookbook 'bashrc_manager' + source 'bashrc' + owner new_resource.user + group group_gid + mode 0o644 + end + + file ::File.join(bashrc_d, new_resource.filename) do + content <<-TXT +# Managed by Chef. Local changes will be overwritten. +#{new_resource.content} + TXT + owner new_resource.user + group group_gid + mode 0o644 + end +end + +action :remove do + file ::File.join(bashrc_d, new_resource.filename) do + action :delete + end +end diff --git a/spec/bashrc_manager_spec.rb b/spec/bashrc_manager_spec.rb new file mode 100644 index 0000000..33a7219 --- /dev/null +++ b/spec/bashrc_manager_spec.rb @@ -0,0 +1,101 @@ +require_relative 'spec_helper' + +EtcPwnam = Struct.new(:name, :gid) + +describe 'test::bashrc_manager' do + let(:chef_run) do + ChefSpec::ServerRunner.new(step_into: ['bashrc_manager']) + end + + before do + pw_user = EtcPwnam.new + pw_user.name = 'test_user' + pw_user.gid = 'users' + + allow(Dir).to receive(:home).and_call_original + allow(Etc).to receive(:getpwnam).and_call_original + + allow(Dir).to receive(:home).with('test_user').and_return('/home/test_user') + allow(Etc).to receive(:getpwnam).with('test_user').and_return(pw_user) + end + + context 'action create' do + context 'init' do + context 'default' do + before do + allow(File).to receive(:exist?).and_call_original + allow(IO).to receive(:read).and_call_original + + allow(File).to receive(:exist?).with('/home/test_user/.bashrc').and_return(true) + allow(File).to receive(:exist?).with('/home/test_user/.bashrc.d/init').and_return(false) + allow(IO).to receive(:read).with('/home/test_user/.bashrc').and_return('') + chef_run.converge described_recipe + end + + it 'to create .bashrc.d directory' do + expect(chef_run).to create_directory('/home/test_user/.bashrc.d') + end + + it 'to create .bashrc.d/init file' do + expect(chef_run).to create_file('/home/test_user/.bashrc.d/init') + end + + it 'to replace .bashrc with cookbook file' do + expect(chef_run).to create_cookbook_file('/home/test_user/.bashrc') + end + end + + context 'to touch' do + before do + chef_run.converge described_recipe + end + + it '.bashrc.d/init file' do + expect(chef_run).to touch_file('/home/test_user/.bashrc.d/init') + end + end + end + + context 'test1' do + before do + chef_run.converge described_recipe + end + + it 'create .bashrc.d/test1 file' do + expect(chef_run).to create_file('/home/test_user/.bashrc.d/test1') + end + + it 'append chef warning to .bashrc.d/test1 file' do + expect(chef_run).to render_file('/home/test_user/.bashrc.d/test1') + .with_content <<-TXT +# Managed by Chef. Local changes will be overwritten. +test1 + TXT + end + end + end + + context 'action remove' do + before do + chef_run.converge described_recipe + end + + it 'delete .bashrc.d/test2 file' do + expect(chef_run).to delete_file('/home/test_user/.bashrc.d/test2') + end + end + + context 'matcher' do + before do + chef_run.converge described_recipe + end + + it 'add_bashrc' do + expect(chef_run).to add_bashrc_manager('test1') + end + + it 'remove_bashrc' do + expect(chef_run).to remove_bashrc_manager('test2') + end + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 0000000..151e82f --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,7 @@ +require 'chefspec' +require 'chefspec/berkshelf' + +RSpec.configure do |config| + config.platform = 'amazon' + config.version = '2017.03' +end diff --git a/spec/support/cookbooks/test/LICENSE b/spec/support/cookbooks/test/LICENSE new file mode 100644 index 0000000..e69de29 diff --git a/spec/support/cookbooks/test/README.md b/spec/support/cookbooks/test/README.md new file mode 100644 index 0000000..e69de29 diff --git a/spec/support/cookbooks/test/metadata.rb b/spec/support/cookbooks/test/metadata.rb new file mode 100644 index 0000000..7999975 --- /dev/null +++ b/spec/support/cookbooks/test/metadata.rb @@ -0,0 +1,9 @@ +name 'test' +maintainer 'test' +maintainer_email 'test@test.com' +license '' +description 'Test the bash cookbook' +long_description 'Test the bash cookbook' +version '1.0' + +depends 'bashrc_manager' diff --git a/spec/support/cookbooks/test/recipes/bashrc_manager.rb b/spec/support/cookbooks/test/recipes/bashrc_manager.rb new file mode 100644 index 0000000..7acfb2b --- /dev/null +++ b/spec/support/cookbooks/test/recipes/bashrc_manager.rb @@ -0,0 +1,9 @@ +bashrc_manager 'test1' do + user 'test_user' + content 'test1' +end + +bashrc_manager 'test2' do + action :remove + user 'test_user' +end diff --git a/spec/support/cookbooks/test/recipes/default.rb b/spec/support/cookbooks/test/recipes/default.rb new file mode 100644 index 0000000..cd0d160 --- /dev/null +++ b/spec/support/cookbooks/test/recipes/default.rb @@ -0,0 +1,3 @@ +user 'test_user' do + manage_home true +end From 0db18ba9d0f1fe486cf3774eb61d35a9590c58af Mon Sep 17 00:00:00 2001 From: Lloyd Philbrook Date: Wed, 27 Sep 2017 17:50:23 -0500 Subject: [PATCH 2/3] Remove unnecessary key token --- .circleci/config.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7a49ecd..63bcc6d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -55,9 +55,6 @@ jobs: - checkout - *restore_bundle - *install_bundle - - add-ssh-keys: - fingerprints: - - "20:16:b9:4b:09:15:74:d5:8d:9c:1e:b2:33:47:9c:1c" - run: name: setup git for push command: | From e68a0868399029ec2f99ae35f0a012ae02aab3d8 Mon Sep 17 00:00:00 2001 From: Lloyd Philbrook Date: Wed, 27 Sep 2017 17:57:53 -0500 Subject: [PATCH 3/3] Bundle Gemfile.lock --- .gitignore | 1 - Gemfile.lock | 386 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 386 insertions(+), 1 deletion(-) create mode 100644 Gemfile.lock diff --git a/.gitignore b/.gitignore index ec304c0..1f8b8e1 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,6 @@ Berksfile.lock /cookbooks # Bundler -Gemfile.lock bin/* .bundle/* diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..c8ec8e5 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,386 @@ +GEM + remote: http://rubygems.org/ + specs: + activesupport (5.1.4) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (~> 0.7) + minitest (~> 5.1) + tzinfo (~> 1.1) + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) + artifactory (2.8.2) + ast (2.3.0) + aws-sdk (2.10.53) + aws-sdk-resources (= 2.10.53) + aws-sdk-core (2.10.53) + aws-sigv4 (~> 1.0) + jmespath (~> 1.0) + aws-sdk-resources (2.10.53) + aws-sdk-core (= 2.10.53) + aws-sigv4 (1.0.2) + backports (3.8.0) + berkshelf (6.3.1) + buff-config (~> 2.0) + buff-extensions (~> 2.0) + chef (>= 12.7.2) + cleanroom (~> 1.0) + concurrent-ruby (~> 1.0) + faraday (~> 0.9) + httpclient (~> 2.7) + minitar (~> 0.5, >= 0.5.4) + mixlib-archive (~> 0.4) + mixlib-shellout (~> 2.0) + octokit (~> 4.0) + retryable (~> 2.0) + ridley (~> 5.0) + solve (~> 4.0) + thor (~> 0.19, < 0.19.2) + buff-config (2.0.0) + buff-extensions (~> 2.0) + varia_model (~> 0.6) + buff-extensions (2.0.0) + buff-ignore (1.2.0) + buff-ruby_engine (1.0.0) + buff-shell_out (1.1.0) + buff-ruby_engine (~> 1.0) + builder (3.2.3) + bump (0.5.4) + celluloid (0.16.0) + timers (~> 4.0.0) + celluloid-io (0.16.2) + celluloid (>= 0.16.0) + nio4r (>= 1.1.0) + chef (12.21.12) + addressable + bundler (>= 1.10) + chef-config (= 12.21.12) + chef-zero (>= 4.8, < 13) + diff-lcs (~> 1.2, >= 1.2.4) + erubis (~> 2.7) + ffi-yajl (~> 2.2) + highline (~> 1.6, >= 1.6.9) + iniparse (~> 1.4) + mixlib-archive (~> 0.4) + mixlib-authentication (~> 1.4) + mixlib-cli (~> 1.7) + mixlib-log (~> 1.3) + mixlib-shellout (~> 2.0) + net-sftp (~> 2.1, >= 2.1.2) + net-ssh (>= 2.9, < 5.0) + net-ssh-multi (~> 1.2, >= 1.2.1) + ohai (>= 8.6.0.alpha.1, < 13) + plist (~> 3.2) + proxifier (~> 1.0) + rspec-core (~> 3.5) + rspec-expectations (~> 3.5) + rspec-mocks (~> 3.5) + rspec_junit_formatter (~> 0.2.0) + serverspec (~> 2.7) + specinfra (~> 2.10) + syslog-logger (~> 1.6) + uuidtools (~> 2.1.5) + chef-api (0.7.1) + logify (~> 0.1) + mime-types + chef-config (12.21.12) + addressable + fuzzyurl + mixlib-config (~> 2.0) + mixlib-shellout (~> 2.0) + chef-zero (5.3.2) + ffi-yajl (~> 2.2) + hashie (>= 2.0, < 4.0) + mixlib-log (~> 1.3) + rack (~> 2.0) + uuidtools (~> 2.1) + chefspec (7.1.0) + chef (>= 12.14.89) + fauxhai (>= 4, < 6) + rspec (~> 3.0) + cleanroom (1.0.0) + coderay (1.1.2) + concurrent-ruby (1.0.5) + cucumber-core (2.0.0) + backports (~> 3.6) + gherkin (~> 4.0) + diff-lcs (1.3) + erubis (2.7.0) + excon (0.59.0) + faraday (0.13.1) + multipart-post (>= 1.2, < 3) + faraday-http-cache (2.0.0) + faraday (~> 0.8) + fauxhai (5.4.0) + net-ssh + ffi (1.9.18) + ffi-yajl (2.3.1) + libyajl2 (~> 1.2) + foodcritic (11.4.0) + cucumber-core (>= 1.3) + erubis + ffi-yajl (~> 2.0) + nokogiri (>= 1.5, < 2.0) + rake + rufus-lru (~> 1.0) + treetop (~> 1.4) + formatador (0.2.5) + fuzzyurl (0.9.0) + gherkin (4.1.3) + github_changelog_generator (1.14.3) + activesupport + faraday-http-cache + multi_json + octokit (~> 4.6) + rainbow (>= 2.1) + rake (>= 10.0) + retriable (~> 2.1) + guard (2.14.1) + formatador (>= 0.2.4) + listen (>= 2.7, < 4.0) + lumberjack (~> 1.0) + nenv (~> 0.1) + notiffany (~> 0.0) + pry (>= 0.9.12) + shellany (~> 0.0) + thor (>= 0.18.1) + guard-compat (1.2.1) + guard-foodcritic (3.0.0) + foodcritic (>= 8) + guard (~> 2.12) + guard-compat (~> 1.2) + guard-kitchen (0.0.2) + guard + mixlib-shellout + guard-rspec (4.7.3) + guard (~> 2.1) + guard-compat (~> 1.1) + rspec (>= 2.99.0, < 4.0) + guard-rubocop (1.3.0) + guard (~> 2.0) + rubocop (~> 0.20) + hashie (3.5.6) + highline (1.7.8) + hitimes (1.2.6) + httpclient (2.8.3) + i18n (0.8.6) + iniparse (1.4.4) + ipaddress (0.8.3) + jmespath (1.3.1) + json (2.1.0) + kitchen-docker (2.6.0) + test-kitchen (>= 1.0.0) + kitchen-ec2 (1.3.2) + aws-sdk (~> 2) + excon + multi_json + retryable (~> 2.0) + test-kitchen (~> 1.4, >= 1.4.1) + kitchen-transport-rsync (0.1.2) + test-kitchen (~> 1.4) + libyajl2 (1.2.0) + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) + logify (0.2.0) + lumberjack (1.0.12) + method_source (0.9.0) + mime-types (3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2016.0521) + mini_portile2 (2.3.0) + minitar (0.6.1) + minitest (5.10.3) + mixlib-archive (0.4.1) + mixlib-log + mixlib-authentication (1.4.2) + mixlib-cli (1.7.0) + mixlib-config (2.2.4) + mixlib-install (2.1.12) + artifactory + mixlib-shellout + mixlib-versioning + thor + mixlib-log (1.7.1) + mixlib-shellout (2.3.2) + mixlib-versioning (1.2.2) + molinillo (0.6.3) + multi_json (1.12.2) + multipart-post (2.0.0) + nenv (0.3.0) + net-scp (1.2.1) + net-ssh (>= 2.6.5) + net-sftp (2.1.2) + net-ssh (>= 2.6.5) + net-ssh (4.2.0) + net-ssh-gateway (1.3.0) + net-ssh (>= 2.6.5) + net-ssh-multi (1.2.1) + net-ssh (>= 2.6.5) + net-ssh-gateway (>= 1.2.0) + net-telnet (0.1.1) + nio4r (2.1.0) + nokogiri (1.8.1) + mini_portile2 (~> 2.3.0) + notiffany (0.1.1) + nenv (~> 0.1) + shellany (~> 0.0) + octokit (4.7.0) + sawyer (~> 0.8.0, >= 0.5.3) + ohai (8.24.1) + chef-config (>= 12.5.0.alpha.1, < 14) + ffi (~> 1.9) + ffi-yajl (~> 2.2) + ipaddress + mixlib-cli + mixlib-config (~> 2.0) + mixlib-log (>= 1.7.1, < 2.0) + mixlib-shellout (~> 2.0) + plist (~> 3.1) + systemu (~> 2.6.4) + wmi-lite (~> 1.0) + parallel (1.12.0) + parser (2.4.0.0) + ast (~> 2.2) + plist (3.3.0) + polyglot (0.3.5) + powerpack (0.1.1) + proxifier (1.0.3) + pry (0.11.1) + coderay (~> 1.1.0) + method_source (~> 0.9.0) + public_suffix (3.0.0) + rack (2.0.3) + rainbow (2.2.2) + rake + rake (12.1.0) + rb-fsevent (0.10.2) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + retriable (2.1.0) + retryable (2.0.4) + ridley (5.1.1) + addressable + buff-config (~> 2.0) + buff-extensions (~> 2.0) + buff-ignore (~> 1.2) + buff-shell_out (~> 1.0) + celluloid (~> 0.16.0) + celluloid-io (~> 0.16.1) + chef-config (>= 12.5.0) + erubis + faraday (~> 0.9) + hashie (>= 2.0.2, < 4.0.0) + httpclient (~> 2.7) + json (>= 1.7.7) + mixlib-authentication (>= 1.3.0) + retryable (~> 2.0) + semverse (~> 2.0) + varia_model (~> 0.6) + rspec (3.6.0) + rspec-core (~> 3.6.0) + rspec-expectations (~> 3.6.0) + rspec-mocks (~> 3.6.0) + rspec-core (3.6.0) + rspec-support (~> 3.6.0) + rspec-expectations (3.6.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.6.0) + rspec-its (1.2.0) + rspec-core (>= 3.0.0) + rspec-expectations (>= 3.0.0) + rspec-mocks (3.6.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.6.0) + rspec-support (3.6.0) + rspec_junit_formatter (0.2.3) + builder (< 4) + rspec-core (>= 2, < 4, != 2.12.0) + rubocop (0.50.0) + parallel (~> 1.10) + parser (>= 2.3.3.1, < 3.0) + powerpack (~> 0.1) + rainbow (>= 2.2.2, < 3.0) + ruby-progressbar (~> 1.7) + unicode-display_width (~> 1.0, >= 1.0.1) + ruby-progressbar (1.9.0) + ruby_dep (1.5.0) + ruby_gntp (0.3.4) + rufus-lru (1.1.0) + safe_yaml (1.0.4) + sawyer (0.8.1) + addressable (>= 2.3.5, < 2.6) + faraday (~> 0.8, < 1.0) + semverse (2.0.0) + serverspec (2.41.0) + multi_json + rspec (~> 3.0) + rspec-its + specinfra (~> 2.72) + sfl (2.3) + shellany (0.0.1) + solve (4.0.0) + molinillo (~> 0.6) + semverse (>= 1.1, < 3.0) + specinfra (2.72.0) + net-scp + net-ssh (>= 2.7, < 5.0) + net-telnet + sfl + stove (6.0.0) + chef-api (~> 0.5) + logify (~> 0.2) + syslog-logger (1.6.8) + systemu (2.6.5) + test-kitchen (1.17.0) + mixlib-install (>= 1.2, < 3.0) + mixlib-shellout (>= 1.2, < 3.0) + net-scp (~> 1.1) + net-ssh (>= 2.9, < 5.0) + net-ssh-gateway (~> 1.2) + safe_yaml (~> 1.0) + thor (~> 0.19, < 0.19.2) + thor (0.19.1) + thread_safe (0.3.6) + timers (4.0.4) + hitimes + treetop (1.6.8) + polyglot (~> 0.3) + tzinfo (1.2.3) + thread_safe (~> 0.1) + unicode-display_width (1.3.0) + uuidtools (2.1.5) + varia_model (0.6.0) + buff-extensions (~> 2.0) + hashie (>= 2.0.2, < 4.0.0) + wmi-lite (1.0.0) + +PLATFORMS + ruby + +DEPENDENCIES + berkshelf + bump + chef (~> 12) + chef-zero + chefspec + foodcritic + github_changelog_generator + guard + guard-foodcritic + guard-kitchen + guard-rspec + guard-rubocop + kitchen-docker + kitchen-ec2 + kitchen-transport-rsync + rubocop + ruby_gntp + stove + test-kitchen + +RUBY VERSION + ruby 2.4.1p111 + +BUNDLED WITH + 1.15.0