bookshop-array-structures 2.0.0.pre.alpha.3 → 2.0.0.pre.alpha.8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6738d08d84522a5465442dcfdba331e599e1d24db2298e8fc60ae474dc097f41
4
- data.tar.gz: c7ecfde99307b8756bc24cc175421735869d013760dd5311b26e6a39c8ce7ff4
3
+ metadata.gz: 22677855f6b324f9afb59568c281564392c3fdd50777dfe1b90067aedbc11391
4
+ data.tar.gz: 2e16193303b823509f81735a4f9c77ea1a88a49c9f77954f218dd3136ab8d5a0
5
5
  SHA512:
6
- metadata.gz: 2441b86eebcee962023cc93266905d04ec5e95609ba5cb42089fd727fc7d4264a26d89cd78e68a0206f8fa0460b2c869b87ab7979e487179aca645ee1ee2ab88
7
- data.tar.gz: ce87689acdc1e21fc509612e6477d8aea56ca4ec9b98e93a0db38cbd72eb5dc95ccc56bb04145de945e7603ce74da3cf8da215e110ed5544c1eb5b8d7d5bd7e0
6
+ metadata.gz: c58f22533b9570e8fd2a1b5026e57efae6633cadb20eb735bfbc6d2fd99276c36bd8b0ab01ec87e236fdf9d80521bada5ebd9395b50b8b84099422cf6294064d
7
+ data.tar.gz: ad50d2713c9c761e30b5e486b865663f503e5458e48b768bbd005a4ccd3f4a893eddca731728890e877fee166c17ae4f3b121ce63f0fea3b99941314735c8bf3
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bookshop-array-structures (1.6.1)
4
+ bookshop-array-structures (2.0.0.pre.alpha.7)
5
+ dry-inflector (>= 0.1, < 1.0)
5
6
  jekyll (>= 3.7, < 5.0)
6
7
  toml-rb (>= 2.0, < 3.0)
7
8
 
@@ -15,7 +16,8 @@ GEM
15
16
  builder (3.2.4)
16
17
  citrus (3.0.2)
17
18
  colorator (1.1.0)
18
- concurrent-ruby (1.1.8)
19
+ concurrent-ruby (1.1.9)
20
+ dry-inflector (0.2.0)
19
21
  em-websocket (0.5.2)
20
22
  eventmachine (>= 0.12.9)
21
23
  http_parser.rb (~> 0.6.0)
@@ -22,4 +22,5 @@ Gem::Specification.new do |spec|
22
22
 
23
23
  spec.add_dependency "jekyll", ">= 3.7", "< 5.0"
24
24
  spec.add_dependency "toml-rb", ">= 2.0", "< 3.0"
25
+ spec.add_dependency "dry-inflector", ">= 0.1", "< 1.0"
25
26
  end
@@ -1,6 +1,7 @@
1
1
  require "jekyll"
2
- require 'pathname'
2
+ require "pathname"
3
3
  require "toml-rb"
4
+ require "dry/inflector"
4
5
 
5
6
  module Bookshop
6
7
  class ArrayStructures
@@ -28,6 +29,7 @@ module Bookshop
28
29
  structure["_comments"] ||= {}
29
30
  structure["value"] ||= {}
30
31
  value_context = structure["value"] if value_context.nil?
