palletjack 0.6.2 → 0.6.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 14f3b0d5254e3fa2cf03fedf8dc389b2c40736d7
4
- data.tar.gz: 7d3da40909cf135ca4f478a6859085fd561a09af
3
+ metadata.gz: a311c5f84cc62a899d75d2d568f1f3080708d102
4
+ data.tar.gz: bb4564952042bbe43374456a43b2570c8fde909a
5
5
  SHA512:
6
- metadata.gz: 31c6762dabae70a3337a712b97cd03ab29b50032e07e7f80129e9dca2777bbdd1cab0a0a61b339bf01db4be4a011cd7e2db6062026105aaea879b16acc994f4d
7
- data.tar.gz: cf03d5769cb6d7458db2ccf0818a9c9911129a07b35905198faf29071000a48907584060be86212daa296c720bd7ae18188540db052b2f1afd622cdd089b3b78
6
+ metadata.gz: 52fb77bb8e144ecefad11a4122ccf2e17783879b0bccab0075d1ffc35c3ab9b3d0ab98132132256eae2f03c941c3118b69707a28b63057fd52160353e28fe159
7
+ data.tar.gz: 113b72574d9fe43009d09d525a0fd02a477fa122a8ad7d5e021677612ac68dd3736d6115ea4b2d5201232991897ae0b4fcda4b4a19a59c9a04c16d95fb2b0e35
checksums.yaml.gz.sig CHANGED
Binary file
data/.rubocop.yml CHANGED
@@ -2,5 +2,10 @@ inherit_from: .rubocop_todo.yml
2
2
 
3
3
  Style/IndentArray:
4
4
  EnforcedStyle: consistent
5
- Style/MethodName:
6
- EnforcedStyle: snake_case
5
+ Style/MethodName:
6
+ EnforcedStyle: snake_case
7
+ Style/SymbolArray:
8
+ EnforcedStyle: brackets
9
+ Lint/HandleExceptions:
10
+ Exclude:
11
+ - 'spec/palletjack-tool_spec.rb'
data/.rubocop_todo.yml CHANGED
@@ -77,7 +77,7 @@ Metrics/BlockLength:
77
77
  # Offense count: 3
78
78
  # Configuration parameters: CountComments.
79
79
  Metrics/ClassLength:
80
- Max: 131
80
+ Max: 147
81
81
 
82
82
  # Offense count: 13
83
83
  # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
@@ -323,6 +323,7 @@ Style/GuardClause:
323
323
  Style/HashSyntax:
324
324
  Exclude:
325
325
  - 'Rakefile'
326
+ - 'exe/palletjack-pallet'
326
327
  - 'tools/Rakefile'
327
328
  - 'tools/exe/palletjack2pxelinux'
328
329
 
@@ -1,5 +1,6 @@
1
1
  require 'palletjack'
2
2
  require 'fileutils'
3
+ require 'pathname'
3
4
  require 'optparse'
4
5
  require 'singleton'
5
6
  require 'rugged'
@@ -137,14 +138,18 @@ module PalletJack
137
138
  'warehouse directory', String) {|dir|
138
139
  @options[:warehouse] = dir }
139
140
  @parser.on_tail('-h', '--help', 'display usage information') {
140
- raise ArgumentError }
141
+ raise OptionParser::ParseError }
141
142
 
142
143
  parse_options(@parser)
143
144
 
144
145
  @parser.parse!(argv)
145
146
  @option_checks.each {|check| check.call }
146
- rescue
147
- abort(usage)
147
+ rescue OptionParser::ParseError => error
148
+ if error.args.empty?
149
+ abort(usage)
150
+ else
151
+ abort("#{error}\n\n#{usage}")
152
+ end
148
153
  end
149
154
 
150
155
  # Additional option parsing
@@ -188,9 +193,9 @@ module PalletJack
188
193
  # end
189
194
 
190
195
  def required_option(*opts)
