stache 1.0.0.rc → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ # 1.0.0
2
+
3
+ * Overhauled Mustache template engine. If you wish to have Mustache drive your entire template stack, you can invert control to it.
4
+ * Fixed a bunch of problems with Handlebars access to the view namespace for helpers, etc.
5
+ * New configuration option: you can now specify a wrapper namespace that Stache will look for your view classes in.
6
+
7
+ Backwards compatibility should be fine; any regressions are bugs and should be reported.
8
+
9
+ Huge thanks to all contributors!
10
+
1
11
  # 0.9.1
2
12
 
3
13
  * soften our hardcore stance on missing properties.
data/README.md CHANGED
@@ -4,7 +4,7 @@ A Rails 3.x compatible Mustache/Handlebars Template Handler, with support for pa
4
4
 
5
5
  [![Build Status](https://secure.travis-ci.org/agoragames/stache.png)](http://travis-ci.org/agoragames/stache)
6
6
 
7
- ## 1.0.0.rc
7
+ ## 1.0.0
8
8
 
9
9
  Major overhaul to the mustache side of things. Backwards compatibility *should* be intact. If not, file a bug and it will get taken care of.
10
10
 
@@ -26,6 +26,10 @@ Stache.configure do |c|
26
26
  c.template_base_path = "..." # this is probably the one you'll want to change
27
27
  # it defaults to app/templates
28
28
 
29
+ c.wrapper_module_name = "..." # this lets you indicate the name of a module that
30
+ # namespaces all your view classes, useful, if you
31
+ # have a naming conflict, such as with a mailer
32
+
29
33
  # N.B. YOU MUST TELL STACHE WHICH TO USE:
30
34
  c.use :mustache
31
35
  # and / or
@@ -74,6 +78,10 @@ end
74
78
  <p>Here's a helper_method call: {{ my_view_helper_method }}</p>
75
79
  ```
76
80
 
81
+ With the wrapper_module_name configuration set to "Wrapper":
82
+
83
+ With a template `app/templates/profiles/index`, Stache will look for a view named `Wrapper::Profiles::Index`, and, if not found, will just use the base `Stache::Mustache::View`.
84
+
77
85
  ### Handlebars?
78
86
 
79
87
  Handlebars will have full access to your rails view helpers.
@@ -113,6 +121,10 @@ So: thanks a ton to those guys.
113
121
  * [ajacksified](https://github.com/ajacksified) cleaned up template extension handling.
114
122
  * [ayamomiji](https://github.com/ayamomiji) extended the `#template_include_tag` to pass through the full range of `#content_tag` options.
115
123
  * [awestendorf](https://github.com/awestendorf) requested that `View#partial` not be so particular about leading underscores. Though I didn't use his code, his prompt lead me to investigate how to properly use Rails' internal template lookup code.
124
+ * [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.
125
+ * [kategengler](https://github.com/kategengler) contributed a patch to allow folks to specify a namespace for their view objects.
126
+
127
+ Thanks a ton to all of the contributors as well. This would never have grown beyond a mediocre tool that rendered partials without their help!
116
128
 
117
129
  ## Note on Patches/Pull Requests
118
130
 
data/Rakefile CHANGED
@@ -10,8 +10,8 @@ end
10
10
 
11
11
  task :default => :spec
12
12
 
13
- require 'rake/rdoctask'
14
- Rake::RDocTask.new do |rdoc|
13
+ require 'rdoc/task'
14
+ RDoc::Task.new do |rdoc|
15
15
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
16
16
 
17
17
  rdoc.main = 'README.rdoc'
data/lib/stache/config.rb CHANGED
@@ -11,13 +11,12 @@ module Stache
11
11
  # use :mustache # or :handlebars
12
12
  # end
13
13
  module Config
14
- attr_accessor :template_base_path, :shared_path
14
+ attr_accessor :template_base_path, :shared_path, :wrapper_module_name
15
15
 
16
16
  def configure
17
17
  yield self
18
18
  end
19
19
 
20
-
21
20
  def template_base_path
22
21
  @template_base_path ||= ::Rails.root.join('app', 'templates')
23
22
  end
@@ -30,6 +29,10 @@ module Stache
30
29
  @shared_path ||= ::Rails.root.join('app', 'templates', 'shared')
31
30
  end
32
31
 
32
+ def wrapper_module_name
33
+ @wrapper_module_name ||= nil
34
+ end
35
+
33
36
  def use template_engine
34
37
  require "stache/#{template_engine}"
35
38
  end
@@ -70,6 +70,8 @@ module Stache
70
70
  # suss out a constant name for the given template
71
71
  def handlebars_class_from_template(template)
72
72
  const_name = ActiveSupport::Inflector.camelize(template.virtual_path.to_s)
73
+ const_name = "#{Stache.wrapper_module_name}::#{const_name}" if Stache.wrapper_module_name
74
+
73
75
  begin
74
76
  const_name.constantize
75
77
  rescue NameError, LoadError => e
@@ -25,7 +25,7 @@ module Stache
25
25
  if #{mustache_class} == Stache::Mustache::View
26
26
  template_source = '#{template.source.gsub(/'/, "\\\\'")}'
27
27
  else
28
- template_name = mustache.template_name+".#{template.formats.first.to_s}."+mustache.template_extension
28
+ template_name = "#{template.virtual_path.to_s}.#{template.formats.first.to_s}."+mustache.template_extension
29
29
  template_source = File.read(File.join(::Stache.template_base_path, template_name))
30
30
  end
31
31
 
@@ -68,6 +68,7 @@ module Stache
68
68
  end
69
69
 
70
70
  const_name = ActiveSupport::Inflector.camelize(template.virtual_path.to_s)
71
+ const_name = "#{Stache.wrapper_module_name}::#{const_name}" if Stache.wrapper_module_name
71
72
  begin
72
73
  const_name.constantize
73
74
  rescue NameError, LoadError => e
@@ -1,3 +1,3 @@
1
1
  module Stache
2
- VERSION = "1.0.0.rc"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -15,6 +15,20 @@ describe HandlebarsController do
15
15
  response.body.should =~ /Hello, Matt!/
16
16
  end
17
17
 
18
+ it "can render using a module wrapper" do
19
+ begin
20
+ Stache.wrapper_module_name = "Wrapper"
21
+
22
+ get :with_wrapper
23
+ assert_response 200
24
+
25
+ response.should render_template 'with_wrapper'
26
+ response.body.should =~ /Yes/
27
+ ensure
28
+ Stache.wrapper_module_name = nil
29
+ end
30
+ end
31
+
18
32
  it "correctly renders partials" do
19
33
  get :with_partials
20
34
  assert_response 200
@@ -15,6 +15,20 @@ describe StacheController do
15
15
  response.body.should =~ /Hello, Matt!/
16
16
  end
17
17
 
18
+ it "can render using a module wrapper" do
19
+ begin
20
+ Stache.wrapper_module_name = "Wrapper"
21
+
22
+ get :with_wrapper
23
+ assert_response 200
24
+
25
+ response.should render_template 'with_wrapper'
26
+ response.body.should =~ /Yes/
27
+ ensure
28
+ Stache.wrapper_module_name = nil
29
+ end
30
+ end
31
+
18
32
  it "correctly renders partials" do
19
33
  get :with_partials
20
34
  assert_response 200
@@ -19,4 +19,8 @@ class HandlebarsController < ApplicationController
19
19
  #with_missing_data.html.hbs
20
20
  end
21
21
 
22
+ def with_wrapper
23
+
24
+ end
25
+
22
26
  end
@@ -18,6 +18,10 @@ class StacheController < ApplicationController
18
18
 
19
19
  end
20
20
 
21
+ def with_wrapper
22
+
23
+ end
24
+
21
25
  def helper
22
26
  Stache::ViewContext.current = self.view_context
23
27
  end
@@ -0,0 +1,3 @@
1
+ Am I using a wrapper module?
2
+
3
+ {{answer}}
@@ -0,0 +1,3 @@
1
+ Am I using a wrapper module?
2
+
3
+ {{answer}}
@@ -43,5 +43,7 @@ module Dummy
43
43
  config.filter_parameters += [:password]
44
44
 
45
45
  config.assets.enabled = true
46
+
47
+ config.autoload_paths += %W(#{config.root}/lib)
46
48
  end
47
49
  end
@@ -9,6 +9,8 @@ Dummy::Application.routes.draw do
9
9
 
10
10
  get 'stache/with_asset_helpers', :to => 'stache#with_asset_helpers'
11
11
 
12
+ get 'stache/with_wrapper', :to => 'stache#with_wrapper'
13
+
12
14
  get 'handlebars', :to => 'handlebars#index', :as => 'handlebars'
13
15
 
14
16
  get 'handlebars/with_partials', :to => 'handlebars#with_partials'
@@ -16,4 +18,6 @@ Dummy::Application.routes.draw do
16
18
  get 'handlebars/with_helpers', :to => 'handlebars#with_helpers'
17
19
 
18
20
  get 'handlebars/with_missing_data', :to => 'handlebars#with_missing_data'
21
+
22
+ get 'handlebars/with_wrapper', :to => 'handlebars#with_wrapper'
19
23
  end
@@ -0,0 +1,9 @@
1
+ module Wrapper
2
+ module Handlebars
3
+ class WithWrapper < ::Stache::Handlebars::View
4
+ def answer
5
+ "Yes"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Wrapper
2
+ module Stache
3
+ class WithWrapper < ::Stache::Mustache::View
4
+ def answer
5
+ "Yes"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -7,8 +7,7 @@ describe "Stache::Config" do
7
7
  end
8
8
  [:template_base_path, :shared_path].each do |attr|
9
9
  it "sets up an attribute named #{attr.to_s}" do
10
- Stache.should respond_to(attr)
11
- Stache.should respond_to("#{attr}=")
10
+ should_set_up_attr_accessor_for(attr)
12
11
  end
13
12
 
14
13
  it "sets up a default value for #{attr}" do
@@ -20,6 +19,15 @@ describe "Stache::Config" do
20
19
  end
21
20
  end
22
21
  end
22
+
23
+ it "sets up an attribute named wrapper_module_name" do
24
+ attr = :wrapper_module_name
25
+ should_set_up_attr_accessor_for(attr)
26
+ end
27
+
28
+ it "sets a default value for wrapper_module_name" do
29
+ Stache.send(:wrapper_module_name).should be_nil
30
+ end
23
31
  end
24
32
 
25
33
  describe ".configure" do
@@ -34,4 +42,9 @@ describe "Stache::Config" do
34
42
  end
35
43
  end
36
44
 
45
+ def should_set_up_attr_accessor_for(attr)
46
+ Stache.should respond_to(attr)
47
+ Stache.should respond_to("#{attr}=")
48
+ end
49
+
37
50
  end
@@ -34,4 +34,26 @@ describe Stache::Handlebars::Handler do
34
34
  Object.send(:remove_const, :Profiles)
35
35
  end
36
36
  end
37
+
38
+ describe "#handlebars_class_from_template with config module wrapper set" do
39
+ before do
40
+ Stache.wrapper_module_name = "Wrapper"
41
+ end
42
+
43
+ it "returns the appropriate handlebars class" do
44
+ module Wrapper; class HelloWorld < ::Stache::Handlebars::View; end; end
45
+ @handler.handlebars_class_from_template(@template).should == Wrapper::HelloWorld
46
+ Object.send(:remove_const, :Wrapper)
47
+ end
48
+ it "is clever about folders and such" do
49
+ @template.stub!(:virtual_path).and_return("profiles/index")
50
+ module Wrapper; module Profiles; class Index < ::Stache::Handlebars::View; end; end; end
51
+ @handler.handlebars_class_from_template(@template).should == Wrapper::Profiles::Index
52
+ Object.send(:remove_const, :Wrapper)
53
+ end
54
+
55
+ after do
56
+ Stache.wrapper_module_name = nil
57
+ end
58
+ end
37
59
  end
@@ -38,4 +38,26 @@ describe Stache::Mustache::Handler do
38
38
  Object.send(:remove_const, :Profiles)
39
39
  end
40
40
  end
41
+
42
+ describe "#mustache_class_from_template with config module wrapper set" do
43
+ before do
44
+ Stache.wrapper_module_name = "Wrapper"
45
+ end
46
+
47
+ it "returns the appropriate mustache class" do
48
+ module Wrapper; class HelloWorld < ::Stache::Mustache::View; end; end
49
+ @handler.mustache_class_from_template(@template).should == Wrapper::HelloWorld
50
+ Object.send(:remove_const, :Wrapper)
51
+ end
52
+ it "is clever about folders and such" do
53
+ @template.stub!(:virtual_path).and_return("profiles/index")
54
+ module Wrapper; module Profiles; class Index < ::Stache::Mustache::View; end; end; end
55
+ @handler.mustache_class_from_template(@template).should == Wrapper::Profiles::Index
56
+ Object.send(:remove_const, :Wrapper)
57
+ end
58
+
59
+ after do
60
+ Stache.wrapper_module_name = nil
61
+ end
62
+ end
41
63
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stache
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.rc
5
- prerelease: 6
4
+ version: 1.0.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Matt Wilson
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-09 00:00:00.000000000 Z
12
+ date: 2012-11-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mustache
@@ -169,6 +169,7 @@ files:
169
169
  - spec/dummy/app/views/handlebars/with_helpers.html.hbs
170
170
  - spec/dummy/app/views/handlebars/with_missing_data.html.hbs
171
171
  - spec/dummy/app/views/handlebars/with_partials.html.hbs
172
+ - spec/dummy/app/views/handlebars/with_wrapper.html.hbs
172
173
  - spec/dummy/app/views/layouts/application.html.erb
173
174
  - spec/dummy/app/views/stache/_eaten_by_a.html.mustache
174
175
  - spec/dummy/app/views/stache/helper.html.mustache
@@ -181,6 +182,7 @@ files:
181
182
  - spec/dummy/app/views/stache/with_layout.rb
182
183
  - spec/dummy/app/views/stache/with_partials.html.mustache
183
184
  - spec/dummy/app/views/stache/with_partials.rb
185
+ - spec/dummy/app/views/stache/with_wrapper.html.mustache
184
186
  - spec/dummy/config.ru
185
187
  - spec/dummy/config/application.rb
186
188
  - spec/dummy/config/boot.rb
@@ -198,6 +200,8 @@ files:
198
200
  - spec/dummy/config/locales/en.yml
199
201
  - spec/dummy/config/routes.rb
200
202
  - spec/dummy/lib/with_asset_helpers.rb
203
+ - spec/dummy/lib/wrapper/handlebars/with_wrapper.rb
204
+ - spec/dummy/lib/wrapper/stache/with_wrapper.rb
201
205
  - spec/dummy/public/404.html
202
206
  - spec/dummy/public/422.html
203
207
  - spec/dummy/public/500.html
@@ -234,9 +238,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
234
238
  - - ! '>='
235
239
  - !ruby/object:Gem::Version
236
240
  version: '0'
237
- segments:
238
- - 0
239
- hash: 2542393094037451014
240
241
  required_rubygems_version: !ruby/object:Gem::Requirement
241
242
  none: false
242
243
  requirements:
@@ -263,6 +264,7 @@ test_files:
263
264
  - spec/dummy/app/views/handlebars/with_helpers.html.hbs
264
265
  - spec/dummy/app/views/handlebars/with_missing_data.html.hbs
265
266
  - spec/dummy/app/views/handlebars/with_partials.html.hbs
267
+ - spec/dummy/app/views/handlebars/with_wrapper.html.hbs
266
268
  - spec/dummy/app/views/layouts/application.html.erb
267
269
  - spec/dummy/app/views/stache/_eaten_by_a.html.mustache
268
270
  - spec/dummy/app/views/stache/helper.html.mustache
@@ -275,6 +277,7 @@ test_files:
275
277
  - spec/dummy/app/views/stache/with_layout.rb
276
278
  - spec/dummy/app/views/stache/with_partials.html.mustache
277
279
  - spec/dummy/app/views/stache/with_partials.rb
280
+ - spec/dummy/app/views/stache/with_wrapper.html.mustache
278
281
  - spec/dummy/config.ru
279
282
  - spec/dummy/config/application.rb
280
283
  - spec/dummy/config/boot.rb
@@ -292,6 +295,8 @@ test_files:
292
295
  - spec/dummy/config/locales/en.yml
293
296
  - spec/dummy/config/routes.rb
294
297
  - spec/dummy/lib/with_asset_helpers.rb
298
+ - spec/dummy/lib/wrapper/handlebars/with_wrapper.rb
299
+ - spec/dummy/lib/wrapper/stache/with_wrapper.rb
295
300
  - spec/dummy/public/404.html
296
301
  - spec/dummy/public/422.html
297
302
  - spec/dummy/public/500.html