pandocomatic 0.1.4.15 → 0.1.4.16

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: 5240cbf162a995ea3d305fe47322f77205148547
4
- data.tar.gz: 1be3dfdb812155812f80e9cbcbc5e76c0ff9f688
3
+ metadata.gz: 5c02545012823b03faea6b75bd1eefe4f0321f87
4
+ data.tar.gz: e20c1f0fb820d2372a549bdeae47b8ef97207e9c
5
5
  SHA512:
6
- metadata.gz: d2750ea57e8ba18f517577efbe07544624f79f99b272a58de0c7a504768e3a9971f96dd7cfcbc2813bb140ae530a714956b78ba3834246d7461824466092a15f
7
- data.tar.gz: 7bc0149c21b7ccdf7ee2938519a0873e264ba06ca115df615fd5d460a37511c8e09a9d1f3414b0f4121cbaf94ff6cc6154e682d225b6c34c9f0e29bf405ed65c
6
+ metadata.gz: dffc42a133303448e4e0fb8c2921231b5c59de5b50b2506e1babdc8b4499f11d724e48615f60cd0449206e26bf6dbc69d97933bea6efd195a1c8b16445dc9598
7
+ data.tar.gz: c7f3608f963daa702eeec4f3203bf8eba373f31aae316fafe9bdee1d3bd4cbccbff00137c6cb2758e24ddfd82512e0feca30143b766dc1bc3ff286dd3cbb9794
@@ -311,8 +311,11 @@ module Pandocomatic
311
311
  # @param mixin_template [Hash] the template to mixin into the base template
312
312
  # @return [Hash] the merged templates
313
313
  def merge(base_template, mixin_template)
314
+ if mixin_template['extends'] and mixin_template['extends'].is_a? String
315
+ mixin_template['extends'] = [mixin_template['extends']]
316
+ end
317
+
314
318
  fields = [
315
- 'extends',
316
319
  'glob',
317
320
  'metadata',
318
321
  'setup',
@@ -323,46 +326,104 @@ module Pandocomatic
323
326
  ]
324
327
 
325
328
  fields.each do |field|
326
- case field
327
- when 'extends'
328
- if mixin_template[field] and mixin_template[field].is_a? String
329
- mixin_template[field] = [mixin_template[field]]
330
- end
331
- when
332
- 'cleanup',
333
- 'setup',
334
- 'preprocessors',
335
- 'postprocessors',
336
- 'glob'
337
-
338
- if base_template[field] then
339
- # If both templates have this field, concat the arrays
340
- # and remove duplicates
341
- if mixin_template[field] then
342
- base_template[field].concat(mixin_template[field]).uniq!
343
- end
344
- else
345
- # If the base does not have this fiel yet, assign it
346
- # the mixin's
347
- if mixin_template[field] then
348
- base_template[field] = mixin_template[field]
329
+ parent = base_template[field]
330
+ current = mixin_template[field]
331
+ extended_value = extend_value current, parent
332
+
333
+ if extended_value.nil?
334
+ base_template.delete field
335
+ else
336
+ base_template[field] = extended_value
337
+ end
338
+ end
339
+
340
+ base_template
341
+ end
342
+
343
+ # Extend the current value with the parent value. Depending on the
344
+ # value and type of the current and parent values, the extension
345
+ # differs.
346
+ #
347
+ # For simple values, the current value takes precedence over the
348
+ # parent value
349
+ #
350
+ # For Hash values, each parent value's property is extended as well
351
+ #
352
+ # For Arrays, the current overwrites and adds to parent value's items
353
+ # unless the current value is a Hash with a 'remove' and 'add'
354
+ # property. Then the 'add' items are added to the parent value and the
355
+ # 'remove' items are removed from the parent value.
356
+ #
357
+ # @param current [Object] the current value
358
+ # @param parent [Object] the parent value the current might extend
359
+ # @return [Object] the extended value
360
+ def extend_value(current, parent)
361
+ if parent.nil?
362
+ # If no parent value is specified, the current takes
363
+ # precedence
364
+ current
365
+ else
366
+ if current.nil?
367
+ # Current nil removes value of parent; follows YAML spec.
368
+ # Note. take care to actually remove this value from a
369
+ # Hash. (Like it is done in the next case)
370
+ nil
371
+ else
372
+ if parent.is_a? Hash
373
+ if current.is_a? Hash
374
+ # Mixin current and parent values
375
+ parent.each_pair do |property, value|
376
+ if current.has_key? property
377
+ extended_value = extend_value(current[property], value)
378
+ if extended_value.nil?
379
+ current.delete property
380
+ else
381
+ current[property] = extended_value
382
+ end
383
+ else
384
+ current[property] = value
385
+ end
386
+ end
349
387
  end
