rabl 0.8.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.8.2
4
+
5
+ * Passing locals when rendering templates via partials or inheritance (Thanks @simsalabim)
6
+
3
7
  ## 0.8.1
4
8
 
5
9
  * Fix to respect @collection :root for xml output (Thanks @chinshr)
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![Continuous Integration status](https://secure.travis-ci.org/nesquena/rabl.png)](http://travis-ci.org/nesquena/rabl)
4
4
  [![Dependency Status](https://gemnasium.com/nesquena/rabl.png)](https://gemnasium.com/nesquena/rabl)
5
5
 
6
- RABL (Ruby API Builder Language) is a Rails and [Padrino](http://padrinorb.com) ruby templating system for generating JSON, XML, MessagePack, PList and BSON.
6
+ RABL (Ruby API Builder Language) is a Rails and [Padrino](http://padrinorb.com) ruby templating system for generating JSON, XML, MessagePack, PList and BSON.
7
7
  When using the ActiveRecord 'to_json' method, I find myself wanting a more expressive and powerful solution for generating APIs.
8
8
  This is especially true when the JSON representation is complex or doesn't match the exact schema defined within the database.
9
9
 
@@ -21,11 +21,11 @@ RABL is a general templating system created to solve these problems by approachi
21
21
 
22
22
  RABL at the core is all about adhering to MVC principles by deferring API data representations to the **view** layer of your application.
23
23
  For a breakdown of common misconceptions about RABL, please check out our guide to
24
- [understanding RABL](https://github.com/nesquena/rabl/wiki/Understanding-RABL) which can help clear up any confusion about this project.
24
+ [understanding RABL](https://github.com/nesquena/rabl/wiki/Understanding-RABL) which can help clear up any confusion about this project.
25
25
 
26
26
  ## Breaking Changes ##
27
27
 
28
- * v0.8.0 (released Feb 14, 2013) removes multi_json dependency and
28
+ * v0.8.0 (released Feb 14, 2013) removes multi_json dependency and
29
29
  relies on Oj (or JSON) as the json parser. Simplifies code, removes a dependency
30
30
  but you might want to remove any references to MultiJson.
31
31
 
@@ -179,8 +179,8 @@ the primary JSON encoding engine simply add that to your Gemfile:
179
179
  gem 'oj'
180
180
  ```
181
181
 
182
- and RABL will use that engine automatically for encoding your JSON responses.
183
- Set your own custom json_engine which define a `dump` or `encode`
182
+ and RABL will use that engine automatically for encoding your JSON responses.
183
+ Set your own custom json_engine which define a `dump` or `encode`
184
184
  method for converting to JSON from ruby data:
185
185
 
186
186
  ```ruby
@@ -422,6 +422,33 @@ Using partials and inheritance can significantly reduce code duplication in your
422
422
 
423
423
  You can see more examples on the [Reusing Templates wiki page](https://github.com/nesquena/rabl/wiki/Reusing-templates).
424
424
 
425
+ ### Passing Locals in Partials ###
426
+
427
+ You can pass an arbitrary set of locals when rendering partials or extending templates.
428
+ For example, if we want to show on `posts/:id.json` any information regarding particular post and associated comments
429
+ but in other cases we want to hide those comments. We can use locals to do this:
430
+
431
+ ```ruby
432
+ # app/views/posts/index.json.rabl
433
+ collection @posts
434
+
435
+ extends('posts/show', :locals => { :hide_comments => true })
436
+ # or using partial instead of extends
437
+ # node(false) { |post| partial('posts/show', :object => :post, :locals => { :hide_comments => true })}
438
+ ```
439
+
440
+ and then access locals in the sub-template:
441
+
442
+ ```ruby
443
+ # app/views/posts/show.json.rabl
444
+ object @post
445
+
446
+ attributes :id, :title, :body, :created_at
447
+ node(:comments) { |post| post.comments } unless locals[:hide_comments]
448
+ ```
449
+
450
+ This can be useful as an advanced tool when extending or rendering partials.
451
+
425
452
  ### Template Scope ###
426
453
 
427
454
  In RABL, you have access to everything you need to build an API response. Each RABL template has full access to the controllers
data/Rakefile CHANGED
@@ -14,7 +14,7 @@ end
14
14
 
15
15
  # Running integration tests
16
16
  # rake test:clean
17
- # rake test:stup
17
+ # rake test:setup
18
18
  # rake test:full
19
19
 
20
20
  fixture_list = "{padrino_test,sinatra_test,rails2,rails3,rails3_2}"
@@ -23,7 +23,7 @@ desc "Clean up the fixtures being tested by cleaning and installing dependencies
23
23
  task "test:clean" do
24
24
  Dir[File.dirname(__FILE__) + "/fixtures/#{fixture_list}"].each do |fixture|
25
25
  puts "\n*** Cleaning up for #{File.basename(fixture)} tests ***\n"
26
- puts `cd #{fixture}; rm Gemfile.lock`
26
+ Dir.chdir(fixture) { puts `rm Gemfile.lock` }
27
27
  end
28
28
  end
29
29
 
@@ -31,8 +31,10 @@ desc "Prepares the fixtures being tested by installing dependencies"
31
31
  task "test:setup" do
32
32
  Dir[File.dirname(__FILE__) + "/fixtures/#{fixture_list}"].each do |fixture|
33
33
  puts "\n*** Setting up for #{File.basename(fixture)} tests ***\n"
34
- `export BUNDLE_GEMFILE=#{fixture}/Gemfile` if ENV['TRAVIS']
35
- puts `cd #{fixture}; mkdir -p tmp/cache; bundle install;`
34
+ `export BUNDLE_GEMFILE="#{fixture}/Gemfile"` if ENV["TRAVIS"]
35
+ Bundler.with_clean_env {
36
+ Dir.chdir(fixture) { puts `mkdir -p tmp/cache; bundle install --gemfile="#{fixture}/Gemfile"`; }
37
+ }
36
38
  end
37
39
  end
38
40
 
@@ -40,7 +42,9 @@ desc "Executes the fixture tests"
40
42
  task "test:fixtures" do
41
43
  Dir[File.dirname(__FILE__) + "/fixtures/#{fixture_list}"].each do |fixture|
42
44
  puts "\n*** Running tests for #{File.basename(fixture)}... ***\n"
43
- puts `cd #{fixture}; bundle check; bundle exec rake test:rabl`
45
+ Bundler.with_clean_env {
46
+ Dir.chdir(fixture) { puts `bundle check; bundle exec rake test:rabl` }
47
+ }
44
48
  end
45
49
  end
46
50
 
@@ -1,3 +1,3 @@
1
1
  collection @users
2
2
 
3
- extends "users/show"
3
+ extends "users/show", :locals => { :reversed => true }
@@ -1,6 +1,8 @@
1
1
  attributes :prefix, :suffix, :area_code
2
2
  attributes :is_primary => :primary
3
3
 
4
- node :formatted do |n|
5
- n.formatted
4
+ if locals[:reversed]
5
+ node(:reversed) { |n| n.formatted.reverse }
6
+ else
7
+ node(:formatted) { |n| n.formatted }
6
8
  end
@@ -1,6 +1,8 @@
1
1
  attributes :prefix, :suffix, :area_code
2
2
  attributes :is_primary => :primary
3
3
 
4
- node :formatted do |n|
5
- n.formatted
4
+ if locals[:reversed]
5
+ node(:reversed) { |n| n.formatted.reverse }
6
+ else
7
+ node(:formatted) { |n| n.formatted }
6
8
  end
@@ -12,5 +12,5 @@ child :phone_numbers => :pnumbers do
12
12
  end
13
13
 
14
14
  node :node_numbers do |u|
15
- partial("users/phone_number", :object => u.phone_numbers)
15
+ partial("users/phone_number", :object => u.phone_numbers, :locals => { :reversed => locals[:reversed].presence })
16
16
  end
@@ -1,4 +1,4 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
 
3
3
  # Project requirements
4
4
  gem 'rake'
@@ -1,5 +1,6 @@
1
- source :gemcutter
2
- gem "rails", "~> 2.3.14"
1
+ source 'https://rubygems.org'
2
+
3
+ gem "rails", "~> 2.3.18"
3
4
  gem "sqlite3", :require => "sqlite3"
4
5
  gem 'json'
5
6
  gem 'rabl', :path => File.expand_path(File.dirname(__FILE__) + "/../../")
@@ -1,7 +1,7 @@
1
1
  # Be sure to restart your server when you modify this file
2
2
 
3
3
  # Specifies gem version of Rails to use when vendor/rails is not present
4
- RAILS_GEM_VERSION = '2.3.14' unless defined? RAILS_GEM_VERSION
4
+ RAILS_GEM_VERSION = '2.3.18' unless defined? RAILS_GEM_VERSION
5
5
 
6
6
  # Bootstrap the Rails environment, frameworks, and default configuration
7
7
  require File.join(File.dirname(__FILE__), 'boot')
@@ -1,4 +1,4 @@
1
- source 'http://rubygems.org'
1
+ source 'https://rubygems.org'
2
2
 
3
3
  gem 'rails', '~> 3.0.17'
4
4
 
@@ -48,9 +48,9 @@ context "UsersController" do
48
48
  end.equals { @users.map { |u| u.phone_numbers.map(&:formatted) } }
49
49
 
50
50
  # Node (renders collection partial)
51
- asserts("contains formatted node numbers") do
52
- json_output.map { |u| u["user"]["node_numbers"].map { |n| n["formatted"] } }
53
- end.equals { @users.map { |u| u.phone_numbers.map(&:formatted) } }
51
+ asserts("contains reversed node numbers") do
52
+ json_output.map { |u| u["user"]["node_numbers"].map { |n| n["reversed"] } }
53
+ end.equals { @users.map { |u| u.phone_numbers.map(&:formatted).map(&:reverse) } }
54
54
  end # index
55
55
 
56
56
  context "for show action" do
@@ -1,4 +1,4 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
 
3
3
  gem 'rake'
4
4
  gem 'activerecord', :require => "active_record"
data/lib/rabl/engine.rb CHANGED
@@ -21,6 +21,7 @@ module Rabl
21
21
  # Rabl::Engine.new("...source...", { :format => "xml" }).render(scope, { :foo => "bar", :object => @user })
22
22
  def render(scope, locals, &block)
23
23
  reset_options!
24
+ locals.merge!(locals.delete(:locals) || {})
24
25
  @_locals, @_scope = locals, scope
25
26
  self.copy_instance_variables_from(@_scope, [:@assigns, :@helpers])
26
27
  locals.each { |k,v| instance_variable_set(:"@#{k}", v) }
data/lib/rabl/partials.rb CHANGED
@@ -24,7 +24,7 @@ module Rabl
24
24
  return object if object.nil?
25
25
  return [] if is_collection?(object) && object.blank? # empty collection
26
26
  engine_options = options.reverse_merge(:format => "hash", :view_path => @_view_path, :root => (options[:root] || false))
27
- Rabl::Engine.new(options[:source], engine_options).render(@_scope, :object => object, &block)
27
+ Rabl::Engine.new(options[:source], engine_options).render(@_scope, :object => object, :locals => options[:locals], &block)
28
28
  end
29
29
 
30
30
  # Returns source for a given relative file
data/lib/rabl/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rabl
2
- VERSION = "0.8.1"
2
+ VERSION = "0.8.2"
3
3
  end
data/test/builder_test.rb CHANGED
@@ -144,7 +144,7 @@ context "Rabl::Builder" do
144
144
  context "#extend" do
145
145
  asserts "that it does not genereate if no data is present" do
146
146
  b = builder :extends => [{ :file => 'users/show', :options => {}, :block => lambda { |u| attribute :name }}]
147
- mock(b).partial('users/show',{ :object => @user}).returns({}).subject
147
+ mock(b).partial('users/show',{ :object => @user }).returns({}).subject
148
148
  b.build(@user)
149
149
  end.equals({})
150
150
 
data/test/engine_test.rb CHANGED
@@ -306,10 +306,29 @@ context "Rabl::Engine" do
306
306
  end.equals "{\"user\":{\"age\":12}}"
307
307
  end
308
308
 
309
+ context "#partial" do
310
+ asserts "that it creates object from partial and passes local" do
311
+ template = rabl %{
312
+ object false
313
+ node :foo do
314
+ partial("foo/bar", :object => @user, :locals => { :foo => "bar" })
315
+ end
316
+ }
317
+ scope = Object.new
318
+ @user = User.new(:name => 'leo', :city => 'LA', :age => 12)
319
+ scope.instance_variable_set :@user, @user
320
+ any_instance_of(Rabl::Engine) do |b|
321
+ mock(b).fetch_source("foo/bar", :view_path => nil).once
322
+ mock(b).object_to_hash(@user, :locals => { :foo => "bar" }, :source => nil, :source_location => nil).returns({ :name => 'leo', :city => 'LA', :age => 12 })
323
+ end
324
+ JSON.parse(template.render(scope))
325
+ end.equals JSON.parse("{ \"foo\" : {\"name\":\"leo\",\"city\":\"LA\",\"age\":12} }")
326
+ end
327
+
309
328
  teardown do
310
329
  Rabl.reset_configuration!
311
330
  end
312
- end
331
+ end # with json root
313
332
 
314
333
  context "without json root" do
315
334
  setup do
@@ -585,7 +604,7 @@ context "Rabl::Engine" do
585
604
  teardown do
586
605
  Rabl.reset_configuration!
587
606
  end
588
- end
607
+ end # without json root
589
608
 
590
609
  context "without child root" do
591
610
  setup do
@@ -48,9 +48,9 @@ context "UsersController" do
48
48
  end.equals { @users.map { |u| u.phone_numbers.map(&:formatted) } }
49
49
 
50
50
  # Node (renders collection partial)
51
- asserts("contains formatted node numbers") do
52
- json_output.map { |u| u["user"]["node_numbers"].map { |n| n["formatted"] } }
53
- end.equals { @users.map { |u| u.phone_numbers.map(&:formatted) } }
51
+ asserts("contains reversed node numbers") do
52
+ json_output.map { |u| u["user"]["node_numbers"].map { |n| n["reversed"] } }
53
+ end.equals { @users.map { |u| u.phone_numbers.map(&:formatted).map(&:reverse) } }
54
54
  end # index
55
55
 
56
56
  context "for show action" do
@@ -131,5 +131,5 @@ context "Rabl::Partials" do
131
131
  Rabl.configuration.view_paths = []
132
132
  end
133
133
  end
134
- end
135
- end
134
+ end # Rails
135
+ end # Rabl::Partials
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rabl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.8.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-25 00:00:00.000000000 Z
12
+ date: 2013-03-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -351,17 +351,14 @@ files:
351
351
  - fixtures/rails3_2/public/index.html
352
352
  - fixtures/rails3_2/public/robots.txt
353
353
  - fixtures/rails3_2/script/rails
354
- - fixtures/rails3_2/test/fixtures/.gitkeep
355
354
  - fixtures/rails3_2/test/fixtures/phone_numbers.yml
356
355
  - fixtures/rails3_2/test/fixtures/posts.yml
357
356
  - fixtures/rails3_2/test/fixtures/users.yml
358
- - fixtures/rails3_2/test/functional/.gitkeep
359
357
  - fixtures/rails3_2/test/functional/posts_controller_test.rb
360
358
  - fixtures/rails3_2/test/functional/users_controller_test.rb
361
359
  - fixtures/rails3_2/test/integration/.gitkeep
362
360
  - fixtures/rails3_2/test/performance/browsing_test.rb
363
361
  - fixtures/rails3_2/test/test_helper.rb
364
- - fixtures/rails3_2/test/unit/.gitkeep
365
362
  - fixtures/rails3_2/test/unit/helpers/posts_helper_test.rb
366
363
  - fixtures/rails3_2/test/unit/helpers/users_helper_test.rb
367
364
  - fixtures/rails3_2/test/unit/phone_number_test.rb
@@ -424,7 +421,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
424
421
  version: '0'
425
422
  segments:
426
423
  - 0
427
- hash: 2506448699878914083
424
+ hash: 1400362274549242151
428
425
  required_rubygems_version: !ruby/object:Gem::Requirement
429
426
  none: false
430
427
  requirements:
@@ -433,7 +430,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
433
430
  version: '0'
434
431
  segments:
435
432
  - 0
436
- hash: 2506448699878914083
433
+ hash: 1400362274549242151
437
434
  requirements: []
438
435
  rubyforge_project: rabl
439
436
  rubygems_version: 1.8.25
File without changes
File without changes
File without changes