liquidoc 0.11.0 → 0.12.0.pre.rc1

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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/liquidoc/version.rb +1 -1
  3. data/lib/liquidoc.rb +75 -52
  4. metadata +16 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6c893b7f373640a5bab823899f7236665074b94f2922bbb651fdddc859efffa9
4
- data.tar.gz: b4574f73d3829fb88d005c4340917be3297d0bcc345e6a42870f959b9da69c55
3
+ metadata.gz: d8e7be74837c6d2456cc2186bd58240dd64f32dfbe22e4e960e4887e11b0f892
4
+ data.tar.gz: 42a9d17d69753e6f7c905f2cf35f08fe0bf68ce3cfa8e76c81fb314fe2b097e4
5
5
  SHA512:
6
- metadata.gz: 1144cb86dcc7644e54f974a6d303e348f23250aa2015bc44a4b24d6e7627218da5485ca0bf09711136047a1f43df8682fdd504d90bd38f34779c8e52a37954e0
7
- data.tar.gz: 3914f320195b2e9fe2376ff29d5730a8f17c38518b4f66f5cd6a5ee1a02ed054efe48bc69c25165ed795db2c813532501356db9ca2900ca824136518de9efe82
6
+ metadata.gz: 386c7dc3021bff1955cdfa02ea1e39799510ad41a9ad7c95f7bd23b4bb8feb914bc6b35f5698c0bf17e899247ee3bc2cbd795679e29f3ed0eac8bfff7b03cfb2
7
+ data.tar.gz: 236059bc98386f110a6cec058658d58ba173c7b8d1f0a9ad654f3613776f76dbcfda2deb0ecc8fc3ef3500a525e1d33979c6d00264a5e516dbb195ba9328bf25
@@ -1,3 +1,3 @@
1
1
  module Liquidoc
2
- VERSION = "0.11.0"
2
+ VERSION = "0.12.0-rc1"
3
3
  end
data/lib/liquidoc.rb CHANGED
@@ -40,7 +40,7 @@ require 'highline'
40
40
  @configs_dir = @base_dir + '_configs'
41
41
  @templates_dir = @base_dir + '_templates/'
42
42
  @data_dir = @base_dir + '_data/'
43
- @data_file = nil
43
+ @data_files = nil
44
44
  @attributes_file_def = '_data/asciidoctor.yml'
45
45
  @attributes_file = @attributes_file_def
46
46
  @pdf_theme_file = 'theme/pdf-theme.yml'
@@ -75,17 +75,21 @@ FileUtils::mkdir_p("#{@build_dir}/pre") unless File.exists?("#{@build_dir}/pre")
75
75
  # ===
76
76
 
77
77
  # Establish source, template, index, etc details for build jobs from a config file
78
- def config_build config_file, config_vars={}, parse=false
78
+ def config_build config_file, config_vars={}, data_files=nil, parse=false
79
79
  @logger.debug "Using config file #{config_file}."
80
80
  validate_file_input(config_file, "config")
81
- if config_vars.length > 0 or parse or contains_liquid(config_file)
81
+ if config_vars.length > 0 or data_files or parse or contains_liquid(config_file)
82
82
  @logger.debug "Config_vars: #{config_vars.length}"
83
83
  # If config variables are passed on the CLI, we want to parse the config file
84
84
  # and use the parsed version for the rest fo this routine
85
85
  config_out = "#{@build_dir}/pre/#{File.basename(config_file)}"
86
- vars = DataObj.new()
87
- vars.add_data!("vars", config_vars)
88
- liquify(vars, config_file, config_out)
86
+ data_obj = DataObj.new()
87
+ if data_files
88
+ payload = get_payload(data_files)
89
+ data_obj.add_payload!(payload)
90
+ end
91
+ data_obj.add_data!(config_vars, "vars")
92
+ liquify(data_obj, config_file, config_out)
89
93
  config_file = config_out
90
94
  @logger.debug "Config parsed! Using #{config_out} for build."
91
95
  validate_file_input(config_file, "config")
@@ -131,41 +135,23 @@ def iterate_build cfg
131
135
  data_obj = DataObj.new()
132
136
  if step.data
133
137
  data_files = DataFiles.new(step.data)
134
- data_files.sources.each do |src|
135
- begin
136
- data = ingest_data(src) # Extract data from file
137
- rescue Exception => ex
138
- @logger.error "#{ex.class}: #{ex.message}"
139
- raise "DataFileReadFail (#{src.file})"
140
- end
141
- begin # Create build.data
142
- if data_files.sources.size == 1
143
- data_obj.add_data!("", data) if data.is_a? Hash
144
- # Insert arrays into the data. scope, and for backward compatibility, hashes as well
145
- data_obj.add_data!("data", data)
146
- else
147
- data_obj.add_data!(src.name, data) # Insert object under self-named scope
148
- end
149
- rescue Exception => ex
150
- @logger.error "#{ex.class}: #{ex.message}"
151
- raise "DataIngestFail (#{src.file})"
152
- end
153
- end
138
+ payload = get_payload(data_files)
139
+ data_obj.add_payload!(payload)
154
140
  end
