rabl 0.7.8 → 0.7.9

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,6 +1,11 @@
1
1
  # CHANGELOG
2
2
 
3
- ## 0.7.9 (unreleased)
3
+ ## 0.7.10 (unreleased)
4
+
5
+ ## 0.7.9
6
+
7
+ * Replace yajl with oj in docs and tests
8
+ * Fix handling of empty children arrays with tests (Thanks @sethvargo)
4
9
 
5
10
  ## 0.7.8
6
11
 
data/README.md CHANGED
@@ -18,6 +18,9 @@ I wanted a simple and flexible system for generating my APIs. In particular, I w
18
18
  Anyone who has tried the 'to_json' method used in ActiveRecord for generating a JSON response has felt the pain of this restrictive approach.
19
19
  RABL is a general templating system created to solve these problems in an entirely new way.
20
20
 
21
+ For a breakdown of common misconceptions about RABL, please check out our guide to
22
+ [understanding RABL](https://github.com/nesquena/rabl/wiki/Understanding-RABL) which can help clear up any confusion about this project.
23
+
21
24
  ## Breaking Changes ##
22
25
 
23
26
  * v0.6.14 (released June 28, 2012) requires the use of render_views
@@ -37,13 +40,13 @@ or add to your Gemfile:
37
40
  ```ruby
38
41
  # Gemfile
39
42
  gem 'rabl'
40
- # Also add either `json` or `yajl-ruby` as the JSON parser
41
- gem 'yajl-ruby'
43
+ # Also add either `oj` or `yajl-ruby` as the JSON parser
44
+ gem 'oj'
42
45
  ```
43
46
 
44
47
  and run `bundle install` to install the dependency.
45
48
 
46
- If you are using **Rails 2.X, Rails 3.X or Padrino**, RABL works without configuration.
49
+ If you are using **Rails 2.3.8 (and up), Rails 3.X or Padrino**, RABL works without configuration.
47
50
 
48
51
  **Important:** With Padrino, be sure that **the rabl gem is listed after the padrino gem in your Gemfile**, otherwise
49
52
  Rabl will not register properly as a template engine.
@@ -152,12 +155,12 @@ If `view_paths` is set to a path, this view path will be checked for every rabl
152
155
  Add to this path especially when including Rabl in an engine and using view paths within a another Rails app.
153
156
 
154
157
  Note that the `json_engine` option uses [multi_json](http://intridea.com/2010/6/14/multi-json-the-swappable-json-handler) engine
155
- defaults so that in most cases you **don't need to configure this** directly. For example, if you wish to use yajl as
158
+ defaults so that in most cases you **don't need to configure this** directly. For example, if you wish to use [oj](https://github.com/ohler55/oj) as
156
159
  the primary JSON encoding engine simply add that to your Gemfile:
157
160
 
158
161
  ```ruby
159
162
  # Gemfile
160
- gem 'yajl-ruby', :require => "yajl"
163
+ gem 'oj'
161
164
  ```
162
165
 
163
166
  and RABL will automatically start using that engine for encoding your JSON responses!
@@ -503,19 +506,20 @@ Rails and Padrino. I recommend a before_filter on that controller or directly sp
503
506
  ## Resources ##
504
507
 
505
508
  There are many resources available relating to RABL including the [RABL Wiki](https://github.com/nesquena/rabl/wiki),
506
- and many tutorials and guides detailed below.
509
+ and many tutorials and guides detailed below.
507
510
  You can check out the [RABL Site](http://nesquena.github.com/rabl) as well.
508
511
 
509
512
  ### Advanced Usage ###
510
513
 
511
514
  Links to resources for advanced usage:
512
515
 
513
- * Production Speed Optimizations: https://github.com/nesquena/rabl/wiki/Rabl-In-Production
514
- * Grape Integration: https://github.com/nesquena/rabl/wiki/Using-Rabl-with-Grape
515
- * Rendering JSON for a tree structure using RABL: https://github.com/nesquena/rabl/issues/70
516
- * Layouts (erb, haml and rabl) in RABL: https://github.com/nesquena/rabl/wiki/Using-Layouts
517
- * Backbone or [Ember.js](http://www.emberjs.com) Integration: https://github.com/nesquena/rabl/wiki/Backbone-Integration
518
- * RABL with Rails Engines: https://github.com/nesquena/rabl/wiki/Setup-rabl-with-rails-engines
516
+ * [Managing Complexity](https://github.com/nesquena/rabl/wiki/Managing-complexity-with-presenters)
517
+ * [Production Optimizations](https://github.com/nesquena/rabl/wiki/Rabl-In-Production)
518
+ * [Grape Integration](https://github.com/nesquena/rabl/wiki/Using-Rabl-with-Grape)
519
+ * [Rendering JSON for a tree structure using RABL](https://github.com/nesquena/rabl/issues/70)
520
+ * [Layouts (erb, haml and rabl) in RABL](https://github.com/nesquena/rabl/wiki/Using-Layouts)
521
+ * [Backbone or Ember.js Integration](https://github.com/nesquena/rabl/wiki/Backbone-Integration)
522
+ * [RABL with Rails Engines](https://github.com/nesquena/rabl/wiki/Setup-rabl-with-rails-engines)
519
523
 
520
524
  Please add your own usages and let me know so we can add them here! Also be sure to check out
521
525
  the [RABL Wiki](https://github.com/nesquena/rabl/wiki) for other usages.
@@ -541,16 +545,17 @@ Let me know if there's any other useful resources not listed here.
541
545
 
542
546
  There are other libraries that can either complement or extend the functionality of RABL:
543
547
 
548
+ * [versioncake](https://github.com/bwillis/versioncake) - Excellent library for easily versioning your RABL APIs
544
549
  * [gon](https://github.com/gazay/gon) - Exposes your Rails variables in JS with RABL support integrated.
545
- * [rabl-rails](https://github.com/ccocchi/rabl-rails) - Reimplementation for RABL and Rails
550
+ * [rabl-rails](https://github.com/ccocchi/rabl-rails) - Reimplementation for RABL and Rails
546
551
  [focused on speed](https://github.com/ccocchi/rabl-benchmark/blob/master/BENCHMARK).
547
552
 
548
553
  Let me know if there's any other related libraries not listed here.
549
554
 
550
555
  ### Troubleshooting ###
551
556
 
552
- * Redundant calls for a collection: https://github.com/nesquena/rabl/issues/142#issuecomment-2969107
553
- * Testing RABL Views: https://github.com/nesquena/rabl/issues/130#issuecomment-4179285
557
+ * [Redundant calls for a collection](https://github.com/nesquena/rabl/issues/142#issuecomment-2969107)
558
+ * [Testing RABL Views](https://github.com/nesquena/rabl/issues/130#issuecomment-4179285)
554
559
 
555
560
  ### Examples ###
556
561
 
data/lib/rabl/helpers.rb CHANGED
@@ -10,7 +10,7 @@ module Rabl
10
10
  # data_object(:user => :person) => @_object.send(:user)
11
11
  def data_object(data)
12
12
  data = (data.is_a?(Hash) && data.keys.size == 1) ? data.keys.first : data
13
- data.is_a?(Symbol) && @_object ? @_object.__send__(data) : data
13
+ data.is_a?(Symbol) && defined?(@_object) && @_object ? @_object.__send__(data) : data
14
14
  end
15
15
 
16
16
  # data_object_attribute(data) => @_object.send(data)
@@ -23,14 +23,17 @@ module Rabl
23
23
  # data_name(@users) => :user
24
24
  # data_name([@user]) => "users"
25
25
  # data_name([]) => "array"
26
- def data_name(data)
27
- return nil unless data # nil or false
28
- return data.values.first if data.is_a?(Hash) # @user => :user
29
- data = @_object.__send__(data) if data.is_a?(Symbol) && @_object # :address
30
- if is_collection?(data) && data.respond_to?(:first) # data collection
31
- data_name(data.first).to_s.pluralize if data.first.present?
32
- elsif is_object?(data) # actual data object
26
+ def data_name(data_token)
27
+ return unless data_token # nil or false
28
+ return data_token.values.first if data_token.is_a?(Hash) # @user => :user
29
+ data = data_object(data_token)
30
+ if is_collection?(data) && data.respond_to?(:first) # data is a collection
31
+ object_name = data_name(data.first).to_s.pluralize if data.first.present?
32
+ object_name ||= data_token if data_token.is_a?(Symbol)
33
+ object_name
34
+ elsif is_object?(data) # data is an object
33
35
  object_name = object_root_name if object_root_name
36
+ object_name ||= data if data.is_a?(Symbol)
34
37
  object_name ||= collection_root_name.to_s.singularize if collection_root_name
35
38
  object_name ||= data.class.respond_to?(:model_name) ? data.class.model_name.element : data.class.to_s.downcase
36
39
  object_name
@@ -42,12 +45,12 @@ module Rabl
42
45
  # determine_object_root(@user, :user, true) => "user"
43
46
  # determine_object_root(@user, :person) => "person"
44
47
  # determine_object_root([@user, @user]) => "user"
45
- def determine_object_root(data_object, data_name=nil, include_root=true)
48
+ def determine_object_root(data_token, data_name=nil, include_root=true)
46
49
  return if object_root_name == false
47
50
  root_name = data_name.to_s if include_root
48
- if is_object?(data_object)
51
+ if is_object?(data_token)
49
52
  root_name
50
- elsif is_collection?(data_object)
53
+ elsif is_collection?(data_token)
51
54
  object_root_name || (root_name.singularize if root_name)
52
55
  end
53
56
  end
data/lib/rabl/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rabl
2
- VERSION = "0.7.8"
2
+ VERSION = "0.7.9"
3
3
  end
data/rabl.gemspec CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
26
26
  s.add_development_dependency 'rr', '~> 1.0.2'
27
27
  s.add_development_dependency 'rake'
28
28
  s.add_development_dependency 'tilt'
29
- s.add_development_dependency 'yajl-ruby'
29
+ s.add_development_dependency 'oj'
30
30
  s.add_development_dependency 'msgpack', '~> 0.4.5'
31
31
  s.add_development_dependency 'bson', '~> 1.7.0'
32
32
  s.add_development_dependency 'plist'
@@ -18,11 +18,11 @@ context 'Rabl::Configuration' do
18
18
  context 'custom JSON engine configured as Symbol' do
19
19
  setup do
20
20
  Rabl.configure do |c|
21
- c.json_engine = :yajl
21
+ c.json_engine = :oj
22
22
  end
23
23
  end
24
24
 
25
- asserts('uses a custom JSON engine') { topic.json_engine.to_s =~ /yajl/i }
25
+ asserts('uses a custom JSON engine') { topic.json_engine.to_s =~ /oj/i }
26
26
  end # custom json, symbol
27
27
 
28
28
  context 'custom JSON engine configured as Class' do
data/test/engine_test.rb CHANGED
@@ -501,7 +501,7 @@ context "Rabl::Engine" do
501
501
  end
502
502
 
503
503
  context "#child" do
504
- asserts "that it can create a child node" do
504
+ asserts "that it can create a singular child node" do
505
505
  template = rabl %{
506
506
  object @user
507
507
  attribute :name
@@ -512,7 +512,7 @@ context "Rabl::Engine" do
512
512
  JSON.parse(template.render(scope))
513
513
  end.equals JSON.parse("{\"name\":\"leo\",\"user\":{\"city\":\"LA\"}}")
514
514
 
515
- asserts "that it can create a child node with different key" do
515
+ asserts "that it can create a singular child node with different key" do
516
516
  template = rabl %{
517
517
  object @user
518
518
  attribute :name
@@ -523,6 +523,39 @@ context "Rabl::Engine" do
523
523
  JSON.parse(template.render(scope))
524
524
  end.equals JSON.parse("{\"name\":\"leo\",\"person\":{\"city\":\"LA\"}}")
525
525
 
526
+ asserts "that it can create a many child node" do
527
+ template = rabl %{
528
+ object @user
529
+ attribute :name
530
+ child(:hobbies) { attribute :name }
531
+ }
532
+ scope = Object.new
533
+ scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA')
534
+ JSON.parse(template.render(scope))
535
+ end.equals JSON.parse(%q^{"name":"leo", "hobbies":[{"hobby":{"name":"Photography"}}]}^)
536
+
537
+ asserts "that it can create a many child node with different key" do
538
+ template = rabl %{
539
+ object @user
540
+ attribute :name
541
+ child(:hobbies => :interests) { attribute :name }
542
+ }
543
+ scope = Object.new
544
+ scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA')
545
+ JSON.parse(template.render(scope))
546
+ end.equals JSON.parse(%q^{"name":"leo", "interests":[{"interest":{"name":"Photography"}}]}^)
547
+
548
+ asserts "that it can create a many child node with no data" do
549
+ template = rabl %{
550
+ object @user
551
+ attribute :name
552
+ child(:hobbies) { attribute :name }
553
+ }
554
+ scope = Object.new
555
+ scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA', :hobbies => [])
556
+ JSON.parse(template.render(scope))
557
+ end.equals JSON.parse(%q^{"name":"leo", "hobbies":[]}^)
558
+
526
559
  asserts "that it can be passed conditionals" do
527
560
  template = rabl %{
528
561
  object @user
data/test/helpers_test.rb CHANGED
@@ -17,6 +17,10 @@ context "Rabl::Helpers" do
17
17
  @helper_class.data_name(nil)
18
18
  end.equals(nil)
19
19
 
20
+ asserts "returns symbol if symbol with empty children" do
21
+ @helper_class.data_name(:user)
22
+ end.equals(:user)
23
+
20
24
  asserts "returns alias if hash with symbol is passed" do
21
25
  @helper_class.data_name(@user => :user)
22
26
  end.equals(:user)
data/test/models/user.rb CHANGED
@@ -1,21 +1,28 @@
1
1
  unless defined?(User)
2
2
  class User
3
- attr_accessor :age, :city, :name, :first, :float
3
+ attr_accessor :age, :city, :name, :first, :float, :hobbies
4
4
 
5
- DEFAULT_AGE = 24
6
- DEFAULT_CITY = 'irvine'
7
- DEFAULT_NAME = 'rabl'
8
- DEFAULT_FIRST = 'bob'
9
- DEFAULT_FLOAT = 1234.56
5
+ DEFAULT_AGE = 24
6
+ DEFAULT_CITY = 'irvine'
7
+ DEFAULT_NAME = 'rabl'
8
+ DEFAULT_FIRST = 'bob'
9
+ DEFAULT_FLOAT = 1234.56
10
+ DEFAULT_HOBBIES = ['Photography']
10
11
 
11
12
  def initialize(attributes={})
12
- self.age = attributes[:age] || DEFAULT_AGE
13
- self.city = attributes[:city] || DEFAULT_CITY
14
- self.name = attributes[:name] || DEFAULT_NAME
15
- self.first = attributes[:first] || DEFAULT_FIRST
16
- self.float = attributes[:float] || DEFAULT_FLOAT
13
+ self.age = attributes[:age] || DEFAULT_AGE
14
+ self.city = attributes[:city] || DEFAULT_CITY
15
+ self.name = attributes[:name] || DEFAULT_NAME
16
+ self.first = attributes[:first] || DEFAULT_FIRST
17
+ self.float = attributes[:float] || DEFAULT_FLOAT
18
+ self.hobbies = (attributes[:hobbies] || DEFAULT_HOBBIES).map { |h| Hobby.new(h) }
17
19
  end
18
20
  end
21
+
22
+ class Hobby
23
+ attr_accessor :name
24
+ def initialize(name); @name = name; end
25
+ end
19
26
  end
20
27
 
21
28
  unless defined?(NestedScope::User)
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.7.8
4
+ version: 0.7.9
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: 2012-11-26 00:00:00.000000000 Z
12
+ date: 2012-11-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -108,7 +108,7 @@ dependencies:
108
108
  - !ruby/object:Gem::Version
109
109
  version: '0'
110
110
  - !ruby/object:Gem::Dependency
111
- name: yajl-ruby
111
+ name: oj
112
112
  requirement: !ruby/object:Gem::Requirement
113
113
  none: false
114
114
  requirements: