vagrant-application-cookbooks 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ # OS-specific
2
+ .DS_Store
3
+
4
+ # Bundler/Rubygems
5
+ *.gem
6
+ .bundle
7
+ pkg/*
8
+ tags
9
+ Gemfile.lock
10
+
11
+ # Vagrant
12
+ .vagrant
13
+ !example_box/Vagrantfile
14
+
15
+ # Berkshelf
16
+ cookbooks
17
+ Berksfile.lock
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format=doc
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ script:
5
+ - rake spec
data/CHANGELOG.md ADDED
@@ -0,0 +1,4 @@
1
+
2
+ # 0.1.0 (unreleased)
3
+
4
+ * Initial release
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ # We depend on Vagrant for development, but we don't add it as a
7
+ # gem dependency because we expect to be installed within the
8
+ # Vagrant environment itself using `vagrant plugin`.
9
+ gem "vagrant", "1.2.7",
10
+ :git => "https://github.com/mitchellh/vagrant.git",
11
+ :ref => "v1.2.7"
12
+ gem "berkshelf", "2.0.8"
13
+ gem "vagrant-omnibus", "1.1.1"
14
+ gem "vagrant-cachier", "0.3.3"
15
+ end
data/LICENSE ADDED
@@ -0,0 +1,8 @@
1
+ The MIT License (MIT)
2
+ Copyright (c) 2013 Torben Knerr
3
+
4
+ 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:
5
+
6
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
7
+
8
+ 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.
data/README.md ADDED
@@ -0,0 +1,71 @@
1
+ # Vagrant Application Cookbooks Plugin
2
+
3
+ [![Build Status](https://travis-ci.org/tknerr/vagrant-application-cookbooks.png?branch=master)](https://travis-ci.org/tknerr/vagrant-application-cookbooks)
4
+
5
+
6
+ This [Vagrant](http://www.vagrantup.com) 1.2+ plugin lets you specify application cookbooks to deploy your VMs with. It will take care of cloning the application cookbook from the Git repository, resolve its dependencies via Berkshelf, and configure the Chef Solo provisioner accordingly.
7
+
8
+ ## Features
9
+
10
+ * allows you to deploy [application cookbooks](http://red-badger.com/blog/2013/06/24/berkshelf-application-cookbooks/) from a git repository (remote or local)
11
+ * lets you choose a specific `ref` (i.e. commit, tag or branch) to deploy
12
+ * resolves each VMs application cookbook dependencies in isolation to `.vagrant/app-cookbooks/<vm-name>/cookbooks/` (i.e. no inter-VM dependency conflicts)
13
+ * uses the `Berksfile` that is shipped with the application cookbook to resolve dependencies
14
+ * configures the `cookbooks_path` of the `:chef_solo` provisioner accordingly
15
+
16
+ ## Usage
17
+
18
+ Install using standard Vagrant 1.1+ plugin installation methods or via bindler.
19
+
20
+ To deploy the `sample-app` application cookbook from the `master` branch:
21
+ ```ruby
22
+ Vagrant.configure("2") do |config|
23
+ config.vm.define :sample do |sample_config|
24
+ sample_config.app_cookbook.url = "https://github.com/tknerr/sample-application-cookbook"
25
+ sample_config.vm.provision :chef_solo do |chef|
26
+ chef.add_recipe "sample-app"
27
+ end
28
+ end
29
+ end
30
+ ```
31
+
32
+ Or to deploy from a specific git `ref`, `branch` or `tag`:
33
+ ```ruby
34
+ ...
35
+ sample_config.app_cookbook.url = "https://github.com/tknerr/sample-application-cookbook"
36
+ sample_config.app_cookbook.ref = "some_ref"
37
+ ...
38
+ ```
39
+
40
+ You can also use local file URLs:
41
+ ```ruby
42
+ ...
43
+ sample_config.app_cookbook.url = "file:///path/to/application-cookbook"
44
+ ...
45
+ ```
46
+
47
+
48
+ ## Development
49
+
50
+ To work on the `vagrant-application-cookbooks` plugin, clone this repository out, and use
51
+ [Bundler](http://gembundler.com) to get the dependencies:
52
+
53
+ ```
54
+ $ bundle
55
+ ```
56
+
57
+ Once you have the dependencies, verify the unit tests pass with `rake`:
58
+
59
+ ```
60
+ $ bundle exec rake
61
+ ```
62
+
63
+ If those pass, you're ready to start developing the plugin. You can test
64
+ the plugin without installing it into your Vagrant environment by using the
65
+ `Vagrantfile` in the top level of this directory and use bundler to execute Vagrant.
66
+
67
+ To test that the `my_app` vm is deployed with the `sample-app` application cookbook simply run:
68
+ ```
69
+ $ bundle exec vagrant up my_app
70
+ ```
71
+
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'rspec/core/rake_task'
4
+
5
+ # Immediately sync all stdout so that tools like buildbot can
6
+ # immediately load in the output.
7
+ $stdout.sync = true
8
+ $stderr.sync = true
9
+
10
+ # Change to the directory of this file.
11
+ Dir.chdir(File.expand_path("../", __FILE__))
12
+
13
+ # This installs the tasks that help with gem creation and
14
+ # publishing.
15
+ Bundler::GemHelper.install_tasks
16
+
17
+ # Install the `spec` task so that we can run tests.
18
+ RSpec::Core::RakeTask.new
19
+
20
+ # Default task is to run the unit tests
21
+ task :default => "spec"
data/TODO.md ADDED
@@ -0,0 +1,17 @@
1
+
2
+ # TODO
3
+
4
+ [x] improve log/info output
5
+ [-] configure app cookbook in chef_solo config rather than vm config
6
+ [x] warn if cookbook_path is manually configured and will be overridden
7
+ [x] skip everything (e.g. cloning, resolving deps) for vms which don't define an app cookbook
8
+ [x] skip everything for vms which don't have a chef provisioner
9
+ [x] support for cloning a specific ref / branch / tag
10
+ [-] configure the default recipe automatically
11
+ [ ] use Berkshelf Ruyb API rather than shelling out
12
+ [x] add spec tests for the config
13
+ [ ] add spec tests for the clone action
14
+ [ ] check if url is a valid url
15
+ [ ] use i18n
16
+ [ ] suppress stdout / stderr when shelling out git commands
17
+ [ ] add support for more provisioners / dependency managers
data/Vagrantfile ADDED
@@ -0,0 +1,76 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ # require plugin for testing via bundler
5
+ Vagrant.require_plugin "vagrant-application-cookbooks"
6
+ Vagrant.require_plugin "vagrant-omnibus"
7
+ Vagrant.require_plugin "vagrant-cachier"
8
+
9
+ Vagrant.configure("2") do |config|
10
+
11
+ config.omnibus.chef_version = "11.6.0"
12
+ config.cache.auto_detect = true
13
+
14
+ config.vm.box = "opscode_ubuntu-12.04_provisionerless"
15
+ config.vm.box_url = "https://opscode-vm-bento.s3.amazonaws.com/vagrant/opscode_ubuntu-12.04_provisionerless.box"
16
+
17
+ #
18
+ # configure vm to be deployed with application cookbook
19
+ #
20
+ config.vm.define :my_app do |my_app_config|
21
+ # app cookbook to deploy
22
+ my_app_config.app_cookbook.url = "https://github.com/tknerr/sample-application-cookbook"
23
+
24
+ my_app_config.vm.provision :chef_solo do |chef|
25
+ chef.add_recipe "sample-app"
26
+ chef.json = {
27
+ :sample_app => {
28
+ :words_of_wisdom => "Chuck Norris' beard can type 140 wpm!"
29
+ }
30
+ }
31
+ end
32
+ end
33
+
34
+ #
35
+ # example for deploying a specific branch
36
+ #
37
+ config.vm.define :my_app_branched do |my_app_config|
38
+ # app cookbook to deploy
39
+ my_app_config.app_cookbook.url = "https://github.com/tknerr/sample-application-cookbook"
40
+ my_app_config.app_cookbook.ref = "lxc"
41
+
42
+ my_app_config.vm.provision :chef_solo do |chef|
43
+ chef.add_recipe "sample-app"
44
+ end
45
+ end
46
+
47
+ #
48
+ # example using a local file url
49
+ #
50
+ config.vm.define :my_app_local_file do |my_app_config|
51
+ # app cookbook to deploy
52
+ my_app_config.app_cookbook.url = "file://D:/Repos/_github/_cookbooks/sample-application-cookbook"
53
+
54
+ my_app_config.vm.provision :chef_solo do |chef|
55
+ chef.add_recipe "sample-app"
56
+ end
57
+ end
58
+
59
+ #
60
+ # example without application cookbook configured
61
+ #
62
+ config.vm.define :my_app_no_app_cookbook do |my_app_config|
63
+ my_app_config.vm.provision :chef_solo do |chef|
64
+ chef.add_recipe "sample-app"
65
+ end
66
+ end
67
+
68
+ #
69
+ # example without provisioner - should kick in here
70
+ #
71
+ config.vm.define :my_app_no_provisioner do |my_app_config|
72
+ # app cookbook to deploy
73
+ my_app_config.app_cookbook.url = "https://github.com/tknerr/sample-application-cookbook"
74
+ end
75
+
76
+ end
@@ -0,0 +1,18 @@
1
+ require "pathname"
2
+
3
+ require "vagrant-application-cookbooks/plugin"
4
+
5
+ module VagrantPlugins
6
+ module ApplicationCookbooks
7
+ lib_path = Pathname.new(File.expand_path("../vagrant-application-cookbooks", __FILE__))
8
+ autoload :Action, lib_path.join("action")
9
+ autoload :Errors, lib_path.join("errors")
10
+
11
+ # This returns the path to the source of this plugin.
12
+ #
13
+ # @return [Pathname]
14
+ def self.source_root
15
+ @source_root ||= Pathname.new(File.expand_path("../../", __FILE__))
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ require 'pathname'
2
+
3
+ module VagrantPlugins
4
+ module ApplicationCookbooks
5
+ module Action
6
+
7
+ def self.action_root
8
+ Pathname.new(File.expand_path("../action", __FILE__))
9
+ end
10
+
11
+ autoload :Clone, action_root.join("clone")
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,109 @@
1
+ module VagrantPlugins
2
+ module ApplicationCookbooks
3
+ module Action
4
+
5
+ # This middleware checks if reqiured plugins are present
6
+ class Clone
7
+
8
+ attr_reader :cloned_repo_path, :cookbook_install_path, :git_url, :git_ref
9
+
10
+ def initialize(app, env)
11
+ @app = app
12
+ @env = env
13
+
14
+ # machine-specific paths to clone git repo and install cookbooks
15
+ @cloned_repo_path = env[:root_path].join('.vagrant', 'app-cookbooks', env[:machine].name.to_s, 'repo')
16
+ @cookbook_install_path = env[:root_path].join('.vagrant', 'app-cookbooks', env[:machine].name.to_s, 'cookbooks')
17
+
18
+ # shortcut for values from config
19
+ @git_url = env[:machine].config.app_cookbook.url
20
+ @git_ref = env[:machine].config.app_cookbook.ref
21
+ end
22
+
23
+ def provisioners(name)
24
+ @env[:machine].config.vm.provisioners.select{ |prov| prov.name == name }
25
+ end
26
+
27
+ def log(msg)
28
+ @env[:ui].info msg
29
+ end
30
+
31
+ def is_cloned?
32
+ File.exist?(cloned_repo_path) && get_origin.eql?(git_url)
33
+ end
34
+
35
+ def get_origin
36
+ `cd #{cloned_repo_path} && git config --get remote.origin.url`.strip
37
+ end
38
+
39
+ def cookbooks_path_configured?(provisioner)
40
+ # see https://github.com/mitchellh/vagrant/blob/master/plugins/provisioners/chef/config/chef_solo.rb#L41-45
41
+ provisioner.config.cookbooks_path != [[:host, "cookbooks"], [:vm, "cookbooks"]]
42
+ end
43
+
44
+ def has_chef_solo_provisioner?
45
+ provisioners(:chef_solo).size > 0
46
+ end
47
+
48
+ def app_cookbook_configured?
49
+ git_url != nil
50
+ end
51
+
52
+ def clean_and_clone_repo
53
+ FileUtils.rm_rf cloned_repo_path
54
+ FileUtils.mkdir_p cloned_repo_path
55
+ unless system("git clone #{git_url} #{cloned_repo_path}")
56
+ raise "something went wrong while cloning '#{git_url}'"
57
+ end
58
+ end
59
+
60
+ def update_and_checkout
61
+ unless system("cd #{cloned_repo_path} && git pull && git checkout #{git_ref}")
62
+ raise "something went wrong while updating / checking out '#{git_ref}'"
63
+ end
64
+ end
65
+
66
+ def install_cookbooks
67
+ unless system("cd #{cloned_repo_path} && berks install --path #{cookbook_install_path}")
68
+ raise "something went wrong while installing cookbook dependencies"
69
+ end
70
+ end
71
+
72
+ def configure_chef_solo
73
+ provisioners(:chef_solo).each do |provisioner|
74
+ if cookbooks_path_configured? provisioner
75
+ @env[:ui].warn "WARNING: already configured `cookbooks_path` will be overridden!"
76
+ end
77
+ provisioner.config.cookbooks_path = provisioner.config.send(:prepare_folders_config, cookbook_install_path)
78
+ end
79
+ end
80
+
81
+
82
+ def call(env)
83
+
84
+ if app_cookbook_configured? && has_chef_solo_provisioner?
85
+
86
+ if not is_cloned?
87
+ log "Cloning application cookbook from '#{git_url}'"
88
+ clean_and_clone_repo
89
+ else
90
+ log "Using application cookbook '#{git_url}'"
91
+ end
92
+
93
+ log "Ensuring application cookbook is checked out at '#{git_ref}'"
94
+ update_and_checkout
95
+
96
+ log "Installing application cookbook dependencies to '#{cookbook_install_path}'"
97
+ install_cookbooks
98
+
99
+ log "Configuring Chef Solo provisioner for application cookbook"
100
+ configure_chef_solo
101
+ end
102
+
103
+ # continue if ok
104
+ @app.call(env)
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,35 @@
1
+ require "vagrant"
2
+
3
+ module VagrantPlugins
4
+ module ApplicationCookbooks
5
+ class Config < Vagrant.plugin(2, :config)
6
+
7
+ # git url to clone from
8
+ attr_accessor :url
9
+ # git ref / branch to checkout
10
+ attr_accessor :ref
11
+
12
+ def initialize
13
+ @url = UNSET_VALUE
14
+ @ref = UNSET_VALUE
15
+ end
16
+
17
+ def validate(machine)
18
+ errors = _detected_errors
19
+ if @ref != nil
20
+ errors << "'app_cookbook.url' must be specified when 'app_cookbook.ref' is used" if @url.nil?
21
+ end
22
+ { "vagrant-application-cookbooks" => errors }
23
+ end
24
+
25
+ def finalize!
26
+ @url = nil if @url == UNSET_VALUE
27
+ if @url != nil
28
+ @ref = 'master' if @ref == UNSET_VALUE
29
+ else
30
+ @ref = nil if @ref == UNSET_VALUE
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,32 @@
1
+ begin
2
+ require "vagrant"
3
+ rescue LoadError
4
+ raise "The Vagrant ApplicationCookbooks plugin must be run within Vagrant."
5
+ end
6
+
7
+ # This is a sanity check to make sure no one is attempting to install
8
+ # this into an early Vagrant version.
9
+ if Vagrant::VERSION < "1.2.0"
10
+ raise "The Vagrant ApplicationCookbooks plugin is only compatible with Vagrant 1.2+"
11
+ end
12
+
13
+ module VagrantPlugins
14
+ module ApplicationCookbooks
15
+ class Plugin < Vagrant.plugin("2")
16
+ name "ApplicationCookbooks"
17
+ description "This plugin allows you to deploy Application Cookbooks"
18
+
19
+ config "app_cookbook" do
20
+ require_relative "config"
21
+ Config
22
+ end
23
+
24
+ clone_action_hook = lambda do |hook|
25
+ hook.before Vagrant::Action::Builtin::ConfigValidate, VagrantPlugins::ApplicationCookbooks::Action::Clone
26
+ end
27
+ action_hook 'clone-application-cookbook-on-machine-up', :machine_action_up, &clone_action_hook
28
+ action_hook 'clone-application-cookbook-on-machine-reload', :machine_action_reload, &clone_action_hook
29
+ action_hook 'clone-application-cookbook-on-machine-provision', :machine_action_provision, &clone_action_hook
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,5 @@
1
+ module VagrantPlugins
2
+ module ApplicationCookbooks
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,40 @@
1
+ require "vagrant-application-cookbooks/config"
2
+
3
+ describe VagrantPlugins::ApplicationCookbooks::Config do
4
+ let(:instance) { described_class.new }
5
+
6
+ describe "defaults" do
7
+ subject do
8
+ instance.tap do |o|
9
+ o.finalize!
10
+ end
11
+ end
12
+
13
+ its("url") { should be_nil }
14
+ its("ref") { should be_nil }
15
+ end
16
+
17
+ describe "overriding defaults" do
18
+ it "should use the specified url with 'master' branch as default" do
19
+ instance.url = "https://github.com/some/repo"
20
+ instance.finalize!
21
+ instance.url.should == "https://github.com/some/repo"
22
+ instance.ref.should == "master"
23
+ end
24
+
25
+ it "should be possible to specify a different branch" do
26
+ instance.url = "https://github.com/some/repo"
27
+ instance.ref = "my_branch"
28
+ instance.finalize!
29
+ instance.url.should == "https://github.com/some/repo"
30
+ instance.ref.should == "my_branch"
31
+ end
32
+
33
+ it "should error if a branch is specified but no url" do
34
+ instance.ref = "my_branch"
35
+ instance.finalize!
36
+ err_hash = instance.validate(nil)
37
+ err_hash['vagrant-application-cookbooks'].size.should == 1
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,56 @@
1
+ $:.unshift File.expand_path("../lib", __FILE__)
2
+ require "vagrant-application-cookbooks/version"
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "vagrant-application-cookbooks"
6
+ s.version = VagrantPlugins::ApplicationCookbooks::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = "Torben Knerr"
9
+ s.email = "mail@tknerr.de"
10
+ s.homepage = "https://github.com/tknerr/vagrant-application-cookbooks"
11
+ s.summary = "Deploy Chef \"Application Cookbooks\" directly from a Git repository"
12
+ s.description = "Deploy Chef \"Application Cookbooks\" directly from a Git repository"
13
+
14
+ s.required_rubygems_version = ">= 1.3.6"
15
+ s.rubyforge_project = "vagrant-application-cookbooks"
16
+
17
+ s.add_development_dependency "rake"
18
+ s.add_development_dependency "rspec-core", "~> 2.12.2"
19
+ s.add_development_dependency "rspec-expectations", "~> 2.12.1"
20
+ s.add_development_dependency "rspec-mocks", "~> 2.12.1"
21
+
22
+ # The following block of code determines the files that should be included
23
+ # in the gem. It does this by reading all the files in the directory where
24
+ # this gemspec is, and parsing out the ignored files from the gitignore.
25
+ # Note that the entire gitignore(5) syntax is not supported, specifically
26
+ # the "!" syntax, but it should mostly work correctly.
27
+ root_path = File.dirname(__FILE__)
28
+ all_files = Dir.chdir(root_path) { Dir.glob("**/{*,.*}") }
29
+ all_files.reject! { |file| [".", ".."].include?(File.basename(file)) }
30
+ gitignore_path = File.join(root_path, ".gitignore")
31
+ gitignore = File.readlines(gitignore_path)
32
+ gitignore.map! { |line| line.chomp.strip }
33
+ gitignore.reject! { |line| line.empty? || line =~ /^(#|!)/ }
34
+
35
+ unignored_files = all_files.reject do |file|
36
+ # Ignore any directories, the gemspec only cares about files
37
+ next true if File.directory?(file)
38
+
39
+ # Ignore any paths that match anything in the gitignore. We do
40
+ # two tests here:
41
+ #
42
+ # - First, test to see if the entire path matches the gitignore.
43
+ # - Second, match if the basename does, this makes it so that things
44
+ # like '.DS_Store' will match sub-directories too (same behavior
45
+ # as git).
46
+ #
47
+ gitignore.any? do |ignore|
48
+ File.fnmatch(ignore, file, File::FNM_PATHNAME) ||
49
+ File.fnmatch(ignore, File.basename(file), File::FNM_PATHNAME)
50
+ end
51
+ end
52
+
53
+ s.files = unignored_files
54
+ s.executables = unignored_files.map { |f| f[/^bin\/(.*)/, 1] }.compact
55
+ s.require_path = 'lib'
56
+ end
metadata ADDED
@@ -0,0 +1,129 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vagrant-application-cookbooks
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Torben Knerr
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-10-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec-core
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 2.12.2
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 2.12.2
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec-expectations
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 2.12.1
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 2.12.1
62
+ - !ruby/object:Gem::Dependency
63
+ name: rspec-mocks
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 2.12.1
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 2.12.1
78
+ description: Deploy Chef "Application Cookbooks" directly from a Git repository
79
+ email: mail@tknerr.de
80
+ executables: []
81
+ extensions: []
82
+ extra_rdoc_files: []
83
+ files:
84
+ - CHANGELOG.md
85
+ - Gemfile
86
+ - lib/vagrant-application-cookbooks/action/clone.rb
87
+ - lib/vagrant-application-cookbooks/action.rb
88
+ - lib/vagrant-application-cookbooks/config.rb
89
+ - lib/vagrant-application-cookbooks/plugin.rb
90
+ - lib/vagrant-application-cookbooks/version.rb
91
+ - lib/vagrant-application-cookbooks.rb
92
+ - LICENSE
93
+ - Rakefile
94
+ - README.md
95
+ - spec/vagrant-application-cookbooks/config_spec.rb
96
+ - TODO.md
97
+ - vagrant-application-cookbooks.gemspec
98
+ - Vagrantfile
99
+ - .gitignore
100
+ - .rspec
101
+ - .travis.yml
102
+ homepage: https://github.com/tknerr/vagrant-application-cookbooks
103
+ licenses: []
104
+ post_install_message:
105
+ rdoc_options: []
106
+ require_paths:
107
+ - lib
108
+ required_ruby_version: !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ! '>='
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ segments:
115
+ - 0
116
+ hash: 37287891
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ! '>='
121
+ - !ruby/object:Gem::Version
122
+ version: 1.3.6
123
+ requirements: []
124
+ rubyforge_project: vagrant-application-cookbooks
125
+ rubygems_version: 1.8.24
126
+ signing_key:
127
+ specification_version: 3
128
+ summary: Deploy Chef "Application Cookbooks" directly from a Git repository
129
+ test_files: []