155
141
  builds.each do |bld|
156
142
  build = Build.new(bld, type, data_obj) # create an instance of the Build class; Build.new accepts a 'bld' hash & action 'type'
157
143
  if build.template
158
- # Prep & perform a Liquid-parsed build build
144
+ # Prep & perform a Liquid-parsed build
159
145
  @explainer.info build.message
160
- build.add_data!("vars", build.variables) if build.variables
146
+ build.add_data!(build.variables, "vars") if build.variables
161
147
  liquify(build.data, build.template, build.output) # perform the liquify operation
162
148
  else # Prep & perform a direct conversion
163
149
  # Delete nested data and vars objects
164
150
  build.data.remove_scope("data")
165
151
  build.data.remove_scope("vars")
166
152
  # Add vars from CLI or config args
167
- build.data.add_data!("", build.variables) unless build.variables.empty?
168
- build.data.add_data!("", @passed_vars) unless @passed_vars.empty?
153
+ build.data.add_data!(build.variables) unless build.variables.empty?
154
+ build.data.add_data!(@passed_vars) unless @passed_vars.empty?
169
155
  regurgidata(build.data, build.output)
170
156
  end
171
157
  end
@@ -479,8 +465,8 @@ class Build
479
465
  @data unless @data.nil?
480
466
  end
481
467
 
482
- def add_data! obj, scope
483
- @data.add_data!(obj, scope)
468
+ def add_data! data, scope=""
469
+ @data.add_data!(data, scope)
484
470
  end
485
471
 
486
472
  # def vars
@@ -612,6 +598,7 @@ class Build
612
598
  end # class Build
613
599
 
614
600
  class DataSrc
601
+ # Organizes metadata about an ingestible data source
615
602
  # initialization means establishing a proper hash for the 'data' param
616
603
  def initialize sources
617
604
  @datasrc = {}
@@ -679,9 +666,9 @@ end # class DataSrc
679
666
  # DataFiles
680
667
  class DataFiles
681
668
  # Accepts a single String, Hash, or Array
682
- # String must be a filename
683
- # Hash must contain :file and optionally :type and :pattern
684
- # Array must contain filenames as strings
669
+ # String must be a path/filename
670
+ # Hash must contain file: and optionally type: and pattern:
671
+ # Array must contain path/filenames as strings
685
672
  # Returns array of DataSrc objects
686
673
  def initialize data_sources
687
674
  @data_sources = []
@@ -696,6 +683,7 @@ class DataFiles
696
683
  end
697
684
 
698
685
  def sources
686
+ # An Array of DataSrc objects
699
687
  @data_sources
700
688
  end
701
689
 
@@ -714,13 +702,14 @@ class DataObj
714
702
  @data = {"vars" => {}}
715
703
  end
716
704
 
717
- def add_data! scope="", data
705
+ def add_data! data, scope=""
718
706
  # Merges data into existing scope or creates a new scope
719
707
  if scope.empty? # store new object at root of this object
720
708
  self.data.merge!data
721
709
  else # store new object as a subordinate, named object
722
- if self.data.key?(scope) # merge into existing key
723
- self.data[scope].merge!data
710
+ if self.data.key?(scope) # merge/append into existing object
711
+ self.data[scope].merge!data if self.data[scope].is_a? Hash
712
+ self.data[scope] << data if self.data[scope].is_a? Array
724
713
  else # create a new key named after the scope
725
714
  scoped_hash = { scope => data }
726
715
  self.data.merge!scoped_hash
@@ -728,6 +717,21 @@ class DataObj
728
717
  end
729
718
  end
730
719
 
720
+ def add_payload! payload
721
+ # Expects an Array of Hashes ([{name=>String, data=>Object},...])
722
+ if payload.size == 1
723
+ # If payload is a single Hash, store it at the root level (no scope)
724
+ self.add_data!(payload[0]['data']) if payload[0]['data'].is_a? Hash
725
+ # Insert arrays into the data. scope, and for backward compatibility, hashes as well
726
+ self.add_data!(payload[0]['data'], "data")
727
+ end
728
+ # For ALL payloads, create a self-named obj scope
729
+ payload.each do |obj|
730
+ puts obj
731
+ self.add_data!(obj['data'], obj['name']) # Insert object under self-named scope
732
+ end
733
+ end
734
+
731
735
  def data
732
736
  @data
733
737
  end
@@ -770,7 +774,25 @@ end
770
774
  # PARSE-type build procs
771
775
  # ===
772
776
 
