pandocomatic 0.1.4.15 → 0.1.4.16

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