stache 0.0.3 → 0.1.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/README.md CHANGED
@@ -28,7 +28,33 @@ Needless to say, it's probably better if your custom View objects are subclasses
28
28
 
29
29
  An example by way of explanation:
30
30
 
31
- With a template `app/templates/profiles/index`, Stache will look for a view named `Profiles::Index`, and, if not found, will just use the base `Stache::View`.
31
+ With a template `app/templates/profiles/index`, Stache will look for a view named `Profiles::Index`, and, if not found, will just use the base `Stache::View`. Stache adds `app/views` to Rails' autoload paths, so here's a sample directory structure and some sample files:
32
+
33
+ ```
34
+ app/
35
+ templates/
36
+ profiles/
37
+ index.html.mustache
38
+ views/
39
+ profiles/
40
+ index.rb
41
+ ```
42
+
43
+ ```ruby
44
+ # in profiles/index.rb
45
+ module Profiles
46
+ class Index < ::Stache::View
47
+ def my_view_helper_method
48
+ "whoo"
49
+ end
50
+ end
51
+ end
52
+ ```
53
+
54
+ ```html
55
+ <!-- in the view, then -->
56
+ <p>Here's a helper_method call: {{ my_view_helper_method }}</p>
57
+ ```
32
58
 
33
59
  ## Of Note
34
60
 
@@ -7,10 +7,29 @@ module Stache
7
7
  exploded = source.split("/")
8
8
  file = exploded.pop
9
9
  file = file.split(".").first
10
- template_path = Stache.template_base_path.join(exploded.join("/"), "_#{file}.html.mustache")
11
- template = ::File.open(template_path, "rb")
12
- content_tag(:script, template.read.html_safe, :type => "text/html", :id => "#{file.dasherize.underscore}_template")
10
+
11
+ base_path = Stache.template_base_path.join(*exploded)
12
+ template_path = locate_template_for(base_path, file)
13
+ if template_path
14
+ template = ::File.open(template_path, "rb")
15
+ content_tag(:script, template.read.html_safe, :type => "text/html", :id => "#{file.dasherize.underscore}_template")
16
+ else
17
+ raise ActionView::MissingTemplate.new(potential_paths(base_path, file), file, [base_path], false, { :handlers => [:mustache] })
18
+ end
13
19
  end.join("\n").html_safe
14
20
  end
21
+
22
+ def potential_paths(path, candidate_file_name)
23
+ [
24
+ path.join("_#{candidate_file_name}.html.mustache"),
25
+ path.join("_#{candidate_file_name}.mustache"),
26
+ path.join("#{candidate_file_name}.html.mustache"),
27
+ path.join("#{candidate_file_name}.mustache")
28
+ ]
29
+ end
30
+
31
+ def locate_template_for(path, candidate_file_name)
32
+ potential_paths(path, candidate_file_name).find { |file| File.file?(file.to_s) }
33
+ end
15
34
  end
16
35
  end
@@ -20,6 +20,7 @@ module Stache
20
20
  mustache = ::#{mustache_class}.new
21
21
  mustache.view = self
22
22
  mustache.template = '#{template.source.gsub(/'/, "\\\\'")}'
23
+ mustache.virtual_path = '#{template.virtual_path.to_s}'
23
24
  mustache[:yield] = content_for(:layout)
24
25
  mustache.context.update(local_assigns)
25
26
  variables = controller.instance_variable_names
@@ -53,7 +54,7 @@ module Stache
53
54
  const_name = ActiveSupport::Inflector.camelize(template.virtual_path.to_s)
54
55
  begin
55
56
  const_name.constantize
56
- rescue NameError
57
+ rescue NameError, LoadError
57
58
  Stache::View
58
59
  end
59
60
  end
@@ -0,0 +1,11 @@
1
+ module Stache
2
+ class Railtie < ::Rails::Railtie
3
+ initializer 'stache.autoload', :before => :set_autoload_paths do |app|
4
+ app.config.autoload_paths << Rails.root + 'app/views'
5
+ end
6
+
7
+ config.to_prepare do
8
+ ApplicationController.send(:append_view_path, 'app/templates')
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module Stache
2
- VERSION = "0.0.3"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/stache/view.rb CHANGED
@@ -6,7 +6,7 @@ module Stache
6
6
  #
7
7
  # e.g. if the handler is loading a template from templates/
8
8
  class View < ::Mustache
9
- attr_accessor :view, :template
9
+ attr_accessor :view, :template, :virtual_path
10
10
 
