liquidoc 0.11.0 → 0.12.0.pre.rc1

Sign up to get free protection for your applications and to get access to all the features.
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