easol-canvas 1.4.1 → 1.5.0

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: 5cc9522b87ab434f7121dfd557aa987b820c9934486da6c96e8c7706ac4f92b4
4
- data.tar.gz: e922ef25a0d8a916a82a7b9c4d8b4faf342088f6da65077518d72b68bf64eeab
3
+ metadata.gz: c61a6785fbf34da110e1fe2b01a9f096ff4aaf8ea3cfbef780491b5e94e68998
4
+ data.tar.gz: 3acb2a3215a5fd874ad5e54cc719204cb0a4698218935f2546ce5cacf3f73777
5
5
  SHA512:
6
- metadata.gz: c33da855f7ad39a4dad8172fc0942c9c60d4af81acf6c677bddb9c55dcacd9759392fa9c24e65910d76228a760bad31c244b865e8f83e52623ffdf26282f99b6
7
- data.tar.gz: e4d2f3ebae85a1ed14716a1f5514bd3211ae130b973475bbcaf3b52c946cb25db90cdcfbd75143db9984600e3604071d153eb1766e79388e172a2307e09abcfb
6
+ metadata.gz: 660512a56bea758cae95483fdaefd41a75156a7c15723e661749a64feb6dbc847bab31e279fecd733af807c33491a138b9c4afc850bfd2db84e8b1ae5d3c848a
7
+ data.tar.gz: 75fdbbefd7cfccc1849bf26e1c42e9f24f274c1d1ed27774d6b1a5085a5caafd30b4b8a0499d418686320157b6335116e0a25bf973b24fedee60210bb64c8d0d
@@ -9,23 +9,39 @@ module Canvas
9
9
  # This class is used to validate a layout definition, part of block schema.
10
10
  # Example of a valid layout definition:
11
11
  # {
12
+ # "attributes" => [
13
+ # {
14
+ # "name" => "title",
15
+ # "type" => "string"
16
+ # }
17
+ # ...
18
+ # ],
12
19
  # "layout" => [
13
- # {
14
- # "label" => "Design",
15
- # "type" => "tab",
16
- # "elements" => [
17
- # "heading",
18
- # {
19
- # "type" => "accordion",
20
- # "label" => "Logo",
20
+ # {
21
+ # "label" => "Design",
22
+ # "type" => "tab",
21
23
  # "elements" => [
22
- # "description",
23
- # { "type" => "attribute", "name" => "logo_alt" },
24
- # "title"
25
- # ]
26
- # }
27
- # ]
28
- # }]
24
+ # "heading",
25
+ # {
26
+ # "type" => "accordion",
27
+ # "label" => "Logo",
28
+ # "elements" => [
29
+ # "description",
30
+ # { "type" => "attribute", "name" => "logo_alt" },
31
+ # "title"
32
+ # ]
33
+ # },
34
+ # {
35
+ # "type" => "accordion_toggle",
36
+ # "toggle_attribute" => "cta_enabled",
37
+ # "elements" => [
38
+ # "cta_text",
39
+ # "cta_target"
40
+ # ]
41
+ # }
42
+ # ]
43
+ # }
44
+ # ]
29
45
  # }
30
46
  class LayoutSchema
31
47
  attr_reader :errors
@@ -41,6 +57,7 @@ module Canvas
41
57
  if ensure_valid_format
42
58
  ensure_no_unrecognized_keys
43
59
  ensure_no_duplicate_keys
60
+ ensure_accordion_toggles_are_valid
44
61
  end
45
62
 
46
63
  @errors.empty?
@@ -48,8 +65,10 @@ module Canvas
48
65
 
49
66
  private
50
67
 
68
+ attr_reader :schema
69
+
51
70
  def ensure_no_duplicate_keys
52
- attributes = gather_attributes_from_layout_schema
71
+ attributes = fetch_all_attribute_names
53
72
  duplicates =
54
73
  attributes
55
74
  .group_by { |(key)| key }
@@ -63,37 +82,54 @@ module Canvas
63
82
  end
64
83
 
65
84
  def ensure_no_unrecognized_keys
66
- attributes = gather_attributes_from_layout_schema
67
- defined_attributes = @schema["attributes"]&.map { |definition| normalize_attribute(definition["name"]) } || []
85
+ attributes = fetch_all_attribute_names
86
+ defined_attributes = schema["attributes"]&.map { |definition| normalize_attribute(definition["name"]) } || []
68
87
 
69
88
  attributes.each do |attribute, location|
70
89
  @errors << "Unrecognized attribute `#{attribute}`. Location: #{location}" unless defined_attributes.include?(attribute)
71
90
  end
72
91
  end
73
92
 
