petroglyph 0.0.1 → 0.0.2

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
@@ -77,9 +77,20 @@ This can be overridden by re-implementing the `Petroglyph.partial(name)` method.
77
77
  partial :tea, :tea => tea
78
78
  end
79
79
 
80
+ ## Rails 3
81
+
82
+ In your controller:
83
+
84
+ render 'index', :locals => {:teas => teas}, :layout => false
85
+
86
+ Support for partials is non-standard at this time: create a subdirectory in the directory that your template lives in and call it `partials`.
87
+
88
+
80
89
  ## Caveat
81
90
 
82
- We've removed support for using instance variables (from the controller) in the template, as this was hacky and not optimal.
91
+ There is currently no support for instance variables in Sinatra and Rails 3.
92
+
93
+ Avoid using `post` as a local variable name in sinatra. Since the template context in sinatra is the controller, calling `post` from your template will call the http `post` action. Same goes for `get`, `head`, `put`, etc, but these are less likely to be resources in your application.
83
94
 
84
95
  ## Related Projects
85
96
 
@@ -2,9 +2,13 @@ require 'json'
2
2
 
3
3
  require 'petroglyph/scope'
4
4
  require 'petroglyph/engine'
5
+ require 'petroglyph/railtie' if defined?(Rails) && Rails.version =~ /^3/
5
6
 
6
7
  module Petroglyph
7
8
  class << self
9
+ def register!
10
+ require 'petroglyph/template'
11
+ end
8
12
  def partial(filename, template_filename)
9
13
  basedir = File.dirname(template_filename)
10
14
  [basedir, "#{basedir}/partials"].each do |dir|
@@ -15,3 +19,10 @@ module Petroglyph
15
19
  end
16
20
  end
17
21
  end
22
+
23
+ if defined?(Padrino)
24
+ require 'padrino-core'
25
+ Padrino.after_load { Petroglyph.register! }
26
+ elsif defined?(Rails) && Rails.version =~ /^2/
27
+ Petroglyph.register!
28
+ end
@@ -6,13 +6,16 @@ module Petroglyph
6
6
  end
7
7
 
8
8
  def render(context = Object.new, locals = {}, file = nil, &block)
9
+ to_hash(locals, file, context, &block).to_json
10
+ end
11
+
12
+ def to_hash(locals = {}, file = nil, context = Object.new, &block)
9
13
  scope = Scope.new(context, locals, file)
10
- if @data
11
- scope.instance_eval(@data)
12
- else
13
- scope.instance_eval(&block)
14
- end
15
- scope.value.to_json
14
+
15
+ scope.instance_eval(@data) if @data
16
+ scope.instance_eval(&block) if block_given?
17
+
18
+ scope.value
16
19
  end
17
20
  end
18
21
  end
@@ -0,0 +1,10 @@
1
+ module Petroglyph
2
+ class Railtie < Rails::Railtie
3
+
4
+ initializer "petroglyph.initialize" do |app|
5
+ ActiveSupport.on_load(:action_view) do
6
+ Petroglyph.register!
7
+ end
8
+ end
9
+ end
10
+ end
@@ -5,6 +5,7 @@ module Petroglyph
5
5
  def initialize(context = nil, locals = {}, template_filename = nil, parent_scope = nil)
6
6
  @file = template_filename
7
7
  @context = context
8
+ self.copy_instance_variables_from(@context, [:@assigns, :@helpers]) if self.respond_to?(:copy_instance_variables_from)
8
9
  @locals = locals
9
10
  @parent_scope = parent_scope
10
11
  @value = nil
@@ -81,7 +82,7 @@ module Petroglyph
81
82
  end
82
83
 
83
84
  def method_missing(method, *args, &block)
84
- if @locals.has_key?(method)
85
+ if @locals and @locals.has_key?(method)
85
86
  @locals[method]
86
87
  elsif @context.respond_to?(method)
87
88
  @context.send(method)
