spiceweasel 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/spiceweasel +1 -0
- data/lib/spiceweasel/cookbook_data.rb +2 -2
- data/lib/spiceweasel/directory_extractor.rb +33 -56
- data/lib/spiceweasel/version.rb +1 -1
- metadata +8 -8
data/bin/spiceweasel
CHANGED
@@ -40,7 +40,7 @@ class Spiceweasel::CookbookData
|
|
40
40
|
else
|
41
41
|
raise IOError, "Cannot open or read cookbooks/#{@_name}/metadata.rb!"
|
42
42
|
end
|
43
|
-
{
|
43
|
+
{'name' => @_name, 'version' => @_version, 'dependencies' => @_dependencies }
|
44
44
|
end
|
45
45
|
|
46
46
|
def name(*args) # Override metadata.rb DSL
|
@@ -56,7 +56,7 @@ class Spiceweasel::CookbookData
|
|
56
56
|
if args.length > 0
|
57
57
|
cookbook_version = args.shift
|
58
58
|
end
|
59
|
-
@_dependencies << {
|
59
|
+
@_dependencies << {'cookbook' => cookbook, 'version' => cookbook_version}
|
60
60
|
end
|
61
61
|
|
62
62
|
def method_missing(m, *args, &block)
|
@@ -24,20 +24,21 @@ class Spiceweasel::DirectoryExtractor
|
|
24
24
|
# COOKBOOKS
|
25
25
|
cookbooks = []
|
26
26
|
Dir.glob("cookbooks/*").each do |cookbook_full_path|
|
27
|
-
cookbook =
|
27
|
+
cookbook = cookbook_full_path.split('/').last
|
28
28
|
STDOUT.puts "DEBUG: dir_ext: cookbook: '#{cookbook}'" if DEBUG
|
29
29
|
cookbook_data = Spiceweasel::CookbookData.new(cookbook)
|
30
30
|
if cookbook_data.is_readable?
|
31
31
|
cookbooks << cookbook_data.read
|
32
32
|
end
|
33
33
|
end
|
34
|
-
|
35
|
-
|
34
|
+
STDOUT.puts "DEBUG: dir_ext: cookbooks: '#{cookbooks}'" if DEBUG
|
35
|
+
cookbooks = self.order_cookbooks_by_dependency(cookbooks)
|
36
|
+
objects["cookbooks"] = cookbooks unless cookbooks.empty?
|
36
37
|
|
37
38
|
# ROLES
|
38
39
|
roles = []
|
39
40
|
Dir.glob("roles/*.{rb,json}").each do |role_full_path|
|
40
|
-
role = self.grab_name_from_path
|
41
|
+
role = self.grab_name_from_path(role_full_path)
|
41
42
|
STDOUT.puts "DEBUG: dir_ext: role: '#{role}'" if DEBUG
|
42
43
|
roles << {role => nil}
|
43
44
|
end
|
@@ -45,7 +46,7 @@ class Spiceweasel::DirectoryExtractor
|
|
45
46
|
# ENVIRONMENTS
|
46
47
|
environments = []
|
47
48
|
Dir.glob("environments/*.{rb,json}").each do |environment_full_path|
|
48
|
-
environment = self.grab_name_from_path
|
49
|
+
environment = self.grab_name_from_path(environment_full_path)
|
49
50
|
STDOUT.puts "DEBUG: dir_ext: environment: '#{environment}'" if DEBUG
|
50
51
|
environments << {environment => nil}
|
51
52
|
end
|
@@ -67,7 +68,7 @@ class Spiceweasel::DirectoryExtractor
|
|
67
68
|
# TODO: Cant use this yet as node_list.rb doesnt support node from file syntax but expects the node info to be part of the objects passed in
|
68
69
|
# nodes = []
|
69
70
|
# Dir.glob("nodes/*.{rb,json}").each do |node_full_path|
|
70
|
-
# node = self.grab_name_from_path
|
71
|
+
# node = self.grab_name_from_path(node_full_path)
|
71
72
|
# nodes << {node => nil}
|
72
73
|
# end
|
73
74
|
# objects["nodes"] = nodes unless nodes.empty?
|
@@ -75,66 +76,42 @@ class Spiceweasel::DirectoryExtractor
|
|
75
76
|
objects
|
76
77
|
end
|
77
78
|
|
78
|
-
def self.
|
79
|
-
path.split('/').last
|
80
|
-
end
|
81
|
-
|
82
|
-
def self.grab_name_from_path path
|
83
|
-
name = self.grab_filename_from_path(path).split('.')
|
79
|
+
def self.grab_name_from_path(path)
|
80
|
+
name = path.split('/').last.split('.')
|
84
81
|
if name.length>1
|
85
82
|
name.pop
|
86
83
|
end
|
87
84
|
name.join('.')
|
88
85
|
end
|
89
|
-
def self.order_cookbooks_by_dependency cookbooks
|
90
86
|
|
87
|
+
def self.order_cookbooks_by_dependency(cookbooks)
|
91
88
|
# Weak algorithm, not particularly elegant, ignores version info as unlikely to have two versions of a cookbook anyway
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
if dependencies.nil?
|
109
|
-
ordered_cookbooks << name
|
110
|
-
num_sorted_cookbooks_this_iteration += 1
|
111
|
-
next
|
112
|
-
end
|
113
|
-
|
114
|
-
dependencies_satisfied_yet = true
|
115
|
-
dependencies.each {|dependency| dependencies_satisfied_yet = false unless ordered_cookbooks.include? dependency[:cookbook]}
|
116
|
-
if dependencies_satisfied_yet
|
117
|
-
ordered_cookbooks << name
|
118
|
-
num_sorted_cookbooks_this_iteration += 1
|
119
|
-
next
|
120
|
-
end
|
121
|
-
|
122
|
-
left_to_sort << cookbook
|
123
|
-
|
89
|
+
# We're going to find the cookbooks with their dependencies matched and keep going until all we have is unmatched deps
|
90
|
+
|
91
|
+
sorted_cookbooks = []
|
92
|
+
unsorted_cookbooks = cookbooks
|
93
|
+
scount = 0
|
94
|
+
#keep looping until no more cookbooks are left or can't remove remainders
|
95
|
+
while unsorted_cookbooks.any? and scount < cookbooks.length
|
96
|
+
cookbook = unsorted_cookbooks.shift
|
97
|
+
#if all the cookbook dependencies are in sorted_cookbooks
|
98
|
+
if sorted_cookbooks.eql?(sorted_cookbooks | cookbook['dependencies'].collect {|x| x['cookbook']})
|
99
|
+
sorted_cookbooks.push(cookbook['name'])
|
100
|
+
scount = 0
|
101
|
+
else #put it back in the list
|
102
|
+
unsorted_cookbooks.push(cookbook)
|
103
|
+
scount = scount + 1
|
124
104
|
end
|
125
|
-
|
105
|
+
STDOUT.puts "DEBUG: dir_ext: sorted_cookbooks: '#{sorted_cookbooks}' #{scount}" if DEBUG
|
126
106
|
end
|
127
|
-
|
128
|
-
|
129
|
-
|
107
|
+
if scount > 0
|
108
|
+
remainders = unsorted_cookbooks.collect {|x| x['name']}
|
109
|
+
deps = unsorted_cookbooks.collect {|x| x['dependencies'].collect {|x| x['cookbook']}}
|
110
|
+
STDERR.puts "ERROR: Dependencies not satisfied or circular dependencies in cookbook(s): #{remainders} depend(s) on #{deps}"
|
130
111
|
exit(-1)
|
112
|
+
else
|
113
|
+
#hack to get the format same as yaml/json parse
|
114
|
+
return sorted_cookbooks.collect {|x| {x => nil} }
|
131
115
|
end
|
132
|
-
output_cookbooks = []
|
133
|
-
ordered_cookbooks.each do |cookbook|
|
134
|
-
output_cookbooks << {cookbook => nil}
|
135
|
-
end
|
136
|
-
output_cookbooks
|
137
|
-
|
138
116
|
end
|
139
|
-
|
140
117
|
end
|
data/lib/spiceweasel/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spiceweasel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
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-05-
|
13
|
+
date: 2012-05-23 00:00:00.000000000Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: json
|
17
|
-
requirement: &
|
17
|
+
requirement: &70318502093180 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70318502093180
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: mixlib-cli
|
28
|
-
requirement: &
|
28
|
+
requirement: &70318502092760 !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: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *70318502092760
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: rspec
|
39
|
-
requirement: &
|
39
|
+
requirement: &70318502092340 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,7 +44,7 @@ dependencies:
|
|
44
44
|
version: '0'
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *70318502092340
|
48
48
|
description: Provides a CLI tool for generating knife commands to build Chef-managed
|
49
49
|
infrastructure from a simple YAML or JSON file.
|
50
50
|
email:
|