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.
- checksums.yaml +4 -4
- data/lib/liquidoc/version.rb +1 -1
- data/lib/liquidoc.rb +75 -52
- metadata +16 -16
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d8e7be74837c6d2456cc2186bd58240dd64f32dfbe22e4e960e4887e11b0f892
|
|
4
|
+
data.tar.gz: 42a9d17d69753e6f7c905f2cf35f08fe0bf68ce3cfa8e76c81fb314fe2b097e4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 386c7dc3021bff1955cdfa02ea1e39799510ad41a9ad7c95f7bd23b4bb8feb914bc6b35f5698c0bf17e899247ee3bc2cbd795679e29f3ed0eac8bfff7b03cfb2
|
|
7
|
+
data.tar.gz: 236059bc98386f110a6cec058658d58ba173c7b8d1f0a9ad654f3613776f76dbcfda2deb0ecc8fc3ef3500a525e1d33979c6d00264a5e516dbb195ba9328bf25
|
data/lib/liquidoc/version.rb
CHANGED
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
|
-
@
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
135
|
-
|
|
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
|
|
144
|
+
# Prep & perform a Liquid-parsed build
|
|
159
145
|
@explainer.info build.message
|
|
160
|
-
build.add_data!("vars"
|
|
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!(
|
|
168
|
-
build.data.add_data!(
|
|
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!
|
|
483
|
-
@data.add_data!(
|
|
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 :
|
|
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=""
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
869
|
-
|
|
870
|
-
|
|
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"
|
|
875
|
-
data_obj.add_data!("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!(
|
|
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
|
-
|
|
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 @
|
|
1400
|
-
cli_liquify(@
|
|
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.
|
|
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:
|
|
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:
|
|
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:
|
|
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: '
|
|
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: '
|
|
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.
|
|
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.
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
152
|
+
version: '3.0'
|
|
153
153
|
- !ruby/object:Gem::Dependency
|
|
154
154
|
name: highline
|
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|