liquidoc 0.1.0 → 0.2.0

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: e6d540613bd9ce63cedb817ae5faec345f8f1ef6
4
- data.tar.gz: b8d3ebaae9154e2c06632288226f0d0d790cba60
3
+ metadata.gz: 84d0dce2c5baddc6b4b2c9d7a9dffe763ce32a73
4
+ data.tar.gz: 65d945dcfdb8480a72aa72650adf4e509e7834ed
5
5
  SHA512:
6
- metadata.gz: 520b0885644503d9ef90e0283423c5eedfa3a53b2c3b6d920dcc60776e8173d770b64a80994e463cdb7a1c5411f1fc11e4d0b7ba43ec9687b349a82940067955
7
- data.tar.gz: 760c4c9a0c6315f0c3488db65f839441a91e09e8e596c0c73ec9756443b2de21e21561154fe7db0511e81fdb598edf527567098f5cd6d62e184442d9241c256c
6
+ metadata.gz: d8e16dd3ae8c7851c1e7f24d0b5a684019d9b7f8e3b93efb8b8713b243e7692ef53150db619e34dc3247f4861e9dae335152aad51f1b754795cb95e59a1cfde8
7
+ data.tar.gz: a72ffb5946651195885fe70e25739c2476939fd9ebdfd637d96ef56896332fcde81b6cce7555ff311ef79c05890580f1940bfd2c264067fe5a6ae304e9b60d0a
@@ -35,32 +35,49 @@ end
35
35
  # ===
36
36
 
37
37
  # Pull in a semi-structured data file, converting contents to a Ruby hash
38
- def get_data data_file
39
- case File.extname(data_file)
40
- when ".yml"
38
+ def get_data data
39
+ # data must be a hash produced by data_hashify()
40
+ if data['type']
41
+ if data['type'].downcase == "yaml"
42
+ data['type'] = "yml"
43
+ end
44
+ unless data['type'].downcase.match(/yml|json|xml|csv|regex/)
45
+ @logger.error "Declared data type must be one of: yaml, json, xml, csv, or regex."
46
+ raise "DataTypeUnrecognized"
47
+ end
48
+ else
49
+ unless data['ext'].match(/\.yml|\.json|\.xml|\.csv/)
50
+ @logger.error "Data file extension must be one of: .yml, .json, .xml, or .csv or else declared in config file."
51
+ raise "FileExtensionUnknown (#{data[ext]})"
52
+ end
53
+ data['type'] = data['ext']
54
+ data['type'].slice!(0) # removes leading dot char
55
+ end
56
+ case data['type']
57
+ when "yml"
41
58
  begin
42
- return YAML.load_file(data_file)
59
+ return YAML.load_file(data['file'])
43
60
  rescue Exception => ex
44
61
  @logger.error "There was a problem with the data file. #{ex.message}"
45
62
  end
46
- when ".json"
63
+ when "json"
47
64
  begin
48
- return JSON.parse(File.read(data_file))
65
+ return JSON.parse(File.read(data['file']))
49
66
  rescue Exception => ex
50
67
  @logger.error "There was a problem with the data file. #{ex.message}"
51
68
  end
52
- when ".xml"
69
+ when "xml"
53
70
  begin
54
- data = Crack::XML.parse(File.read(data_file))
71
+ data = Crack::XML.parse(File.read(data['file']))
55
72
  return data['root']
56
73
  rescue Exception => ex
57
74
  @logger.error "There was a problem with the data file. #{ex.message}"
58
75
  end
59
- when ".csv"
76
+ when "csv"
60
77
  output = []
61
78
  i = 0
62
79
  begin
63
- CSV.foreach(data_file, headers: true, skip_blanks: true) do |row|
80
+ CSV.foreach(data['file'], headers: true, skip_blanks: true) do |row|
64
81
  output[i] = row.to_hash
65
82
  i = i+1
66
83
  end
@@ -69,8 +86,13 @@ def get_data data_file
69
86
  rescue
70
87
  @logger.error "The CSV format is invalid."
71
88
  end
72
- else
73
- @logger.error "The data file is an invalid type. Allowed: .yml, .json, .xml, and .csv."
89
+ when "regex"
90
+ if data['pattern']
91
+ return parse_regex(data['file'], data['pattern'])
92
+ else
93
+ @logger.error "You must supply a regex pattern with your free-form data file."
94
+ raise "MissingRegexPattern"
95
+ end
74
96
  end
75
97
  end
76
98
 
@@ -92,13 +114,13 @@ def config_build config_file
92
114
  validate_config_structure(config)
93
115
  if config['compile']
94
116
  for src in config['compile']
95
- data = @base_dir + src['data']
117
+ data = src['data']
96
118
  for cfgn in src['builds']
97
119
  template = @base_dir + cfgn['template']
