rabl-rails 0.1.2 → 0.1.3

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,5 +1,10 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.1.3
4
+ * Render correcly when variables are not passed via the assigns ivar but as helper methods
5
+ (decent_exposure, focused_controller)
6
+ * Add custom Responder
7
+
3
8
  ## 0.1.2
4
9
  * Add RablRails#render method (see README or source code)
5
10
  * Fix fail when JSON engine is not found. Now fallback to MultiJson.default_adapter
data/lib/rabl-rails.rb CHANGED
@@ -17,31 +17,41 @@ require 'multi_json'
17
17
 
18
18
  module RablRails
19
19
  extend Renderer
20
-
20
+
21
+ autoload :Responder, 'rabl-rails/responder'
22
+
21
23
  mattr_accessor :cache_templates
22
24
  @@cache_templates = true
23
-
25
+
24
26
  mattr_accessor :include_json_root
25
27
  @@include_json_root = true
26
28
 
27
29
  mattr_reader :json_engine
28
30
  @@json_engine = :yajl
29
31
 
32
+ mattr_accessor :use_custom_responder
33
+ @@use_custom_responder = false
34
+
35
+ mattr_accessor :responder_default_template
36
+ @@responder_default_template = 'show'
37
+
30
38
  def self.configure
31
39
  yield self
40
+
41
+ ActionController::Base.responder = Responder if self.use_custom_responder
32
42
  end
33
-
43
+
34
44
  def self.json_engine=(name)
35
45
  MultiJson.engine = name
36
46
  @@json_engine = name
37
47
  rescue LoadError
38
48
  Rails.logger.warn %Q(WARNING: rabl-rails could not load "#{self.json_engine}" as JSON engine, fallback to default)
39
49
  end
40
-
50
+
41
51
  def self.cache_templates?
42
52
  ActionController::Base.perform_caching && @@cache_templates
43
53
  end
44
-
54
+
45
55
  def self.load_default_engines!
46
56
  self.json_engine = :yajl
47
57
  end
@@ -133,7 +133,7 @@ module RablRails
133
133
  name_or_data
134
134
  end
135
135
  end
136
-
136
+
137
137
  def sub_compile(data)
138
138
  return {} unless block_given?
139
139
  old_template, @template = @template, {}
@@ -18,7 +18,9 @@ module RablRails
18
18
  # method defined by the renderer.
19
19
  #
20
20
  def render(template)
21
- collection_or_resource = instance_variable_get(template.data) if template.data
21
+ collection_or_resource = if template.data
22
+ template.data.to_s.start_with?('@') ? instance_variable_get(template.data) : @_context.send(template.data)
23
+ end
22
24
  collection_or_resource = @_context.target_object unless collection_or_resource || template.data == false || !@_context.respond_to?(:target_object)
23
25
  output_hash = collection_or_resource.respond_to?(:each) ? render_collection(collection_or_resource, template.source) :
24
26
  render_resource(collection_or_resource, template.source)
@@ -55,7 +57,13 @@ module RablRails
55
57
  when Hash
56
58
  current_value = value.dup
57
59
  data_symbol = current_value.delete(:_data)
58
- object = data_symbol.nil? ? data : data_symbol.to_s.start_with?('@') ? instance_variable_get(data_symbol) : data.send(data_symbol)
60
+ object = if data_symbol == nil
61
+ data
62
+ else
63
+ data_symbol.to_s.start_with?('@') ? instance_variable_get(data_symbol)
64
+ : data.respond_to?(data_symbol) ? data.send(data_symbol)
65
+ : send(data_symbol)
66
+ end
59
67
 
60
68
  if key.to_s.start_with?('_') # glue