350
- end
351
- when 'pandoc', 'metadata'
352
- # Merge Hashes
353
- if base_template[field] then
354
- if mixin_template[field] then
355
- base_template[field].merge! mixin_template[field]
388
+ current
389
+ elsif parent.is_a? Array
390
+ if current.is_a? Hash
391
+ if current.has_key? 'remove'
392
+ to_remove = current['remove']
393
+
394
+ if to_remove.is_a? Array
395
+ parent = parent.delete_if {|v| current['remove'].include? v}
396
+ else
397
+ parent = parent.delete to_remove
398
+ end
399
+ end
400
+
401
+ if current.has_key? 'add'
402
+ to_add = current['add']
403
+
404
+ if to_add.is_a? Array
405
+ parent = current['add'].concat(parent).uniq
406
+ else
407
+ parent.push(to_add).uniq
408
+ end
409
+ end
410
+
411
+ parent
412
+ elsif current.is_a? Array
413
+ # Just combine parent and current arrays, current
414
+ # values take precedence
415
+ current.concat(parent).uniq
416
+ else
417
+ # Unknown what to do, assuming current should take
418
+ # precedence
419
+ current
356
420
  end
357
421
  else
358
- if mixin_template[field] then
359
- base_template[field] = mixin_template[field]
360
- end
422
+ # Simple values: current replaces parent
423
+ current
361
424
  end
362
425
  end
363
426
  end
364
-
365
- base_template
366
427
  end
367
428
 
368
429
  # Resolve the templates the templates extends and mixes them in, in
@@ -45,9 +45,12 @@ module Pandocomatic
45
45
 
46
46
  # The Pandocomatic class controlls the pandocomatic conversion process
47
47
  class Pandocomatic
48
+
49
+ # Pandocomatic error status codes start from ERROR_STATUS
50
+ ERROR_STATUS = 1266 # This is the sum of the ascii values of the characters in 'pandocomatic'
48
51
 
49
52
  # Pandocomatic's current version
50
- VERSION = [0, 1, 4, 15]
53
+ VERSION = [0, 1, 4, 16]
51
54
 
52
55
  # Pandocomatic's default configuration file
53
56
  CONFIG_FILE = 'pandocomatic.yaml'
@@ -103,11 +106,12 @@ module Pandocomatic
103
106
  # conversion.
104
107
  if command.all_errors.size > 0
105
108
  ConfigurationErrorsPrinter.new(command.all_errors).print
106
- exit
109
+ exit ERROR_STATUS
107
110
  end
108
111
 
109
112
  # Pandocomatic is successfully configured: running the
110
- # actual conversion now.
113
+ # actual conversion now. But first a short summary of the
114
+ # process to execute is printed.
111
115
  SummaryPrinter.new(command, input, output).print unless quiet or not command.directory?
112
116
 
113
117
  # Depending on the options dry-run and quiet, the command.execute
@@ -120,9 +124,11 @@ module Pandocomatic
120
124
  rescue PandocomaticError => e
121
125
  # Report the error and break off the conversion process.
122
126
  ErrorPrinter.new(e).print
127
+ exit ERROR_STATUS + 1
123
128
  rescue StandardError => e
124
129
  # An unexpected error has occurred; break off the program drastically
125
- # for now
130
+ # for now. This is likely a bug: ask the user to report it.
131
+ warn "An unexpected error has occurred. You can report this bug via https://github.com/htdebeer/pandocomatic/issues/new."
126
132
  raise e
127
133
  end
128
134
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pandocomatic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4.15
4
+ version: 0.1.4.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Huub de Beer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-09 00:00:00.000000000 Z
11
+ date: 2017-09-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: paru
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: 0.2.5
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 0.2.5.6
22
+ version: 0.2.5.7
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: 0.2.5
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 0.2.5.6
32
+ version: 0.2.5.7
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: trollop
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -78,8 +78,9 @@ dependencies:
78
78
  - - "~>"
79
79
  - !ruby/object:Gem::Version
80
80
  version: 0.9.8
81
- description: 'Automating the use of pandoc <http://pandoc.org>: use pandocomatic to
82
- convert one file or a directory with files and sub directories.'
81
+ description: Pandocomatic is a tool to automate using pandoc (<http://pandoc.org>).
82
+ With pandocomatic you can express common patterns of using pandoc for generating
83
+ your documents. Applied to a directory, pandocomatic can act as a static site generator.
83
84
  email: Huub@heerdebeer.org
84
85
  executables:
85
86
  - pandocomatic
@@ -153,7 +154,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
153
154
  requirements:
154
155
  - pandoc, a universal document converer <http://pandoc.org>
155
156
  rubyforge_project:
156
- rubygems_version: 2.6.11
157
+ rubygems_version: 2.5.2
157
158
  signing_key:
158
159
  specification_version: 4
159
160
  summary: Automating the use of pandoc