head_chef 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +17 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +38 -0
  8. data/Rakefile +1 -0
  9. data/bin/head-chef +5 -0
  10. data/features/commands/diff.feature +74 -0
  11. data/features/commands/list.feature +20 -0
  12. data/features/commands/sync.feature +67 -0
  13. data/features/step_definitions/berkshelf_steps.rb +40 -0
  14. data/features/step_definitions/chef_server_steps.rb +81 -0
  15. data/features/step_definitions/git_steps.rb +3 -0
  16. data/features/support/env.rb +40 -0
  17. data/head_chef.gemspec +36 -0
  18. data/lib/head_chef/cli.rb +28 -0
  19. data/lib/head_chef/cookbook.rb +115 -0
  20. data/lib/head_chef/cookbook_diff.rb +80 -0
  21. data/lib/head_chef/tasks/diff.rb +42 -0
  22. data/lib/head_chef/tasks/env.rb +48 -0
  23. data/lib/head_chef/tasks/list.rb +17 -0
  24. data/lib/head_chef/tasks/sync.rb +38 -0
  25. data/lib/head_chef/tasks.rb +3 -0
  26. data/lib/head_chef/ui.rb +23 -0
  27. data/lib/head_chef/version.rb +3 -0
  28. data/lib/head_chef.rb +63 -0
  29. data/spec/cookbook_diff_spec.rb +77 -0
  30. data/spec/cookbook_spec.rb +60 -0
  31. data/spec/diff_spec.rb +38 -0
  32. data/spec/env_spec.rb +94 -0
  33. data/spec/fixtures/Berksfiles/default +3 -0
  34. data/spec/fixtures/Berksfiles/template.erb +5 -0
  35. data/spec/fixtures/cookbooks/test_cookbook/metadata.rb +2 -0
  36. data/spec/fixtures/cookbooks/test_cookbook/recipes/default.rb +8 -0
  37. data/spec/fixtures/cookbooks/test_cookbook_file_content_conflict/metadata.rb +2 -0
  38. data/spec/fixtures/cookbooks/test_cookbook_file_content_conflict/recipes/default.rb +10 -0
  39. data/spec/fixtures/cookbooks/test_cookbook_file_list_conflict/chefignore +2 -0
  40. data/spec/fixtures/cookbooks/test_cookbook_file_list_conflict/metadata.rb +2 -0
  41. data/spec/fixtures/cookbooks/test_cookbook_file_list_conflict/recipes/default.rb +10 -0
  42. data/spec/fixtures/cookbooks/test_cookbook_file_list_conflict/recipes/not_default.rb +1 -0
  43. data/spec/fixtures/dot_chef/head_chef.pem +27 -0
  44. data/spec/fixtures/dot_chef/knife.rb +4 -0
  45. data/spec/head_chef_spec.rb +79 -0
  46. data/spec/list_spec.rb +26 -0
  47. data/spec/spec_helper.rb +15 -0
  48. data/spec/support/chef_server.rb +100 -0
  49. data/spec/support/path_helpers.rb +38 -0
  50. data/spec/sync_spec.rb +86 -0
  51. metadata +319 -0
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEpQIBAAKCAQEA0X+zL9IyWRvlqWQLzPiXksmcXTbR2DdE6apJcXGMQ4rkyyHA
3
+ QQBhRnIDiKvyNb9Nm7jaKipx+AaYl7/j7SvsyagNBeC5Y//xbzi6A0eVbSfGMuv3
4
+ Wrf5egr0UoOuC7EWndPevg47slJsZI4q5MxlZ0S+1jffGoYBV4PhLFb6UD4UDrHb
5
+ KSIBO7ngSEG9C+tBcGXRT4sBAjj4u8ennEeAMXe1QmrmfKYyecGLpiDBshbkNjTf
6
+ LRGJTmAxAjMPh8tXfT6WqMXyJgDOCLG2fa533nfCZ5tOtXJTLEyKPsWHFPUR8Kbi
7
+ f3r2F/wfacRXoHIvnH0Fu04iAwUA7locJXadwQIDAQABAoIBAHU7EUkkRVpJ2xUT
8
+ z+qt/Rt9yAr9PyXPn7dlu91IXeX51he5VjzJeqWR7VpQZaQf3czS/vnzcH0LK95W
9
+ 2bOBDeq2KDtuyi8kLLVBOA3Xw80mIamjE3JnWqopcRivaPhP60j8IzuU+WDK8K7A
10
+ Q05u9ht4g5WaBDVyYVPYj2thbIbzgtAJlSn/JuTwL8cr+uLri9G6/s0PP0ce/Q3x
11
+ tbl2i6aR3eqHH90wdJVnjisaOtouw4Q80Zx23qLIZP08f9TKtlhVNksVw5ZAW4JM
12
+ DzI2ndfOKwSE9Cf7vcUBKS3UxSVJySc+vP00jAW5Lzi+yNuTArP3z9RBP93b0N75
13
+ oLgurcECgYEA6mI59908LLoTZSpiUWfJ6AbYJz9ND89Qf/OY4DL+3xHUrX0S43mV
14
+ w8y0OAl8cXOpbWJeEIBKbDWBEkM/qOTSmqLx+6xctCgwcSrh1oKY0xqMVAVjocuE
15
+ OOYSAGLV1Psy8lWbsXlJ9aKT4PdqwqG2miRjE8eJ6yxtnpvPGYvj8BkCgYEA5NHx
16
+ yCw5esNYI7W+oAnOjdW0jnuPwnRAcn4u0rnC5N6fbpQdwX1gUe5I7+Hb28bExAwJ
17
+ pCWky9hia4c6ZneP+MKReMWc5qZh05Ez6ukYyNTI5HEkaUWn8v8G4z7050WDZIEK
18
+ rF1yAPA6yVyB7sb1ZTZatnEonZI37RPYvczgr+kCgYEA1CnuR0xgeCxH+j+PmBjX
19
+ T81CROSsIS+MswYS0H/Y7pv5ZMHfI0KgKwlV6ZPMrfYA3B86/rzioWkdWSa+rWfU
20
+ rF3rpeG0WPA4SXiDzeWR6SYS+MuYEJFlMwwwJ2FQJubsiyirMs+T/2IXcoEEhwJT
21
+ hNyDQxhQ5CznXbe0lG9o+aECgYEA48XMzPqg2QAc+6cNs1cvwmZJjk+XIfUAtje/
22
+ Okppo9OrlrJgEFxShhwRhKAqb9KjyZdF/ZzvN28VQX5h9t/rc6+SiUsEzWAwHx76
23
+ NEuGPVv7AdNScGxDK5MLcygXNyQuD9yYGE4IjsCTdB/ewyZP3klF8TghOwDzJM7N
24
+ wNlxjAkCgYEA6Pbo2COjWrTwLDe4DH73AjvCjJbwZIbanZ2cXuqYLb2/EKmB6PXC
25
+ Ygxhkwys8kFDjGVKOlI84VWACilq5Tf0Kvr9pew8UneKvWn2m3EOGH4gpnykRgZV
26
+ aMoHhYD74MgsLNPcuZm5lhkzptKlY1/eCXEJ+Z+LM2yyE5/dn6JalGM=
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,4 @@
1
+ # Knife.rb for chef-zero
2
+ node_name "head_chef"
3
+ chef_server_url "http://localhost:6267"
4
+ client_key File.join(File.dirname(__FILE__), "head_chef.pem")
@@ -0,0 +1,79 @@
1
+ require 'spec_helper'
2
+
3
+ describe HeadChef do
4
+ let(:berksfile) { Berkshelf::Berksfile }
5
+ let(:branch) { 'curr_branch' }
6
+ let(:repo) { double('Grit::Repo') }
7
+
8
+ before(:each) do
9
+ stub_const("HeadChef::BERKSFILE_LOCATION", './Berksfile')
10
+ stub_const("HeadChef::BERKSFILE_COOKBOOK_DIR", '.head_chef')
11
+ end
12
+
13
+ describe 'ClassMethods' do
14
+ describe '::ui' do
15
+ it 'returns Thor shell' do
16
+ expect(subject.ui).to be_an_instance_of(Thor::Base.shell)
17
+ end
18
+ end
19
+
20
+ describe '::chef_server' do
21
+ let(:ridley_client) { double('Ridley::Client') }
22
+
23
+ before do
24
+ allow(Ridley).to receive(:from_chef_config).and_return(ridley_client)
25
+ end
26
+
27
+ it 'returns Ridley::Client' do
28
+ expect(subject.chef_server).to eq(ridley_client)
29
+ end
30
+ end
31
+
32
+ describe '::master_cookbook' do
33
+ before do
34
+ allow(Grit::Repo).to receive(:new).with('.').and_return(repo)
35
+ end
36
+
37
+ it 'returns Grit repo' do
38
+ expect(subject.master_cookbook).to eq(repo)
39
+ end
40
+ end
41
+
42
+ describe '::current_branch' do
43
+ before do
44
+ allow(subject).to receive(:master_cookbook).and_return(repo)
45
+ repo.stub_chain(:head, :name).and_return(branch)
46
+ end
47
+
48
+ it 'returns current branch' do
49
+ expect(subject.current_branch).to eq(branch)
50
+ end
51
+ end
52
+
53
+ describe '::berksfile' do
54
+ before(:each) do
55
+ allow(berksfile).to receive(:from_file).
56
+ with(HeadChef::BERKSFILE_LOCATION).
57
+ and_return(Berkshelf::Berksfile.new(''))
58
+ end
59
+
60
+ it 'returns Berksfile' do
61
+ expect(subject.berksfile).to be_an_instance_of(Berkshelf::Berksfile)
62
+ end
63
+ end
64
+
65
+ describe '::cleanup' do
66
+ after(:each) do
67
+ subject.cleanup
68
+ end
69
+
70
+ it 'removes .head_chef when present' do
71
+ allow(Dir).to receive(:exists?).
72
+ with(HeadChef::BERKSFILE_COOKBOOK_DIR).and_return(true)
73
+
74
+ expect(FileUtils).to receive(:rm_rf).
75
+ with(HeadChef::BERKSFILE_COOKBOOK_DIR)
76
+ end
77
+ end
78
+ end
79
+ end
data/spec/list_spec.rb ADDED
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe HeadChef::List do
4
+ describe 'ClassMethods' do
5
+ let(:environment_name) { 'environment' }
6
+ let(:environment_resource) { double('Ridley::EnvironmentResouce') }
7
+ let(:environment) { double('Ridley::EnvironmentObject') }
8
+
9
+ before(:each) do
10
+ HeadChef.stub_chain(:chef_server, :environment).and_return(environment_resource)
11
+
12
+ allow(environment_resource).to receive(:find).and_return(environment)
13
+ allow(environment).to receive(:cookbook_versions).and_return([])
14
+ end
15
+
16
+ after(:each) do
17
+ described_class.list(environment)
18
+ end
19
+
20
+ describe '::list' do
21
+ it 'reads chef environment' do
22
+ expect(environment_resource).to receive(:find).with(environment)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,15 @@
1
+ require 'head_chef'
2
+ require 'hashie'
3
+
4
+ RSpec.configure do |config|
5
+ config.treat_symbols_as_metadata_keys_with_true_values = true
6
+ config.run_all_when_everything_filtered = true
7
+ config.filter_run :focus
8
+
9
+ config.color_enabled = true
10
+ config.formatter = :documentation
11
+
12
+ #config.order = 'random'
13
+ end
14
+
15
+ HeadChef.ui.mute!
@@ -0,0 +1,100 @@
1
+ # From Berkshelf
2
+ require 'chef_zero/server'
3
+ require 'json'
4
+
5
+ module HeadChef::RSpec
6
+ module ChefServer
7
+ PORT = 4000
8
+
9
+ class << self
10
+ attr_reader :server
11
+
12
+ def clear_request_log
13
+ @request_log = Array.new
14
+ end
15
+
16
+ def request_log
17
+ @request_log ||= Array.new
18
+ end
19
+
20
+ def server_url
21
+ @server && @server.url
22
+ end
23
+
24
+ def start(options = {})
25
+ return @server if @server
26
+
27
+ options = options.reverse_merge(port: PORT)
28
+ options[:generate_real_keys] = false
29
+
30
+ @server = ChefZero::Server.new(options)
31
+ @server.start_background
32
+ @server.on_response do |request, response|
33
+ request_log << [ request, response ]
34
+ end
35
+ clear_request_log
36
+
37
+ @server
38
+ end
39
+
40
+ def stop
41
+ @server.stop if running?
42
+ end
43
+
44
+ def running?
45
+ @server && @server.running?
46
+ end
47
+
48
+ def reset!
49
+ @server && @server.clear_data
50
+ end
51
+ end
52
+
53
+ def chef_server
54
+ ChefServer.server
55
+ end
56
+
57
+ def chef_client(name, hash = {})
58
+ load_data(:clients, name, hash)
59
+ end
60
+
61
+ def chef_cookbook(name, hash = {})
62
+ chef_server.load_data({ 'cookbooks' => { name => hash }})
63
+ end
64
+
65
+ def chef_cookbooks
66
+ chef_server.data_store.list(['cookbooks']).inject({}) do |hash, name|
67
+ hash[name] = chef_server.data_store.list(['cookbooks', name])
68
+ hash
69
+ end
70
+ end
71
+
72
+ def chef_data_bag(name, hash = {})
73
+ chef_server.load_data({ 'data' => { name => hash }})
74
+ end
75
+
76
+ def chef_environment(name, hash = {})
77
+ load_data(:environments, name, hash)
78
+ end
79
+
80
+ def chef_environment_locks(name)
81
+ JSON.parse(chef_server.data_store.get(['environments', name]))['cookbook_versions']
82
+ rescue ChefZero::DataStore::DataNotFoundError
83
+ {}
84
+ end
85
+
86
+ def chef_node(name, hash = {})
87
+ load_data(:nodes, name, hash)
88
+ end
89
+
90
+ def chef_role(name, hash = {})
91
+ load_data(:roles, name, hash)
92
+ end
93
+
94
+ private
95
+
96
+ def load_data(key, name, hash)
97
+ chef_server.load_data({ key.to_s => { name => JSON.generate(hash) }})
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,38 @@
1
+ module HeadChef
2
+ module RSpec
3
+ module PathHelpers
4
+ def tmp_path
5
+ HeadChef.root.join('tmp')
6
+ end
7
+
8
+ def fixtures_path
9
+ HeadChef.root.join('spec/fixtures')
10
+ end
11
+
12
+ def berkshelf_path
13
+ tmp_path.join('.berkshelf').expand_path
14
+ end
15
+
16
+ def cookbook_store
17
+ fixtures_path.join('cookbooks').expand_path
18
+ end
19
+
20
+ def cookbook_path(cookbook_name)
21
+ "#{cookbook_store}/#{cookbook_name}"
22
+ end
23
+
24
+ def file_content_conflict_path(cookbook_name)
25
+ "#{cookbook_path(cookbook_name)}_file_content_conflict"
26
+ end
27
+
28
+ def file_list_conflict_path(cookbook_name)
29
+ "#{cookbook_path(cookbook_name)}_file_list_conflict"
30
+ end
31
+
32
+ def clean_tmp_path
33
+ FileUtils.rm_rf(tmp_path)
34
+ FileUtils.mkdir_p(tmp_path)
35
+ end
36
+ end
37
+ end
38
+ end
data/spec/sync_spec.rb ADDED
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ #@TODO: refactor/cleanup
4
+ # Keep stubs related to tests
5
+ # make force context for using/not using force
6
+ describe HeadChef::Sync do
7
+ describe 'ClassMethods' do
8
+ let(:berksfile) { double('Berkshelf::Berksfile') }
9
+ let(:chef_environments) { double('Ridley::EnvironmentResource') }
10
+ let(:environment) { 'test_env' }
11
+ let(:branch) { 'test_branch' }
12
+ let(:diff_hash) { {} }
13
+
14
+ describe '::sync(environment, force)' do
15
+ before(:each) do
16
+ allow(berksfile).to receive(:apply).with(environment, {})
17
+ allow(berksfile).to receive(:upload)
18
+
19
+ allow(HeadChef).to receive(:berksfile).
20
+ and_return(berksfile)
21
+ HeadChef.stub_chain(:chef_server, :environment).
22
+ and_return(chef_environments)
23
+
24
+ allow(chef_environments).to receive(:find).with(environment)
25
+ allow(chef_environments).to receive(:create).with(name: environment)
26
+
27
+ allow(HeadChef::Diff).to receive(:diff).with(environment).
28
+ and_return(HeadChef::CookbookDiff)
29
+
30
+ allow(HeadChef::CookbookDiff).to receive(:conflicts?)
31
+ allow(HeadChef::CookbookDiff).to receive(:conflicts)
32
+
33
+ #@TODO: not being muted, despite it being in spec_helper
34
+ # not sure why
35
+ allow(HeadChef.ui).to receive(:say)
36
+ end
37
+
38
+ after(:each) do
39
+ described_class.sync(environment, false)
40
+ end
41
+
42
+ it 'reads environment from Chef server' do
43
+ expect(chef_environments).to receive(:find).with(environment)
44
+ end
45
+
46
+ context 'environment does not exist on Chef server' do
47
+ before do
48
+ allow(chef_environments).to receive(:find).
49
+ with(environment).
50
+ and_return(false)
51
+ end
52
+
53
+ it 'creates environment' do
54
+ expect(chef_environments).to receive(:create).with(name: environment)
55
+ end
56
+ end
57
+
58
+ it 'performs diff of Chef environment and lockfile' do
59
+ expect(HeadChef::Diff).to receive(:diff).with(environment)
60
+ end
61
+
62
+ context 'with --force' do
63
+ after(:each) do
64
+ described_class.sync(environment, true)
65
+ end
66
+
67
+ it 'calls Berksfile#upload with force option' do
68
+ expect(berksfile).to receive(:upload).with({force: true})
69
+ end
70
+ end
71
+
72
+ it 'reads Berksfile from branch' do
73
+ expect(HeadChef).to receive(:berksfile)
74
+ end
75
+
76
+ it 'calls Berksfile#upload to push cookbooks to server' do
77
+ expect(berksfile).to receive(:upload)
78
+ end
79
+
80
+ it 'applies Berksfile to environment' do
81
+ expect(berksfile).to receive(:apply).with(environment, {})
82
+ end
83
+ end
84
+
85
+ end
86
+ end
metadata ADDED
@@ -0,0 +1,319 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: head_chef
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mark Corwin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-01-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: cucumber
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: aruba
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: chef-zero
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: erubis
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: ridley
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: hashie
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ! '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: thor
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ! '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ! '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: grit
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ! '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ! '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: berkshelf
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ! '>='
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: ridley
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ! '>='
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ! '>='
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: semantic
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ! '>='
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ! '>='
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ description: Head Chef is a Chef workflow CLI built on Berkshelf
210
+ email:
211
+ - mcorwin@mdsol.com
212
+ executables:
213
+ - head-chef
214
+ extensions: []
215
+ extra_rdoc_files: []
216
+ files:
217
+ - .gitignore
218
+ - .ruby-gemset
219
+ - .ruby-version
220
+ - Gemfile
221
+ - LICENSE.txt
222
+ - README.md
223
+ - Rakefile
224
+ - bin/head-chef
225
+ - features/commands/diff.feature
226
+ - features/commands/list.feature
227
+ - features/commands/sync.feature
228
+ - features/step_definitions/berkshelf_steps.rb
229
+ - features/step_definitions/chef_server_steps.rb
230
+ - features/step_definitions/git_steps.rb
231
+ - features/support/env.rb
232
+ - head_chef.gemspec
233
+ - lib/head_chef.rb
234
+ - lib/head_chef/cli.rb
235
+ - lib/head_chef/cookbook.rb
236
+ - lib/head_chef/cookbook_diff.rb
237
+ - lib/head_chef/tasks.rb
238
+ - lib/head_chef/tasks/diff.rb
239
+ - lib/head_chef/tasks/env.rb
240
+ - lib/head_chef/tasks/list.rb
241
+ - lib/head_chef/tasks/sync.rb
242
+ - lib/head_chef/ui.rb
243
+ - lib/head_chef/version.rb
244
+ - spec/cookbook_diff_spec.rb
245
+ - spec/cookbook_spec.rb
246
+ - spec/diff_spec.rb
247
+ - spec/env_spec.rb
248
+ - spec/fixtures/Berksfiles/default
249
+ - spec/fixtures/Berksfiles/template.erb
250
+ - spec/fixtures/cookbooks/test_cookbook/metadata.rb
251
+ - spec/fixtures/cookbooks/test_cookbook/recipes/default.rb
252
+ - spec/fixtures/cookbooks/test_cookbook_file_content_conflict/metadata.rb
253
+ - spec/fixtures/cookbooks/test_cookbook_file_content_conflict/recipes/default.rb
254
+ - spec/fixtures/cookbooks/test_cookbook_file_list_conflict/chefignore
255
+ - spec/fixtures/cookbooks/test_cookbook_file_list_conflict/metadata.rb
256
+ - spec/fixtures/cookbooks/test_cookbook_file_list_conflict/recipes/default.rb
257
+ - spec/fixtures/cookbooks/test_cookbook_file_list_conflict/recipes/not_default.rb
258
+ - spec/fixtures/dot_chef/head_chef.pem
259
+ - spec/fixtures/dot_chef/knife.rb
260
+ - spec/head_chef_spec.rb
261
+ - spec/list_spec.rb
262
+ - spec/spec_helper.rb
263
+ - spec/support/chef_server.rb
264
+ - spec/support/path_helpers.rb
265
+ - spec/sync_spec.rb
266
+ homepage: https://github.com/mdsol/head_chef
267
+ licenses:
268
+ - MIT
269
+ metadata: {}
270
+ post_install_message:
271
+ rdoc_options: []
272
+ require_paths:
273
+ - lib
274
+ required_ruby_version: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - ! '>='
277
+ - !ruby/object:Gem::Version
278
+ version: '0'
279
+ required_rubygems_version: !ruby/object:Gem::Requirement
280
+ requirements:
281
+ - - ! '>='
282
+ - !ruby/object:Gem::Version
283
+ version: '0'
284
+ requirements: []
285
+ rubyforge_project:
286
+ rubygems_version: 2.1.5
287
+ signing_key:
288
+ specification_version: 4
289
+ summary: Chef workflow tool
290
+ test_files:
291
+ - features/commands/diff.feature
292
+ - features/commands/list.feature
293
+ - features/commands/sync.feature
294
+ - features/step_definitions/berkshelf_steps.rb
295
+ - features/step_definitions/chef_server_steps.rb
296
+ - features/step_definitions/git_steps.rb
297
+ - features/support/env.rb
298
+ - spec/cookbook_diff_spec.rb
299
+ - spec/cookbook_spec.rb
300
+ - spec/diff_spec.rb
301
+ - spec/env_spec.rb
302
+ - spec/fixtures/Berksfiles/default
303
+ - spec/fixtures/Berksfiles/template.erb
304
+ - spec/fixtures/cookbooks/test_cookbook/metadata.rb
305
+ - spec/fixtures/cookbooks/test_cookbook/recipes/default.rb
306
+ - spec/fixtures/cookbooks/test_cookbook_file_content_conflict/metadata.rb
307
+ - spec/fixtures/cookbooks/test_cookbook_file_content_conflict/recipes/default.rb
308
+ - spec/fixtures/cookbooks/test_cookbook_file_list_conflict/chefignore
309
+ - spec/fixtures/cookbooks/test_cookbook_file_list_conflict/metadata.rb
310
+ - spec/fixtures/cookbooks/test_cookbook_file_list_conflict/recipes/default.rb
311
+ - spec/fixtures/cookbooks/test_cookbook_file_list_conflict/recipes/not_default.rb
312
+ - spec/fixtures/dot_chef/head_chef.pem
313
+ - spec/fixtures/dot_chef/knife.rb
314
+ - spec/head_chef_spec.rb
315
+ - spec/list_spec.rb
316
+ - spec/spec_helper.rb
317
+ - spec/support/chef_server.rb
318
+ - spec/support/path_helpers.rb
319
+ - spec/sync_spec.rb