express_templates 0.11.11 → 0.11.13
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/arbre/patches.rb +17 -0
- data/lib/express_templates/components/capabilities/configurable.rb +165 -0
- data/lib/express_templates/components/capabilities/hideable.rb +21 -0
- data/lib/express_templates/components/configurable.rb +1 -147
- data/lib/express_templates/components/container.rb +3 -1
- data/lib/express_templates/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 777b6b9b183caeb311d0c70cac1f01d28926fc26
|
4
|
+
data.tar.gz: 2a92573b49a5853af5b99f86125998985c65e164
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: acb771f468452735b568bf8ce8aee2541b9e0a8605c70e58263cd9d91c3052008c7ec68255e2cdef081074d5102c8ef9ca83827acae9f6065629e610fcf6dfdb
|
7
|
+
data.tar.gz: 1c7ea931f212a887c2ffe4a1991ac45f1b3850329eb45948ed247c5864a8160f7b692a428622cf8eee30c75c2a21d47f384c83e9957ebbaa53a784e6c77bc83b
|
data/lib/arbre/patches.rb
CHANGED
@@ -14,6 +14,7 @@ module Arbre
|
|
14
14
|
# are expected to be able to contain other components or template code
|
15
15
|
# without use of a builder style syntax
|
16
16
|
def build_tag(klass, *args, &block)
|
17
|
+
return if should_supress_output?(args)
|
17
18
|
tag = klass.new(arbre_context)
|
18
19
|
tag.parent = current_arbre_element
|
19
20
|
|
@@ -28,6 +29,22 @@ module Arbre
|
|
28
29
|
tag
|
29
30
|
end
|
30
31
|
|
32
|
+
# Conditionally do not emit markup
|
33
|
+
# Example that would supress generation of the h2 markup:
|
34
|
+
# * h2(only_when: false) { "Some text" }
|
35
|
+
# * h2(unless: true) { "Some text" }
|
36
|
+
def should_supress_output?(args)
|
37
|
+
if args.last.kind_of?(Hash)
|
38
|
+
only_when = args.last[:only_when]
|
39
|
+
unless_condition = args.last[:unless]
|
40
|
+
return true if only_when === false
|
41
|
+
return true if !unless_condition.nil? && !!unless_condition
|
42
|
+
else
|
43
|
+
false
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
|
31
48
|
def on_component_error(tag, exception)
|
32
49
|
tag.content = "Error rendering #{tag.class} component: #{exception.message}"
|
33
50
|
::Rails.logger.error exception
|
@@ -0,0 +1,165 @@
|
|
1
|
+
module ExpressTemplates
|
2
|
+
module Components
|
3
|
+
module Capabilities
|
4
|
+
|
5
|
+
module Configurable
|
6
|
+
|
7
|
+
def self.included(base)
|
8
|
+
base.class_eval do
|
9
|
+
|
10
|
+
class_attribute :supported_options
|
11
|
+
self.supported_options = {}
|
12
|
+
|
13
|
+
class_attribute :supported_arguments
|
14
|
+
self.supported_arguments = {}
|
15
|
+
|
16
|
+
|
17
|
+
def self.emits(*args, &block)
|
18
|
+
warn ".emits is deprecrated"
|
19
|
+
self.contains(*args, &block)
|
20
|
+
end
|
21
|
+
|
22
|
+
def build(*args, &block)
|
23
|
+
_process_builder_args!(args)
|
24
|
+
super(*args, &block)
|
25
|
+
end
|
26
|
+
|
27
|
+
def config
|
28
|
+
@config ||= {}
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.has_option(name, description, type: :string, required: nil, default: nil, attribute: nil, values: nil)
|
32
|
+
raise "name must be a symbol" unless name.kind_of?(Symbol)
|
33
|
+
option_definition = {description: description}
|
34
|
+
option_definition.merge!(type: type, required: required, default: default, attribute: attribute, values: values)
|
35
|
+
self.supported_options =
|
36
|
+
self.supported_options.merge(name => option_definition)
|
37
|
+
end
|
38
|
+
|
39
|
+
def required_options
|
40
|
+
supported_options.select {|k,v| v[:required] unless v[:default] }
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.has_argument(name, description, as: nil, type: :string, default: nil, optional: false)
|
44
|
+
raise "name must be a symbol" unless name.kind_of?(Symbol)
|
45
|
+
argument_definition = {description: description, as: as, type: type, default: default, optional: optional}
|
46
|
+
self.supported_arguments =
|
47
|
+
self.supported_arguments.merge(name => argument_definition)
|
48
|
+
end
|
49
|
+
|
50
|
+
has_argument :id, "The id of the component.", type: :symbol, optional: true
|
51
|
+
|
52
|
+
protected
|
53
|
+
|
54
|
+
def _default_options
|
55
|
+
supported_options.select {|k,v| v[:default] }
|
56
|
+
end
|
57
|
+
|
58
|
+
def _check_required_options(supplied)
|
59
|
+
missing = required_options.keys - supplied.keys
|
60
|
+
if missing.any?
|
61
|
+
raise "#{self.class} missing required option(s): #{missing}"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def _set_defaults
|
66
|
+
_default_options.each do |key, value|
|
67
|
+
default_value = value[:default].respond_to?(:call) ? value[:default].call : value[:default]
|
68
|
+
if !!value[:attribute]
|
69
|
+
set_attribute key, default_value
|
70
|
+
else
|
71
|
+
if config[key].nil?
|
72
|
+
config[key] = default_value
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def _valid_types(definition)
|
79
|
+
valid_type_names = if definition[:type].kind_of?(Symbol)
|
80
|
+
[definition[:type]]
|
81
|
+
elsif definition[:type].respond_to?(:keys)
|
82
|
+
definition[:type].keys
|
83
|
+
else
|
84
|
+
definition[:type] || []
|
85
|
+
end
|
86
|
+
valid_type_names.map do |type_name|
|
87
|
+
if type_name.eql?(:boolean)
|
88
|
+
type_name
|
89
|
+
else
|
90
|
+
type_name.to_s.classify.constantize
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def _is_valid?(value, definition)
|
96
|
+
valid_types = _valid_types(definition)
|
97
|
+
if valid_types.empty? && value.kind_of?(String)
|
98
|
+
true
|
99
|
+
elsif valid_types.include?(value.class)
|
100
|
+
true
|
101
|
+
elsif valid_types.include?(:boolean) &&
|
102
|
+
[1, 0, true, false].include?(value)
|
103
|
+
true
|
104
|
+
else
|
105
|
+
false
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def _optional_argument?(definition)
|
110
|
+
definition[:default] || definition[:optional]
|
111
|
+
end
|
112
|
+
|
113
|
+
def _required_argument?(definition)
|
114
|
+
!_optional_argument?(definition)
|
115
|
+
end
|
116
|
+
|
117
|
+
def _extract_supported_arguments!(args)
|
118
|
+
supported_arguments.each do |key, definition|
|
119
|
+
value = args.shift
|
120
|
+
if value.nil? && _required_argument?(definition)
|
121
|
+
raise "argument for #{key} not supplied"
|
122
|
+
end
|
123
|
+
unless _is_valid?(value, definition)
|
124
|
+
if _required_argument?(definition)
|
125
|
+
raise "argument for #{key} invalid (#{value.class}) '#{value.to_s}'; Allowable: #{_valid_types(definition).inspect}"
|
126
|
+
else
|
127
|
+
args.unshift value
|
128
|
+
next
|
129
|
+
end
|
130
|
+
end
|
131
|
+
config_key = definition[:as] || key
|
132
|
+
config[config_key] = value || definition[:default]
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def _set_id_attribute
|
137
|
+
attributes[:id] = config[:id]
|
138
|
+
end
|
139
|
+
|
140
|
+
def _extract_supported_options!(builder_options)
|
141
|
+
builder_options.each do |key, value|
|
142
|
+
if supported_options.keys.include?(key)
|
143
|
+
unless supported_options[key][:attribute]
|
144
|
+
config[key] = builder_options.delete(key)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
# TODO: this method should probably save the unprocessed builder options
|
151
|
+
# for passing to builder/helpers like in FormComponent
|
152
|
+
def _process_builder_args!(args)
|
153
|
+
_extract_supported_arguments!(args)
|
154
|
+
builder_options = args.last.try(:kind_of?, Hash) ? args.last : {}
|
155
|
+
_check_required_options(builder_options)
|
156
|
+
_extract_supported_options!(builder_options)
|
157
|
+
_set_defaults
|
158
|
+
_set_id_attribute
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ExpressTemplates
|
2
|
+
module Components
|
3
|
+
module Capabilities
|
4
|
+
|
5
|
+
module Hideable
|
6
|
+
|
7
|
+
def self.included(base)
|
8
|
+
base.class_eval do
|
9
|
+
|
10
|
+
has_option :hidden, "Toggles visiblity of the component. Assumes hidden CSS class.", type: :boolean, default: false
|
11
|
+
|
12
|
+
before_build -> {
|
13
|
+
add_class 'hidden' if config[:hidden]
|
14
|
+
}
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -31,153 +31,7 @@ module ExpressTemplates
|
|
31
31
|
|
32
32
|
abstract_component
|
33
33
|
|
34
|
-
|
35
|
-
self.supported_options = {}
|
36
|
-
|
37
|
-
class_attribute :supported_arguments
|
38
|
-
self.supported_arguments = {}
|
39
|
-
|
40
|
-
def self.emits(*args, &block)
|
41
|
-
warn ".emits is deprecrated"
|
42
|
-
self.contains(*args, &block)
|
43
|
-
end
|
44
|
-
|
45
|
-
def build(*args, &block)
|
46
|
-
_process_builder_args!(args)
|
47
|
-
super(*args, &block)
|
48
|
-
end
|
49
|
-
|
50
|
-
def config
|
51
|
-
@config ||= {}
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.has_option(name, description, type: :string, required: nil, default: nil, attribute: nil, values: nil)
|
55
|
-
raise "name must be a symbol" unless name.kind_of?(Symbol)
|
56
|
-
option_definition = {description: description}
|
57
|
-
option_definition.merge!(type: type, required: required, default: default, attribute: attribute, values: values)
|
58
|
-
self.supported_options =
|
59
|
-
self.supported_options.merge(name => option_definition)
|
60
|
-
end
|
61
|
-
|
62
|
-
def required_options
|
63
|
-
supported_options.select {|k,v| v[:required] unless v[:default] }
|
64
|
-
end
|
65
|
-
|
66
|
-
def self.has_argument(name, description, as: nil, type: :string, default: nil, optional: false)
|
67
|
-
raise "name must be a symbol" unless name.kind_of?(Symbol)
|
68
|
-
argument_definition = {description: description, as: as, type: type, default: default, optional: optional}
|
69
|
-
self.supported_arguments =
|
70
|
-
self.supported_arguments.merge(name => argument_definition)
|
71
|
-
end
|
72
|
-
|
73
|
-
has_argument :id, "The id of the component.", type: :symbol, optional: true
|
74
|
-
|
75
|
-
protected
|
76
|
-
|
77
|
-
def _default_options
|
78
|
-
supported_options.select {|k,v| v[:default] }
|
79
|
-
end
|
80
|
-
|
81
|
-
def _check_required_options(supplied)
|
82
|
-
missing = required_options.keys - supplied.keys
|
83
|
-
if missing.any?
|
84
|
-
raise "#{self.class} missing required option(s): #{missing}"
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def _set_defaults
|
89
|
-
_default_options.each do |key, value|
|
90
|
-
default_value = value[:default].respond_to?(:call) ? value[:default].call : value[:default]
|
91
|
-
if !!value[:attribute]
|
92
|
-
set_attribute key, default_value
|
93
|
-
else
|
94
|
-
if config[key].nil?
|
95
|
-
config[key] = default_value
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def _valid_types(definition)
|
102
|
-
valid_type_names = if definition[:type].kind_of?(Symbol)
|
103
|
-
[definition[:type]]
|
104
|
-
elsif definition[:type].respond_to?(:keys)
|
105
|
-
definition[:type].keys
|
106
|
-
else
|
107
|
-
definition[:type] || []
|
108
|
-
end
|
109
|
-
valid_type_names.map do |type_name|
|
110
|
-
if type_name.eql?(:boolean)
|
111
|
-
type_name
|
112
|
-
else
|
113
|
-
type_name.to_s.classify.constantize
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
def _is_valid?(value, definition)
|
119
|
-
valid_types = _valid_types(definition)
|
120
|
-
if valid_types.empty? && value.kind_of?(String)
|
121
|
-
true
|
122
|
-
elsif valid_types.include?(value.class)
|
123
|
-
true
|
124
|
-
elsif valid_types.include?(:boolean) &&
|
125
|
-
[1, 0, true, false].include?(value)
|
126
|
-
true
|
127
|
-
else
|
128
|
-
false
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
def _optional_argument?(definition)
|
133
|
-
definition[:default] || definition[:optional]
|
134
|
-
end
|
135
|
-
|
136
|
-
def _required_argument?(definition)
|
137
|
-
!_optional_argument?(definition)
|
138
|
-
end
|
139
|
-
|
140
|
-
def _extract_supported_arguments!(args)
|
141
|
-
supported_arguments.each do |key, definition|
|
142
|
-
value = args.shift
|
143
|
-
if value.nil? && _required_argument?(definition)
|
144
|
-
raise "argument for #{key} not supplied"
|
145
|
-
end
|
146
|
-
unless _is_valid?(value, definition)
|
147
|
-
if _required_argument?(definition)
|
148
|
-
raise "argument for #{key} invalid (#{value.class}) '#{value.to_s}'; Allowable: #{_valid_types(definition).inspect}"
|
149
|
-
else
|
150
|
-
args.unshift value
|
151
|
-
next
|
152
|
-
end
|
153
|
-
end
|
154
|
-
config_key = definition[:as] || key
|
155
|
-
config[config_key] = value || definition[:default]
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
def _set_id_attribute
|
160
|
-
attributes[:id] = config[:id]
|
161
|
-
end
|
162
|
-
|
163
|
-
def _extract_supported_options!(builder_options)
|
164
|
-
builder_options.each do |key, value|
|
165
|
-
if supported_options.keys.include?(key)
|
166
|
-
unless supported_options[key][:attribute]
|
167
|
-
config[key] = builder_options.delete(key)
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
def _process_builder_args!(args)
|
174
|
-
_extract_supported_arguments!(args)
|
175
|
-
builder_options = args.last.try(:kind_of?, Hash) ? args.last : {}
|
176
|
-
_check_required_options(builder_options)
|
177
|
-
_extract_supported_options!(builder_options)
|
178
|
-
_set_defaults
|
179
|
-
_set_id_attribute
|
180
|
-
end
|
34
|
+
include Capabilities::Configurable
|
181
35
|
|
182
36
|
end
|
183
37
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: express_templates
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
4
|
+
version: 0.11.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steven Talcott Smith
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2017-03-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -169,6 +169,8 @@ files:
|
|
169
169
|
- lib/express_templates/components.rb
|
170
170
|
- lib/express_templates/components/all.rb
|
171
171
|
- lib/express_templates/components/base.rb
|
172
|
+
- lib/express_templates/components/capabilities/configurable.rb
|
173
|
+
- lib/express_templates/components/capabilities/hideable.rb
|
172
174
|
- lib/express_templates/components/capabilities/resourceful.rb
|
173
175
|
- lib/express_templates/components/configurable.rb
|
174
176
|
- lib/express_templates/components/container.rb
|
@@ -259,7 +261,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
259
261
|
version: '0'
|
260
262
|
requirements: []
|
261
263
|
rubyforge_project:
|
262
|
-
rubygems_version: 2.
|
264
|
+
rubygems_version: 2.4.7
|
263
265
|
signing_key:
|
264
266
|
specification_version: 4
|
265
267
|
summary: Reusable view components
|
@@ -315,4 +317,3 @@ test_files:
|
|
315
317
|
- test/express_templates_test.rb
|
316
318
|
- test/handler_test.rb
|
317
319
|
- test/test_helper.rb
|
318
|
-
has_rdoc:
|