knife_cookbook_dependencies 0.0.3 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data/.gitignore +4 -1
  2. data/README.rdoc +41 -2
  3. data/Rakefile +42 -0
  4. data/features/lib/chef/knife/error_messages.feature +16 -0
  5. data/features/lib/chef/knife/lockfile.feature +25 -0
  6. data/features/lib/chef/knife/without.feature +27 -0
  7. data/features/support/env.rb +30 -0
  8. data/features/support/step_definitions.rb +22 -0
  9. data/knife_cookbook_dependencies.gemspec +6 -2
  10. data/lib/chef/knife/cookbook_dependencies_install.rb +12 -6
  11. data/lib/kcd.rb +1 -0
  12. data/lib/{knife_cookbook_dependencies → kcd}/cookbook.rb +72 -40
  13. data/lib/{knife_cookbook_dependencies → kcd}/cookbookfile.rb +12 -11
  14. data/lib/kcd/dsl.rb +13 -0
  15. data/lib/{knife_cookbook_dependencies → kcd}/error_messages.rb +1 -1
  16. data/lib/{knife_cookbook_dependencies → kcd}/git.rb +0 -0
  17. data/lib/{knife_cookbook_dependencies → kcd}/knife_utils.rb +1 -1
  18. data/lib/{knife_cookbook_dependencies → kcd}/lockfile.rb +8 -5
  19. data/lib/{knife_cookbook_dependencies → kcd}/metacookbook.rb +1 -1
  20. data/lib/{knife_cookbook_dependencies → kcd}/shelf.rb +30 -5
  21. data/lib/{knife_cookbook_dependencies → kcd}/version.rb +1 -1
  22. data/lib/knife_cookbook_dependencies.rb +20 -13
  23. data/spec/acceptance/knife_cookbook_dependencies_spec.rb +1 -11
  24. data/spec/fixtures/lockfile_spec/with_lock/Cookbookfile +1 -0
  25. data/spec/fixtures/lockfile_spec/without_lock/Cookbookfile.lock +5 -0
  26. data/spec/lib/{knife_cookbook_dependencies → kcd}/cookbook_spec.rb +43 -14
  27. data/spec/lib/{knife_cookbook_dependencies → kcd}/cookbookfile_spec.rb +3 -3
  28. data/spec/lib/kcd/dsl_spec.rb +56 -0
  29. data/spec/lib/{knife_cookbook_dependencies → kcd}/git_spec.rb +0 -0
  30. data/spec/lib/kcd/lockfile_spec.rb +54 -0
  31. data/spec/lib/kcd/shelf_spec.rb +81 -0
  32. data/spec/spec_helper.rb +22 -2
  33. data/todo.txt +8 -8
  34. metadata +98 -51
  35. data/lib/knife_cookbook_dependencies/dependency_reader.rb +0 -46
  36. data/lib/knife_cookbook_dependencies/dsl.rb +0 -7
  37. data/spec/lib/knife_cookbook_dependencies/dependency_reader_spec.rb +0 -42
  38. data/spec/lib/knife_cookbook_dependencies/dsl_spec.rb +0 -29
  39. data/spec/lib/knife_cookbook_dependencies/shelf_spec.rb +0 -37