@@ -0,0 +1,64 @@
1
+ # TILT Template
2
+ if defined?(Tilt)
3
+ class PetroglyphTemplate < Tilt::Template
4
+ def initialize_engine
5
+ return if defined?(::Petroglyph)
6
+ require_template_library 'petroglyph'
7
+ end
8
+
9
+ def prepare
10
+ options = @options.merge(:source_location => file)
11
+ @engine = ::Petroglyph::Engine.new(data, options)
12
+ end
13
+
14
+ def evaluate(scope, locals, &block)
15
+ @engine.render(scope, locals, &block)
16
+ end
17
+ end
18
+
19
+ Tilt.register 'pg', PetroglyphTemplate
20
+ end
21
+
22
+ # Rails 2.X Template
23
+ if defined?(Rails) && Rails.version =~ /^2/
24
+ require 'action_view/base'
25
+ require 'action_view/template'
26
+
27
+ module ActionView
28
+ module TemplateHandlers
29
+ class PetroglyphHandler < TemplateHandler
30
+ include Compilable
31
+
32
+ def compile(template) %{
33
+ ::Petroglyph::Engine.new(#{template.source.inspect}).
34
+ render(self, assigns.merge(local_assigns), '#{template.filename}')
35
+ } end
36
+ end
37
+ end
38
+ end
39
+
40
+ ActionView::Template.register_template_handler :pg, ActionView::TemplateHandlers::PetroglyphHandler
41
+ end
42
+
43
+ # Rails 3.X Template
44
+ if defined?(Rails) && Rails.version =~ /^3/
45
+ module ActionView
46
+ module Template::Handlers
47
+ class Petroglyph
48
+
49
+ def call(template)
50
+ source = if template.source.empty?
51
+ File.read(template.identifier)
52
+ else
53
+ template.source
54
+ end
55
+
56
+ %{ ::Petroglyph::Engine.new(#{source.inspect}).
57
+ render(self, assigns.merge(local_assigns), '#{template.identifier}') }
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ ActionView::Template.register_template_handler :pg, ActionView::Template::Handlers::Petroglyph.new
64
+ end
@@ -1,3 +1,3 @@
1
1
  module Petroglyph
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -1,6 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Petroglyph::Engine do
4
+ specify "#to_hash" do
5
+ engine = Petroglyph::Engine.new('node :whatever => thing')
6
+ engine.to_hash({:thing => 'stuff'}).should eq({:whatever => 'stuff'})
7
+ end
8
+
4
9
  it "takes a template" do
5
10
  engine = Petroglyph::Engine.new('node :whatever => "nevermind"')
6
11
  engine.render.should eq({:whatever => "nevermind"}.to_json)
@@ -30,8 +30,12 @@ describe "Sinatra integration" do
30
30
  last_response.body.should eq '{"drinks":[{"type":"tea","temperature":"hot"},{"type":"coffee","temperature":"lukewarm"}]}'
31
31
  end
32
32
 
33
- xit "doesn't freak out on the HTTP method" do
34
- post '/'
35
- last_response.body.should eq '{}'
33
+ it "overshadows the controller methods" do
34
+ # look at /views/fixtures/post.pg
35
+ # and line 18 of this file
36
+ pending "right now if you refer to a local var 'post' in the template, you will accidentally call sinatra's post method" do
37
+ post '/'
38
+ last_response.body.should eq "{\"post\":\"a post\"}"
39
+ end
36
40
  end
37
41
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: petroglyph
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-20 00:00:00.000000000Z
12
+ date: 2012-03-18 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: tilt
16
- requirement: &2161013440 !ruby/object:Gem::Requirement
16
+ requirement: &70204971169420 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2161013440
24
+ version_requirements: *70204971169420
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &2161013020 !ruby/object:Gem::Requirement
27
+ requirement: &70204971169000 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2161013020
35
+ version_requirements: *70204971169000
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: sinatra
38
- requirement: &2161012600 !ruby/object:Gem::Requirement
38
+ requirement: &70204971168580 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2161012600
46
+ version_requirements: *70204971168580
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rack-test
49
- requirement: &2161012180 !ruby/object:Gem::Requirement
49
+ requirement: &70204971168160 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2161012180
57
+ version_requirements: *70204971168160
58
58
  description: A simple, terse, and unsurprising ruby dsl to create json views.
59
59
  email:
60
60
  - katrina.owen@gmail.com
@@ -70,7 +70,9 @@ files:
70
70
  - Rakefile
71
71
  - lib/petroglyph.rb
72
72
  - lib/petroglyph/engine.rb
73
+ - lib/petroglyph/railtie.rb
73
74
  - lib/petroglyph/scope.rb
75
+ - lib/petroglyph/template.rb
74
76
  - lib/petroglyph/version.rb
75
77
  - lib/sinatra/petroglyph.rb
76
78
  - lib/tilt/petroglyph.rb