74
- def gather_attributes_from_layout_schema
75
- attribute_keys = []
93
+ # @return [Array<Array(String, String)>] an array of all the attribute names that
94
+ # are mentioned in the layout schema, along with its path. The names are
95
+ # normalized, i.e. downcased.
96
+ def fetch_all_attribute_names
97
+ attributes = fetch_elements_of_type("attribute")
98
+ attributes.map do |(node, path)|
99
+ [
100
+ normalize_attribute(node.is_a?(Hash) ? node["name"] : node),
101
+ path
102
+ ]
103
+ end
104
+ end
105
+
106
+ # @param type [String] the element type to fetch
107
+ # @return [Array<Array(<Hash, String>, String)] an array of elements that match
108
+ # the given type. Each element is an array containing the node and its path.
109
+ def fetch_elements_of_type(type)
110
+ elements = []
111
+
112
+ fetch_element = ->(node, path) {
113
+ if type == "attribute" && node.is_a?(String)
114
+ elements << [node, path]
115
+ elsif node["type"] == type
116
+ elements << [node, path]
117
+ end
76
118
 
77
- fetch_attribute_type = ->(node, path) {
78
119
  if node.is_a?(Hash) && node.key?("elements")
79
120
  node["elements"].each_with_index do |element, i|
80
121
  current_path = "#{path}/elements/#{i}"
81
- fetch_attribute_type.call(element, current_path)
122
+ fetch_element.call(element, current_path)
82
123
  end
83
- else
84
- attribute_keys << [
85
- normalize_attribute(node.is_a?(Hash) ? node["name"] : node),
86
- path
87
- ]
88
124
  end
89
125
  }
90
126
 
91
127
  layout_schema.each_with_index do |tab, i|
92
128
  current_path = "layout/#{i}"
93
- fetch_attribute_type.call(tab, current_path)
129
+ fetch_element.call(tab, current_path)
94
130
  end
95
131
 
96
- attribute_keys
132
+ elements
97
133
  end
98
134
 
99
135
  def ensure_valid_format
@@ -105,8 +141,23 @@ module Canvas
105
141
  false
106
142
  end
107
143
 
144
+ def ensure_accordion_toggles_are_valid
145
+ accordion_toggles = fetch_elements_of_type("accordion_toggle")
146
+ accordion_toggles.each do |accordion_toggle, location|
147
+ toggle_attribute = schema["attributes"]&.detect { |attr|
148
+ attr["name"] == accordion_toggle["toggle_attribute"]
149
+ }
150
+
151
+ if toggle_attribute.nil?
152
+ @errors << "The toggle_attribute in accordion_toggle is unrecognized. Location: #{location}"
153
+ elsif toggle_attribute["type"] != "boolean"
154
+ @errors << "The toggle_attribute in accordion_toggle must be a boolean. Location: #{location}"
155
+ end
156
+ end
157
+ end
158
+
108
159
  def layout_schema
109
- @schema["layout"] || []
160
+ schema["layout"] || []
110
161
  end
111
162
 
112
163
  def schema_definition
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Canvas
4
- VERSION = "1.4.1"
4
+ VERSION = "1.5.0"
5
5
  end
@@ -24,20 +24,21 @@
24
24
  "items": {
25
25
  "oneOf": [
26
26
  { "type": "string" },
27
- { "$ref": "#/$defs/component" },
27
+ { "$ref": "#/$defs/accordion" },
28
+ { "$ref": "#/$defs/accordion_toggle" },
28
29
  { "$ref": "#/$defs/attribute" }
29
30
  ]
30
31
  }
31
32
  }
32
33
  }
33
34
  },
34
- "component": {
35
+ "accordion": {
35
36
  "type": "object",
36
37
  "required": ["label", "type"],
37
38
  "properties": {
38
39
  "type": {
39
40
  "type": "string",
40
- "enum": ["accordion"]
41
+ "const": "accordion"
41
42
  },
42
43
  "label": {
43
44
  "type": "string"
@@ -50,6 +51,25 @@
50
51
  }
51
52
  }
52
53
  },
54
+ "accordion_toggle": {
55
+ "type": "object",
56
+ "required": ["type", "toggle_attribute", "elements"],
57
+ "properties": {
58
+ "type": {
59
+ "type": "string",
60
+ "const": "accordion_toggle"
61
+ },
62
+ "toggle_attribute": {
63
+ "type": "string"
64
+ },
65
+ "elements": {
66
+ "type": "array",
67
+ "items": {
68
+ "oneOf": [{ "type": "string" }, { "$ref": "#/$defs/attribute" }]
69
+ }
70
+ }
71
+ }
72
+ },
53
73
  "attribute": {
54
74
  "type": "object",
55
75
  "required": ["name", "type"],
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: easol-canvas
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.1
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kyle Byrne
8
8
  - Ian Mooney
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-07-15 00:00:00.000000000 Z
12
+ date: 2022-07-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor
@@ -155,7 +155,7 @@ homepage: https://rubygems.org/gems/easol-canvas
155
155
  licenses:
156
156
  - MIT
157
157
  metadata: {}
158
- post_install_message:
158
+ post_install_message:
159
159
  rdoc_options: []
160
160
  require_paths:
161
161
  - lib
@@ -170,8 +170,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
170
170
  - !ruby/object:Gem::Version
171
171
  version: '0'
172
172
  requirements: []
173
- rubygems_version: 3.2.33
174
- signing_key:
173
+ rubygems_version: 3.1.6
174
+ signing_key:
175
175
  specification_version: 4
176
176
  summary: CLI to help with building themes for Easol
177
177
  test_files: []