32
+ inflector = Dry::Inflector.new
31
33
  value_obj.each_pair {|key, value|
32
34
  if value_context.has_key?(key)
33
35
  next
@@ -47,7 +49,8 @@ module Bookshop
47
49
  end
48
50
  if value["select"]
49
51
  value_context[key] = nil
50
- structure["_select_data"][key+"s"] = value["select"]
52
+ plural_key = inflector.pluralize(key)
53
+ structure["_select_data"][plural_key] = value["select"]
51
54
  next
52
55
  end
53
56
  if value["preview"]
@@ -65,7 +68,14 @@ module Bookshop
65
68
  structure["_comments"][key] = value[0]["--bookshop_comment"]
66
69
  end
67
70
 
68
- structure["_array_structures"][key] ||= {"values" => [{"value" => {}}]}
71
+ singular_title = inflector.classify(key).gsub(/(.)([A-Z])/, '\1 \2')
72
+ structure["_array_structures"][key] ||= {
73
+ "values" => [{
74
+ "label" => singular_title,
75
+ "icon" => "add_box",
76
+ "value" => {}
77
+ }]
78
+ }
69
79
  handle_bookprops( value[0],
70
80
  structure["_array_structures"][key]["values"][0],
71
81
  structure["_array_structures"][key]["values"][0]["value"])
@@ -161,7 +171,103 @@ module Bookshop
161
171
  result["array_structures"].push("bookshop_components")
162
172
  end
163
173
  result.delete("_hidden") unless result["_hidden"].nil?
164
- return result
174
+ results = [result]
175
+ if result["_template"]
176
+ results.push(transform_template_component(result))
177
+ end
178
+ result.delete("_template")
179
+ return results
180
+ end
181
+
182
+ def self.transform_template_component(result)
183
+ schema_result = Marshal.load(Marshal.dump(result))
184
+ unwrap_structure_template(schema_result)
185
+ schema_result["value"] = templatize_values(schema_result["value"])
186
+ schema_result["_comments"] = templatize_comments(schema_result["_comments"])
187
+ schema_result["value"]["_bookshop_name"] = "#{schema_result["value"]["_bookshop_name"]}.__template"
188
+ schema_result["label"] = "Templated #{schema_result["label"]}"
189
+ schema_result["_array_structures"] = {}
190
+ schema_result["_select_data"] = {}
191
+ schema_result.delete("_template")
192
+ schema_result
193
+ end
194
+
195
+ # Breadth-first search through the structure, looking for keys
196
+ # that will match array structure or comments and flattening them
197
+ # into the root structure
198
+ def self.unwrap_structure_template(structure)
199
+ flattened_keys = {}
200
+ structure["value"].each_pair do |base_key, base_value|
201
+ flattened_keys[base_key] = base_value if base_key.start_with? "_"
202
+ end
203
+ flatten_hash(structure["value"]).each do |flat_key|
204
+ cascade_key = flat_key.split(".").last
205
+ matched_comment = structure.dig("_comments", cascade_key)
206
+ matched_substructure = structure.dig("_array_structures", cascade_key, "values", 0)
207
+
208
+ if matched_substructure
209
+ unwrap_structure_template(matched_substructure)
210
+ matched_substructure["value"].each_pair do |subkey, subvalue|
211
+ # Pull substructure's flat keys into this structure
212
+ flattened_keys["#{flat_key}.#{subkey}"] = subvalue
213
+ end
214
+ matched_substructure["_comments"].each_pair do |subkey, subcomment|
215
+ # Pull substructure's comments into this structure
216
+ structure["_comments"]["#{flat_key}.#{subkey}"] = subcomment
217
+ end
218
+ # Mark this key as an array so the include plugin knows to return
219
+ # a value and not a string
220
+ flattened_keys["#{flat_key}.__array_template"] = "{{#{cascade_key}}}"
221
+ if matched_comment
222
+ structure["_comments"].delete(cascade_key)
223
+ structure["_comments"]["#{flat_key}.__array_template"] = matched_comment
224
+ end
225
+ else
226
+ flattened_keys[flat_key] = ""
227
+ if matched_comment
228
+ structure["_comments"].delete(cascade_key)
229
+ structure["_comments"][flat_key] = matched_comment
230
+ end
231
+ end
232
+ end
233
+ structure["value"] = flattened_keys
234
+ end
235
+
236
+ # Recursively convert a hash into flat dot-notation keys
237
+ def self.flatten_hash(hash)
238
+ keys = [];
239
+ hash.each_pair do |k, v|
240
+ next if k.start_with? "_"
241
+ if v.is_a? Hash
242
+ flatten_hash(v).each do |ik|
243
+ keys.push("#{k}.#{ik}")
244
+ end
245
+ else
246
+ keys.push(k)
247
+ end
248
+ end
249
+ keys
250
+ end
251
+
252
+ def self.templatize_values(hash)
253
+ templated_hash = hash.dup
254
+ hash.each_key do |k|
255
+ next if k.start_with? "_"
256
+ next if k.end_with? "__array_template"
257
+ templated_hash.delete(k)
258
+ templated_hash["#{k}.__template"] = "{{#{k.split('.').last}}}"
259
+ end
260
+ templated_hash
261
+ end
262
+
263
+ def self.templatize_comments(hash)
264
+ templated_hash = hash.dup
265
+ hash.each_pair do |k, comment|
266
+ next if k.end_with? "__array_template"
267
+ templated_hash.delete(k)
268
+ templated_hash["#{k}.__template"] = comment
269
+ end
270
+ templated_hash
165
271
  end
166
272
 
167
273
  def self.transform_legacy_component(path, component, site)
@@ -182,7 +288,7 @@ module Bookshop
182
288
  result["array_structures"].push("components")
183
289
  end
184
290
  result.delete("_hidden") unless result["_hidden"].nil?
185
- return result
291
+ return [result]
186
292
  end
187
293
 
188
294
  def self.rewrite_bookshop_toml(content)
@@ -225,24 +331,26 @@ module Bookshop
225
331
  puts exception
226
332
  next
227
333
  end
228
- transformed_component = transform_component(f, component, site)
229
- array_structures = transformed_component.delete("array_structures")
230
- array_structures.each{|key|
231
- begin
232
- site.config["_array_structures"][key] ||= {}
233
- site.config["_array_structures"][key]["values"] ||= []
234
- site.config["_array_structures"][key]["values"].push(transformed_component)
235
- rescue => exception
236
- puts "❌ Error Adding Story to Array Structures: " + f
237
- puts "🤔 Maybe your current _config.yml has conflicting array structures?"
238
- end
334
+ transformed_components = transform_component(f, component, site)
335
+ transformed_components.each{|transformed_component|
336
+ array_structures = transformed_component.delete("array_structures")
337
+ array_structures.each{|key|
338
+ begin
339
+ site.config["_array_structures"][key] ||= {}
340
+ site.config["_array_structures"][key]["values"] ||= []
341
+ site.config["_array_structures"][key]["values"].push(transformed_component)
342
+ rescue => exception
343
+ puts " Error Adding Story to Array Structures: " + f
344
+ puts "🤔 Maybe your current _config.yml has conflicting array structures?"
345
+ end
346
+ }
239
347
  }
240
348
  end
241
349
  end
242
350
 
243
351
  def self.build_array_structures(site)
244
352
  bookshop_locations = site.config['bookshop_locations']&.collect do |location|
245
- Pathname.new(location + "/components").cleanpath.to_s
353
+ Pathname.new("#{site.source}/#{location}/components").cleanpath.to_s
246
354
  end
247
355
  bookshop_locations = bookshop_locations.select do |location|
248
356
  Dir.exist?(location)
@@ -1,5 +1,5 @@
1
1
  module Bookshop
2
2
  module Arraystructures
3
- VERSION = "2.0.0.pre.alpha.3"
3
+ VERSION = "2.0.0.pre.alpha.8"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bookshop-array-structures
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.pre.alpha.3
4
+ version: 2.0.0.pre.alpha.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tate
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-05-27 00:00:00.000000000 Z
11
+ date: 2021-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -50,6 +50,26 @@ dependencies:
50
50
  - - "<"
51
51
  - !ruby/object:Gem::Version
52
52
  version: '3.0'
53
+ - !ruby/object:Gem::Dependency
54
+ name: dry-inflector
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0.1'
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '1.0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0.1'
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '1.0'
53
73
  description:
54
74
  email:
55
75
  - tate@cloudcannon.com