@@ -1,46 +0,0 @@
1
- module KnifeCookbookDependencies
2
- class DependencyReader
3
- attr_reader :dependency_list, :cookbook
4
-
5
- def initialize(cookbook)
6
- @cookbook = cookbook
7
- @dependency_list = []
8
- end
9
-
10
- def read
11
- Dir.chdir(@cookbook.full_path) do
12
- # XXX this filename is required because it sets __FILE__, which is
13
- # used for README.md parsing among other things in metadata.rb files
14
- instance_eval(@cookbook.metadata_file, @cookbook.metadata_filename)
15
- end
16
- @dependency_list
17
- end
18
-
19
- def depends(*args)
20
- name, constraint = args
21
-
22
- dependency_cookbook = KnifeCookbookDependencies.shelf.get_cookbook(name) || get_dependency(name)
23
- if dependency_cookbook
24
- dependency_cookbook.add_version_constraint constraint
25
- else
26
- @dependency_list << Cookbook.new(*args)
27
- end
28
- end
29
-
30
- def get_dependency(name)
31
- @dependency_list.select { |c| c.name == name }.first
32
- end
33
-
34
- def method_missing(method, *args)
35
- # Don't blow up when other metadata DSL methods are called, we
36
- # only care about #depends.
37
- end
38
-
39
- def name(the_name)
40
- # Module#name is defined, so method_missing won't catch it
41
- # when running instance_eval on a metadata.rb that overrides
42
- # the name
43
- end
44
-
45
- end
46
- end
@@ -1,7 +0,0 @@
1
- module KnifeCookbookDependencies
2
- module DSL
3
- def cookbook *args
4
- KnifeCookbookDependencies.shelf.shelve_cookbook *args
5
- end
6
- end
7
- end
@@ -1,42 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module KnifeCookbookDependencies
4
- describe DependencyReader do
5
- subject { DependencyReader.new(Cookbook.new('mysql')) }
6
-
7
- before do
8
- @cookbook = Cookbook.new('mysql')
9
- @cookbook.download # TODO: mock out
10
- @cookbook.unpack
11
- end
12
-
13
- after do
14
- @cookbook.clean
15
- end
16
-
17
- it "should parse the metadata file for dependencies" do
18
- subject.read.should == [Cookbook.new('openssl')]
19
- end
20
-
21
- it "should not blow up when reading a metadata.rb that overrides the name" do
22
- Cookbook.any_instance.stub(:metadata_file).and_return <<M
23
- name 'dontblowupplease'
24
- version '1.2.3'
25
- M
26
- -> { subject.read }.should_not raise_error
27
- end
28
-
29
- it 'should display a warning when no version is defined in the metadata.rb'
30
-
31
- it "should add a constraint to the cookbook on the shelf instead of adding a new dependency" do
32
- KnifeCookbookDependencies.shelf.shelve_cookbook example_cookbook_from_path
33
- subject.depends('example_cookbook')
34
- subject.dependency_list.should be_empty
35
- end
36
-
37
- it "should create a new cookbook if the cookbook is not found on the shelf" do
38
- subject.depends('example_cookbook')
39
- subject.dependency_list.first.name.should == 'example_cookbook'
40
- end
41
- end
42
- end
@@ -1,29 +0,0 @@
1
- require 'spec_helper'
2
- require 'knife_cookbook_dependencies/dsl'
3
-
4
- module KnifeCookbookDependencies
5
- describe DSL do
6
- include DSL
7
-
8
- describe "#cookbook" do
9
- after do
10
- KnifeCookbookDependencies.shelf.cookbooks.each(&:clean)
11
- end
12
-
13
- it 'should add the cookbooks to the shelf' do
14
- cookbook "ntp"
15
- cookbook "nginx"
16
-
17
- ['ntp', 'nginx'].each do |cookbook|
18
- KnifeCookbookDependencies.shelf.cookbooks.collect(&:name).should include cookbook
19
- end
20
- end
21
-
22
- it 'should take version constraints' do
23
- Cookbook.any_instance.stub(:clean)
24
- cookbook 'ntp', '= 1.2.3'
25
- KnifeCookbookDependencies.shelf.cookbooks.select {|c| c.name == 'ntp'}.first.version_constraints.first.should == DepSelector::VersionConstraint.new('= 1.2.3')
26
- end
27
- end
28
- end
29
- end
@@ -1,37 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module KnifeCookbookDependencies
4
- describe Shelf do
5
- describe '#get_cookbook' do
6
- it "should return nil if a cookbook doesn't exist on the shelf" do
7
- Shelf.new.get_cookbook('arbitrary').should be_nil
8
- end
9
- it "should return the cookbook if the cookbook exists on the shelf" do
10
- s = Shelf.new
11
- s.shelve_cookbook example_cookbook_from_path
12
- s.get_cookbook(example_cookbook_from_path.name).should_not be_nil
13
- end
14
- end
15
-
16
- describe "#shelve_cookbook" do
17
- subject { Shelf.new }
18
- it 'should store shelved cookbooks' do
19
- subject.shelve_cookbook 'acookbook'
20
- subject.cookbooks.collect(&:name).should include 'acookbook'
21
- end
22
-
23
- it 'should take version constraints' do
24
- subject.shelve_cookbook 'acookbook', '= 1.2.3'
25
- subject.cookbooks.last.version_constraints.should == [DepSelector::VersionConstraint.new('= 1.2.3')]
26
- end
27
-
28
- it "should resolve the dependency graph of the cookbooks on the shelf" do
29
- subject.shelve_cookbook 'mysql', "= 1.2.4"
30
-
31
- subject.resolve_dependencies.should == ({"mysql" => DepSelector::Version.new("1.2.4"), "openssl" => DepSelector::Version.new("1.0.0")})
32
- Cookbook.new('mysql').clean
33
- Cookbook.new('openssl').clean
34
- end
35
- end
36
- end
37
- end