773
- # Pull in a semi-structured data file, converting contents to a Ruby hash
777
+ def get_payload data_files
778
+ # data_files: a proper DataFile object
779
+ payload = []
780
+ data_files.sources.each do |src|
781
+ obj = {}
782
+ begin
783
+ data = ingest_data(src) # Extract data from file
784
+ rescue Exception => ex
785
+ @logger.error "#{ex.class}: #{ex.message}"
786
+ raise "DataFileReadFail (#{src.file})"
787
+ end
788
+ obj['name'] = src.name
789
+ obj['data'] = data
790
+ payload << obj
791
+ end
792
+ return payload
793
+ end
794
+
795
+ # Pull in a semi-structured data file, converting contents to a Ruby object
774
796
  def ingest_data datasrc
775
797
  raise "InvalidDataSrcObject" unless datasrc.is_a? DataSrc
776
798
  case datasrc.type
@@ -862,21 +884,20 @@ def liquify data_obj, template_file, output
862
884
  end
863
885
  end
864
886
 
865
- def cli_liquify data_file=nil, template_file=nil, output_file=nil, passed_vars
887
+ def cli_liquify data_files=nil, template_file=nil, output_file=nil, passed_vars
866
888
  # converts command-line options into liquify or regurgidata inputs
867
889
  data_obj = DataObj.new()
868
- if data_file
869
- df = DataFiles.new(data_file)
870
- ingested = ingest_data(df.sources[0])
871
- data_obj.add_data!("", ingested)
890
+ if data_files
891
+ payload = get_payload(data_files)
892
+ data_obj.add_payload!(payload)
872
893
  end
873
894
  if template_file
874
- data_obj.add_data!("data", ingested) if df
875
- data_obj.add_data!("vars", passed_vars) if passed_vars
895
+ # data_obj.add_data!(ingested, "data") if df
896
+ data_obj.add_data!(passed_vars, "vars") if passed_vars
876
897
  liquify(data_obj, template_file, output_file)
877
898
  else
878
899
  data_obj.remove_scope("vars")
879
- data_obj.add_data!("", passed_vars) if passed_vars
900
+ data_obj.add_data!(passed_vars) if passed_vars
880
901
  regurgidata(data_obj, output_file)
881
902
  end
882
903
  end
@@ -1303,8 +1324,10 @@ command_parser = OptionParser.new do|opts|
1303
1324
  @config_file = @base_dir + n
1304
1325
  end
1305
1326
 
1306
- opts.on("-d PATH", "--data=PATH", "Semi-structured data source (input) path. Ex. path/to/data.yml. Required unless --config is called." ) do |n|
1307
- @data_file = @base_dir + n
1327
+ opts.on("-d PATH[,PATH]", "--data=PATH[,PATH]", "Semi-structured data source (input) path or paths. Ex. path/to/data.yml or data/file1.yml,data/file2.json. Required unless --config is called; optional with config." ) do |n|
1328
+ data_files = n.split(',')
1329
+ data_files = data_files.map! {|file| @base_dir + file}
1330
+ @data_files = DataFiles.new(data_files)
1308
1331
  end
1309
1332
 
1310
1333
  opts.on("-f PATH", "--from=PATH", "Directory to copy assets from." ) do |n|
@@ -1396,13 +1419,13 @@ explainer_init
1396
1419
 
1397
1420
  unless @config_file
1398
1421
  @logger.debug "Executing config-free build based on API/CLI arguments alone."
1399
- if @data_file
1400
- cli_liquify(@data_file, @template_file, @output_file, @passed_vars)
1422
+ if @data_files
1423
+ cli_liquify(@data_files, @template_file, @output_file, @passed_vars)
1401
1424
  end
1402
1425
  if @index_file
1403
1426
  @logger.warn "Rendering via command line arguments is not yet implemented. Use a config file."
1404
1427
  end
1405
1428
  else
1406
1429
  @logger.debug "Executing... config_build"
1407
- config_build(@config_file, @passed_vars, @parseconfig)
1430
+ config_build(@config_file, @passed_vars, @data_files, @parseconfig)
1408
1431
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: liquidoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.12.0.pre.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Dominick
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-11 00:00:00.000000000 Z
11
+ date: 2020-03-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -28,30 +28,30 @@ dependencies:
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: 12.3.3
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: 12.3.3
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: asciidoctor
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.5'
47
+ version: '2.0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.5'
54
+ version: '2.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: json
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -84,16 +84,16 @@ dependencies:
84
84
  name: asciidoctor-pdf
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - '='
88
88
  - !ruby/object:Gem::Version
89
- version: 1.5.0.alpha.16
89
+ version: 1.5.3
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - '='
95
95
  - !ruby/object:Gem::Version
96
- version: 1.5.0.alpha.16
96
+ version: 1.5.3
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: logger
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -128,28 +128,28 @@ dependencies:
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '3.0'
131
+ version: '4.0'
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '3.0'
138
+ version: '4.0'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: jekyll-asciidoc
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: '2.1'
145
+ version: '3.0'
146
146
  type: :runtime
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: '2.1'
152
+ version: '3.0'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: highline
155
155
  requirement: !ruby/object:Gem::Requirement