butcher 0.0.1 → 0.0.2

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.
@@ -0,0 +1,13 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 1.8.7
5
+ - ree
6
+ script: "bundle exec rspec spec && bundle exec cucumber features"
7
+ notifications:
8
+ email:
9
+ recipients:
10
+ - e.saxby@modcloth.com
11
+ - github@modcloth.com
12
+ on_success: never
13
+ on_failure: always
data/Gemfile CHANGED
@@ -1,4 +1,5 @@
1
1
  source "http://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in butcher.gemspec
4
+ gem "aruba-doubles", :git => "https://github.com/sax/aruba-doubles.git"
4
5
  gemspec
data/README.md CHANGED
@@ -3,6 +3,16 @@
3
3
  Butcher is a set of command line tools intended to ease the use of Chef with a managed
4
4
  Opscode account.
5
5
 
6
+ ### Installation
7
+
8
+ gem install "butcher"
9
+
10
+ Or stick this in your Gemfile
11
+
12
+ gem "butcher"
13
+ # or
14
+ gem "butcher", "~>0.0.1"
15
+
6
16
  ## Commands
7
17
 
8
18
  The following commands are currently available. All commands should be run from the top
@@ -39,6 +49,11 @@ by looking at the chef_server_url in your knife.rb. For this reason, stab can on
39
49
  from the top level of a chef repo.
40
50
 
41
51
 
