tilt-jbuilder 0.3.0 → 0.4.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 00e24cf46f2b348806b82a5b80db198a1d8971e5
4
+ data.tar.gz: 42c17a0504854084781501c9fb4e94a1536e3fb0
5
+ SHA512:
6
+ metadata.gz: 34922151c7a3712d67ac1e60da326dcab754727ec5730e10f953f7336a9880c2efd3141c84d05972244e509a0221c595771c1c76b5b3be7a5f3dae8f6c37359b
7
+ data.tar.gz: 31eea542ca37c304be935ead939fd32b6866baf50a87c771deb101e6af4f58f805d0bfb7bd621612f10b7769a2818f717d33c5f7a137dae290d87d6a3f3bcbf1
data/.travis.yml CHANGED
@@ -1,4 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
- - jruby-19mode
4
+ - 2.0.0
5
+ - ruby-head
6
+ - jruby-19mode
7
+ - jruby-head
data/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # tilt-jbuilder [![endorse](http://api.coderwall.com/anthonator/endorsecount.png)](http://coderwall.com/anthonator)
2
+
3
+ Adds support for rendering Jbuilder templates using Tilt.
4
+
5
+ [![Build Status](https://secure.travis-ci.org/anthonator/tilt-jbuilder.png)](http://travis-ci.org/anthonator/tilt-jbuilder)
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'tilt-jbuilder'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install tilt-jbuilder
20
+
21
+ ## Usage
22
+
23
+ ```ruby
24
+ require 'tilt/jbuilder.rb'
25
+
26
+ template = Tilt::JbuilderTemplate.new("templates/awesomeness.json.jbuilder")
27
+ teplate.render
28
+
29
+ # With locals
30
+ template = Tilt::JbuilderTemplate.new { "json.author name" }
31
+ template.render(nil, :name => 'Anthony')
32
+
33
+ # With scope
34
+ template = Tilt::JbuilderTemplate.new { "json.author @name" }
35
+ scope = Object.new
36
+ scope.instance_variable_set :@name, 'Anthony'
37
+ template.render(scope)
38
+
39
+ # Block style
40
+ template = Tilt::JbuilderTemplate.new do |t|
41
+ lambda { |json| json.author 'Anthony'; json.target! }
42
+ end
43
+ template.render
44
+ ```
45
+
46
+ ## Contributing
47
+ 1. Fork it
48
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
49
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
50
+ 4. Push to the branch (`git push origin my-new-feature`)
51
+ 5. Create new Pull Request
@@ -0,0 +1,10 @@
1
+ require "tilt/jbuilder"
2
+
3
+ module Sinatra
4
+ module Templates
5
+ def jbuilder(template, options={}, locals={})
6
+ render :jbuilder, template, options, locals
7
+ end
8
+ end
9
+ end
10
+
data/lib/tilt/jbuilder.rb CHANGED
@@ -1,6 +1,37 @@
1
1
  require 'jbuilder'
2
2
 
3
3
  module Tilt
4
+ class Jbuilder < ::Jbuilder
5
+ def initialize(scope, *args, &block)
6
+ @scope = scope
7
+ super(*args, &block)
8
+ end
9
+
10
+ def partial!(options, locals = {})
11
+ locals.merge! :json => self
12
+ view_path = @scope.instance_variable_get('@_jbuilder_view_path')
13
+ template = ::Tilt::JbuilderTemplate.new(fetch_partial_path(options.to_s, view_path), nil, view_path: view_path)
14
+ template.render(@scope, locals)
15
+ end
16
+
17
+ private
18
+ def fetch_partial_path(file, view_path)
19
+ view_path ||=
20
+ if defined?(::Sinatra) && @scope.respond_to?(:settings)
21
+ @scope.settings.views
22
+ else
23
+ ::Dir.pwd
24
+ end
25
+ ::Dir[::File.join(view_path, partialized(file) + ".{*.,}jbuilder")].first
26
+ end
27
+
28
+ def partialized(path)
29
+ partial_file = path.split("/")
30
+ partial_file[-1] = "_#{partial_file[-1]}" unless partial_file[-1].start_with?("_")
31
+ partial_file.join("/")
32
+ end
33
+ end
34
+
4
35
  class JbuilderTemplate < Template
5
36
  self.default_mime_type = 'application/json'
6
37
 
@@ -18,17 +49,18 @@ module Tilt
18
49
  scope ||= Object.new
19
50
  context = scope.instance_eval { binding }
20
51
  set_locals(locals, scope, context)
52
+ klass = ::Tilt::Jbuilder
21
53
  eval %{
22
54
  if defined? json
23
55
  if @_tilt_data.kind_of? Proc
24
- return @_tilt_data.call(Jbuilder.new)
56
+ return @_tilt_data.call(klass.new(scope))
25
57
  else
26
58
  eval @_tilt_data, binding
27
59
  end
28
60
  else
29
- Jbuilder.encode do |json|
61
+ klass.encode(scope) do |json|
30
62
  if @_tilt_data.kind_of? Proc
31
- return @_tilt_data.call(Jbuilder.new)
63
+ return @_tilt_data.call(klass.new(scope))
32
64
  else
33
65
  eval @_tilt_data, binding
34
66
  end
@@ -39,6 +71,8 @@ module Tilt
39
71
 
40
72
  private
41
73
  def set_locals(locals, scope, context)
74
+ view_path = options.delete(:view_path)
75
+ scope.send(:instance_variable_set, '@_jbuilder_view_path', view_path)
42
76
  scope.send(:instance_variable_set, '@_jbuilder_locals', locals)
43
77
  scope.send(:instance_variable_set, '@_tilt_data', data)
44
78
  set_locals = locals.keys.map { |k| "#{k} = @_jbuilder_locals[#{k.inspect}]" }.join("\n")
@@ -48,12 +82,3 @@ module Tilt
48
82
 
49
83
  register Tilt::JbuilderTemplate, 'jbuilder'
50
84
  end
51
-
52
- class Jbuilder
53
- def partial!(options, locals = {})
54
- path = ::Pathname.new(options)
55
- locals.merge! :json => self
56
- template = ::Tilt::JbuilderTemplate.new("#{path.dirname.to_s}/_#{path.basename}.json.jbuilder")
57
- template.render(nil, locals)
58
- end
59
- end
@@ -0,0 +1,72 @@
1
+ require "tilt"
2
+ require "tilt/jbuilder"
3
+ require "sinatra/jbuilder"
4
+
5
+ require "rack/test"
6
+ require "sinatra/base"
7
+
8
+ ENV['RACK_ENV'] ||= "test"
9
+ Sinatra::Base.set :environment, :test
10
+
11
+ module SinatraIntegrationTestMethods
12
+ def jbuilder_app(&block)
13
+ @app = Sinatra.new(Sinatra::Base) do
14
+ set :views, File.dirname(__FILE__) + "/views"
15
+ helpers do
16
+ def admin?; false end
17
+ end
18
+ get("/", &block)
19
+ end
20
+ get "/"
21
+ end
22
+
23
+ def app
24
+ Rack::Lint.new(@app)
25
+ end
26
+
27
+ def body
28
+ last_response.body.to_s
29
+ end
30
+ end
31
+
32
+ RSpec.configure do |config|
33
+ config.include Rack::Test::Methods
34
+ config.include SinatraIntegrationTestMethods
35
+ end
36
+
37
+ describe "Sinatra Integration" do
38
+ it "renders inline jbuilder strings" do
39
+ jbuilder_app { jbuilder "json.author 'Anthony'" }
40
+ body.should == "{\"author\":\"Anthony\"}"
41
+ end
42
+
43
+ it "renders .jbuilder files in views path" do
44
+ jbuilder_app { jbuilder :hello }
45
+ body.should == "{\"author\":\"Anthony\"}"
46
+ end
47
+
48
+ it "renders instance variables" do
49
+ jbuilder_app { @last_name = "Smith"; jbuilder "json.last_name @last_name" }
50
+ body.should == "{\"last_name\":\"Smith\"}"
51
+ end
52
+
53
+ it "renders helper methods" do
54
+ jbuilder_app { jbuilder "json.is_admin admin?" }
55
+ body.should == "{\"is_admin\":false}"
56
+ end
57
+
58
+ it "renders partials with local variables" do
59
+ jbuilder_app { jbuilder "json.partial! :partial_with_local_variable, last_name: \"Smith\"" }
60
+ body.should == "{\"last_name\":\"Smith\"}"
61
+ end
62
+
63
+ it "renders partials with instance variables" do
64
+ jbuilder_app { @last_name = "Smith"; jbuilder "json.partial! :partial_with_instance_variable" }
65
+ body.should == "{\"last_name\":\"Smith\"}"
66
+ end
67
+
68
+ it "renders partials with helper methods" do
69
+ jbuilder_app { jbuilder "json.partial! :partial_with_helper_method" }
70
+ body.should == "{\"is_admin\":false}"
71
+ end
72
+ end
@@ -39,4 +39,9 @@ describe Tilt::JbuilderTemplate do
39
39
  template = Tilt::JbuilderTemplate.new { "json.partial! 'spec/partial', last_name: 'Smith'" }
40
40
  "{\"last_name\":\"Smith\"}".should == template.render
41
41
  end
42
+
43
+ it "should evaluate partials with view_path" do
44
+ template = Tilt::JbuilderTemplate.new(nil, nil, view_path: 'spec') { "json.partial! '/partial', last_name: 'Smith'" }
45
+ "{\"last_name\":\"Smith\"}".should == template.render
46
+ end
42
47
  end
@@ -0,0 +1,3 @@
1
+ json.author "Anthony"
2
+ json.is_admin admin?
3
+ json.last_name @last_name
@@ -0,0 +1 @@
1
+ json.is_admin admin?
@@ -0,0 +1 @@
1
+ json.last_name @last_name
@@ -0,0 +1 @@
1
+ json.last_name last_name
@@ -0,0 +1 @@
1
+ json.author "Anthony"
@@ -10,11 +10,13 @@ Gem::Specification.new do |gem|
10
10
  gem.add_dependency 'jbuilder'
11
11
  gem.add_development_dependency 'rake'
12
12
  gem.add_development_dependency 'rspec'
13
+ gem.add_development_dependency 'rack-test'
14
+ gem.add_development_dependency 'sinatra'
13
15
 
14
16
  gem.files = `git ls-files`.split($\)
15
17
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
16
18
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
17
19
  gem.name = "tilt-jbuilder"
18
20
  gem.require_paths = ["lib"]
19
- gem.version = '0.3.0'
21
+ gem.version = '0.4.0'
20
22
  end
metadata CHANGED
@@ -1,78 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tilt-jbuilder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
5
- prerelease:
4
+ version: 0.4.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Anthony Smith
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-09-27 00:00:00.000000000 Z
11
+ date: 2013-03-11 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: tilt
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: jbuilder
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - '>='
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rake
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - '>='
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - '>='
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rspec
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rack-test
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: sinatra
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
76
95
  - !ruby/object:Gem::Version
77
96
  version: '0'
78
97
  description: Jbuilder support for Tilt
@@ -87,42 +106,49 @@ files:
87
106
  - .travis.yml
88
107
  - Gemfile
89
108
  - LICENSE
109
+ - README.md
90
110
  - README.rdoc
91
111
  - Rakefile
112
+ - lib/sinatra/jbuilder.rb
92
113
  - lib/tilt/jbuilder.rb
93
114
  - spec/_partial.json.jbuilder
115
+ - spec/sinatra_integration_spec.rb
94
116
  - spec/tilt-jbuilder_spec.rb
117
+ - spec/views/_hello.jbuilder
118
+ - spec/views/_partial_with_helper_method.jbuilder
119
+ - spec/views/_partial_with_instance_variable.jbuilder
120
+ - spec/views/_partial_with_local_variable.jbuilder
121
+ - spec/views/hello.jbuilder
95
122
  - tilt-jbuilder.gemspec
96
123
  homepage: https://github.com/anthonator/tilt-jbuilder
97
124
  licenses: []
125
+ metadata: {}
98
126
  post_install_message:
99
127
  rdoc_options: []
100
128
  require_paths:
101
129
  - lib
102
130
  required_ruby_version: !ruby/object:Gem::Requirement
103
- none: false
104
131
  requirements:
105
- - - ! '>='
132
+ - - '>='
106
133
  - !ruby/object:Gem::Version
107
134
  version: '0'
108
- segments:
109
- - 0
110
- hash: 1083047209817213749
111
135
  required_rubygems_version: !ruby/object:Gem::Requirement
112
- none: false
113
136
  requirements:
114
- - - ! '>='
137
+ - - '>='
115
138
  - !ruby/object:Gem::Version
116
139
  version: '0'
117
- segments:
118
- - 0
119
- hash: 1083047209817213749
120
140
  requirements: []
121
141
  rubyforge_project:
122
- rubygems_version: 1.8.24
142
+ rubygems_version: 2.0.2
123
143
  signing_key:
124
- specification_version: 3
144
+ specification_version: 4
125
145
  summary: Adds support for rendering Jbuilder templates in Tilt.
126
146
  test_files:
127
147
  - spec/_partial.json.jbuilder
148
+ - spec/sinatra_integration_spec.rb
128
149
  - spec/tilt-jbuilder_spec.rb
150
+ - spec/views/_hello.jbuilder
151
+ - spec/views/_partial_with_helper_method.jbuilder
152
+ - spec/views/_partial_with_instance_variable.jbuilder
153
+ - spec/views/_partial_with_local_variable.jbuilder
154
+ - spec/views/hello.jbuilder