curly-templates 0.10.2 → 0.11.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.
- data/CHANGELOG.md +10 -0
- data/curly-templates.gemspec +4 -2
- data/lib/curly.rb +1 -1
- data/lib/curly/compiler.rb +0 -4
- data/lib/curly/scanner.rb +41 -41
- data/lib/curly/syntax_error.rb +14 -0
- data/spec/compiler_spec.rb +0 -8
- data/spec/scanner_spec.rb +21 -5
- data/spec/syntax_error_spec.rb +14 -0
- metadata +6 -3
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
### Unreleased
|
2
2
|
|
3
|
+
### Curly 0.11.0 (July 31, 2013)
|
4
|
+
|
5
|
+
* Make Curly raise an exception when a reference or comment is not closed.
|
6
|
+
|
7
|
+
*Daniel Schierbeck*
|
8
|
+
|
9
|
+
* Fix a bug that caused an infinite loop when there was whitespace in a reference.
|
10
|
+
|
11
|
+
*Daniel Schierbeck*
|
12
|
+
|
3
13
|
### Curly 0.10.2 (July 11, 2013)
|
4
14
|
|
5
15
|
* Fix a bug that caused non-string presenter method return values to be
|
data/curly-templates.gemspec
CHANGED
@@ -4,8 +4,8 @@ Gem::Specification.new do |s|
|
|
4
4
|
s.rubygems_version = '1.3.5'
|
5
5
|
|
6
6
|
s.name = 'curly-templates'
|
7
|
-
s.version = '0.
|
8
|
-
s.date = '2013-07-
|
7
|
+
s.version = '0.11.0'
|
8
|
+
s.date = '2013-07-31'
|
9
9
|
|
10
10
|
s.summary = "Free your views!"
|
11
11
|
s.description = "A view layer for your Rails apps that separates structure and logic."
|
@@ -42,6 +42,7 @@ Gem::Specification.new do |s|
|
|
42
42
|
lib/curly/presenter.rb
|
43
43
|
lib/curly/railtie.rb
|
44
44
|
lib/curly/scanner.rb
|
45
|
+
lib/curly/syntax_error.rb
|
45
46
|
lib/curly/template_handler.rb
|
46
47
|
lib/generators/curly/controller/controller_generator.rb
|
47
48
|
lib/generators/curly/controller/templates/presenter.rb.erb
|
@@ -52,6 +53,7 @@ Gem::Specification.new do |s|
|
|
52
53
|
spec/presenter_spec.rb
|
53
54
|
spec/scanner_spec.rb
|
54
55
|
spec/spec_helper.rb
|
56
|
+
spec/syntax_error_spec.rb
|
55
57
|
spec/template_handler_spec.rb
|
56
58
|
]
|
57
59
|
# = MANIFEST =
|
data/lib/curly.rb
CHANGED
data/lib/curly/compiler.rb
CHANGED
data/lib/curly/scanner.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'strscan'
|
2
|
+
require 'curly/syntax_error'
|
2
3
|
|
3
4
|
module Curly
|
4
5
|
|
@@ -8,9 +9,9 @@ module Curly
|
|
8
9
|
# until the end of the template is reached.
|
9
10
|
#
|
10
11
|
class Scanner
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
CURLY_START = /\{\{/
|
13
|
+
CURLY_END = /\}\}/
|
14
|
+
COMMENT_MARKER = /!/
|
14
15
|
|
15
16
|
# Scans a Curly template for tokens.
|
16
17
|
#
|
@@ -44,58 +45,41 @@ module Curly
|
|
44
45
|
# Returns a two-element Array, the first element being the Symbol type of
|
45
46
|
# the token and the second being the String value.
|
46
47
|
def scan_token
|
47
|
-
|
48
|
-
scan_comment_line ||
|
49
|
-
scan_comment ||
|
50
|
-
scan_text ||
|
51
|
-
scan_remainder
|
48
|
+
scan_curly || scan_text
|
52
49
|
end
|
53
50
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
# be found at the current position.
|
58
|
-
def scan_reference
|
59
|
-
if value = @scanner.scan(REFERENCE_REGEX)
|
60
|
-
# Return the reference name excluding "{{" and "}}".
|
61
|
-
[:reference, value[2..-3]]
|
51
|
+
def scan_curly
|
52
|
+
if @scanner.scan(CURLY_START)
|
53
|
+
scan_reference_or_comment or syntax_error!
|
62
54
|
end
|
63
55
|
end
|
64
56
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
def scan_comment_line
|
71
|
-
if value = @scanner.scan(COMMENT_LINE_REGEX)
|
72
|
-
# Returns the comment excluding "{{!" and "}}".
|
73
|
-
[:comment_line, value[3..-4]]
|
57
|
+
def scan_reference_or_comment
|
58
|
+
if @scanner.scan(COMMENT_MARKER)
|
59
|
+
scan_comment
|
60
|
+
else
|
61
|
+
scan_reference
|
74
62
|
end
|
75
63
|
end
|
76
64
|
|
77
|
-
# Scans a comment token, if a comment is the next token in the template.
|
78
|
-
#
|
79
|
-
# Returns an Array representing the token, or nil if no comment token can
|
80
|
-
# be found at the current position.
|
81
65
|
def scan_comment
|
82
|
-
if value =
|
83
|
-
|
84
|
-
|
66
|
+
if value = scan_until_end_of_curly
|
67
|
+
[:comment, value]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def scan_reference
|
72
|
+
if value = scan_until_end_of_curly
|
73
|
+
[:reference, value]
|
85
74
|
end
|
86
75
|
end
|
87
76
|
|
88
|
-
# Scans a text token, if a text is the next token in the template.
|
89
|
-
#
|
90
|
-
# Returns an Array representing the token, or nil if no text token can
|
91
|
-
# be found at the current position.
|
92
77
|
def scan_text
|
93
|
-
if value =
|
94
|
-
# Rewind the scanner until before the "{{"
|
78
|
+
if value = scan_until_start_of_curly
|
95
79
|
@scanner.pos -= 2
|
96
|
-
|
97
|
-
|
98
|
-
|
80
|
+
[:text, value]
|
81
|
+
else
|
82
|
+
scan_remainder
|
99
83
|
end
|
100
84
|
end
|
101
85
|
|
@@ -107,5 +91,21 @@ module Curly
|
|
107
91
|
[:text, value]
|
108
92
|
end
|
109
93
|
end
|
94
|
+
|
95
|
+
def scan_until_start_of_curly
|
96
|
+
if value = @scanner.scan_until(CURLY_START)
|
97
|
+
value[0..-3]
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def scan_until_end_of_curly
|
102
|
+
if value = @scanner.scan_until(CURLY_END)
|
103
|
+
value[0..-3]
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def syntax_error!
|
108
|
+
raise SyntaxError.new(@scanner.pos, @scanner.string)
|
109
|
+
end
|
110
110
|
end
|
111
111
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Curly
|
2
|
+
class SyntaxError < StandardError
|
3
|
+
def initialize(position, source)
|
4
|
+
@position, @source = position, source
|
5
|
+
end
|
6
|
+
|
7
|
+
def message
|
8
|
+
start = [@position - 8, 0].max
|
9
|
+
stop = [@position + 8, @source.length].min
|
10
|
+
snippet = @source[start..stop].strip
|
11
|
+
"invalid syntax near `#{snippet}` in template:\n\n#{@source}\n"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/spec/compiler_spec.rb
CHANGED
@@ -108,14 +108,6 @@ describe Curly::Compiler do
|
|
108
108
|
evaluate("HELO{{! I'm a comment, yo }}WORLD").should == "HELOWORLD"
|
109
109
|
end
|
110
110
|
|
111
|
-
it "removes comment lines from the output" do
|
112
|
-
evaluate(<<-CURLY.strip_heredoc).should == "HELO\nWORLD\n"
|
113
|
-
HELO
|
114
|
-
{{! I'm a comment }}
|
115
|
-
WORLD
|
116
|
-
CURLY
|
117
|
-
end
|
118
|
-
|
119
111
|
it "does not execute arbitrary Ruby code" do
|
120
112
|
evaluate('#{foo}').should == '#{foo}'
|
121
113
|
end
|
data/spec/scanner_spec.rb
CHANGED
@@ -15,6 +15,12 @@ describe Curly::Scanner, ".scan" do
|
|
15
15
|
]
|
16
16
|
end
|
17
17
|
|
18
|
+
it "allows references with whitespace" do
|
19
|
+
scan("{{ foo bar}}").should == [
|
20
|
+
[:reference, " foo bar"]
|
21
|
+
]
|
22
|
+
end
|
23
|
+
|
18
24
|
it "scans comments in the source" do
|
19
25
|
scan("foo {{!bar}} baz").should == [
|
20
26
|
[:text, "foo "],
|
@@ -23,11 +29,9 @@ describe Curly::Scanner, ".scan" do
|
|
23
29
|
]
|
24
30
|
end
|
25
31
|
|
26
|
-
it "
|
27
|
-
scan("
|
28
|
-
[:
|
29
|
-
[:comment_line, "bar"],
|
30
|
-
[:text, "baz"]
|
32
|
+
it "allows newlines in comments" do
|
33
|
+
scan("{{!\nfoo\n}}").should == [
|
34
|
+
[:comment, "\nfoo\n"]
|
31
35
|
]
|
32
36
|
end
|
33
37
|
|
@@ -49,6 +53,18 @@ describe Curly::Scanner, ".scan" do
|
|
49
53
|
]
|
50
54
|
end
|
51
55
|
|
56
|
+
it "raises Curly::SyntaxError on unclosed references" do
|
57
|
+
["{{", "{{yolo"].each do |template|
|
58
|
+
expect { scan(template) }.to raise_error(Curly::SyntaxError)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
it "raises Curly::SyntaxError on unclosed comments" do
|
63
|
+
["{{!", "{{! foo bar"].each do |template|
|
64
|
+
expect { scan(template) }.to raise_error(Curly::SyntaxError)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
52
68
|
def scan(source)
|
53
69
|
Curly::Scanner.scan(source)
|
54
70
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Curly::SyntaxError, "#message" do
|
4
|
+
it "includes the context of the error in the message" do
|
5
|
+
source = "I am a very bad error that has snuck in"
|
6
|
+
error = Curly::SyntaxError.new(13, source)
|
7
|
+
|
8
|
+
error.message.should == <<-MESSAGE.strip_heredoc
|
9
|
+
invalid syntax near `a very bad error` in template:
|
10
|
+
|
11
|
+
I am a very bad error that has snuck in
|
12
|
+
MESSAGE
|
13
|
+
end
|
14
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: curly-templates
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-07-
|
12
|
+
date: 2013-07-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: actionpack
|
@@ -123,6 +123,7 @@ files:
|
|
123
123
|
- lib/curly/presenter.rb
|
124
124
|
- lib/curly/railtie.rb
|
125
125
|
- lib/curly/scanner.rb
|
126
|
+
- lib/curly/syntax_error.rb
|
126
127
|
- lib/curly/template_handler.rb
|
127
128
|
- lib/generators/curly/controller/controller_generator.rb
|
128
129
|
- lib/generators/curly/controller/templates/presenter.rb.erb
|
@@ -133,6 +134,7 @@ files:
|
|
133
134
|
- spec/presenter_spec.rb
|
134
135
|
- spec/scanner_spec.rb
|
135
136
|
- spec/spec_helper.rb
|
137
|
+
- spec/syntax_error_spec.rb
|
136
138
|
- spec/template_handler_spec.rb
|
137
139
|
homepage: https://github.com/zendesk/curly
|
138
140
|
licenses:
|
@@ -150,7 +152,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
150
152
|
version: '0'
|
151
153
|
segments:
|
152
154
|
- 0
|
153
|
-
hash:
|
155
|
+
hash: 1896340551249669380
|
154
156
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
157
|
none: false
|
156
158
|
requirements:
|
@@ -168,5 +170,6 @@ test_files:
|
|
168
170
|
- spec/generators/controller_generator_spec.rb
|
169
171
|
- spec/presenter_spec.rb
|
170
172
|
- spec/scanner_spec.rb
|
173
|
+
- spec/syntax_error_spec.rb
|
171
174
|
- spec/template_handler_spec.rb
|
172
175
|
has_rdoc:
|