191
- @option_checks << lambda do
192
- raise ArgumentError unless opts.any? {|opt| options[opt]}
193
- end
196
+ @option_checks << (lambda do
197
+ raise OptionParser::ParseError unless opts.any? {|opt| options[opt]}
198
+ end)
194
199
  end
195
200
 
196
201
  # Require the presence of no more than one of the given options.
@@ -208,9 +213,9 @@ module PalletJack
208
213
  # end
209
214
 
210
215
  def exclusive_options(*opts)
211
- @option_checks << lambda do
212
- raise ArgumentError if opts.count {|opt| options[opt]} > 1
213
- end
216
+ @option_checks << (lambda do
217
+ raise OptionParser::ParseError if opts.count {|opt| options[opt]} > 1
218
+ end)
214
219
  end
215
220
 
216
221
  # Usage information from option parser
@@ -255,9 +260,7 @@ module PalletJack
255
260
  # Build a filesystem path from path components
256
261
  #
257
262
  # Symbols are looked up in the options dictionary.
258
- # All other types are converted to strings. The
259
- # resulting list is fed to File#join to produce a
260
- # local filesystem compliant path.
263
+ # All components are converted to Pathname and concatenated.
261
264
  #
262
265
  # Example:
263
266
  # parser.on(...) {|dir| options[:output] = dir }
@@ -266,14 +269,16 @@ module PalletJack
266
269
  # config_path :output, 'subdir2'
267
270
 
268
271
  def config_path(*path)
269
- File.join(path.map {|item|
270
- case item
271
- when Symbol
272
- options.fetch(item)
273
- else
274
- item.to_s
275
- end
276
- })
272
+ path.map { |item|
273
+ case item
274
+ when Pathname
275
+ item
276
+ when Symbol
277
+ Pathname.new(options.fetch(item))
278
+ else
279
+ Pathname.new(item.to_s)
280
+ end
281
+ }.reduce(&:+)
277
282
  end
278
283
 
279
284
  # :call-seq:
@@ -300,8 +305,12 @@ module PalletJack
300
305
  # config_file :option, 'fragment', 'base.ext' {|file| ... }
301
306
  # config_file ..., mode:0600 {|file| ...}
302
307
  #
303
- # Creates a configuration file, with default mode:0644
304
- # and calls the given block with the file as argument.
308
+ # Creates a temporary configuration file with an undefined name,
309
+ # with default mode:0644, and calls the given block with the file
310
+ # as argument. After the block has run, the file is atomically
311
+ # renamed to the given destination file name. If any errors occur,
312
+ # the temporary file is deleted without overwriting the
313
+ # destination file.
305
314
  #
306
315
  # Uses config_path to construct the path, so any symbols will
307
316
  # be looked up in the options hash.
@@ -315,9 +324,25 @@ module PalletJack
315
324
  # end
316
325
 
317
326
  def config_file(*path, mode: 0644, &block)
318
- File.open(config_path(*path),
319
- File::CREAT | File::TRUNC | File::WRONLY, mode) do |file|
320
- block.call(file)
327
+ filename = config_path(*path)
328
+ begin
329
+ temp_filename = "#{filename}.tmp.#{Process.pid}.#{rand(1_000_000)}"
330
+ temp_file = File.new(temp_filename,
331
+ File::CREAT | File::EXCL | File::RDWR)
332
+ rescue Errno::EEXIST
333
+ retry
334
+ end
335
+
336
+ begin
337
+ temp_file.flock(File::LOCK_EX)
338
+ block.call(temp_file)
339
+ temp_file.flush
340
+ File.rename(temp_filename, filename)
341
+ rescue
342
+ File.unlink(temp_filename) rescue nil
343
+ raise
344
+ ensure
345
+ temp_file.close
321
346
  end
322
347
  end
323
348
 
@@ -337,29 +362,41 @@ module PalletJack
337
362
  config_dir :warehouse, kind, name
338
363
  end
339
364
 