61
69
  current_value.each_pair { |k, v|
@@ -0,0 +1,22 @@
1
+ module RablRails
2
+ #
3
+ # Override default responder's api behavior to not
4
+ # user to_format methods on a resource as a default
5
+ # representation but instead use a rabl template
6
+ #
7
+ class Responder < ActionController::Responder
8
+ protected
9
+
10
+ def api_behavior(error)
11
+ rabl_options = options.merge(template: RablRails.responder_default_template)
12
+
13
+ if get?
14
+ controller.default_render rabl_options
15
+ elsif post?
16
+ controller.default_render rabl_options.merge!(status: :created, location: api_location)
17
+ else
18
+ head :no_content
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,3 +1,3 @@
1
1
  module RablRails
2
- VERSION = '0.1.2'
2
+ VERSION = '0.1.3'
3
3
  end
@@ -19,7 +19,6 @@ class DeepNestingTest < ActiveSupport::TestCase
19
19
  @post = Post.new(42, 'I rock !')
20
20
  @user = User.new(1, 'foobar', 'male')
21
21
  @user.stub(:posts).and_return([@post])
22
- @user.stub(:respond_to?).with(:each).and_return(false)
23
22
 
24
23
  @context = Context.new
25
24
  @context.assigns['user'] = @user
@@ -4,7 +4,6 @@ class TestJsonRenderer < ActiveSupport::TestCase
4
4
 
5
5
  setup do
6
6
  @data = User.new(1, 'foobar', 'male')
7
- @data.stub(:respond_to?).with(:each).and_return(false)
8
7
 
9
8
  @context = Context.new
10
9
  @context.assigns['data'] = @data
@@ -28,6 +27,13 @@ class TestJsonRenderer < ActiveSupport::TestCase
28
27
  assert_equal %q([{}]), render_json_output
29
28
  end
30
29
 
30
+ test "render object with local methods (used by decent_exposure)" do
31
+ @context.stub(:user).and_return(@data)
32
+ @template.data = :user
33
+ @template.source = { :id => :id }
34
+ assert_equal %q({"id":1}), render_json_output
35
+ end
36
+
31
37
  test "render single object attributes" do
32
38
  @template.source = { :id => :id, :name => :name }
33
39
  assert_equal %q({"id":1,"name":"foobar"}), render_json_output
@@ -44,6 +50,12 @@ class TestJsonRenderer < ActiveSupport::TestCase
44
50
  assert_equal %q({"author":{"name":"foobar"}}), render_json_output
45
51
  end
46
52
 
53
+ test "render child with local methods (used by decent_exposure)" do
54
+ @context.stub(:user).and_return(@data)
55
+ @template.source = { :author => { :_data => :user, :name => :name } }
56
+ assert_equal %q({"author":{"name":"foobar"}}), render_json_output
57
+ end
58
+
47
59
  test "render glued attributes from single object" do
48
60
  @template.source = { :_glue0 => { :_data => :@data, :name => :name } }
49
61
  assert_equal %q({"name":"foobar"}), render_json_output
@@ -75,7 +87,7 @@ class TestJsonRenderer < ActiveSupport::TestCase
75
87
  @template.source = { :name => [condition, proc] }
76
88
  assert_equal %q({}), render_json_output
77
89
  end
78
-
90
+
79
91
  test "node with context method call" do
80
92
  @context.stub(:respond_to?).with(:context_method).and_return(true)
81
93
  @context.stub(:context_method).and_return('marty')
@@ -86,7 +98,6 @@ class TestJsonRenderer < ActiveSupport::TestCase
86
98
 
87
99
  test "partial should be evaluated at rendering time" do
88
100
  # Set assigns
89
- @data.stub(:respond_to?).with(:empty?).and_return(false)
90
101
  @context.assigns['user'] = @data
91
102
 
92
103
  # Stub Library#get
@@ -114,17 +125,17 @@ class TestJsonRenderer < ActiveSupport::TestCase
114
125
 
115
126
  assert_equal %q({"users":[]}), render_json_output
116
127
  end
117
-
128
+
118
129
  test "render object with root node" do
119
130
  @template.root_name = :author
120
131
  @template.source = { :id => :id, :name => :name }
121
- assert_equal %q({"author":{"id":1,"name":"foobar"}}), render_json_output
132
+ assert_equal %q({"author":{"id":1,"name":"foobar"}}), render_json_output
122
133
  end
123
-
134
+
124
135
  test "render object with root options set to false" do
125
136
  RablRails.include_json_root = false
126
137
  @template.root_name = :author
127
138
  @template.source = { :id => :id, :name => :name }
128
- assert_equal %q({"id":1,"name":"foobar"}), render_json_output
139
+ assert_equal %q({"id":1,"name":"foobar"}), render_json_output
129
140
  end
130
141
  end
data/test/test_helper.rb CHANGED
@@ -32,12 +32,12 @@ end
32
32
 
33
33
  class Context
34
34
  attr_writer :virtual_path
35
-
35
+
36
36
  def initialize
37
37
  @_assigns = {}
38
38
  @virtual_path = nil
39
39
  end
40
-
40
+
41
41
  def assigns
42
42
  @_assigns
43
43
  end
@@ -47,4 +47,11 @@ class Context
47
47
  end
48
48
  end
49
49
 
50
- User = Struct.new(:id, :name, :sex)
50
+ class User
51
+ attr_accessor :id, :name, :sex
52
+ def initialize(id=nil, name=nil, sex=nil)
53
+ @id = id
54
+ @name = name
55
+ @sex = sex
56
+ end
57
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rabl-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
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-08-03 00:00:00.000000000 Z
12
+ date: 2012-09-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -80,6 +80,7 @@ files:
80
80
  - lib/rabl-rails/renderer.rb
81
81
  - lib/rabl-rails/renderers/base.rb
82
82
  - lib/rabl-rails/renderers/json.rb
83
+ - lib/rabl-rails/responder.rb
83
84
  - lib/rabl-rails/template.rb
84
85
  - lib/rabl-rails/version.rb
85
86
  - lib/tasks/rabl-rails.rake