batali 0.4.10 → 0.5.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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +5 -0
- data/CONTRIBUTING.md +2 -2
- data/LICENSE +1 -1
- data/README.md +6 -5
- data/batali.gemspec +26 -25
- data/bin/batali +1 -0
- data/lib/batali.rb +23 -26
- data/lib/batali/b_file.rb +116 -98
- data/lib/batali/chefspec.rb +14 -16
- data/lib/batali/command.rb +32 -27
- data/lib/batali/command/cache.rb +9 -11
- data/lib/batali/command/configure.rb +1 -3
- data/lib/batali/command/display.rb +2 -4
- data/lib/batali/command/install.rb +13 -15
- data/lib/batali/command/resolve.rb +49 -51
- data/lib/batali/command/supermarket.rb +42 -45
- data/lib/batali/command/update.rb +2 -5
- data/lib/batali/config.rb +1 -2
- data/lib/batali/git.rb +10 -11
- data/lib/batali/manifest.rb +5 -6
- data/lib/batali/monkey.rb +6 -4
- data/lib/batali/origin.rb +12 -9
- data/lib/batali/origin/chef_server.rb +12 -14
- data/lib/batali/origin/git.rb +7 -9
- data/lib/batali/origin/path.rb +14 -15
- data/lib/batali/origin/remote_site.rb +17 -18
- data/lib/batali/requirement_list.rb +6 -7
- data/lib/batali/score_keeper.rb +12 -13
- data/lib/batali/source.rb +19 -21
- data/lib/batali/source/chef_server.rb +8 -10
- data/lib/batali/source/git.rb +11 -7
- data/lib/batali/source/path.rb +16 -12
- data/lib/batali/source/site.rb +23 -25
- data/lib/batali/tag_lines.rb +4 -5
- data/lib/batali/unit.rb +13 -16
- data/lib/batali/unit_loader.rb +12 -15
- data/lib/batali/utility.rb +42 -14
- data/lib/batali/version.rb +1 -1
- data/lib/chef/knife/batali_sync.rb +66 -72
- metadata +29 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 36c2b3a73af2cda00310d325b11c45528b6ce1e73053733bec57aecda740691d
|
4
|
+
data.tar.gz: 859df3d565d6e7d0e010a75d06e6de75db33fef921d0b60472aee9c4f9675c8c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 82f4762ba5bac43cf341c94fd3f158be89b34b2de70a47b2bae4bbf7fc1cd8ab176a7609d6abe34e9b4d4ccf0724e3a084aaa55c4f0780fda1bdb6cd5f2b884b
|
7
|
+
data.tar.gz: 6256dc382f21a894ef7532b71e89a8f0885b5eb5b3172441f654612c88586bd67580e464506fb90d988eb1b79d4f516eae84bd6cfd250680cc6f60c5d7e5386d
|
data/CHANGELOG.md
CHANGED
data/CONTRIBUTING.md
CHANGED
@@ -12,7 +12,7 @@ The develop branch is the current edge of development.
|
|
12
12
|
|
13
13
|
## Pull requests
|
14
14
|
|
15
|
-
* https://github.com/
|
15
|
+
* https://github.com/spox/batali
|
16
16
|
|
17
17
|
Please base all pull requests of the `develop` branch. Merges to
|
18
18
|
`master` only occur through the `develop` branch. Pull requests
|
@@ -22,4 +22,4 @@ based on `master` will likely be cherry picked.
|
|
22
22
|
|
23
23
|
Need to report an issue? Use the github issues:
|
24
24
|
|
25
|
-
* https://github.com/
|
25
|
+
* https://github.com/spox/batali
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
+
[](https://travis-ci.org/spox/batali) [](https://ci.appveyor.com/project/chrisroberts/batali)
|
2
|
+
|
1
3
|

|
2
4
|
|
3
5
|
# Batali
|
4
6
|
|
5
|
-
Batali is a light weight cookbook resolver.
|
6
|
-
a beta state, moving quickly towards a proper stable release.
|
7
|
+
Batali is a light weight cookbook resolver.
|
7
8
|
|
8
9
|
## What is Batali?
|
9
10
|
|
@@ -400,7 +401,7 @@ end
|
|
400
401
|
|
401
402
|
Batali can be used with [Test Kitchen](https://github.com/test-kitchen/test-kitchen):
|
402
403
|
|
403
|
-
* https://github.com/
|
404
|
+
* https://github.com/spox/batali-tk
|
404
405
|
|
405
406
|
## ChefSpec
|
406
407
|
|
@@ -452,7 +453,7 @@ $ batali supermarket --remote-supermarket-url="http://supermarket.example.com"
|
|
452
453
|
|
453
454
|
# Info
|
454
455
|
|
455
|
-
* Repository: https://github.com/
|
456
|
+
* Repository: https://github.com/spox/batali
|
456
457
|
|
457
458
|
[1]: https://rubygems.org/gems/librarian "A Framework for Bundlers"
|
458
|
-
[2]: https://rubygems.org/gems/chef "A systems integration framework"
|
459
|
+
[2]: https://rubygems.org/gems/chef "A systems integration framework"
|
data/batali.gemspec
CHANGED
@@ -1,28 +1,29 @@
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__)) +
|
2
|
-
require
|
1
|
+
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__)) + "/lib/"
|
2
|
+
require "batali/version"
|
3
3
|
Gem::Specification.new do |s|
|
4
|
-
s.name =
|
4
|
+
s.name = "batali"
|
5
5
|
s.version = Batali::VERSION.version
|
6
|
-
s.summary =
|
7
|
-
s.author =
|
8
|
-
s.email =
|
9
|
-
s.homepage =
|
10
|
-
s.description =
|
11
|
-
s.require_path =
|
12
|
-
s.license =
|
13
|
-
s.add_runtime_dependency
|
14
|
-
s.add_runtime_dependency
|
15
|
-
s.add_runtime_dependency
|
16
|
-
s.add_runtime_dependency
|
17
|
-
s.add_runtime_dependency
|
18
|
-
s.add_runtime_dependency
|
19
|
-
s.add_runtime_dependency
|
20
|
-
s.add_runtime_dependency
|
21
|
-
s.add_development_dependency
|
22
|
-
s.add_development_dependency
|
23
|
-
s.add_development_dependency
|
24
|
-
s.add_development_dependency
|
25
|
-
s.add_development_dependency
|
26
|
-
s.
|
27
|
-
s.
|
6
|
+
s.summary = "Magic"
|
7
|
+
s.author = "Chris Roberts"
|
8
|
+
s.email = "code@chrisroberts.org"
|
9
|
+
s.homepage = "https://github.com/hw-labs/batali"
|
10
|
+
s.description = "Magic"
|
11
|
+
s.require_path = "lib"
|
12
|
+
s.license = "Apache 2.0"
|
13
|
+
s.add_runtime_dependency "attribute_struct", ">= 0.2.14", "< 0.5"
|
14
|
+
s.add_runtime_dependency "grimoire", ">= 0.2.14", "< 0.4"
|
15
|
+
s.add_runtime_dependency "bogo", ">= 0.1.20", "< 0.4"
|
16
|
+
s.add_runtime_dependency "bogo-cli", ">= 0.2.12", "< 0.4"
|
17
|
+
s.add_runtime_dependency "bogo-config", ">= 0.1.10", "< 0.4"
|
18
|
+
s.add_runtime_dependency "bogo-ui", ">= 0.1.6", "< 0.4"
|
19
|
+
s.add_runtime_dependency "http", ">= 0.8.2", "< 1.0.0"
|
20
|
+
s.add_runtime_dependency "git"
|
21
|
+
s.add_development_dependency "rake"
|
22
|
+
s.add_development_dependency "minitest"
|
23
|
+
s.add_development_dependency "rufo", "~> 0.3.0"
|
24
|
+
s.add_development_dependency "rspec", "~> 3.5"
|
25
|
+
s.add_development_dependency "pry"
|
26
|
+
s.add_development_dependency "chef"
|
27
|
+
s.executables << "batali"
|
28
|
+
s.files = Dir["{lib,bin}/**/**/*"] + %w(batali.gemspec README.md CHANGELOG.md CONTRIBUTING.md LICENSE)
|
28
29
|
end
|
data/bin/batali
CHANGED
data/lib/batali.rb
CHANGED
@@ -1,25 +1,24 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "bogo-cli"
|
2
|
+
require "grimoire"
|
3
|
+
require "batali/monkey"
|
4
4
|
|
5
5
|
# Batali namespace
|
6
6
|
module Batali
|
7
|
-
|
8
|
-
autoload :
|
9
|
-
autoload :
|
10
|
-
autoload :
|
11
|
-
autoload :
|
12
|
-
autoload :
|
13
|
-
autoload :
|
14
|
-
autoload :
|
15
|
-
autoload :
|
16
|
-
autoload :
|
17
|
-
autoload :
|
18
|
-
autoload :
|
19
|
-
autoload :
|
20
|
-
|
21
|
-
|
22
|
-
autoload :TAG_LINES, 'batali/tag_lines'
|
7
|
+
autoload :BFile, "batali/b_file"
|
8
|
+
autoload :Command, "batali/command"
|
9
|
+
autoload :Config, "batali/config"
|
10
|
+
autoload :Git, "batali/git"
|
11
|
+
autoload :Manifest, "batali/manifest"
|
12
|
+
autoload :Origin, "batali/origin"
|
13
|
+
autoload :RequirementList, "batali/requirement_list"
|
14
|
+
autoload :ScoreKeeper, "batali/score_keeper"
|
15
|
+
autoload :Source, "batali/source"
|
16
|
+
autoload :Struct, "batali/b_file"
|
17
|
+
autoload :Unit, "batali/unit"
|
18
|
+
autoload :UnitLoader, "batali/unit_loader"
|
19
|
+
autoload :Utility, "batali/utility"
|
20
|
+
|
21
|
+
autoload :TAG_LINES, "batali/tag_lines"
|
23
22
|
|
24
23
|
class << self
|
25
24
|
# @return [Bogo::Ui]
|
@@ -30,7 +29,7 @@ module Batali
|
|
30
29
|
# @param ui [Bogo::Ui]
|
31
30
|
# @return [Bogo::Ui]
|
32
31
|
def ui=(ui)
|
33
|
-
unless
|
32
|
+
unless ui.respond_to?(:verbose) && ui.respond_to?(:debug)
|
34
33
|
raise TypeError.new "Expecting type `Bogo::Ui` but received `#{ui.class}`"
|
35
34
|
end
|
36
35
|
@ui = Grimoire.ui = ui
|
@@ -38,21 +37,19 @@ module Batali
|
|
38
37
|
|
39
38
|
# Write verbose message
|
40
39
|
def verbose(*args)
|
41
|
-
if
|
40
|
+
if ui
|
42
41
|
ui.verbose(*args)
|
43
42
|
end
|
44
43
|
end
|
45
44
|
|
46
45
|
# Write debug message
|
47
46
|
def debug(*args)
|
48
|
-
if
|
47
|
+
if ui
|
49
48
|
ui.debug(*args)
|
50
49
|
end
|
51
50
|
end
|
52
|
-
|
53
51
|
end
|
54
|
-
|
55
52
|
end
|
56
53
|
|
57
|
-
require
|
58
|
-
require
|
54
|
+
require "batali/b_file"
|
55
|
+
require "batali/version"
|
data/lib/batali/b_file.rb
CHANGED
@@ -1,14 +1,13 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "batali"
|
2
|
+
require "pathname"
|
3
3
|
|
4
4
|
# Batali namespace
|
5
5
|
module Batali
|
6
6
|
|
7
7
|
# Custom struct class for file processing
|
8
8
|
class Struct < AttributeStruct
|
9
|
-
|
10
9
|
def cookbook(*args)
|
11
|
-
unless
|
10
|
+
unless self[:cookbook]
|
12
11
|
set!(:cookbook, ::AttributeStruct::CollapseArray.new.push(args))
|
13
12
|
else
|
14
13
|
self[:cookbook].push(args)
|
@@ -17,7 +16,7 @@ module Batali
|
|
17
16
|
end
|
18
17
|
|
19
18
|
def source(*args)
|
20
|
-
unless
|
19
|
+
unless self[:source]
|
21
20
|
set!(:source, ::AttributeStruct::CollapseArray.new.push(args))
|
22
21
|
else
|
23
22
|
self[:source].push(args)
|
@@ -26,7 +25,7 @@ module Batali
|
|
26
25
|
end
|
27
26
|
|
28
27
|
def chef_server(*args)
|
29
|
-
unless
|
28
|
+
unless self[:chef_server]
|
30
29
|
set!(:chef_server, ::AttributeStruct::CollapseArray.new.push(args))
|
31
30
|
else
|
32
31
|
self[:chef_server].push(args)
|
@@ -35,7 +34,7 @@ module Batali
|
|
35
34
|
end
|
36
35
|
|
37
36
|
def restrict(*args)
|
38
|
-
unless
|
37
|
+
unless self[:restrict]
|
39
38
|
set!(:restrict, ::AttributeStruct::CollapseArray.new.push(args))
|
40
39
|
else
|
41
40
|
self[:restrict].push(args)
|
@@ -49,7 +48,7 @@ module Batali
|
|
49
48
|
|
50
49
|
def _dump(*_)
|
51
50
|
_keys.each do |k|
|
52
|
-
if
|
51
|
+
if _data[k].nil? && _data[k].is_a?(::AttributeStruct)
|
53
52
|
_data[k] = true
|
54
53
|
end
|
55
54
|
end
|
@@ -57,7 +56,17 @@ module Batali
|
|
57
56
|
end
|
58
57
|
|
59
58
|
::Object.constants.each do |const_name|
|
60
|
-
|
59
|
+
deprecated_constants = [
|
60
|
+
:Config,
|
61
|
+
:Data,
|
62
|
+
:TimeoutError,
|
63
|
+
:Fixnum,
|
64
|
+
:Bignum,
|
65
|
+
:NIL,
|
66
|
+
:TRUE,
|
67
|
+
:FALSE,
|
68
|
+
]
|
69
|
+
next if deprecated_constants.include?(const_name)
|
61
70
|
const_set(const_name, ::Object.const_get(const_name))
|
62
71
|
end
|
63
72
|
|
@@ -66,14 +75,23 @@ module Batali
|
|
66
75
|
instance_exec do
|
67
76
|
class << self
|
68
77
|
::Object.constants.each do |const_name|
|
69
|
-
|
78
|
+
deprecated_constants = [
|
79
|
+
:Config,
|
80
|
+
:Data,
|
81
|
+
:TimeoutError,
|
82
|
+
:Fixnum,
|
83
|
+
:Bignum,
|
84
|
+
:NIL,
|
85
|
+
:TRUE,
|
86
|
+
:FALSE,
|
87
|
+
]
|
88
|
+
next if deprecated_constants.include?(const_name)
|
70
89
|
const_set(const_name, ::Object.const_get(const_name))
|
71
90
|
end
|
72
91
|
end
|
73
92
|
end
|
74
93
|
result
|
75
94
|
end
|
76
|
-
|
77
95
|
end
|
78
96
|
|
79
97
|
# Create a new file
|
@@ -99,6 +117,7 @@ module Batali
|
|
99
117
|
# @param cache_path [String] path to cache directory
|
100
118
|
# @return [self]
|
101
119
|
def initialize(b_file, cache_path)
|
120
|
+
b_file = Utility.clean_path(b_file)
|
102
121
|
@cache = cache_path
|
103
122
|
super(b_file)
|
104
123
|
end
|
@@ -107,13 +126,13 @@ module Batali
|
|
107
126
|
def self.cookbook_coerce
|
108
127
|
proc do |v|
|
109
128
|
v = [v].flatten.compact
|
110
|
-
if
|
129
|
+
if v.size == 1 && v.first.is_a?(Hash)
|
111
130
|
Cookbook.new(v.first)
|
112
131
|
else
|
113
132
|
name, args = v.first, v.slice(1, v.size)
|
114
|
-
if
|
133
|
+
if args.empty?
|
115
134
|
args = Smash.new
|
116
|
-
elsif
|
135
|
+
elsif args.size == 1 && args.first.is_a?(Hash)
|
117
136
|
args = args.first
|
118
137
|
else
|
119
138
|
args = Smash.new(:constraint => args.map(&:to_s))
|
@@ -146,67 +165,67 @@ module Batali
|
|
146
165
|
end
|
147
166
|
|
148
167
|
attribute :discover, [TrueClass, FalseClass], :required => true, :default => false
|
149
|
-
attribute :restrict, Restriction, :multiple => true, :coerce => lambda{|v|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
attribute :source, Origin::RemoteSite, :multiple => true, :default => [], :coerce => lambda{|v, b_file|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
attribute :chef_server, Origin::ChefServer, :multiple => true, :default => [], :coerce => lambda{|v, b_file|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
attribute :group, Group, :multiple => true, :coerce => lambda{|v| Group.new(v)}
|
168
|
+
attribute :restrict, Restriction, :multiple => true, :coerce => lambda { |v|
|
169
|
+
if v.is_a?(Hash)
|
170
|
+
Restriction.new(v)
|
171
|
+
else
|
172
|
+
Restriction.new(:cookbook => v.first, :source => v.last.to_smash[:source])
|
173
|
+
end
|
174
|
+
}
|
175
|
+
attribute :source, Origin::RemoteSite, :multiple => true, :default => [], :coerce => lambda { |v, b_file|
|
176
|
+
if v.is_a?(Hash)
|
177
|
+
args = v
|
178
|
+
else
|
179
|
+
args = Smash.new(:endpoint => v.first)
|
180
|
+
if v.last.is_a?(Hash)
|
181
|
+
args.merge!(v.last)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
Origin::RemoteSite.new(args.merge(:cache_path => b_file.cache))
|
185
|
+
}
|
186
|
+
attribute :chef_server, Origin::ChefServer, :multiple => true, :default => [], :coerce => lambda { |v, b_file|
|
187
|
+
if v.is_a?(Hash)
|
188
|
+
args = v
|
189
|
+
else
|
190
|
+
args = Smash.new(:endpoint => v.first)
|
191
|
+
if v.last.is_a?(Hash)
|
192
|
+
args.merge!(v.last)
|
193
|
+
end
|
194
|
+
end
|
195
|
+
Origin::ChefServer.new(args.merge(:cache_path => b_file.cache))
|
196
|
+
}
|
197
|
+
attribute :group, Group, :multiple => true, :coerce => lambda { |v| Group.new(v) }
|
179
198
|
attribute :cookbook, Cookbook, :multiple => true, :coerce => BFile.cookbook_coerce, :default => []
|
180
|
-
attribute :metadata, Cookbook, :coerce => lambda{ |v, b_file|
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
199
|
+
attribute :metadata, Cookbook, :coerce => lambda { |v, b_file|
|
200
|
+
if v.is_a?(Hash)
|
201
|
+
ckbk = Cookbook.new(v)
|
202
|
+
else
|
203
|
+
dir = Pathname.new(File.dirname(b_file.path)).relative_path_from(Pathname.new(Utility.clean_path(Dir.pwd))).to_path
|
204
|
+
m_unit = Origin::Path.new(:name => "metadata", :path => dir, :cache_path => b_file.cache).units.first
|
205
|
+
ckbk = Cookbook.new(:name => m_unit.name, :version => m_unit.version, :path => dir)
|
206
|
+
end
|
207
|
+
unless b_file.cookbook.map(&:name).include?(ckbk.name)
|
208
|
+
b_file.cookbook.push ckbk
|
209
|
+
end
|
210
|
+
ckbk
|
211
|
+
}
|
193
212
|
|
194
213
|
# Search environments for cookbooks and restraints
|
195
214
|
#
|
196
215
|
# @return [TrueClass]
|
197
|
-
def auto_discover!(environment=nil)
|
198
|
-
debug
|
199
|
-
unless
|
200
|
-
raise
|
216
|
+
def auto_discover!(environment = nil)
|
217
|
+
debug "Starting cookbook auto-discovery"
|
218
|
+
unless discover
|
219
|
+
raise "Attempting to perform auto-discovery but auto-discovery is not enabled!"
|
201
220
|
end
|
202
|
-
environment_items = Dir.glob(
|
221
|
+
environment_items = Dir.glob(Utility.join_path(File.dirname(path), "environments", "*.{json,rb}")).map do |e_path|
|
203
222
|
result = parse_environment(e_path)
|
204
|
-
if
|
223
|
+
if result[:name] && result[:cookbooks]
|
205
224
|
Smash.new(
|
206
|
-
result[:name] => result[:cookbooks]
|
225
|
+
result[:name] => result[:cookbooks],
|
207
226
|
)
|
208
227
|
end
|
209
|
-
end.compact.inject(Smash.new){|m, n| m.merge(n)}
|
228
|
+
end.compact.inject(Smash.new) { |m, n| m.merge(n) }
|
210
229
|
environment_items.each do |e_name, items|
|
211
230
|
next if environment && e_name != environment
|
212
231
|
debug "Discovery processing of environment: #{e_name}"
|
@@ -214,8 +233,8 @@ module Batali
|
|
214
233
|
ckbk = cookbook.detect do |c|
|
215
234
|
c.name == ckbk_name
|
216
235
|
end
|
217
|
-
if
|
218
|
-
unless
|
236
|
+
if ckbk
|
237
|
+
unless ckbk.constraint
|
219
238
|
debug "Skipping constraint merging due to lack of original constraints: #{ckbk.inspect}"
|
220
239
|
next
|
221
240
|
end
|
@@ -230,13 +249,13 @@ module Batali
|
|
230
249
|
cookbook.push(
|
231
250
|
Cookbook.new(
|
232
251
|
:name => ckbk_name,
|
233
|
-
:constraint => constraints
|
252
|
+
:constraint => constraints,
|
234
253
|
)
|
235
254
|
)
|
236
255
|
end
|
237
256
|
end
|
238
257
|
end
|
239
|
-
debug
|
258
|
+
debug "Completed cookbook auto-discovery"
|
240
259
|
true
|
241
260
|
end
|
242
261
|
|
@@ -247,8 +266,8 @@ module Batali
|
|
247
266
|
# @param constraint [String]
|
248
267
|
# @param [Array<String>]
|
249
268
|
def convert_constraint(constraint)
|
250
|
-
comp, ver = constraint.split(
|
251
|
-
if
|
269
|
+
comp, ver = constraint.split(" ", 2).map(&:strip)
|
270
|
+
if comp == "~>"
|
252
271
|
ver = UnitVersion.new(ver)
|
253
272
|
[">= #{ver}", "< #{ver.bump}"]
|
254
273
|
else
|
@@ -268,40 +287,40 @@ module Batali
|
|
268
287
|
grouped = Smash[
|
269
288
|
grouped.map do |comp, items|
|
270
289
|
versions = items.map(&:last)
|
271
|
-
if
|
290
|
+
if comp.start_with?(">")
|
272
291
|
[comp, [versions.min]]
|
273
|
-
elsif
|
292
|
+
elsif comp.start_with?("<")
|
274
293
|
[comp, [versions.max]]
|
275
294
|
else
|
276
295
|
[comp, versions]
|
277
296
|
end
|
278
297
|
end
|
279
298
|
]
|
280
|
-
if
|
281
|
-
grouped[
|
282
|
-
grouped[
|
283
|
-
grouped[
|
284
|
-
grouped[
|
285
|
-
grouped[
|
299
|
+
if grouped["="]
|
300
|
+
grouped[">="] ||= []
|
301
|
+
grouped["<="] ||= []
|
302
|
+
grouped["="].each do |ver|
|
303
|
+
grouped[">="] << ver
|
304
|
+
grouped["<="] << ver
|
286
305
|
end
|
287
|
-
grouped.delete(
|
306
|
+
grouped.delete("=")
|
288
307
|
end
|
289
|
-
if
|
290
|
-
if
|
291
|
-
grouped[
|
292
|
-
grouped.delete(
|
308
|
+
if grouped[">"] || grouped[">="]
|
309
|
+
if grouped[">="] && (grouped[">"].nil? || grouped[">="].min <= grouped[">"].min)
|
310
|
+
grouped[">="] = [grouped[">="].min]
|
311
|
+
grouped.delete(">")
|
293
312
|
else
|
294
|
-
grouped[
|
295
|
-
grouped.delete(
|
313
|
+
grouped[">"] = [grouped[">"].min]
|
314
|
+
grouped.delete(">=")
|
296
315
|
end
|
297
316
|
end
|
298
|
-
if
|
299
|
-
if
|
300
|
-
grouped[
|
301
|
-
grouped.delete(
|
317
|
+
if grouped["<"] || grouped["<="]
|
318
|
+
if grouped["<="] && (grouped["<"].nil? || grouped["<="].max >= grouped["<"].max)
|
319
|
+
grouped["<="] = [grouped["<="].max]
|
320
|
+
grouped.delete("<")
|
302
321
|
else
|
303
|
-
grouped[
|
304
|
-
grouped.delete(
|
322
|
+
grouped["<"] = [grouped["<"].max]
|
323
|
+
grouped.delete("<=")
|
305
324
|
end
|
306
325
|
end
|
307
326
|
grouped.map do |comp, vers|
|
@@ -316,12 +335,13 @@ module Batali
|
|
316
335
|
# @param path [String] path to environment
|
317
336
|
# @return [Smash]
|
318
337
|
def parse_environment(path)
|
338
|
+
path = Utility.clean_path(path)
|
319
339
|
case File.extname(path)
|
320
|
-
when
|
340
|
+
when ".json"
|
321
341
|
env = MultiJson.load(
|
322
342
|
File.read(path)
|
323
343
|
).to_smash
|
324
|
-
when
|
344
|
+
when ".rb"
|
325
345
|
struct = Struct.new
|
326
346
|
struct.set_state!(:value_collapse => true)
|
327
347
|
struct.instance_eval(File.read(path), path, 1)
|
@@ -335,8 +355,8 @@ module Batali
|
|
335
355
|
env.fetch(
|
336
356
|
:cookbook_versions,
|
337
357
|
Smash.new
|
338
|
-
).map{|k, v| [k, v.to_s.split(
|
339
|
-
]
|
358
|
+
).map { |k, v| [k, v.to_s.split(",")] }
|
359
|
+
],
|
340
360
|
)
|
341
361
|
end
|
342
362
|
|
@@ -344,7 +364,5 @@ module Batali
|
|
344
364
|
def debug(s)
|
345
365
|
Batali.debug(s)
|
346
366
|
end
|
347
|
-
|
348
367
|
end
|
349
|
-
|
350
368
|
end
|