340
- # Write a key box file inside a pallet
365
+ # :call-seq:
366
+ # pallet_box kind, name, box, 'key.path' => value, ...
367
+ # pallet_box kind, name, box { { key: { path: value, ... } } }
368
+ #
369
+ # Write keys to a box file inside a pallet
370
+ #
371
+ # Any key.path assignments given as parameters, and the hash value
372
+ # returned from a block will be merged into the named box file.
341
373
  #
342
- # The block should return a hash representing the contents of the box.
343
374
  # All keys will be stringified, so we can use key: short forms for
344
375
  # declaration of the box contents.
345
376
  #
346
377
  # Uses config_file to create the file, so any symbols will
347
- # be looked up in the options hash.
348
- #
349
- # N.B! If the box already exists, it will be overwritten!
350
- #--
351
- # FIXME: should new values be merged with existing box data instead?
352
- #++
378
+ # be looked up in the options hash, except for the box name.
353
379
  #
354
380
  # Example:
355
381
  #
356
382
  # pallet_box 'domain', :domain, 'dns' do
357
383
  # { dns:{ ns:options[:soa_ns].split(',') } }
358
384
  # end
385
+ #--
386
+ # FIXME: Box I/O should probably be managed by PalletJack::Pallet,
387
+ # but that requires some redesign work.
388
+ #++
389
+
390
+ def pallet_box(kind, name, box, keyvalues = {}, &block)
391
+ box_path = config_path(:warehouse, kind, name, "#{box}.yaml")
392
+ contents = KVDAG::KeyPathHashProxy.new
393
+
394
+ contents.merge! YAML::load_file(box_path) if box_path.file?
395
+ keyvalues.each { |key, value| contents[key] = value }
396
+ contents.merge! block.call if block_given?
359
397
 
360
- def pallet_box(kind, name, box, &block)
361
- config_file :warehouse, kind, name, "#{box}.yaml" do |box_file|
362
- box_file << block.call.deep_stringify_keys.to_yaml
398
+ config_file box_path do |box_file|
399
+ box_file << contents.deep_stringify_keys.to_yaml
363
400
  end
364
401
  end
365
402
 
@@ -378,7 +415,8 @@ module PalletJack
378
415
 
379
416
  def pallet_links(kind, name, links = {})
380
417
  links.each do |link_type, parent|
381
- link_path = config_path(:warehouse, kind, name, link_type)
418
+ link_base = config_path(:warehouse, kind, name)
419
+ link_path = config_path(link_base, link_type)
382
420
 
383
421
  begin
384
422
  File.delete(link_path)
@@ -387,9 +425,9 @@ module PalletJack
387
425
  end
388
426
  unless parent.empty?
389
427
  parent_kind, parent_name = parent
390
- parent_path = config_path('..', '..', parent_kind, parent_name)
428
+ parent_path = config_path(:warehouse, parent_kind, parent_name)
391
429
 
392
- File.symlink(parent_path, link_path)
430
+ File.symlink(parent_path.relative_path_from(link_base), link_path)
393
431
  end
394
432
  end
395
433
  end
@@ -1,3 +1,3 @@
1
1
  module PalletJack
2
- VERSION = '0.6.2'
2
+ VERSION = '0.6.5'
3
3
  end
data/palletjack.gemspec CHANGED
@@ -1,5 +1,6 @@
1
1
  #-*- ruby -*-
2
2
  # coding: utf-8
3
+
3
4
  lib = File.expand_path('../lib', __FILE__)
4
5
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
6
  require 'palletjack/version'
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: palletjack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Calle Englund
@@ -31,7 +31,7 @@ cert_chain:
31
31
  f8wtQllq82VF0AXUYeLtTh1f+DW3WW5BO1e2OCu5eOV7dbyaVPaNK/+rHjCN8kM/
32
32
  DGZSwUoNADmVkQ==
33
33
  -----END CERTIFICATE-----
34
- date: 2017-03-27 00:00:00.000000000 Z
34
+ date: 2017-04-28 00:00:00.000000000 Z
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: activesupport
metadata.gz.sig CHANGED
Binary file