rabl 0.5.5.h → 0.5.5.i

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/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # CHANGELOG
2
2
 
3
- ## 0.5.5.a-h
3
+ ## 0.5.5.a-i
4
4
 
5
5
  * Change engine to only instantiate one builder when rendering a collection
6
6
  * Alias to\_msgpack to to\_mpac
@@ -10,6 +10,8 @@
10
10
  * Adds a 'object_root' option to collection (thanks @blakewatters)
11
11
  * Adds a 'root_name' option to collection
12
12
  * Adds PList format support (thanks @alzeih)
13
+ * Fixes infinite recursion in edge case calculating object root name
14
+ * Fixes issue with nameless node that has an array result
13
15
 
14
16
  ## 0.5.4
15
17
 
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # RABL #
2
2
 
3
- RABL (Ruby API Builder Language) is a Rails and [Padrino](http://padrinorb.com) ruby templating system for generating JSON, XML, MessagePack and BSON. When using the ActiveRecord 'to_json' method, I tend to quickly find myself wanting a more expressive and powerful solution for generating APIs.
3
+ RABL (Ruby API Builder Language) is a Rails and [Padrino](http://padrinorb.com) ruby templating system for generating JSON, XML, MessagePack, PList and BSON. When using the ActiveRecord 'to_json' method, I tend to quickly find myself wanting a more expressive and powerful solution for generating APIs.
4
4
  This is especially frustrating when the JSON representation is complex or doesn't match the exact schema defined in the database.
5
5
 
6
6
  I wanted a simple and flexible system for generating my APIs. In particular, I wanted to easily:
data/lib/rabl/builder.rb CHANGED
@@ -73,8 +73,8 @@ module Rabl
73
73
  result = block.call(@_object)
74
74
  if name.present?
75
75
  @_result[name] = result
76
- else
77
- @_result.merge!(result) if result
76
+ elsif result.respond_to?(:each_pair) # merge hash into root hash
77
+ @_result.merge!(result)
78
78
  end
79
79
  end
80
80
  alias_method :code, :node
data/lib/rabl/helpers.rb CHANGED
@@ -14,15 +14,15 @@ module Rabl
14
14
  # data_name(data) => "user"
15
15
  # data_name(@user => :person) => :person
16
16
  # data_name(@users) => :user
17
- # data_name([@user]) => "user"
17
+ # data_name([@user]) => "users"
18
18
  # data_name([]) => "array"
19
19
  def data_name(data)
20
20
  return nil unless data # nil or false
21
21
  return data.values.first if data.is_a?(Hash) # @user => :user
22
22
  data = @_object.send(data) if data.is_a?(Symbol) && @_object # :address
23
- if data.respond_to?(:first)
23
+ if is_collection?(data) && data.respond_to?(:first) # data collection
24
24
  data_name(data.first).to_s.pluralize if data.first.present?
25
- else # actual data object
25
+ elsif is_object?(data) # actual data object
26
26
  object_name = object_root_name if object_root_name
27
27
  object_name ||= collection_root_name.to_s.singularize if collection_root_name
28
28
  object_name ||= data.class.respond_to?(:model_name) ? data.class.model_name.element : data.class.to_s.downcase
data/lib/rabl/partials.rb CHANGED
@@ -9,7 +9,6 @@ module Rabl
9
9
  def partial(file, options={}, &block)
10
10
  raise ArgumentError, "Must provide an :object option to render a partial" unless options.has_key?(:object)
11
11
  object, view_path = options.delete(:object), options.delete(:view_path)
12
- return if object.blank?
13
12
  source, location = self.fetch_source(file, :view_path => view_path)
14
13
  engine_options = options.merge(:source => source, :source_location => location)
15
14
  self.object_to_hash(object, engine_options, &block)
@@ -18,10 +17,12 @@ module Rabl
18
17
  # Returns a hash based representation of any data object given ejs template block
19
18
  # object_to_hash(@user) { attribute :full_name } => { ... }
20
19
  # object_to_hash(@user, :source => "...") { attribute :full_name } => { ... }
20
+ # object_to_hash([@user], :source => "...") { attribute :full_name } => { ... }
21
21
  # options must have :source (rabl file contents)
22
22
  # options can have :source_location (source filename)
23
23
  def object_to_hash(object, options={}, &block)
24
24
  return object unless is_object?(object) || is_collection?(object)
25
+ return [] if is_collection?(object) && object.blank? # empty collection
25
26
  engine_options = options.merge(:format => "hash", :root => (options[:root] || false))
26
27
  Rabl::Engine.new(options[:source], engine_options).render(@_scope, :object => object, &block)
27
28
  end
data/lib/rabl/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rabl
2
- VERSION = "0.5.5.h"
2
+ VERSION = "0.5.5.i"
3
3
  end
data/test/helpers_test.rb CHANGED
@@ -2,10 +2,31 @@ require 'tmpdir'
2
2
  require 'pathname'
3
3
  require File.expand_path('../../lib/rabl', __FILE__)
4
4
 
5
- class TestPartial
5
+ class TestHelperMethods
6
6
  include Rabl::Helpers
7
7
  end
8
8
 
9
9
  context "Rabl::Helpers" do
10
- # TODO needs tests
11
- end
10
+ setup do
11
+ @helper_class = TestHelperMethods.new
12
+ @user = User.new
13
+ end
14
+
15
+ context "for data_name method" do
16
+ asserts "returns nil if no data" do
17
+ @helper_class.data_name(nil)
18
+ end.equals(nil)
19
+
20
+ asserts "returns alias if hash with symbol is passed" do
21
+ @helper_class.data_name(@user => :user)
22
+ end.equals(:user)
23
+
24
+ asserts "returns name of first object of a collection" do
25
+ @helper_class.data_name([@user, @user])
26
+ end.equals('users')
27
+
28
+ asserts "returns name of an object" do
29
+ @helper_class.data_name(@user)
30
+ end.equals('user')
31
+ end
32
+ end
data/test/models/user.rb CHANGED
@@ -1,14 +1,16 @@
1
1
  class User
2
- attr_accessor :age, :city, :name
2
+ attr_accessor :age, :city, :name, :first
3
3
 
4
- DEFAULT_AGE = 24
5
- DEFAULT_CITY = 'irvine'
6
- DEFAULT_NAME = 'rabl'
4
+ DEFAULT_AGE = 24
5
+ DEFAULT_CITY = 'irvine'
6
+ DEFAULT_NAME = 'rabl'
7
+ DEFAULT_FIRST = 'bob'
7
8
 
8
9
  def initialize(attributes={})
9
- self.age = attributes[:age] || DEFAULT_AGE
10
- self.city = attributes[:city] || DEFAULT_CITY
11
- self.name = attributes[:name] || DEFAULT_NAME
10
+ self.age = attributes[:age] || DEFAULT_AGE
11
+ self.city = attributes[:city] || DEFAULT_CITY
12
+ self.name = attributes[:name] || DEFAULT_NAME
13
+ self.first = attributes[:first] || DEFAULT_FIRST
12
14
  end
13
15
  end
14
16
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rabl
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: 6
5
- version: 0.5.5.h
5
+ version: 0.5.5.i
6
6
  platform: ruby
7
7
  authors:
8
8
  - Nathan Esquenazi
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-02-16 00:00:00 Z
13
+ date: 2012-02-26 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: multi_json
@@ -312,7 +312,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
312
312
  requirements: []
313
313
 
314
314
  rubyforge_project: rabl
315
- rubygems_version: 1.8.12
315
+ rubygems_version: 1.8.15
316
316
  signing_key:
317
317
  specification_version: 3
318
318
  summary: General ruby templating with json, bson, xml and msgpack support