98
- unless cfgn['output'] == "STDOUT" or @output_type == "STDOUT"
120
+ unless cfgn['output'].downcase == "stdout"
99
121
  output = @base_dir + cfgn['output']
100
122
  else
101
- output = "STDOUT"
123
+ output = "stdout"
102
124
  end
103
125
  liquify(data, template, output)
104
126
  end
@@ -126,7 +148,7 @@ def validate_file_input file, type
126
148
  @logger.debug "Validating input file for #{type} file #{file}"
127
149
  error = false
128
150
  unless file.is_a?(String) and !file.nil?
129
- error = "The #{type} file (#{file}) is not valid."
151
+ error = "The #{type} filename (#{file}) is not valid."
130
152
  else
131
153
  unless File.exists?(file)
132
154
  error = "The #{type} file (#{file}) was not found."
@@ -135,14 +157,14 @@ def validate_file_input file, type
135
157
  unless error
136
158
  @logger.debug "Input file validated for #{type} file #{file}."
137
159
  else
138
- @logger.error
139
- raise "Could not validate file input: #{error}"
160
+ @logger.error "Could not validate input file: #{error}"
161
+ raise "InvalidInput"
140
162
  end
141
163
  end
142
164
 
143
165
  def validate_config_structure config
144
166
  unless config.is_a? Hash
145
- message = "The configuration file is not properly structured; it is not a Hash"
167
+ message = "The configuration file is not properly structured; it is not a hash"
146
168
  @logger.error message
147
169
  raise message
148
170
  else
@@ -153,16 +175,56 @@ def validate_config_structure config
153
175
  # TODO More validation needed
154
176
  end
155
177
 
178
+ def data_hashify data_var
179
+ # TODO make datasource config a class
180
+ if data_var.is_a?(String)
181
+ data = {}
182
+ data['file'] = data_var
183
+ data['ext'] = File.extname(data_var)
184
+ else # add ext to the hash
185
+ data = data_var
186
+ data['ext'] = File.extname(data['file'])
187
+ end
188
+ return data
189
+ end
190
+
191
+ def parse_regex data_file, pattern
192
+ records = []
193
+ pattern_re = /#{pattern}/
194
+ @logger.debug "Using regular expression #{pattern} to parse data file."
195
+ groups = pattern_re.names
196
+ begin
197
+ File.open(data_file, "r") do |file_proc|
198
+ file_proc.each_line do |row|
199
+ matches = row.match(pattern_re)
200
+ if matches
201
+ row_h = {}
202
+ groups.each do |var| # loop over the named groups, adding their key & value to the row_h hash
203
+ row_h.merge!(var => matches[var])
204
+ end
205
+ records << row_h # add the row to the records array
206
+ end
207
+ end
208
+ end
209
+ output = {"data" => records}
210
+ rescue Exception => ex
211
+ @logger.error "Something went wrong trying to parse the free-form file. #{ex.class} thrown. #{ex.message}"
212
+ raise "Freeform parse error"
213
+ end
214
+ return output
215
+ end
216
+
156
217
  # ===
157
218
  # Liquify BUILD methods
158
219
  # ===
159
220
 
160
221
  # Parse given data using given template, saving to given filename
161
- def liquify data_file, template_file, output_file
162
- @logger.debug "Executing... liquify parsing operation on data file: #{data_file}, template #{template_file}, to #{output_file}."
163
- validate_file_input(data_file, "data")
222
+ def liquify data, template_file, output
223
+ @logger.debug "Executing liquify parsing operation."
224
+ data = data_hashify(data)
225
+ validate_file_input(data['file'], "data")
164
226
  validate_file_input(template_file, "template")
165
- data = get_data(data_file) # gathers the data
227
+ data = get_data(data) # gathers the data
166
228
  begin
167
229
  template = File.read(template_file) # reads the template file
168
230
  template = Liquid::Template.parse(template) # compiles template
@@ -173,7 +235,8 @@ def liquify data_file, template_file, output_file
173
235
  @logger.error message
174
236
  raise message
175
237
  end
176
- unless @output_type == "STDOUT"
238
+ unless output.downcase == "stdout"
239
+ output_file = output
177
240
  begin
178
241
  Dir.mkdir(@output_dir) unless File.exists?(@output_dir)
179
242
  File.open(output_file, 'w') { |file| file.write(rendered) } # saves file
@@ -369,7 +432,7 @@ command_parser = OptionParser.new do|opts|
369
432
  end
370
433
 
371
434
  opts.on("--stdout", "Puts the output in STDOUT instead of writing to a file.") do
372
- @output_type = "STDOUT"
435
+ @output_type = "stdout"
373
436
  end
374
437
 
375
438
  opts.on("-h", "--help", "Returns help.") do
@@ -1,3 +1,3 @@
1
1
  module Liquidoc
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  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.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Dominick
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-07 00:00:00.000000000 Z
11
+ date: 2017-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler