kameleon-builder 2.6.7 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  [bumpversion]
2
2
  commit = True
3
3
  tag = True
4
- current_version = 2.6.7
4
+ current_version = 2.7.0
5
5
  parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(\.(?P<release>[a-z]+))?
6
6
  serialize =
7
7
  {major}.{minor}.{patch}.{release}
data/CHANGES CHANGED
@@ -1,6 +1,24 @@
1
1
  Kameleon CHANGELOG
2
2
  ==================
3
3
 
4
+ Version 2.7.0
5
+ -------------
6
+
7
+ Released on December 09th 2015
8
+
9
+ - Fixed variables overload when using inheritance
10
+ - Added support for including global options from a separate file (#57)
11
+ - Allowed kameleon to fail silently if some error occured during include
12
+ - Marked all bash variables for export
13
+ - Sorted variables in ``kameleon info`` dump
14
+ - Removed duplicate error messages
15
+ - Shutdown polipo cleanly (#54)
16
+ - Added offline mode to prevent Polipo from contacting remote servers
17
+ - Fixed polipo default options to avoid "206 partial responses" (#54)
18
+ - Made only one checkpoint per macrostep to improve performance
19
+ - Made polipo log file unique for each user to avoid "Permission denied" error
20
+ - Added new keyword in ZSH completion
21
+
4
22
  Version 2.6.7
5
23
  -------------
6
24
 
@@ -0,0 +1,16 @@
1
+ You can use the script ``./scripts/bumpversion.py`` which will handle
2
+ everything (incrementation, git tag creation, changelog update).
3
+
4
+ 1) After each release, a new version has to be created (in this example, the 2.7.0 dev)
5
+
6
+ $ python2 ./scripts/bumpversion.py newversion minor # 2.6.7 -> 2.7.0.dev
7
+
8
+ [work/commit]
9
+
10
+ 2) Releasing a new version
11
+
12
+ $ python2 ./scripts/bumpversion.py release # 2.7.0.dev -> 2.7.0 + git tag + changelog
13
+ $ gem build kameleon-builder.gemspec
14
+ $ gem push kameleon-builder-2.7.0.gem
15
+
16
+ You need a rubygem account and I have to give you permissions so that you can push
@@ -147,6 +147,7 @@ _kameleon () {
147
147
  _arguments -C \
148
148
  '(--from-cache)1:Kameleon recipe path:_files' \
149
149
  '(1)--from-cache=:Persistent cache tar file to build the image:_files' \
150
+ '--cache-archive-compression=:Select the persistent cache compression:(gzip xz bz2)' \
150
151
  '(-b --build-path)'{-b,--build-path=}':Build directory path:_directories' \
151
152
  '--clean[Runs the command `kameleon clean` first]' \
152
153
  '--from-checkpoint=:Specify checkpoint to build the image' \
@@ -154,6 +155,8 @@ _kameleon () {
154
155
  {--checkpoints,--list-checkpoints}'[Lists all availables checkpoints]' \
155
156
  '--enable-cache[Generates a persistent cache for the appliance]' \
156
157
  '--cache-path=:Cache directory path:_directories' \
158
+ '--proxy=:Specifies the hostname and port number of the parent HTTP proxy define as host\:port' \
159
+ '--proxy-credentials=:Specifies the username and password if the parent proxy requires authorisation define as username\:password' \
157
160
  '*'{-g,--global}':Custom global variable define as key\:value' && ret=0
158
161
  ;;
159
162
  (help)
@@ -2,6 +2,7 @@
2
2
 
3
3
  set -o errexit
4
4
  set -o pipefail
5
+ set -o allexport
5
6
 
6
7
  __ROOT_DIRECTORY__=$(dirname $(readlink -f ${BASH_SOURCE[0]}))
7
8
 
@@ -60,7 +60,7 @@ module Kameleon
60
60
  rescue
61
61
  raise TemplateNotFound, "Template '#{template_name}' not found. " \
62
62
  "To see all templates, run the command "\
63
- "`kameleon template ls`"
63
+ "`kameleon template list`"
64
64
  else
65
65
  tpl.all_files.each do |path|
66
66
  relative_path = path.relative_path_from(Kameleon.env.repositories_path)
@@ -149,7 +149,7 @@ module Kameleon
149
149
  rescue
150
150
  raise TemplateNotFound, "Template '#{template_name}' not found. " \
151
151
  "To see all templates, run the command "\
152
- "`kameleon templates`"
152
+ "`kameleon template list`"
153
153
  else
154
154
  tpl.all_files.each do |path|
155
155
  relative_path = path.relative_path_from(Kameleon.env.repositories_path)
@@ -234,6 +234,9 @@ module Kameleon
234
234
  :desc => "Specifies the username and password if the parent "\
235
235
  "proxy requires authorisation it should have the "\
236
236
  "form 'username:password'"
237
+ method_option :proxy_offline, :type => :boolean ,
238
+ :default => false, :aliases => "--offline",
239
+ :desc => "Prevents Polipo from contacting remote servers"
237
240
  method_option :global, :type => :hash,
238
241
  :default => {}, :aliases => "-g",
239
242
  :desc => "Set custom global variables."
@@ -46,6 +46,7 @@ module Kameleon
46
46
  @cache.polipo_path = @options[:polipo_path]
47
47
  @cache.name = @recipe.name
48
48
  @cache.mode = @options[:enable_cache] ? :build : :from
49
+ @cache.offline = @options[:proxy_offline]
49
50
  @cache.cache_path = @options[:from_cache]
50
51
  @cache.recipe_path = @recipe.path
51
52
  @cache.archive_format = @options[:cache_archive_compression]
@@ -184,6 +185,7 @@ module Kameleon
184
185
  def do_steps(section_name)
185
186
  section = @recipe.sections.fetch(section_name)
186
187
  section.sequence do |macrostep|
188
+ checkpointed = false
187
189
  macrostep_time = Time.now.to_i
188
190
  if @cache then
189
191
  Kameleon.ui.debug("Starting proxy cache server for macrostep '#{macrostep.name}'...")
@@ -209,9 +211,12 @@ module Kameleon
209
211
  safe_exec_cmd(cmd)
210
212
  end
211
213
  unless microstep.on_checkpoint == "redo"
212
- if checkpoint_enabled?
213
- Kameleon.ui.msg("--> Creating checkpoint : #{ microstep.identifier }")
214
- create_checkpoint(microstep.identifier)
214
+ unless checkpointed
215
+ if checkpoint_enabled?
216
+ Kameleon.ui.msg("--> Creating checkpoint : #{ microstep.identifier }")
217
+ create_checkpoint(microstep.identifier)
218
+ checkpointed = true
219
+ end
215
220
  end
216
221
  end
217
222
  end
@@ -21,6 +21,7 @@ module Kameleon
21
21
  attr_accessor :recipe_path
22
22
  attr_accessor :archive_format
23
23
  attr_accessor :polipo_cmd_options
24
+ attr_accessor :offline
24
25
 
25
26
  def initialize()
26
27
  ## we must configure Polipo to be execute for the in and out context
@@ -29,18 +30,15 @@ module Kameleon
29
30
  @polipo_process = nil
30
31
  @polipo_port = find_unused_port
31
32
 
32
- # :idleTime => "1",
33
33
  @polipo_cmd_options = {:diskCacheRoot => "",
34
34
  :maxDiskCacheEntrySize => "-1",
35
- :disableIndexing => "false",
36
- :disableServersList => "false",
35
+ :idleTime => "1",
37
36
  :allowedClients => "0.0.0.0/0",
38
37
  :proxyPort => @polipo_port,
39
- :relaxTransparency =>"true",
40
38
  :daemonise => false,
41
39
  :proxyAddress => "0.0.0.0",
42
- :logFile => File.join(Kameleon.env.build_path, 'polipo.log'),
43
- :logLevel => "4",
40
+ :logFile => File.join(Kameleon.env.build_path, "polipo-#{ENV['USER']}.log"),
41
+ :logLevel => "0xFF",
44
42
  }
45
43
 
46
44
  @activated = false
@@ -56,6 +54,7 @@ module Kameleon
56
54
  @recipe_file = nil
57
55
  @steps_files = []
58
56
  @cached_recipe_dir = nil
57
+ @offline = false
59
58
  end
60
59
 
61
60
  def find_unused_port
@@ -104,13 +103,16 @@ module Kameleon
104
103
  def proxy_is_running?()
105
104
  begin
106
105
  res = Net::HTTP.get_response(URI("http://127.0.0.1:#{@polipo_port}/polipo/status"))
107
- if not res.body.include? "is on line"
108
- Kameleon.ui.debug("The proxy is running but not responding. Server response: #{res.inspect}")
109
- else
110
- Kameleon.ui.debug("The proxy is responding")
111
- return true
106
+ if not @offline
107
+ if not res.body.include? "is on line"
108
+ Kameleon.ui.debug("The proxy is running but not responding. Server response: #{res.inspect}")
109
+ return false
110
+ else
111
+ Kameleon.ui.debug("The proxy is responding")
112
+ return true
113
+ end
112
114
  end
113
- return false
115
+ return true
114
116
  rescue Exception => e
115
117
  Kameleon.ui.debug("The proxy is not responding. Server response: #{e.message}")
116
118
  return false
@@ -141,8 +143,17 @@ module Kameleon
141
143
 
142
144
 
143
145
  def stop_web_proxy
144
- @polipo_process.stop
146
+ # http://www.pps.univ-paris-diderot.fr/~jch/software/polipo/manual/Stopping.html
145
147
  Kameleon.ui.info("Stopping web proxy polipo")
148
+ unless (@polipo_process.nil? || @polipo_process.exited?)
149
+ Process.kill("USR1", @polipo_process.pid) # will write out all the in-memory data to disk
150
+ Process.kill("SIGINT", @polipo_process.pid) # will shut down cleanly
151
+ begin
152
+ @polipo_process.poll_for_exit(10)
153
+ rescue ChildProcess::TimeoutError
154
+ @polipo_process.stop # tries increasingly harsher methods to kill the process.
155
+ end
156
+ end
146
157
  end
147
158
 
148
159
  def pack()
@@ -198,12 +209,7 @@ module Kameleon
198
209
  end
199
210
 
200
211
  def stop()
201
- begin
202
- @polipo_process.poll_for_exit(5)
203
- rescue ChildProcess::TimeoutError
204
- @polipo_process.stop # tries increasingly harsher methods to kill the process.
205
- end
206
- Kameleon.ui.info("Stopping web proxy polipo")
212
+ stop_web_proxy
207
213
  Kameleon.ui.info("Finishing persistent cache with last files")
208
214
  cache_metadata_dir = File.join(@cache_dir,"metadata")
209
215
  if @mode == :build then
@@ -260,6 +266,7 @@ module Kameleon
260
266
  FileUtils.mkdir_p File.join(@cache_dir,"recipe")
261
267
  FileUtils.mkdir_p File.join(@cache_dir,"DATA")
262
268
  FileUtils.mkdir_p File.join(@cache_dir,"metadata")
269
+ @polipo_cmd_options[:proxyOffline] = @offline
263
270
  end
264
271
 
265
272
  def get_recipe()
@@ -50,6 +50,13 @@ module Kameleon
50
50
  load! :strict => false
51
51
  end
52
52
 
53
+ def update_steps_dirs()
54
+ # Where we can find steps
55
+ @steps_dirs = @base_recipes_files.map do |recipe_path|
56
+ get_steps_dirs(recipe_path)
57
+ end.flatten!
58
+ end
59
+
53
60
  def get_steps_dirs(recipe_path)
54
61
  relative_path = recipe_path.to_s.gsub(Kameleon.env.root_dir.to_s + '/', '')
55
62
  if relative_path.eql? recipe_path.to_s
@@ -80,6 +87,9 @@ module Kameleon
80
87
  unless yaml_recipe.kind_of? Hash
81
88
  fail RecipeError, "Invalid yaml error : #{@path}"
82
89
  end
90
+
91
+ update_steps_dirs()
92
+
83
93
  # Load entended recipe variables
84
94
  yaml_recipe = load_base_recipe(yaml_recipe, @path)
85
95
  yaml_recipe.delete("extend")
@@ -92,7 +102,8 @@ module Kameleon
92
102
 
93
103
  # Load Global variables
94
104
  @global.merge!(yaml_recipe.fetch("global", {}))
95
- @global.merge!(@cli_global)
105
+ # merge cli variable with recursive variable overload
106
+ @global = Utils.overload_merge(@global, @cli_global)
96
107
  # Resolve dynamically-defined variables !!
97
108
  resolved_global = Utils.resolve_vars(@global.to_yaml, @path, @global, self, kwargs)
98
109
  resolved_global = @global.merge YAML.load(resolved_global)
@@ -176,6 +187,7 @@ module Kameleon
176
187
  end
177
188
 
178
189
  def load_base_recipe(yaml_recipe, path)
190
+
179
191
  base_recipe_name = yaml_recipe.fetch("extend", "")
180
192
  return yaml_recipe if base_recipe_name.empty?
181
193
 
@@ -186,6 +198,9 @@ module Kameleon
186
198
  ## check that the recipe has not already been loaded
187
199
  return yaml_recipe if @base_recipes_files.include? base_recipe_path
188
200
 
201
+ @base_recipes_files.push(Pathname.new(File.expand_path(base_recipe_path)))
202
+ update_steps_dirs()
203
+
189
204
  base_recipe_path << ".yaml" unless base_recipe_path.end_with? ".yaml"
190
205
  fail RecipeError, "Could not find this following recipe : #{@recipe_path}" \
191
206
  unless File.file? path
@@ -213,17 +228,107 @@ module Kameleon
213
228
  end
214
229
  base_yaml_recipe[key] = recipe_section
215
230
  elsif ["global"].include? key
216
- base_section = base_yaml_recipe.fetch(key, {})
217
- base_section = {} if base_section.nil?
218
- recipe_section = yaml_recipe[key]
219
- recipe_section = {} if recipe_section.nil?
220
- base_yaml_recipe[key] = base_section.merge(recipe_section)
231
+ base_section = load_global(base_yaml_recipe, base_recipe_path)
232
+ recipe_section = load_global(yaml_recipe, path)
233
+ # manage recursive variable overload
234
+ base_yaml_recipe[key] = Utils.overload_merge(base_section, recipe_section)
221
235
  end
222
236
  end
223
- @base_recipes_files.push(Pathname.new(File.expand_path(base_recipe_path)))
224
237
  return load_base_recipe(base_yaml_recipe, base_recipe_path)
225
238
  end
226
239
 
240
+ def load_global(yaml_recipe, recipe_path)
241
+ global = {}
242
+ if yaml_recipe.keys.include? "global"
243
+ global_loaded = yaml_recipe.fetch("global", {})
244
+ global_loaded = {} if global_loaded.nil?
245
+ if global_loaded.kind_of? Hash
246
+ global_loaded.each do |key, value|
247
+ if key.eql? "include"
248
+ global_to_include = load_include_global(value, recipe_path)
249
+ global.merge!(global_to_include)
250
+ else
251
+ global[key] = value
252
+ end
253
+ end
254
+ end
255
+ end
256
+ return global
257
+ end
258
+
259
+ def load_include_global(yaml_include, recipe_path)
260
+ def load_global_file(global_file, recipe_path)
261
+ def try_to_load(absolute_path)
262
+ if File.file?(absolute_path)
263
+ global_to_include = YAML.load_file(absolute_path)
264
+ if global_to_include.kind_of? Hash
265
+ @step_files.push(absolute_path)
266
+ return global_to_include
267
+ else
268
+ fail RecipeError, "Global should be a Hash. (check #{absolute_path})"
269
+ end
270
+ end
271
+ end
272
+ ## check that the recipe has not already been loaded
273
+ global_file << ".yaml" unless global_file.end_with? ".yaml"
274
+
275
+ dir_search = @steps_dirs.map do |steps_dir|
276
+ File.join(steps_dir, "global")
277
+ end.flatten
278
+ dir_search.unshift(File.join(File.dirname(recipe_path)))
279
+ # try relative/absolute path
280
+ if Pathname.new(global_file).absolute?
281
+ global_to_include = try_to_load(global_file)
282
+ unless global_to_include.nil?
283
+ return global_to_include
284
+ else
285
+ fail RecipeError, "File '#{global_file}' not found"
286
+ end
287
+ else
288
+ dir_search.each do |dir_path|
289
+ absolute_path = Pathname.new(File.join(dir_path, global_file))
290
+ global_to_include = try_to_load(absolute_path)
291
+ unless global_to_include.nil?
292
+ return global_to_include
293
+ end
294
+ end
295
+ end
296
+ rel_dir_search = dir_search.map do |steps_dir|
297
+ relative_path = Pathname.new(steps_dir).relative_path_from(Pathname(Dir.pwd)).to_s
298
+ end.flatten
299
+ fail RecipeError, "File '#{global_file}' not found here #{rel_dir_search}"
300
+ end
301
+
302
+ global_hash = {}
303
+ if yaml_include.kind_of? String
304
+ list_files = [yaml_include]
305
+ elsif yaml_include.kind_of? Array
306
+ list_files = []
307
+ yaml_include.each do |value|
308
+ if value.kind_of? String
309
+ list_files.push(value)
310
+ end
311
+ end
312
+ else
313
+ return global_hash
314
+ end
315
+ list_files.each do |includes_file|
316
+ filename = includes_file
317
+ if includes_file.start_with?("-")
318
+ filename = includes_file[1..-1]
319
+ end
320
+ begin
321
+ new_global = load_global_file(filename, recipe_path)
322
+ global_hash.merge!(new_global)
323
+ rescue
324
+ unless includes_file.start_with?("-")
325
+ raise
326
+ end
327
+ end
328
+ end
329
+ return global_hash
330
+ end
331
+
227
332
  def load_aliases(yaml_recipe)
228
333
  def load_aliases_file(aliases_file)
229
334
  dir_search = @steps_dirs.map do |steps_dir|
@@ -681,7 +786,8 @@ module Kameleon
681
786
  prefix ; Kameleon.ui.info("#{d}")
682
787
  end
683
788
  Kameleon.ui.info("Variables:")
684
- @global.each do |key, value|
789
+ @global.sort.map do |key, value|
790
+ value = "\n" if value.to_s.empty?
685
791
  prefix ; Kameleon.ui.info("#{key}: #{value}")
686
792
  end
687
793
  end
@@ -4,7 +4,7 @@ module Kameleon
4
4
 
5
5
  def self.resolve_vars(raw, yaml_path, initial_variables, recipe, kwargs = {})
6
6
  raw = resolve_data_dir_vars(raw, yaml_path, initial_variables, recipe, kwargs)
7
- return resolve_simple_vars(raw, yaml_path, initial_variables, recipe, kwargs)
7
+ return resolve_simple_vars(raw, yaml_path, initial_variables, kwargs)
8
8
  end
9
9
 
10
10
  def self.resolve_data_dir_vars(raw, yaml_path, initial_variables, recipe, kwargs)
@@ -12,7 +12,7 @@ module Kameleon
12
12
  matches = raw.to_enum(:scan, reg).map { Regexp.last_match }
13
13
  matches.each do |m|
14
14
  unless m.nil?
15
- path = resolve_simple_vars(m[1], yaml_path, initial_variables, recipe, kwargs)
15
+ path = resolve_simple_vars(m[1], yaml_path, initial_variables, kwargs)
16
16
  resolved_path = recipe.resolve_data_path(path.chomp('"'), yaml_path)
17
17
  raw.gsub!(m[0].chomp('"'), "#{resolved_path}")
18
18
  end
@@ -20,8 +20,41 @@ module Kameleon
20
20
  return raw
21
21
  end
22
22
 
23
- def self.resolve_simple_vars(raw, yaml_path, initial_variables, recipe, kwargs)
24
- initial_variables.merge! recipe.cli_global
23
+ def self.resolve_simple_vars_once(raw, initial_variables)
24
+ raw.to_s.gsub(/\$\$\{[a-zA-Z0-9\-_]+\}|\$\$[a-zA-Z0-9\-_]+/) do |var|
25
+ # remove the dollars
26
+ if var.include? "{"
27
+ strip_var = var[3,(var.length - 4)]
28
+ else
29
+ strip_var = var[2,(var.length - 2)]
30
+ end
31
+ # check in local vars
32
+ if initial_variables.has_key? strip_var
33
+ value = initial_variables[strip_var]
34
+ end
35
+ return $` + value.to_s + $'
36
+ end
37
+ end
38
+
39
+
40
+ # Variables are replaced correctly for recursive variable overload of
41
+ # the parent by the child:
42
+ # For example:
43
+ # Parent={var: 10}
44
+ # Child={var: $$var 11}
45
+ # => {var: 10 11}
46
+ def self.overload_merge(parent_dict, child_dict)
47
+ parent_dict.merge(child_dict){ |key, old_value, new_value|
48
+ if new_value.to_s.include?("$$" + key.to_s) or new_value.to_s.include?("$${" + key.to_s + "}")
49
+ Utils.resolve_simple_vars_once(new_value, {key => old_value})
50
+ else
51
+ new_value
52
+ end
53
+ }
54
+ end
55
+
56
+
57
+ def self.resolve_simple_vars(raw, yaml_path, initial_variables, kwargs)
25
58
  raw.to_s.gsub(/\$\$\{[a-zA-Z0-9\-_]+\}|\$\$[a-zA-Z0-9\-_]+/) do |var|
26
59
  # remove the dollars
27
60
  if var.include? "{"
@@ -37,7 +70,7 @@ module Kameleon
37
70
  fail RecipeError, "#{yaml_path}: variable #{var} not found in local or global"
38
71
  end
39
72
  end
40
- return $` + resolve_simple_vars(value.to_s + $', yaml_path, initial_variables, recipe, kwargs)
73
+ return $` + resolve_simple_vars(value.to_s + $', yaml_path, initial_variables, kwargs)
41
74
  end
42
75
  end
43
76
 
@@ -16,6 +16,9 @@ global:
16
16
  user_name: kameleon
17
17
  user_password: $$user_name
18
18
 
19
+ # test overload
20
+ toto: $$toto tata
21
+
19
22
  # Distribution
20
23
  distrib: linux
21
24
 
@@ -1,2 +1,3 @@
1
+ extend: ./test3.yaml
1
2
  global:
2
- toto: tata
3
+ toto: $$toto test $$user_name
@@ -0,0 +1,2 @@
1
+ global:
2
+ toto: titi
@@ -1 +1 @@
1
- 2.6.7
1
+ 2.7.0
metadata CHANGED
@@ -1,7 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kameleon-builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.7
4
+ version: 2.7.0
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Salem Harrache
@@ -12,60 +13,66 @@ authors:
12
13
  autorequire:
13
14
  bindir: bin
14
15
  cert_chain: []
15
- date: 2015-10-01 00:00:00.000000000 Z
16
+ date: 2015-12-09 00:00:00.000000000 Z
16
17
  dependencies:
17
18
  - !ruby/object:Gem::Dependency
18
19
  name: childprocess
19
20
  requirement: !ruby/object:Gem::Requirement
21
+ none: false
20
22
  requirements:
21
- - - "~>"
23
+ - - ~>
22
24
  - !ruby/object:Gem::Version
23
25
  version: 0.5.3
24
- - - ">="
26
+ - - ! '>='
25
27
  - !ruby/object:Gem::Version
26
28
  version: 0.3.0
27
29
  type: :runtime
28
30
  prerelease: false
29
31
  version_requirements: !ruby/object:Gem::Requirement
32
+ none: false
30
33
  requirements:
31
- - - "~>"
34
+ - - ~>
32
35
  - !ruby/object:Gem::Version
33
36
  version: 0.5.3
34
- - - ">="
37
+ - - ! '>='
35
38
  - !ruby/object:Gem::Version
36
39
  version: 0.3.0
37
40
  - !ruby/object:Gem::Dependency
38
41
  name: thor
39
42
  requirement: !ruby/object:Gem::Requirement
43
+ none: false
40
44
  requirements:
41
- - - "~>"
45
+ - - ~>
42
46
  - !ruby/object:Gem::Version
43
47
  version: '0.19'
44
- - - ">="
48
+ - - ! '>='
45
49
  - !ruby/object:Gem::Version
46
50
  version: 0.15.0
47
51
  type: :runtime
48
52
  prerelease: false
49
53
  version_requirements: !ruby/object:Gem::Requirement
54
+ none: false
50
55
  requirements:
51
- - - "~>"
56
+ - - ~>
52
57
  - !ruby/object:Gem::Version
53
58
  version: '0.19'
54
- - - ">="
59
+ - - ! '>='
55
60
  - !ruby/object:Gem::Version
56
61
  version: 0.15.0
57
62
  - !ruby/object:Gem::Dependency
58
63
  name: table_print
59
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
60
66
  requirements:
61
- - - "~>"
67
+ - - ~>
62
68
  - !ruby/object:Gem::Version
63
69
  version: 1.5.2
64
70
  type: :runtime
65
71
  prerelease: false
66
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
67
74
  requirements:
68
- - - "~>"
75
+ - - ~>
69
76
  - !ruby/object:Gem::Version
70
77
  version: 1.5.2
71
78
  description: The mindful appliance builder
@@ -80,15 +87,16 @@ executables:
80
87
  extensions: []
81
88
  extra_rdoc_files: []
82
89
  files:
83
- - ".bumpversion.cfg"
84
- - ".editorconfig"
85
- - ".env"
86
- - ".gitignore"
90
+ - .bumpversion.cfg
91
+ - .editorconfig
92
+ - .env
93
+ - .gitignore
87
94
  - AUTHORS
88
95
  - CHANGES
89
96
  - COPYING
90
97
  - Gemfile
91
98
  - README.rst
99
+ - RELEASING
92
100
  - Vagrantfile
93
101
  - bin/kameleon
94
102
  - completion/_kameleon
@@ -156,6 +164,7 @@ files:
156
164
  - tests/recipes/steps/setup/linux/software_install.yaml
157
165
  - tests/recipes/test_recipe.yaml
158
166
  - tests/test2/test2.yaml
167
+ - tests/test2/test3.yaml
159
168
  - tests/test_context.rb
160
169
  - tests/test_recipe.rb
161
170
  - tests/test_version.rb
@@ -163,27 +172,28 @@ files:
163
172
  homepage: http://kameleon.imag.fr/
164
173
  licenses:
165
174
  - GPL-2
166
- metadata: {}
167
175
  post_install_message:
168
176
  rdoc_options: []
169
177
  require_paths:
170
178
  - lib
171
179
  required_ruby_version: !ruby/object:Gem::Requirement
180
+ none: false
172
181
  requirements:
173
- - - ">="
182
+ - - ! '>='
174
183
  - !ruby/object:Gem::Version
175
184
  version: '0'
176
185
  required_rubygems_version: !ruby/object:Gem::Requirement
186
+ none: false
177
187
  requirements:
178
- - - ">="
188
+ - - ! '>='
179
189
  - !ruby/object:Gem::Version
180
190
  version: '0'
181
191
  requirements:
182
192
  - polipo 1.0.3, or greater
183
193
  rubyforge_project:
184
- rubygems_version: 2.2.2
194
+ rubygems_version: 1.8.23.2
185
195
  signing_key:
186
- specification_version: 4
196
+ specification_version: 3
187
197
  summary: Kameleon is a tool to build virtual machines from scratch
188
198
  test_files:
189
199
  - tests/helper.rb
@@ -195,6 +205,7 @@ test_files:
195
205
  - tests/recipes/steps/setup/linux/software_install.yaml
196
206
  - tests/recipes/test_recipe.yaml
197
207
  - tests/test2/test2.yaml
208
+ - tests/test2/test3.yaml
198
209
  - tests/test_context.rb
199
210
  - tests/test_recipe.rb
200
211
  - tests/test_version.rb
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 41ec4253d5c8e1212274257dd0ef731fd911680c
4
- data.tar.gz: 9f6a9adf0e0764e352d2968ade87478d8c9c82a5
5
- SHA512:
6
- metadata.gz: ecd9d831258ff4d46e034e740221c4dc3cf5a10b8e66e711bec447b9fbc417f3519b019e930d503ee2d9791ec5b2d14c412b357bf41cee617e3a7f52009c733b
7
- data.tar.gz: 31575ddef96d63072c0d2d4a8ab391a989eaf871a2fce7e7d5bc89babe03febfb1059330fe5b6221bd94fd71c3952ff15ccec5a5e05bfa122d24edff3a2bce4c