11
11
  def method_missing(method, *args, &block)
12
12
  view.send(method, *args, &block)
@@ -23,8 +23,9 @@ module Stache
23
23
  #
24
24
  def partial(name)
25
25
  partial_name = "_#{name}.#{Stache.template_extension}"
26
- template_dir = Pathname.new(self.class.template_file).dirname
26
+ template_dir = self.virtual_path.split("/")[0..-2].join("/")
27
27
  partial_path = File.expand_path(File.join(Stache.template_base_path, template_dir, partial_name))
28
+ # ::Rails.logger.info "Checking for #{partial_path} in template_dir: #{template_dir}"
28
29
  unless File.file?(partial_path)
29
30
  partial_path = "#{Stache.shared_path}/#{partial_name}"
30
31
  end
data/lib/stache.rb CHANGED
@@ -4,6 +4,10 @@ require "stache/util"
4
4
  require "stache/handler"
5
5
  require "stache/asset_helper"
6
6
 
7
+ if defined? ::Rails::Railtie and ::Rails::VERSION::MAJOR >= 3
8
+ require 'stache/railtie'
9
+ end
10
+
7
11
  module Stache
8
12
  extend Config
9
13
 
@@ -10,8 +10,9 @@ describe Stache::AssetHelper do
10
10
  @helper ||= MyViewContext.new
11
11
  end
12
12
 
13
- describe "template_include_tag" do
13
+ describe "#template_include_tag" do
14
14
  it "renders a script tag with the template contents" do
15
+ File.stub!(:file?).with(Rails.root.join("app/views/widgets/_oh_herro.html.mustache").to_s).and_return(true)
15
16
  File.stub!(:open).with(Rails.root.join("app/views/widgets/_oh_herro.html.mustache"), "rb").
16
17
  and_return(StringIO.new("{{ awyeah }}"))
17
18
 
@@ -21,10 +22,28 @@ describe Stache::AssetHelper do
21
22
  Stache.configure do |c|
22
23
  c.template_base_path = "/tmp/whee"
23
24
  end
25
+ File.stub!(:file?).with("/tmp/whee/_whooo.html.mustache").and_return(true)
24
26
  File.stub!(:open).with(Pathname.new("/tmp/whee/_whooo.html.mustache"), "rb").
25
27
  and_return(StringIO.new("{{ awyeah }}"))
26
28
 
27
29
  helper.template_include_tag("whooo").should == "<script id=\"whooo_template\" type=\"text/html\">{{ awyeah }}</script>"
28
30
  end
31
+ it "raises if it cannot find the template" do
32
+ -> { helper.template_include_tag("arrrgh") }.should raise_error(ActionView::MissingTemplate)
33
+ end
34
+ end
35
+
36
+ describe "#locate_template_for" do
37
+ it "tries permutations of partial names and file extensions to find the requested file" do
38
+ File.should_receive(:file?).with("/tmp/whee/_whooo.html.mustache")
39
+ File.should_receive(:file?).with("/tmp/whee/_whooo.mustache")
40
+ File.should_receive(:file?).with("/tmp/whee/whooo.html.mustache")
41
+ File.should_receive(:file?).with("/tmp/whee/whooo.mustache").and_return(true)
42
+
43
+ helper.locate_template_for(Pathname.new("/tmp/whee"), "whooo").should == Pathname.new("/tmp/whee/whooo.mustache")
44
+ end
45
+ it "returns nil if it cannot find anything" do
46
+ helper.locate_template_for(Pathname.new("/tmp/whee"), "whooo").should be_nil
47
+ end
29
48
  end
30
49
  end
@@ -30,6 +30,9 @@ describe "Stache::Config" do
30
30
  config.template_base_path = "/dev/null"
31
31
  end
32
32
  Stache.template_base_path.should == Pathname.new("/dev/null")
33
+ Stache.configure do |config|
34
+ config.template_base_path = ::Rails.root.join('app', 'views')
35
+ end
33
36
  end
34
37
  end
35
38
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: stache
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.3
5
+ version: 0.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Matt Wilson
@@ -122,6 +122,7 @@ files:
122
122
  - lib/stache/asset_helper.rb
123
123
  - lib/stache/config.rb
124
124
  - lib/stache/handler.rb
125
+ - lib/stache/railtie.rb
125
126
  - lib/stache/util.rb
126
127
  - lib/stache/version.rb
127
128
  - lib/stache/view.rb