express_templates 0.9.3 → 0.9.4
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/README.md +1 -1
- data/lib/express_templates/components/forms/form_component.rb +2 -0
- data/lib/express_templates/components/tree_for.rb +1 -1
- data/lib/express_templates/template/handler.rb +17 -1
- data/lib/express_templates/version.rb +1 -1
- data/test/components/forms/basic_fields_test.rb +58 -0
- data/test/components/forms/submit_test.rb +4 -0
- data/test/components/tree_for_test.rb +1 -6
- data/test/handler_test.rb +24 -0
- data/test/test_helper.rb +5 -5
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 05a81ab8ff1f7f2e94240689d4d87cbea72a4381
|
|
4
|
+
data.tar.gz: caffe066d6c10c2d0d90730f747a72a73d7008fc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fc9dfd7ad73fd876fd18d51d16e2524a7b9d344ee52ddd9ec713b5378ed802e68e5a29b0d773eba563c3d6b78667072979be676e17e6945dedfbe32195fef3a5
|
|
7
|
+
data.tar.gz: b10321d22b52c7a26fbba4105ed363638fd7f4915cc5ed957b2ee2c53926e04fdefc69c1b9ac55256f2513e234d374f0a6e3297b83306290e84bc09b15687aa3
|
data/README.md
CHANGED
|
@@ -40,7 +40,7 @@ Everything should work as you would expect.
|
|
|
40
40
|
|
|
41
41
|
Set your editor syntax for .et files to Ruby.
|
|
42
42
|
|
|
43
|
-
You can now utilize components which are found with documentation and examples in <tt>ExpressTemplates::Components
|
|
43
|
+
You can now utilize components which are found with documentation and examples in <tt>ExpressTemplates::Components</tt>.
|
|
44
44
|
|
|
45
45
|
Components are the real strength of both arbre and express_templates.
|
|
46
46
|
|
|
@@ -8,6 +8,8 @@ module ExpressTemplates
|
|
|
8
8
|
before_build -> {
|
|
9
9
|
set_attribute(:id, "#{resource_name}_#{field_name}_wrapper")
|
|
10
10
|
add_class(config[:wrapper_class])
|
|
11
|
+
add_class('error') if resource.respond_to?(:errors) &&
|
|
12
|
+
resource.errors.include?(field_name.to_sym)
|
|
11
13
|
}
|
|
12
14
|
|
|
13
15
|
has_option :wrapper_class, 'Override the class of the wrapping div of a form component', default: 'field-wrapper'
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'ripper'
|
|
2
|
+
|
|
1
3
|
module ExpressTemplates
|
|
2
4
|
module Template
|
|
3
5
|
class Handler
|
|
@@ -6,10 +8,24 @@ module ExpressTemplates
|
|
|
6
8
|
end
|
|
7
9
|
|
|
8
10
|
def call(template)
|
|
11
|
+
# call ripper stuff method
|
|
12
|
+
|
|
13
|
+
warn_contains_logic("(#{ExpressTemplates.compile(template)}).html_safe") # pass the source code
|
|
9
14
|
# returns a string to be eval'd
|
|
10
15
|
"(#{ExpressTemplates.compile(template)}).html_safe"
|
|
11
16
|
end
|
|
12
17
|
|
|
18
|
+
def warn_contains_logic(compiled_template)
|
|
19
|
+
keywords = %w(if until unless case for do loop while) # array of conditional keywords
|
|
20
|
+
tokens = []
|
|
21
|
+
if Ripper.lex(compiled_template).select do |element| # since it outputs an array [[line, col], type, token]
|
|
22
|
+
element[1]==:on_kw # type must match ':on_kw' type (type is keyword)
|
|
23
|
+
end.each { |match| tokens.push(match) if keywords.include? match[2] } # check if token is in given /keyword/ array, then push to new array match
|
|
24
|
+
tokens.each do |first|
|
|
25
|
+
warn "PAGE TEMPLATE INCLUDES #{first[2]} STATEMENT AT LINE #{first[0][0]}: #{first}\n#{compiled_template}" # warn on first occurence of conditional logic
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
13
29
|
end
|
|
14
30
|
end
|
|
15
|
-
end
|
|
31
|
+
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'test_helper'
|
|
2
|
+
require 'active_model'
|
|
2
3
|
|
|
3
4
|
class BasicFieldsTest < ActiveSupport::TestCase
|
|
4
5
|
|
|
@@ -89,4 +90,61 @@ class BasicFieldsTest < ActiveSupport::TestCase
|
|
|
89
90
|
assert_match /<input class="hidden form-field" value="ninja" type="hidden" name="foo\[bar\]" id="foo_bar"/, html
|
|
90
91
|
end
|
|
91
92
|
|
|
93
|
+
def resource_with_errors
|
|
94
|
+
mock_resource = resource
|
|
95
|
+
class << mock_resource
|
|
96
|
+
def errors
|
|
97
|
+
errors = ActiveModel::Errors.new(self)
|
|
98
|
+
errors.add(:name, "Can't be Foo")
|
|
99
|
+
errors
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
mock_resource
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def has_error_class
|
|
106
|
+
/div[^>]*class="[^"]*error[^"]*"/
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def has_error_class_on(field, html)
|
|
110
|
+
md = html.match(/(<div[^>]*id="[^"]*#{field}_wrapper[^"]*"[^>]*>)/)
|
|
111
|
+
assert md, "field has no wrapper"
|
|
112
|
+
return !!md[1].match(has_error_class)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
test "adds error class if there are errors on a field with no input attributes" do
|
|
116
|
+
html_with_error = arbre(resource: resource_with_errors) {
|
|
117
|
+
express_form(:foo) {
|
|
118
|
+
text :name
|
|
119
|
+
text :body
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
assert resource_with_errors.errors.any?
|
|
123
|
+
assert assigns[:resource].errors.any?
|
|
124
|
+
assert has_error_class_on(:name, html_with_error), "name field has no error when expected"
|
|
125
|
+
refute has_error_class_on(:body, html_with_error), "body field has error class when it should not"
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
test "adds error class if there are errors on a field with no class set" do
|
|
129
|
+
html_with_error = arbre(resource: resource_with_errors) {
|
|
130
|
+
express_form(:foo) {
|
|
131
|
+
text :name, value: 'ninja'
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
assert resource_with_errors.errors.any?
|
|
135
|
+
assert assigns[:resource].errors.any?
|
|
136
|
+
assert_match has_error_class, html_with_error
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
test "adds error to class if there are errors on a field with existing class" do
|
|
140
|
+
html_with_error = arbre(resource: resource_with_errors) {
|
|
141
|
+
express_form(:foo) {
|
|
142
|
+
text :name, value: 'ninja', class: 'slug'
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
assert resource_with_errors.errors.any?
|
|
146
|
+
assert assigns[:resource].errors.any?
|
|
147
|
+
assert_match has_error_class, html_with_error
|
|
148
|
+
end
|
|
149
|
+
|
|
92
150
|
end
|
|
@@ -2,11 +2,6 @@ require 'test_helper'
|
|
|
2
2
|
require 'ostruct'
|
|
3
3
|
|
|
4
4
|
class TreeForTest < ActiveSupport::TestCase
|
|
5
|
-
class Context
|
|
6
|
-
def initialize(roles)
|
|
7
|
-
@roles = roles
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
5
|
|
|
11
6
|
class Role
|
|
12
7
|
attr :name, :children
|
|
@@ -17,7 +12,7 @@ class TreeForTest < ActiveSupport::TestCase
|
|
|
17
12
|
end
|
|
18
13
|
|
|
19
14
|
def roles
|
|
20
|
-
[Role.new('SuperAdmin', children:
|
|
15
|
+
@roles ||= [Role.new('SuperAdmin', children:
|
|
21
16
|
[Role.new('Admin', children:
|
|
22
17
|
[Role.new('Publisher', children:
|
|
23
18
|
[Role.new('Author')]),
|
data/test/handler_test.rb
CHANGED
|
@@ -121,4 +121,28 @@ class HandlerTest < ActiveSupport::TestCase
|
|
|
121
121
|
assert_equal "<li>\n#{A_LINK}#{A_LINK}</li>\n", render
|
|
122
122
|
end
|
|
123
123
|
|
|
124
|
+
test "raises warning if template has conditional logic" do
|
|
125
|
+
temp = "dd(class: 'date') {
|
|
126
|
+
if blog_post.publish_at
|
|
127
|
+
blog_post.publish_at
|
|
128
|
+
else
|
|
129
|
+
link_to('Edit', '#'')
|
|
130
|
+
end
|
|
131
|
+
}"
|
|
132
|
+
keywords = %w(if unless until case for do loop while)
|
|
133
|
+
tokens = []
|
|
134
|
+
|
|
135
|
+
if Ripper.lex(temp).select do |element|
|
|
136
|
+
element[1]==:on_kw
|
|
137
|
+
end.each { |match| tokens.push(match) if keywords.include? match[2] }
|
|
138
|
+
tokens.each do |first|
|
|
139
|
+
out, @err = capture_io do
|
|
140
|
+
warn 'foo'
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
assert_equal @err, "foo\n"
|
|
146
|
+
end
|
|
147
|
+
|
|
124
148
|
end
|
data/test/test_helper.rb
CHANGED
|
@@ -44,16 +44,16 @@ end
|
|
|
44
44
|
|
|
45
45
|
module ActiveSupport
|
|
46
46
|
class TestCase
|
|
47
|
-
def arbre(&block)
|
|
48
|
-
Arbre::Context.new assigns, helpers, &block
|
|
47
|
+
def arbre(additional_assigns = {}, &block)
|
|
48
|
+
Arbre::Context.new assigns.merge(additional_assigns), helpers, &block
|
|
49
49
|
end
|
|
50
50
|
def assigns
|
|
51
|
-
{}
|
|
51
|
+
@arbre_assigns ||={}
|
|
52
52
|
end
|
|
53
53
|
def helpers
|
|
54
|
-
mock_action_view
|
|
54
|
+
mock_action_view
|
|
55
55
|
end
|
|
56
|
-
def mock_action_view
|
|
56
|
+
def mock_action_view
|
|
57
57
|
controller = ActionView::TestCase::TestController.new
|
|
58
58
|
ActionView::Base.send :include, ActionView::Helpers
|
|
59
59
|
ActionView::Base.send :include, ActionView::Helpers::UrlHelper
|
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.9.
|
|
4
|
+
version: 0.9.4
|
|
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: 2015-
|
|
12
|
+
date: 2015-08-05 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: activesupport
|