stache 1.0.3 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rspec +1 -1
- data/.ruby-version +1 -1
- data/.travis.yml +2 -1
- data/CHANGELOG.md +4 -0
- data/README.md +28 -21
- data/Rakefile +1 -1
- data/lib/stache/asset_helper.rb +2 -4
- data/lib/stache/config.rb +17 -1
- data/lib/stache/handlebars/handler.rb +3 -3
- data/lib/stache/mustache.rb +2 -0
- data/lib/stache/mustache/cached_template.rb +41 -0
- data/lib/stache/mustache/faster_context.rb +21 -0
- data/lib/stache/mustache/handler.rb +31 -19
- data/lib/stache/mustache/layout.rb +1 -1
- data/lib/stache/mustache/view.rb +42 -12
- data/lib/stache/railtie.rb +1 -1
- data/lib/stache/version.rb +1 -1
- data/spec/controllers/stache_controller_spec.rb +40 -1
- data/spec/dummy/config/initializers/secret_token.rb +1 -0
- data/spec/dummy/config/initializers/session_store.rb +1 -1
- data/spec/dummy/config/routes.rb +13 -13
- data/spec/spec_helper.rb +1 -1
- data/spec/stache/asset_helper_spec.rb +55 -5
- data/spec/stache/config_spec.rb +9 -0
- data/spec/stache/handlebars/handlebars_spec.rb +1 -1
- data/spec/stache/mustache/cached_template_spec.rb +27 -0
- data/spec/stache/mustache/handler_spec.rb +2 -2
- data/spec/stache/util_spec.rb +2 -2
- data/stache.gemspec +4 -4
- metadata +35 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 351c235cf203b65a8eacf4a9fcb01b9236eb54e1
|
4
|
+
data.tar.gz: 6540207101f87ff30024205a56c8b308e690280e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 689692a05dcf7dc95b82adac7cfb37cd1b0d91f618277584115baffa5a543bc7f0af4e456e172826b5c5dae398b1c06e25822876c14de7a77835fad706e8af2f
|
7
|
+
data.tar.gz: cfd7331c2b602ac2a777ab3c98f22df598f280a5a25a5b8e7eaef54557b06d7297b07be29134db2a81ba2643125e74cfc31b492a6b37363207f886b443f1e345
|
data/.gitignore
CHANGED
data/.rspec
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
--color
|
2
|
-
--format
|
2
|
+
--format documentation
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-2.
|
1
|
+
ruby-2.1.1
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 1.1.0 (2014-09-05)
|
4
|
+
|
5
|
+
* Overhaul of Stache::Mustache rendering by [@MarkusHarmsen](https://github.com/MarkusHarmsen) brings caching, and with it, 200-300% rendering performance enhancements. Thanks!
|
6
|
+
|
3
7
|
## 1.0.3 (2014-01-14)
|
4
8
|
|
5
9
|
* Access RSpec-assigned instance variables in view classes (Thanks [@kianw](https://github.com/kianw))
|
data/README.md
CHANGED
@@ -1,18 +1,16 @@
|
|
1
1
|
# stache
|
2
2
|
|
3
|
-
A Rails 3.x compatible Mustache/Handlebars
|
3
|
+
A Rails 3.x and Rails 4.x compatible Mustache/Handlebars template handler, with support for partials and a couple extra niceties to make sharing the raw templates with client-side javascript a little easier. It's a one-stop shop for your facial-hair-inspired templates.
|
4
4
|
|
5
5
|
[![Build Status](https://secure.travis-ci.org/agoragames/stache.png)](http://travis-ci.org/agoragames/stache)
|
6
6
|
|
7
|
-
## 1.
|
7
|
+
## Mustache template caching is in 1.1+
|
8
8
|
|
9
|
-
|
9
|
+
I'm investigating whether or not this is something that can be/needs to be ported to handlebars.
|
10
10
|
|
11
|
-
|
11
|
+
## Rails 4 Support is in 1.0.3+
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
Stache 0.9.x adds handlebars support. In the process, the public API has changed *ever-so-slightly*. Specifically, you'll need to require the mustache or handlebars gems on your own, **and** you'll need to tell Stache which one (or both!) you want to use. Add `config.use :mustache` to your initializer.
|
13
|
+
If you want Rails 4, you'll have to use 1.0.3.
|
16
14
|
|
17
15
|
## Usage
|
18
16
|
|
@@ -23,21 +21,34 @@ Install the gem. If you want to override any of the configuration options (see `
|
|
23
21
|
|
24
22
|
```ruby
|
25
23
|
Stache.configure do |c|
|
26
|
-
|
27
|
-
|
24
|
+
# This is probably the one you'll want to change
|
25
|
+
# it defaults to app/templates
|
26
|
+
c.template_base_path = "..."
|
28
27
|
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
# This lets you indicate the name of a module that
|
29
|
+
# namespaces all your view classes, useful, if you
|
30
|
+
# have a naming conflict, such as with a mailer
|
31
|
+
c.wrapper_module_name = "..."
|
32
32
|
|
33
33
|
# N.B. YOU MUST TELL STACHE WHICH TO USE:
|
34
34
|
c.use :mustache
|
35
35
|
# and / or
|
36
36
|
c.use :handlebars
|
37
|
+
|
38
|
+
# Set it to true if template path should be included in
|
39
|
+
# script's id tag as a underscored prefix. It can be
|
40
|
+
# overwritten by an id param in `#template_include_tag`.
|
41
|
+
c.include_path_in_id = false
|
42
|
+
|
43
|
+
# Caching (new in 1.1.0, Mustache-only for now)
|
44
|
+
# Any ActiveSupport::Cache should work fine.
|
45
|
+
# If you enable this in development, you will lose automagical template reloading!
|
46
|
+
c.template_cache = ActiveSupport::Cache::MemoryStore.new if Rails.env.production?
|
37
47
|
end
|
38
48
|
|
39
49
|
# or if the block style ain't yer thang, just:
|
40
50
|
Stache.template_base_path = File.join(Rails.root, "app", "şablon")
|
51
|
+
Stache.template_cache = ActiveSupport::Cache::MemoryStore.new if Rails.env.production?
|
41
52
|
```
|
42
53
|
|
43
54
|
There is as of right now one provided helper, `template_include_tag`. Give it the name of a partial and it will write it raw to a script block.
|
@@ -94,8 +105,8 @@ You can subclass `Stache::Handlebars::View` in the same way as mustache above, b
|
|
94
105
|
|
95
106
|
## View Specs
|
96
107
|
|
97
|
-
Yes, you can write view specs using RSpec for your Stache templates! You can use RSpec's `assign` method to
|
98
|
-
assign values to view instance variables, which will then be be available to the Stache view, either as
|
108
|
+
Yes, you can write view specs using RSpec for your Stache templates! You can use RSpec's `assign` method to
|
109
|
+
assign values to view instance variables, which will then be be available to the Stache view, either as
|
99
110
|
instance variables, or via an accessor. Any instance variables defined in the RSpec example will also be
|
100
111
|
similarly available, so
|
101
112
|
|
@@ -144,12 +155,6 @@ View:
|
|
144
155
|
|
145
156
|
This is code that was ripped out of a research project. It probably has some rough edges.
|
146
157
|
|
147
|
-
TODO:
|
148
|
-
|
149
|
-
* more and better integration tests
|
150
|
-
* automated tests across different rails versions
|
151
|
-
* other helpers, etc, as desired
|
152
|
-
|
153
158
|
## Thanks to
|
154
159
|
|
155
160
|
This project builds on work done by the following people and projects:
|
@@ -172,8 +177,10 @@ So: thanks a ton to those guys.
|
|
172
177
|
* [zombor](https://github.com/zombor) contributed an overhaul to the Mustache renderer that puts Mustache classes themselves in control of the render chain, not Rails.
|
173
178
|
* [kategengler](https://github.com/kategengler) contributed a patch to allow folks to specify a namespace for their view objects.
|
174
179
|
* [joker1007](https://github.com/joker1007) contributed a patch making the autoload paths setup more broadly compatible.
|
180
|
+
* [kianw](https://github.com/kianw) contributed a patch making RSpec a little easier to use.
|
181
|
+
* [MarkusHarmsen](https://github.com/MarkusHarmsen) added Mustache caching, leading to HUGE performance increases. Thanks!
|
175
182
|
|
176
|
-
Thanks a ton to all of the contributors
|
183
|
+
Thanks a ton to all of the contributors, equally. This would never have grown beyond a mediocre tool that rendered partials without their help!
|
177
184
|
|
178
185
|
## Note on Patches/Pull Requests
|
179
186
|
|
data/Rakefile
CHANGED
data/lib/stache/asset_helper.rb
CHANGED
@@ -14,10 +14,8 @@ module Stache
|
|
14
14
|
end
|
15
15
|
|
16
16
|
template = template_finder.call(true) rescue template_finder.call(false)
|
17
|
-
template_id = source.split("/").last
|
18
|
-
|
19
|
-
options = options.reverse_merge(:type => "text/html", :id => "#{template_id.dasherize.underscore}_template")
|
20
|
-
content_tag(:script, template.source.html_safe, options)
|
17
|
+
template_id = (Stache.include_path_in_id) ? source.gsub("/", '_') : source.to_s.split("/").last
|
18
|
+
content_tag(:script, template.source.html_safe, options.reverse_merge(type: 'text/html', id: template_id.dasherize.underscore))
|
21
19
|
|
22
20
|
end.join("\n").html_safe
|
23
21
|
end
|
data/lib/stache/config.rb
CHANGED
@@ -11,7 +11,7 @@ module Stache
|
|
11
11
|
# use :mustache # or :handlebars
|
12
12
|
# end
|
13
13
|
module Config
|
14
|
-
attr_accessor :template_base_path, :shared_path, :wrapper_module_name
|
14
|
+
attr_accessor :template_base_path, :shared_path, :wrapper_module_name, :include_path_in_id, :template_cache
|
15
15
|
|
16
16
|
def configure
|
17
17
|
yield self
|
@@ -33,6 +33,22 @@ module Stache
|
|
33
33
|
@wrapper_module_name ||= nil
|
34
34
|
end
|
35
35
|
|
36
|
+
def include_path_in_id
|
37
|
+
@include_path_in_id ||= false
|
38
|
+
end
|
39
|
+
|
40
|
+
def include_path_in_id= boolean
|
41
|
+
@include_path_in_id = boolean
|
42
|
+
end
|
43
|
+
|
44
|
+
def template_cache
|
45
|
+
@template_cache ||= ActiveSupport::Cache::NullStore.new
|
46
|
+
end
|
47
|
+
|
48
|
+
def template_cache= cache
|
49
|
+
@template_cache = cache
|
50
|
+
end
|
51
|
+
|
36
52
|
def use template_engine
|
37
53
|
require "stache/#{template_engine}"
|
38
54
|
end
|
@@ -34,11 +34,11 @@ module Stache
|
|
34
34
|
content_for(:layout)
|
35
35
|
end
|
36
36
|
|
37
|
-
template = handlebars.compile('#{template.source.gsub(/'/, "\\\\'")}')
|
37
|
+
template = handlebars.compile('#{template.source.gsub(/'/, "\\\\'")}')
|
38
38
|
vars = {}
|
39
39
|
partial_renderer = PartialRenderer.new(lookup_context)
|
40
40
|
vars.merge!(@_assigns)
|
41
|
-
vars.merge!(
|
41
|
+
vars.merge!(local_assigns || {})
|
42
42
|
options = partial_renderer.instance_variable_get('@options')
|
43
43
|
vars.merge!(options[:context] || {}) if options
|
44
44
|
|
@@ -46,7 +46,7 @@ module Stache
|
|
46
46
|
search_path = '#{template.virtual_path}'.split("/")[0..-2]
|
47
47
|
file = (search_path + [name]).join("/")
|
48
48
|
finder = lambda do |partial|
|
49
|
-
self.lookup_context.find(file, [], partial, [], {:
|
49
|
+
self.lookup_context.find(file, [], partial, [], {formats: [:html]})
|
50
50
|
end
|
51
51
|
template = finder.call(false) rescue finder.call(true)
|
52
52
|
|
data/lib/stache/mustache.rb
CHANGED
@@ -0,0 +1,41 @@
|
|
1
|
+
module Stache
|
2
|
+
module Mustache
|
3
|
+
#
|
4
|
+
# Extend the Mustache::Template class to support dumping/loading.
|
5
|
+
# This is not possible by the original class since it uses a singleton class.
|
6
|
+
#
|
7
|
+
class CachedTemplate < ::Mustache::Template
|
8
|
+
|
9
|
+
#
|
10
|
+
# Init with uncompiled "source" and "compiled_source" if given.
|
11
|
+
#
|
12
|
+
def initialize(source, compiled_source = nil)
|
13
|
+
super(source)
|
14
|
+
@compiled_source = compiled_source
|
15
|
+
end
|
16
|
+
|
17
|
+
#
|
18
|
+
# Compiles the source, but uses the already compiled version if
|
19
|
+
# present.
|
20
|
+
#
|
21
|
+
def compile(src = @source)
|
22
|
+
@compiled_source || (@compiled_source = super(src))
|
23
|
+
end
|
24
|
+
|
25
|
+
#
|
26
|
+
# Store the template by returning the compiled_source
|
27
|
+
#
|
28
|
+
def _dump(level)
|
29
|
+
compile
|
30
|
+
end
|
31
|
+
|
32
|
+
#
|
33
|
+
# Restore object by simply setting the compiled_source
|
34
|
+
#
|
35
|
+
def self._load(compiled_source)
|
36
|
+
new(nil, compiled_source)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Stache
|
2
|
+
module Mustache
|
3
|
+
class FasterContext < ::Mustache::Context
|
4
|
+
|
5
|
+
def partial(name, indentation = nil)
|
6
|
+
# Look for the first Mustache in the stack.
|
7
|
+
mustache = mustache_in_stack
|
8
|
+
|
9
|
+
# Do NOT indent the partial template by the given indentation.
|
10
|
+
part = mustache.partial(name)
|
11
|
+
|
12
|
+
# If we already have a template, to not convert it into a string
|
13
|
+
part = part.to_s unless part.is_a?(::Mustache::Template)
|
14
|
+
|
15
|
+
# Call the Mustache's `partial` method and render the result.
|
16
|
+
mustache.render(part, self)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -23,30 +23,22 @@ module Stache
|
|
23
23
|
# system.
|
24
24
|
|
25
25
|
template_is_class = template.source.match(/module/) ? true : false
|
26
|
+
virtual_path = template.virtual_path.to_s
|
27
|
+
|
28
|
+
# Caching key
|
29
|
+
template_id = "#{template.identifier.to_s}#{template.updated_at.to_i}"
|
26
30
|
|
27
31
|
# Return a string that will be eval'd in the context of the ActionView, ugly, but it works.
|
28
32
|
<<-MUSTACHE
|
29
33
|
mustache = ::#{mustache_class}.new
|
30
34
|
mustache.view = self
|
31
35
|
|
32
|
-
|
33
|
-
template_name = "#{template.virtual_path.to_s}"
|
34
|
-
file = Dir.glob(File.join(::Stache.template_base_path, template_name + "\.*" + mustache.template_extension)).first
|
35
|
-
template_source = File.read(file)
|
36
|
-
else
|
37
|
-
template_source = '#{template.source.gsub(/'/, "\\\\'")}'
|
38
|
-
end
|
39
|
-
|
40
|
-
mustache.template = template_source
|
41
|
-
mustache.virtual_path = '#{template.virtual_path.to_s}'
|
36
|
+
mustache.virtual_path = '#{virtual_path}'
|
42
37
|
mustache[:yield] = content_for(:layout)
|
43
38
|
mustache.context.update(local_assigns)
|
44
|
-
variables = controller.
|
45
|
-
variables
|
46
|
-
|
47
|
-
if controller.respond_to?(:protected_instance_variables)
|
48
|
-
variables -= controller.protected_instance_variables
|
49
|
-
end
|
39
|
+
variables = controller.instance_variables
|
40
|
+
variables.delete(:@template)
|
41
|
+
variables -= controller.class.protected_instance_variables.to_a
|
50
42
|
|
51
43
|
variables.each do |name|
|
52
44
|
mustache.instance_variable_set(name, controller.instance_variable_get(name))
|
@@ -59,11 +51,31 @@ module Stache
|
|
59
51
|
|
60
52
|
# Declaring an +attr_reader+ for each instance variable in the
|
61
53
|
# Stache::Mustache::View subclass makes them available to your templates.
|
62
|
-
mustache.
|
63
|
-
attr_reader *variables.map { |name| name.sub(/^@/, '').to_sym }
|
54
|
+
mustache.singleton_class.class_eval do
|
55
|
+
attr_reader *variables.map { |name| name.to_s.sub(/^@/, '').to_sym }
|
56
|
+
end
|
57
|
+
|
58
|
+
# Try to get template from cache, otherwise use template source
|
59
|
+
template_cached = ::Stache.template_cache.read(:'#{template_id}', :namespace => :templates, :raw => true)
|
60
|
+
mustache.template = template_cached || Stache::Mustache::CachedTemplate.new(
|
61
|
+
if #{template_is_class}
|
62
|
+
template_name = "#{virtual_path}"
|
63
|
+
file = Dir.glob(File.join(::Stache.template_base_path, template_name + "\.*" + mustache.template_extension)).first
|
64
|
+
File.read(file)
|
65
|
+
else
|
66
|
+
'#{template.source.gsub(/'/, "\\\\'")}'
|
67
|
+
end
|
68
|
+
)
|
69
|
+
|
70
|
+
# Render - this will also compile the template
|
71
|
+
compiled = mustache.render.html_safe
|
72
|
+
|
73
|
+
# Store the now compiled template
|
74
|
+
unless template_cached
|
75
|
+
::Stache.template_cache.write(:'#{template_id}', mustache.template, :namespace => :templates, :raw => true)
|
64
76
|
end
|
65
77
|
|
66
|
-
|
78
|
+
compiled
|
67
79
|
MUSTACHE
|
68
80
|
end
|
69
81
|
|
@@ -24,7 +24,7 @@ module Stache
|
|
24
24
|
# stick that rendered template as :yield into the layout template
|
25
25
|
# (which will be combined with the current context)
|
26
26
|
if (!ctx.is_a?(::Mustache::Context))
|
27
|
-
rendered_template = super(layout_template, :
|
27
|
+
rendered_template = super(layout_template, yield: rendered_template)
|
28
28
|
end
|
29
29
|
|
30
30
|
rendered_template
|
data/lib/stache/mustache/view.rb
CHANGED
@@ -5,7 +5,12 @@ module Stache
|
|
5
5
|
#
|
6
6
|
# A Convienent Base Class for the views. Subclass this for autoloading magic with your templates.
|
7
7
|
class View < ::Mustache
|
8
|
-
attr_accessor :view, :
|
8
|
+
attr_accessor :view, :virtual_path
|
9
|
+
|
10
|
+
def context
|
11
|
+
# Use the faster context instead of the original mustache one
|
12
|
+
@context ||= FasterContext.new(self)
|
13
|
+
end
|
9
14
|
|
10
15
|
def method_missing(method, *args, &block)
|
11
16
|
view.send(method, *args, &block)
|
@@ -15,21 +20,36 @@ module Stache
|
|
15
20
|
super(method, include_private) || view.respond_to?(method, include_private)
|
16
21
|
end
|
17
22
|
|
23
|
+
def virtual_path=(path)
|
24
|
+
@virtual_path = path
|
25
|
+
#
|
26
|
+
# Since the addition to the lookup_context only depends on the virtual_path,
|
27
|
+
# do it here instead of inside the partial.
|
28
|
+
#
|
29
|
+
current_dir = Stache.template_base_path.join(path.split("/")[0..-2].join("/"))
|
30
|
+
lookup_context.view_paths << current_dir unless lookup_context.view_paths.include?(current_dir)
|
31
|
+
end
|
32
|
+
|
18
33
|
# Redefine where Stache::View templates locate their partials
|
19
34
|
def partial(name)
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
35
|
+
cache_key = :"#{virtual_path}/#{name}"
|
36
|
+
|
37
|
+
# Try to resolve template from cache
|
38
|
+
template_cached = ::Stache.template_cache.read(cache_key, :namespace => :partials, :raw => true)
|
39
|
+
curr_template = template_cached || Stache::Mustache::CachedTemplate.new(
|
40
|
+
begin # Try to resolve the partial template
|
41
|
+
template_finder(name, true)
|
42
|
+
rescue ActionView::MissingTemplate
|
43
|
+
template_finder(name, false)
|
44
|
+
end.source
|
45
|
+
)
|
46
|
+
|
47
|
+
# Store the template
|
48
|
+
unless template_cached
|
49
|
+
::Stache.template_cache.write(cache_key, curr_template, :namespace => :partials, :raw => true)
|
29
50
|
end
|
30
51
|
|
31
|
-
|
32
|
-
template.source
|
52
|
+
curr_template
|
33
53
|
end
|
34
54
|
|
35
55
|
def helpers
|
@@ -43,6 +63,16 @@ module Stache
|
|
43
63
|
end
|
44
64
|
alias :h :helpers
|
45
65
|
end
|
66
|
+
|
67
|
+
protected
|
68
|
+
def template_finder(name, partial)
|
69
|
+
if ActionPack::VERSION::MAJOR == 3 && ActionPack::VERSION::MINOR < 2
|
70
|
+
lookup_context.find(name, [], partial)
|
71
|
+
else # Rails 3.2 and higher
|
72
|
+
lookup_context.find(name, [], partial, [], { formats: [:html], handlers: [:mustache] })
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
46
76
|
end
|
47
77
|
end
|
48
78
|
end
|
data/lib/stache/railtie.rb
CHANGED
data/lib/stache/version.rb
CHANGED
@@ -52,7 +52,7 @@ describe StacheController do
|
|
52
52
|
response.body.should == "Wrap\nThis is wrapped in a layout\n\nEndWrap\n"
|
53
53
|
end
|
54
54
|
|
55
|
-
it "can get render a mustache with rails helpers", :
|
55
|
+
it "can get render a mustache with rails helpers", type: :stache do
|
56
56
|
get :helper
|
57
57
|
assert_response 200
|
58
58
|
|
@@ -81,4 +81,43 @@ describe StacheController do
|
|
81
81
|
Stache.wrapper_module_name = nil
|
82
82
|
end
|
83
83
|
end
|
84
|
+
|
85
|
+
describe "cache usage" do
|
86
|
+
before do
|
87
|
+
Stache.template_cache = ActiveSupport::Cache::MemoryStore.new
|
88
|
+
end
|
89
|
+
|
90
|
+
it "fills the cache" do
|
91
|
+
get :index
|
92
|
+
get :index # Render a second time
|
93
|
+
Stache.template_cache.instance_variable_get(:@data).size.should eq(1) # But should only contain one element
|
94
|
+
end
|
95
|
+
|
96
|
+
it "fills the cache" do
|
97
|
+
get :with_partials
|
98
|
+
get :with_partials # Render a second time
|
99
|
+
Stache.template_cache.instance_variable_get(:@data).size.should eq(2) # But should only contain two elements (one for template, one for the partial)
|
100
|
+
end
|
101
|
+
|
102
|
+
it "uses the cache" do
|
103
|
+
get :with_partials
|
104
|
+
|
105
|
+
# Setup fake template
|
106
|
+
template = Stache::Mustache::CachedTemplate.new("foo")
|
107
|
+
template.compile
|
108
|
+
|
109
|
+
# Get first entry and manipulate it to be the fake template
|
110
|
+
key = Stache.template_cache.instance_variable_get(:@data).keys.last
|
111
|
+
Stache.template_cache.write(key, template, :raw => true)
|
112
|
+
|
113
|
+
# Now check response if it is the fake template
|
114
|
+
get :with_partials
|
115
|
+
assert_response 200
|
116
|
+
response.body.should == "foo"
|
117
|
+
end
|
118
|
+
|
119
|
+
after do
|
120
|
+
Stache.template_cache = ActiveSupport::Cache::NullStore.new
|
121
|
+
end
|
122
|
+
end
|
84
123
|
end
|
@@ -5,3 +5,4 @@
|
|
5
5
|
# Make sure the secret is at least 30 characters and all random,
|
6
6
|
# no regular words or you'll be exposed to dictionary attacks.
|
7
7
|
Dummy::Application.config.secret_token = '63d476c32606ceb52290e05ef316ea4d0fa558de3bc1ea83b4182a7c030a28b2f8b0111b7b3e3cf6bbdf43c03c7dd7f7fad555cfe11c56c2d23276e16873eaa0'
|
8
|
+
Dummy::Application.config.secret_key_base = '63d476c32606ceb52290e05ef316ea4d0fa558de3bc1ea83b4182a7c030a28b2f8b0111b7b3e3cf6bbdf43c03c7dd7f7fad555cfe11c56c2d23276e16873eaa0'
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# Be sure to restart your server when you modify this file.
|
2
2
|
|
3
|
-
Dummy::Application.config.session_store :cookie_store, :
|
3
|
+
Dummy::Application.config.session_store :cookie_store, key: '_dummy_session'
|
4
4
|
|
5
5
|
# Use the database for sessions instead of the cookie-based default,
|
6
6
|
# which shouldn't be used to store highly confidential information
|
data/spec/dummy/config/routes.rb
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
Dummy::Application.routes.draw do
|
2
|
-
get 'stache', :
|
2
|
+
get 'stache', to: 'stache#index', as: 'stache'
|
3
3
|
|
4
|
-
get 'stache/with_layout', :
|
4
|
+
get 'stache/with_layout', to: 'stache#with_layout'
|
5
5
|
|
6
|
-
get 'stache/helper', :
|
6
|
+
get 'stache/helper', to: 'stache#helper'
|
7
7
|
|
8
|
-
get 'stache/with_partials', :
|
8
|
+
get 'stache/with_partials', to: 'stache#with_partials'
|
9
9
|
|
10
|
-
get 'stache/with_asset_helpers', :
|
10
|
+
get 'stache/with_asset_helpers', to: 'stache#with_asset_helpers'
|
11
11
|
|
12
|
-
get 'stache/with_wrapper', :
|
12
|
+
get 'stache/with_wrapper', to: 'stache#with_wrapper'
|
13
13
|
|
14
|
-
get 'stache/no_format_in_extension', :
|
14
|
+
get 'stache/no_format_in_extension', to: 'stache#no_format_in_extension'
|
15
15
|
|
16
|
-
get 'stache/no_format_in_extension_with_wrapper', :
|
16
|
+
get 'stache/no_format_in_extension_with_wrapper', to: 'stache#no_format_in_extension_with_wrapper'
|
17
17
|
|
18
|
-
get 'handlebars', :
|
18
|
+
get 'handlebars', to: 'handlebars#index', as: 'handlebars'
|
19
19
|
|
20
|
-
get 'handlebars/with_partials', :
|
20
|
+
get 'handlebars/with_partials', to: 'handlebars#with_partials'
|
21
21
|
|
22
|
-
get 'handlebars/with_helpers', :
|
22
|
+
get 'handlebars/with_helpers', to: 'handlebars#with_helpers'
|
23
23
|
|
24
|
-
get 'handlebars/with_missing_data', :
|
24
|
+
get 'handlebars/with_missing_data', to: 'handlebars#with_missing_data'
|
25
25
|
|
26
|
-
get 'handlebars/with_wrapper', :
|
26
|
+
get 'handlebars/with_wrapper', to: 'handlebars#with_wrapper'
|
27
27
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -39,28 +39,78 @@ describe Stache::AssetHelper do
|
|
39
39
|
it "renders a script tag with the template contents" do
|
40
40
|
helper.lookup_context.should_receive(:find).with('widgets/oh_herro', [], true, [], anything).and_return(TemplateStub.new("{{ awyeah }}"))
|
41
41
|
|
42
|
-
helper.template_include_tag("widgets/oh_herro").should == "<script id=\"
|
42
|
+
helper.template_include_tag("widgets/oh_herro").should == "<script id=\"oh_herro\" type=\"text/html\">{{ awyeah }}</script>"
|
43
|
+
end
|
44
|
+
it "renders a script tag with the template contents for the passed in symbol" do
|
45
|
+
helper.lookup_context.should_receive(:find).with(:oh_herro, [], true, [], anything).and_return(TemplateStub.new("{{ awyeah }}"))
|
46
|
+
|
47
|
+
helper.template_include_tag(:oh_herro).should == "<script id=\"oh_herro\" type=\"text/html\">{{ awyeah }}</script>"
|
48
|
+
end
|
49
|
+
it "renders a script tag with the template contents for the passed in symbols" do
|
50
|
+
helper.lookup_context.should_receive(:find).with(:oh_herro, [], true, [], anything).and_return(TemplateStub.new("{{ awyeah }}"))
|
51
|
+
helper.lookup_context.should_receive(:find).with(:oh_hai, [], true, [], anything).and_return(TemplateStub.new("{{ awyes }}"))
|
52
|
+
|
53
|
+
helper.template_include_tag(:oh_herro, :oh_hai).should == "<script id=\"oh_herro\" type=\"text/html\">{{ awyeah }}</script>\n<script id=\"oh_hai\" type=\"text/html\">{{ awyes }}</script>"
|
43
54
|
end
|
44
55
|
it "renders a script tag with the template contents and given id" do
|
45
56
|
helper.lookup_context.should_receive(:find).with('widgets/oh_herro', [], true, [], anything).and_return(TemplateStub.new("{{ awyeah }}"))
|
46
57
|
|
47
|
-
helper.template_include_tag("widgets/oh_herro", :
|
58
|
+
helper.template_include_tag("widgets/oh_herro", id: 'oh_herro_tmpl').should == "<script id=\"oh_herro_tmpl\" type=\"text/html\">{{ awyeah }}</script>"
|
48
59
|
end
|
49
60
|
it "renders a script tag with the template contents and given options" do
|
50
61
|
helper.lookup_context.should_receive(:find).with('widgets/oh_herro', [], true, [], anything).and_return(TemplateStub.new("{{ awyeah }}"))
|
51
62
|
|
52
|
-
helper.template_include_tag("widgets/oh_herro", :
|
53
|
-
should == "<script data-engine=\"mustache\" id=\"
|
63
|
+
helper.template_include_tag("widgets/oh_herro", data: {engine: 'mustache'}).
|
64
|
+
should == "<script data-engine=\"mustache\" id=\"oh_herro\" type=\"text/html\">{{ awyeah }}</script>"
|
54
65
|
end
|
55
66
|
it "will find first by partial and later by non-partial" do
|
56
67
|
helper.lookup_context.should_receive(:find).with('widgets/oh_herro', anything, true, anything, anything).and_raise(StandardError.new("noooooo"))
|
57
68
|
helper.lookup_context.should_receive(:find).with('widgets/oh_herro', anything, false, anything, anything).and_return(TemplateStub.new("{{ awyeah }}"))
|
58
69
|
|
59
|
-
helper.template_include_tag("widgets/oh_herro").should == "<script id=\"
|
70
|
+
helper.template_include_tag("widgets/oh_herro").should == "<script id=\"oh_herro\" type=\"text/html\">{{ awyeah }}</script>"
|
60
71
|
end
|
61
72
|
it "raises if it cannot find the template" do
|
62
73
|
lambda { helper.template_include_tag("arrrgh") }.should raise_error(ActionView::MissingTemplate)
|
63
74
|
end
|
75
|
+
|
76
|
+
context "when config.include_path_in_id is set to true" do
|
77
|
+
before do
|
78
|
+
Stache.include_path_in_id = true
|
79
|
+
|
80
|
+
helper.lookup_context.should_receive(:find)
|
81
|
+
.with(nested_path, [], true, [], anything)
|
82
|
+
.and_return(TemplateStub.new("{{ awyeah }}"))
|
83
|
+
end
|
84
|
+
|
85
|
+
after do
|
86
|
+
Stache.include_path_in_id = false
|
87
|
+
end
|
88
|
+
|
89
|
+
let(:nested_path) { 'nested/path/to/oh_herro' }
|
90
|
+
|
91
|
+
it "renders a script tag id with template path included (underscored)" do
|
92
|
+
helper.template_include_tag(nested_path)
|
93
|
+
.should == "<script id=\"nested_path_to_oh_herro\" type=\"text/html\">{{ awyeah }}</script>"
|
94
|
+
end
|
95
|
+
|
96
|
+
context "when template_base_path is set" do
|
97
|
+
before do
|
98
|
+
Stache.template_base_path = 'widgets/'
|
99
|
+
end
|
100
|
+
|
101
|
+
it "renders a script tag id without a template path included" do
|
102
|
+
helper.template_include_tag(nested_path)
|
103
|
+
.should == "<script id=\"nested_path_to_oh_herro\" type=\"text/html\">{{ awyeah }}</script>"
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
context "when id option is set" do
|
108
|
+
it "renders a script tag with given id and without a full path" do
|
109
|
+
helper.template_include_tag(nested_path, id: 'oh_herro_tmpl')
|
110
|
+
.should == "<script id=\"oh_herro_tmpl\" type=\"text/html\">{{ awyeah }}</script>"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
64
114
|
end
|
65
115
|
|
66
116
|
|
data/spec/stache/config_spec.rb
CHANGED
@@ -28,6 +28,15 @@ describe "Stache::Config" do
|
|
28
28
|
it "sets a default value for wrapper_module_name" do
|
29
29
|
Stache.send(:wrapper_module_name).should be_nil
|
30
30
|
end
|
31
|
+
|
32
|
+
it "sets up an attribute named include_path_in_id" do
|
33
|
+
attr = :include_path_in_id
|
34
|
+
should_set_up_attr_accessor_for(attr)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "sets a default value for include_path_in_id" do
|
38
|
+
Stache.send(:include_path_in_id).should be false
|
39
|
+
end
|
31
40
|
end
|
32
41
|
|
33
42
|
describe ".configure" do
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Stache::Handlebars::Handler do
|
4
4
|
before do
|
5
|
-
@template = ActionView::Template.new("{{body}}", "hello handlebars", Stache::Handlebars::Handler, { :
|
5
|
+
@template = ActionView::Template.new("{{body}}", "hello handlebars", Stache::Handlebars::Handler, { virtual_path: "hello_world"})
|
6
6
|
@handler = Stache::Handlebars::Handler.new
|
7
7
|
end
|
8
8
|
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Stache::Mustache::CachedTemplate do
|
4
|
+
before do
|
5
|
+
@source = "{{hello}} mustache"
|
6
|
+
@template = Stache::Mustache::CachedTemplate.new(@source)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "can be dumped when compiled" do
|
10
|
+
@template.compile
|
11
|
+
dump = Marshal.dump(@template)
|
12
|
+
dump.should =~ /ctx\[:hello\]/
|
13
|
+
dump.should =~ /mustache/
|
14
|
+
end
|
15
|
+
|
16
|
+
it "can be loaded from valid dump" do
|
17
|
+
@template.compile
|
18
|
+
obj = Marshal.load(Marshal.dump(@template))
|
19
|
+
obj.compile.should eq(@template.compile)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should ignore source if already compiled" do
|
23
|
+
res = @template.compile
|
24
|
+
res2 = @template.compile("{{foo}} bar")
|
25
|
+
res.should eq(res2)
|
26
|
+
end
|
27
|
+
end
|
@@ -3,10 +3,10 @@ require 'spec_helper'
|
|
3
3
|
describe Stache::Mustache::Handler do
|
4
4
|
# ERBHandler = ActionView::Template::Handlers::ERB.new
|
5
5
|
# def new_template(body = "<%= hello %>", details = {})
|
6
|
-
# ActionView::Template.new(body, "hello template", ERBHandler, {:
|
6
|
+
# ActionView::Template.new(body, "hello template", ERBHandler, {virtual_path: "hello"}.merge!(details))
|
7
7
|
# end
|
8
8
|
before do
|
9
|
-
@template = ActionView::Template.new("{{body}}", "hello mustache", Stache::Mustache::Handler, { :
|
9
|
+
@template = ActionView::Template.new("{{body}}", "hello mustache", Stache::Mustache::Handler, { virtual_path: "hello_world"})
|
10
10
|
@handler = Stache::Mustache::Handler.new
|
11
11
|
end
|
12
12
|
|
data/spec/stache/util_spec.rb
CHANGED
@@ -10,8 +10,8 @@ describe Stache::Util do
|
|
10
10
|
Stache::Util.av_template_class("Foo").should == ActionView::TemplateFoo
|
11
11
|
end
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
describe ".needs_compilable?" do
|
15
|
-
|
15
|
+
skip "need to figure out some way to test this across different rails versions..."
|
16
16
|
end
|
17
17
|
end
|
data/stache.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.authors = ['Matt Wilson']
|
9
9
|
s.email = 'mhw@hypomodern.com'
|
10
10
|
s.homepage = 'http://github.com/agoragames/stache'
|
11
|
-
s.summary = %Q{
|
12
|
-
s.description = %Q{A
|
11
|
+
s.summary = %Q{A Rails 3.x and Rails 4.x compatible Mustache/Handlebars template handler}
|
12
|
+
s.description = %Q{A Rails 3.x and Rails 4.x compatible Mustache/Handlebars template handler}
|
13
13
|
s.license = 'MIT'
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
'LICENSE',
|
@@ -28,8 +28,8 @@ Gem::Specification.new do |s|
|
|
28
28
|
s.add_development_dependency 'mustache'
|
29
29
|
s.add_development_dependency 'handlebars', '~>0.4.0'
|
30
30
|
s.add_development_dependency 'rails', '~>4.0.0'
|
31
|
-
s.add_development_dependency 'rspec'
|
32
|
-
s.add_development_dependency 'rspec-rails'
|
31
|
+
s.add_development_dependency 'rspec', '~>2.99.0'
|
32
|
+
s.add_development_dependency 'rspec-rails', '~>2.99.0'
|
33
33
|
s.add_development_dependency 'bundler'
|
34
34
|
s.add_development_dependency 'rake'
|
35
35
|
end
|
metadata
CHANGED
@@ -1,114 +1,114 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stache
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Wilson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mustache
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: handlebars
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - ~>
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 0.4.0
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.4.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rails
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - ~>
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 4.0.0
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ~>
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 4.0.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 2.99.0
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 2.99.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec-rails
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: 2.99.0
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
82
|
+
version: 2.99.0
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: bundler
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rake
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
-
description: A
|
111
|
+
description: A Rails 3.x and Rails 4.x compatible Mustache/Handlebars template handler
|
112
112
|
email: mhw@hypomodern.com
|
113
113
|
executables: []
|
114
114
|
extensions: []
|
@@ -116,12 +116,12 @@ extra_rdoc_files:
|
|
116
116
|
- LICENSE
|
117
117
|
- README.md
|
118
118
|
files:
|
119
|
-
- .document
|
120
|
-
- .gitignore
|
121
|
-
- .rspec
|
122
|
-
- .ruby-gemset
|
123
|
-
- .ruby-version
|
124
|
-
- .travis.yml
|
119
|
+
- ".document"
|
120
|
+
- ".gitignore"
|
121
|
+
- ".rspec"
|
122
|
+
- ".ruby-gemset"
|
123
|
+
- ".ruby-version"
|
124
|
+
- ".travis.yml"
|
125
125
|
- CHANGELOG.md
|
126
126
|
- Gemfile
|
127
127
|
- LICENSE
|
@@ -134,6 +134,8 @@ files:
|
|
134
134
|
- lib/stache/handlebars/handler.rb
|
135
135
|
- lib/stache/handlebars/view.rb
|
136
136
|
- lib/stache/mustache.rb
|
137
|
+
- lib/stache/mustache/cached_template.rb
|
138
|
+
- lib/stache/mustache/faster_context.rb
|
137
139
|
- lib/stache/mustache/handler.rb
|
138
140
|
- lib/stache/mustache/layout.rb
|
139
141
|
- lib/stache/mustache/view.rb
|
@@ -214,6 +216,7 @@ files:
|
|
214
216
|
- spec/stache/handlebars/handlebars_spec.rb
|
215
217
|
- spec/stache/handlebars/profile_autoload.rb
|
216
218
|
- spec/stache/handlebars/view_spec.rb
|
219
|
+
- spec/stache/mustache/cached_template_spec.rb
|
217
220
|
- spec/stache/mustache/handler_spec.rb
|
218
221
|
- spec/stache/mustache/profile_autoload.rb
|
219
222
|
- spec/stache/mustache/view_spec.rb
|
@@ -232,20 +235,20 @@ require_paths:
|
|
232
235
|
- lib
|
233
236
|
required_ruby_version: !ruby/object:Gem::Requirement
|
234
237
|
requirements:
|
235
|
-
- -
|
238
|
+
- - ">="
|
236
239
|
- !ruby/object:Gem::Version
|
237
240
|
version: '0'
|
238
241
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
239
242
|
requirements:
|
240
|
-
- -
|
243
|
+
- - ">="
|
241
244
|
- !ruby/object:Gem::Version
|
242
245
|
version: 1.3.7
|
243
246
|
requirements: []
|
244
247
|
rubyforge_project:
|
245
|
-
rubygems_version: 2.2.
|
248
|
+
rubygems_version: 2.2.2
|
246
249
|
signing_key:
|
247
250
|
specification_version: 3
|
248
|
-
summary:
|
251
|
+
summary: A Rails 3.x and Rails 4.x compatible Mustache/Handlebars template handler
|
249
252
|
test_files:
|
250
253
|
- spec/controllers/handlebars_controller_spec.rb
|
251
254
|
- spec/controllers/stache_controller_spec.rb
|
@@ -319,6 +322,7 @@ test_files:
|
|
319
322
|
- spec/stache/handlebars/handlebars_spec.rb
|
320
323
|
- spec/stache/handlebars/profile_autoload.rb
|
321
324
|
- spec/stache/handlebars/view_spec.rb
|
325
|
+
- spec/stache/mustache/cached_template_spec.rb
|
322
326
|
- spec/stache/mustache/handler_spec.rb
|
323
327
|
- spec/stache/mustache/profile_autoload.rb
|
324
328
|
- spec/stache/mustache/view_spec.rb
|