palletjack 0.6.2 → 0.6.5

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 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