curly-templates 2.1.1 → 2.2.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 +4 -4
- data/CHANGELOG.md +6 -0
- data/CONTRIBUTING.md +1 -1
- data/README.md +25 -12
- data/curly-templates.gemspec +2 -2
- data/lib/curly.rb +1 -2
- data/lib/curly/parser.rb +1 -1
- data/lib/curly/presenter.rb +25 -8
- data/lib/curly/scanner.rb +1 -2
- data/lib/curly/template_handler.rb +3 -4
- data/spec/template_handler_spec.rb +22 -0
- 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: 00132e15e5f5616e89dcda67d5b0bd6177cdb6a4
|
4
|
+
data.tar.gz: 25d9aecdc4dcfab2d2e04844636a5a1631a74844
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1a43cdcf185be6ee43ebfb6512e7cb16482f3c081ff966fabc5d98169a4de47c87acf91b139a7f7ca26ff4bfd7ca960dfe82236f67cc3956fdcdaa9e3f8ded6
|
7
|
+
data.tar.gz: b2f5cba338b6bf4d275674195f474925acee32680fd4d0f118d181311cbf107a52449c10abec7f7bdae10b0c121194896f4f5dc2e61049d010a15948cbfd7062
|
data/CHANGELOG.md
CHANGED
data/CONTRIBUTING.md
CHANGED
@@ -4,7 +4,7 @@ In order to keep the Curly code base nice and tidy, please observe these best pr
|
|
4
4
|
- Document any unclear things in the code. Even better, don't make the code do unclear things.
|
5
5
|
- Use the coding style already present in the code base.
|
6
6
|
- Make your commit messages precise and to the point. Add a short summary (50 chars max) followed by a blank line and then a longer description, if necessary, e.g.
|
7
|
-
|
7
|
+
|
8
8
|
> Make invalid references raise an exception
|
9
9
|
>
|
10
10
|
> In order to avoid nasty errors when doing stuff, make the Curly compiler
|
data/README.md
CHANGED
@@ -71,13 +71,13 @@ class Posts::CommentPresenter < Curly::Presenter
|
|
71
71
|
presents :comment
|
72
72
|
|
73
73
|
def body
|
74
|
-
|
74
|
+
SafeMarkdown.render(@comment.body)
|
75
75
|
end
|
76
76
|
|
77
77
|
def author_link
|
78
78
|
link_to @comment.author.name, @comment.author, rel: "author"
|
79
79
|
end
|
80
|
-
|
80
|
+
|
81
81
|
def deletion_link
|
82
82
|
link_to "Delete", @comment, method: :delete
|
83
83
|
end
|
@@ -85,7 +85,7 @@ class Posts::CommentPresenter < Curly::Presenter
|
|
85
85
|
def time_ago
|
86
86
|
time_ago_in_words(@comment.created_at)
|
87
87
|
end
|
88
|
-
|
88
|
+
|
89
89
|
def author?
|
90
90
|
@comment.author == current_user
|
91
91
|
end
|
@@ -268,7 +268,7 @@ the template inline. A simple template could look like:
|
|
268
268
|
<b>Name: </b> {{name_field}}<br>
|
269
269
|
<b>E-mail: </b> {{email_field}}<br>
|
270
270
|
{{comment_field}}
|
271
|
-
|
271
|
+
|
272
272
|
{{submit_button}}
|
273
273
|
{{/comment_form}}
|
274
274
|
```
|
@@ -284,7 +284,7 @@ class PostPresenter < Curly::Presenter
|
|
284
284
|
presents :post
|
285
285
|
def title; @post.title; end
|
286
286
|
def body; markdown(@post.body); end
|
287
|
-
|
287
|
+
|
288
288
|
# A context block method *must* take a block argument. The return value
|
289
289
|
# of the method will be used when rendering. Calling the block argument will
|
290
290
|
# render the nested template. If you pass a value when calling the block
|
@@ -292,7 +292,7 @@ class PostPresenter < Curly::Presenter
|
|
292
292
|
def comment_form(&block)
|
293
293
|
form_for(Comment.new, &block)
|
294
294
|
end
|
295
|
-
|
295
|
+
|
296
296
|
# The presenter name is automatically deduced.
|
297
297
|
class CommentFormPresenter < Curly::Presenter
|
298
298
|
# The value passed to the block argument will be passed in a parameter named
|
@@ -404,18 +404,18 @@ a component:
|
|
404
404
|
```ruby
|
405
405
|
class Posts::ShowPresenter < Curly::Presenter
|
406
406
|
presents :post
|
407
|
-
|
407
|
+
|
408
408
|
def title
|
409
409
|
@post.title
|
410
410
|
end
|
411
|
-
|
411
|
+
|
412
412
|
def author_link
|
413
413
|
# You can call any Rails helper from within a presenter instance:
|
414
414
|
link_to author.name, profile_path(author), rel: "author"
|
415
415
|
end
|
416
|
-
|
416
|
+
|
417
417
|
private
|
418
|
-
|
418
|
+
|
419
419
|
# Private methods are not available to the template, so they're safe to
|
420
420
|
# use.
|
421
421
|
def author
|
@@ -464,12 +464,12 @@ class ApplicationLayout < Curly::Presenter
|
|
464
464
|
def title
|
465
465
|
"You can use methods just like in any other presenter!"
|
466
466
|
end
|
467
|
-
|
467
|
+
|
468
468
|
def sidebar
|
469
469
|
# A view can call `content_for(:sidebar) { "some HTML here" }`
|
470
470
|
yield :sidebar
|
471
471
|
end
|
472
|
-
|
472
|
+
|
473
473
|
def body
|
474
474
|
# The view will be rendered and inserted here:
|
475
475
|
yield
|
@@ -584,6 +584,19 @@ class Posts::ShowPresenter < Curly::Presenter
|
|
584
584
|
end
|
585
585
|
```
|
586
586
|
|
587
|
+
In order to set *any* cache option, define a `#cache_options` method that
|
588
|
+
returns a Hash of options:
|
589
|
+
|
590
|
+
```ruby
|
591
|
+
class Posts::ShowPresenter < Curly::Presenter
|
592
|
+
...
|
593
|
+
|
594
|
+
def cache_options
|
595
|
+
{ compress: true, namespace: "my-app" }
|
596
|
+
end
|
597
|
+
end
|
598
|
+
```
|
599
|
+
|
587
600
|
|
588
601
|
### Static Caching
|
589
602
|
|
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 = '2.
|
8
|
-
s.date = '2014-
|
7
|
+
s.version = '2.2.0'
|
8
|
+
s.date = '2014-12-04'
|
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."
|
data/lib/curly.rb
CHANGED
data/lib/curly/parser.rb
CHANGED
data/lib/curly/presenter.rb
CHANGED
@@ -41,7 +41,6 @@ module Curly
|
|
41
41
|
#
|
42
42
|
# context - An ActionView::Base context.
|
43
43
|
# options - A Hash of options given to the presenter.
|
44
|
-
#
|
45
44
|
def initialize(context, options = {})
|
46
45
|
@_context = context
|
47
46
|
options.stringify_keys!
|
@@ -63,7 +62,7 @@ module Curly
|
|
63
62
|
# template is rendered. One use case is to call `content_for` in order
|
64
63
|
# to inject content into other templates, e.g. a layout.
|
65
64
|
#
|
66
|
-
#
|
65
|
+
# Examples
|
67
66
|
#
|
68
67
|
# class Posts::ShowPresenter < Curly::Presenter
|
69
68
|
# presents :post
|
@@ -96,10 +95,26 @@ module Curly
|
|
96
95
|
nil
|
97
96
|
end
|
98
97
|
|
98
|
+
# The options that should be passed to the cache backend when caching the
|
99
|
+
# view. The exact options may vary depending on the backend you're using.
|
100
|
+
#
|
101
|
+
# The most common option is `:expires_in`, which controls the duration of
|
102
|
+
# time that the cached view should be considered fresh. Because it's so
|
103
|
+
# common, you can set that option simply by defining `#cache_duration`.
|
104
|
+
#
|
105
|
+
# Note: if you set the `:expires_in` option through this method, the
|
106
|
+
# `#cache_duration` value will be ignored.
|
107
|
+
#
|
108
|
+
# Returns a Hash.
|
109
|
+
def cache_options
|
110
|
+
{}
|
111
|
+
end
|
112
|
+
|
99
113
|
# The duration that the view should be cached for. Only relevant if
|
100
114
|
# `#cache_key` returns a non nil value.
|
101
115
|
#
|
102
|
-
# If nil, the view will not have an expiration time set.
|
116
|
+
# If nil, the view will not have an expiration time set. See also
|
117
|
+
# `#cache_options` for a more flexible way to set cache options.
|
103
118
|
#
|
104
119
|
# Examples
|
105
120
|
#
|
@@ -173,13 +188,14 @@ module Curly
|
|
173
188
|
end
|
174
189
|
end
|
175
190
|
|
176
|
-
# Whether a component is available to templates rendered with the
|
191
|
+
# Whether a component is available to templates rendered with the
|
192
|
+
# presenter.
|
177
193
|
#
|
178
194
|
# Templates have components which correspond with methods defined on
|
179
195
|
# the presenter. By default, only public instance methods can be
|
180
196
|
# referenced, and any method defined on Curly::Presenter itself cannot be
|
181
|
-
# referenced. This means that methods such as `#cache_key` and #inspect
|
182
|
-
# not available. This is done for safety purposes.
|
197
|
+
# referenced. This means that methods such as `#cache_key` and #inspect
|
198
|
+
# are not available. This is done for safety purposes.
|
183
199
|
#
|
184
200
|
# This policy can be changed by overriding this method in your presenters.
|
185
201
|
#
|
@@ -201,7 +217,7 @@ module Curly
|
|
201
217
|
|
202
218
|
# The set of view paths that the presenter depends on.
|
203
219
|
#
|
204
|
-
#
|
220
|
+
# Examples
|
205
221
|
#
|
206
222
|
# class Posts::ShowPresenter < Curly::Presenter
|
207
223
|
# version 2
|
@@ -241,7 +257,8 @@ module Curly
|
|
241
257
|
@version || 0
|
242
258
|
end
|
243
259
|
|
244
|
-
# The cache key for the presenter class. Includes all dependencies as
|
260
|
+
# The cache key for the presenter class. Includes all dependencies as
|
261
|
+
# well.
|
245
262
|
#
|
246
263
|
# Returns a String cache key.
|
247
264
|
def cache_key
|
data/lib/curly/scanner.rb
CHANGED
@@ -8,7 +8,6 @@ module Curly
|
|
8
8
|
#
|
9
9
|
# The Scanner goes through the template piece by piece, extracting tokens
|
10
10
|
# until the end of the template is reached.
|
11
|
-
#
|
12
11
|
class Scanner
|
13
12
|
CURLY_START = /\{\{/
|
14
13
|
CURLY_END = /\}\}/
|
@@ -27,7 +26,7 @@ module Curly
|
|
27
26
|
#
|
28
27
|
# source - The String source of the template.
|
29
28
|
#
|
30
|
-
#
|
29
|
+
# Examples
|
31
30
|
#
|
32
31
|
# Curly::Scanner.scan("hello {{name}}!")
|
33
32
|
# #=> [[:text, "hello "], [:component, "name"], [:text, "!"]]
|
@@ -27,11 +27,10 @@ class Curly::TemplateHandler
|
|
27
27
|
presenter_key = nil
|
28
28
|
end
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
}
|
30
|
+
cache_options = presenter.cache_options || {}
|
31
|
+
cache_options[:expires_in] ||= presenter.cache_duration
|
33
32
|
|
34
|
-
context.cache([key, presenter_key].compact,
|
33
|
+
context.cache([key, presenter_key].compact, cache_options) do
|
35
34
|
yield
|
36
35
|
end
|
37
36
|
else
|
@@ -7,6 +7,7 @@ describe Curly::TemplateHandler do
|
|
7
7
|
@context = context
|
8
8
|
@cache_key = options.fetch(:cache_key, nil)
|
9
9
|
@cache_duration = options.fetch(:cache_duration, nil)
|
10
|
+
@cache_options = options.fetch(:cache_options, {})
|
10
11
|
end
|
11
12
|
|
12
13
|
def setup!
|
@@ -29,6 +30,10 @@ describe Curly::TemplateHandler do
|
|
29
30
|
@cache_duration
|
30
31
|
end
|
31
32
|
|
33
|
+
def cache_options
|
34
|
+
@cache_options
|
35
|
+
end
|
36
|
+
|
32
37
|
def self.component_available?(method)
|
33
38
|
true
|
34
39
|
end
|
@@ -179,6 +184,23 @@ describe Curly::TemplateHandler do
|
|
179
184
|
context.advance_clock(1)
|
180
185
|
output.should == "FOO"
|
181
186
|
end
|
187
|
+
|
188
|
+
it "passes #cache_options to the cache backend" do
|
189
|
+
context.assigns[:cache_key] = "x"
|
190
|
+
context.assigns[:cache_options] = { expires_in: 42 }
|
191
|
+
|
192
|
+
output.should == "BAR"
|
193
|
+
|
194
|
+
context.stub(:bar) { "FOO" }
|
195
|
+
|
196
|
+
# Cached fragment has not yet expired.
|
197
|
+
context.advance_clock(41)
|
198
|
+
output.should == "BAR"
|
199
|
+
|
200
|
+
# Now it has! Huzzah!
|
201
|
+
context.advance_clock(1)
|
202
|
+
output.should == "FOO"
|
203
|
+
end
|
182
204
|
end
|
183
205
|
|
184
206
|
def output
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: curly-templates
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Schierbeck
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|