52
+ ## Build Status
53
+
54
+ [![Build status](https://secure.travis-ci.org/modcloth/butcher.png)](http://travis-ci.org/modcloth/butcher)
55
+
56
+
42
57
  ## License
43
58
 
44
59
  Copyright 2012 ModCloth
@@ -1,11 +1,11 @@
1
1
  Given /I (don't|) ?have a knife configuration file/ do |expectation|
2
2
  if expectation == "don't"
3
- steps %q{
4
- When I remove the file ".chef/knife.rb"
3
+ steps %Q{
4
+ When I remove the file "#{ENV["PWD"]}/.chef/knife.rb"
5
5
  }
6
6
  else
7
- steps %q{
8
- Given a file named ".chef/knife.rb" with:
7
+ steps %Q{
8
+ Given a file named "#{ENV["PWD"]}/.chef/knife.rb" with:
9
9
  """
10
10
  chef_server_url "https://opscode.url/organizations/my_organization"
11
11
  """
@@ -14,8 +14,8 @@ Given /I (don't|) ?have a knife configuration file/ do |expectation|
14
14
  end
15
15
 
16
16
  Given /I have an invalid knife configuration file/ do
17
- steps %q{
18
- Given a file named ".chef/knife.rb" with:
17
+ steps %Q{
18
+ Given a file named "#{ENV["PWD"]}/.chef/knife.rb" with:
19
19
  """
20
20
  some invalid content
21
21
  """
@@ -1,3 +1,4 @@
1
1
  Before do
2
2
  @dirs = ["."]
3
+ set_env("PWD", "#{Butcher::TestCache::PWD}/tmp")
3
4
  end
@@ -27,7 +27,7 @@ class Butcher::Cache
27
27
 
28
28
  def self.format_nodes_for_stderr(nodes)
29
29
  nodes.map do |key, value|
30
- %Q{#{value} => #{key}}
30
+ %Q{#{value.inspect} => #{key}}
31
31
  end.sort.join("\n")
32
32
  end
33
33
 
@@ -38,14 +38,18 @@ class Butcher::Cache
38
38
  private
39
39
 
40
40
  def organization
41
- raise Butcher::NoKnifeRB unless(File.exists?(KNIFE_FILE))
42
- if m = File.read(KNIFE_FILE).match(/chef_server_url\s+".+organizations\/([^\/"]+)"/)
41
+ raise Butcher::NoKnifeRB unless(File.exists?(knife_file))
42
+ if m = File.read(knife_file).match(/chef_server_url\s+".+organizations\/([^\/"]+)"/)
43
43
  m[1]
44
44
  else
45
45
  raise Butcher::NoKnifeOrganization
46
46
  end
47
47
  end
48
48
 
49
+ def knife_file
50
+ File.expand_path(KNIFE_FILE, ENV["PWD"])
51
+ end
52
+
49
53
  def create_node_cachefile
50
54
  File.open(nodes_file, "w") do |file|
51
55
  file.puts %x[knife status]
@@ -19,10 +19,6 @@ class Butcher::Stab::CLI
19
19
  end
20
20
 
21
21
  def matching_node
22
- nodes = Butcher::Cache.instance.nodes(options).select do |k, v|
23
- String(v).include? self.node_matcher
24
- end
25
-
26
22
  raise(Butcher::UnmatchedNode) if nodes.size == 0
27
23
  raise(Butcher::AmbiguousNode, Butcher::Cache.format_nodes_for_stderr(nodes)) if nodes.size > 1
28
24
  nodes.keys.first
@@ -33,4 +29,10 @@ class Butcher::Stab::CLI
33
29
  " -l #{options[:login]}"
34
30
  end
35
31
  end
36
- end
32
+
33
+ def nodes
34
+ @nodes ||= Butcher::Cache.instance.nodes(options).reject do |k, v|
35
+ ! String(v).include? self.node_matcher
36
+ end
37
+ end
38
+ end
@@ -1,3 +1,3 @@
1
1
  module Butcher
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -2,20 +2,21 @@ require 'spec_helper'
2
2
 
3
3
  describe Butcher::Cache, "initialization" do
4
4
  ## singletons do not reset after initialization, so we run tests against clones
5
- let(:cache_class) { Butcher::Cache.clone }
6
5
 
6
+ class CacheSingletonForEnv < Butcher::Cache; end
7
7
  it "should accept cache_dir from env" do
8
8
  ENV["CACHE_DIR"] = "tmp/cache_from_options"
9
9
  test(?d, "tmp/cache_from_options").should be_false
10
- cache_class.instance
10
+ CacheSingletonForEnv.instance
11
11
  ENV["CACHE_DIR"] = nil
12
12
  test(?d, "tmp/cache_from_options").should be_true
13
13
  end
14
14
 
15
+ class CacheSingleton < Butcher::Cache; end
15
16
  it "should create cache directory" do
16
- cache_class.any_instance.stubs(:cache_dir).returns("tmp/cache_stub")
17
+ CacheSingleton.any_instance.stubs(:cache_dir).returns("tmp/cache_stub")
17
18
  test(?d, "tmp/cache_stub").should be_false
18
- cache_class.instance
19
+ CacheSingleton.instance
19
20
  test(?d, "tmp/cache_stub").should be_true
20
21
  end
21
22
  end
@@ -23,7 +24,7 @@ end
23
24
  describe Butcher::Cache, "#nodes_file" do
24
25
  context "cannot find knife.rb" do
25
26
  it "should raise an error" do
26
- File.expects(:exists?).with(".chef/knife.rb").returns(false)
27
+ File.expects(:exists?).with("#{ENV["PWD"]}/.chef/knife.rb").returns(false)
27
28
  lambda {
28
29
  Butcher::Cache.instance.nodes_file
29
30
  }.should raise_error(Butcher::NoKnifeRB)
@@ -31,11 +32,11 @@ describe Butcher::Cache, "#nodes_file" do
31
32
  end
32
33
 
33
34
  context "sees a knife.rb" do
34
- before { File.expects(:exists?).with(".chef/knife.rb").returns(true) }
35
+ before { File.expects(:exists?).with("#{ENV["PWD"]}/.chef/knife.rb").returns(true) }
35
36
 
36
37
  context "without chef_server_url" do
37
38
  it "should raise an error" do
38
- File.expects(:read).with(".chef/knife.rb").returns(
39
+ File.expects(:read).with("#{ENV["PWD"]}/.chef/knife.rb").returns(
39
40
  'some random content'
40
41
  )
41
42
  lambda {
@@ -48,7 +49,7 @@ describe Butcher::Cache, "#nodes_file" do
48
49
  let(:expected_file) { "#{Butcher::TestCache.cache_dir}/my_organization.cache" }
49
50
 
50
51
  it "should set filename based on chef_server_url" do
51
- File.expects(:read).with(".chef/knife.rb").returns(
52
+ File.expects(:read).with("#{ENV["PWD"]}/.chef/knife.rb").returns(
52
53
  'chef_server_url "https://api.opscode.com/organizations/my_organization"'
53
54
  )
54
55
  Butcher::Cache.instance.nodes_file.should == expected_file
@@ -58,11 +59,10 @@ describe Butcher::Cache, "#nodes_file" do
58
59
  end
59
60
 
60
61
  describe Butcher::Cache, "#nodes" do
61
- before { Butcher::Cache.any_instance.stubs(:organization).returns("ops_org") }
62
+ let(:cache_file) { "#{Butcher::TestCache.cache_dir}/ops_org.cache" }
63
+ before { Butcher::Cache.any_instance.stubs(:nodes_file).returns(cache_file) }
62
64
 
63
65
  context "cache file does not exist" do
64
- let(:cache_file) { "#{Butcher::TestCache.cache_dir}/ops_org.cache" }
65
-
66
66
  before do
67
67
  File.exists?(cache_file).should be_false
68
68
  Butcher::Cache.any_instance.stubs(:`).with("knife status").returns("knife return codes")
@@ -20,6 +20,8 @@
20
20
  # World(Butcher::TestCache::TestHelpers)
21
21
  #
22
22
  module Butcher::TestCache
23
+ PWD = ENV["PWD"]
24
+
23
25
  def self.setup_rspec(config)
24
26
  config.before(:each) do
25
27
  Butcher::TestCache.reset
@@ -40,8 +42,8 @@ module Butcher::TestCache
40
42
 
41
43
  def self.cleanup # :nodoc:
42
44
  FileUtils.rm_rf("tmp")
43
- FileUtils.rm_rf(".chef")
44
45
  ENV.delete("CACHE_DIR")
46
+ ENV["PWD"] = PWD
45
47
  end
46
48
 
47
49
  def self.cache_dir # :nodoc:
@@ -51,6 +53,7 @@ module Butcher::TestCache
51
53
  private
52
54
 
53
55
  def self.setup
56
+ ENV["PWD"] = "#{PWD}/tmp"
54
57
  stub_cache
55
58
  FileUtils.mkdir_p("tmp/test")
56
59
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: butcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-03-08 00:00:00.000000000 Z
13
+ date: 2012-03-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec
17
- requirement: &70346417175740 !ruby/object:Gem::Requirement
17
+ requirement: &70173155128740 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>'
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '2'
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *70346417175740
25
+ version_requirements: *70173155128740
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: aruba
28
- requirement: &70346417175140 !ruby/object:Gem::Requirement
28
+ requirement: &70173155128120 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *70346417175140
36
+ version_requirements: *70173155128120
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: aruba-doubles
39
- requirement: &70346417174680 !ruby/object:Gem::Requirement
39
+ requirement: &70173155127520 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *70346417174680
47
+ version_requirements: *70173155127520
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: guard-rspec
50
- requirement: &70346417174260 !ruby/object:Gem::Requirement
50
+ requirement: &70173155126960 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *70346417174260
58
+ version_requirements: *70173155126960
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: guard-cucumber
61
- requirement: &70346417173820 !ruby/object:Gem::Requirement
61
+ requirement: &70173155126360 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: '0'
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *70346417173820
69
+ version_requirements: *70173155126360
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: mocha
72
- requirement: &70346417173380 !ruby/object:Gem::Requirement
72
+ requirement: &70173155125600 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ! '>='
@@ -77,7 +77,7 @@ dependencies:
77
77
  version: '0'
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *70346417173380
80
+ version_requirements: *70173155125600
81
81
  description: Chef is a tool for managing server automation. A good butcher makes for
82
82
  a good chef.
83
83
  email:
@@ -90,6 +90,7 @@ files:
90
90
  - .gitignore
91
91
  - .rbenv-version
92
92
  - .rspec
93
+ - .travis.yml
93
94
  - Gemfile
94
95
  - Guardfile
95
96
  - README.md