rabl-rails 0.4.0 → 0.4.1

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.
@@ -1,5 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.4.1
4
+ * Make classes that should not be treated as collection configurable
5
+ * Internal change to determine rendering format
6
+
3
7
  ## 0.4.0
4
8
  * Internal cleanup and refactor
5
9
  * Remove the `allow_empty_format_in_template` option, since it has become
data/README.md CHANGED
@@ -99,6 +99,7 @@ RablRails.configure do |config|
99
99
  # config.replace_nil_values_with_empty_strings = false
100
100
  # config.replace_empty_string_values_with_nil = false
101
101
  # config.exclude_nil_values = false
102
+ # config.non_collection_classes = Set.new(['Struct'])
102
103
  end
103
104
  ```
104
105
 
@@ -1,3 +1,5 @@
1
+ require 'set'
2
+
1
3
  module RablRails
2
4
  class Configuration
3
5
  attr_accessor :json_engine, :include_json_root, :enable_jsonp_callbacks
@@ -9,6 +11,7 @@ module RablRails
9
11
  attr_accessor :replace_nil_values_with_empty_strings
10
12
  attr_accessor :replace_empty_string_values_with_nil
11
13
  attr_accessor :exclude_nil_values
14
+ attr_accessor :non_collection_classes
12
15
 
13
16
  def initialize
14
17
  @json_engine = defined?(::Oj) ? ::Oj : ::JSON
@@ -20,7 +23,7 @@ module RablRails
20
23
  @plist_engine = defined?(::Plist) ? ::Plist::Emit : nil
21
24
  @include_plist_root = false
22
25
 
23
- @cache_templates = ActionController::Base.perform_caching
26
+ @cache_templates = ActionController::Base.perform_caching
24
27
 
25
28
  @use_custom_responder = false
26
29
  @responder_default_template = 'show'
@@ -28,6 +31,8 @@ module RablRails
28
31
  @replace_nil_values_with_empty_strings = false
29
32
  @replace_empty_string_values_with_nil = false
30
33
  @exclude_nil_values = false
34
+
35
+ @non_collection_classes = Set.new(['Struct'])
31
36
  end
32
37
 
33
38
  def use_custom_responder=(value)
@@ -3,9 +3,6 @@ require 'active_support/core_ext/class/attribute'
3
3
  module RablRails
4
4
  module Handlers
5
5
  class Rabl
6
- class_attribute :default_format
7
- self.default_format = 'application/json'
8
-
9
6
  def self.call(template)
10
7
  %{
11
8
  RablRails::Library.instance.
@@ -1,7 +1,10 @@
1
1
  module RablRails
2
2
  module Helpers
3
3
  def collection?(resource)
4
- resource && resource.respond_to?(:each) && !resource.is_a?(Struct)
4
+ klass = resource.class
5
+
6
+ resource && resource.respond_to?(:each) &&
7
+ klass.ancestors.none? { |a| RablRails.configuration.non_collection_classes.include? a.name }
5
8
  end
6
9
  end
7
10
  end
@@ -6,6 +6,15 @@ module RablRails
6
6
  class Library
7
7
  include Singleton
8
8
 
9
+ UnknownFormat = Class.new(StandardError)
10
+
11
+ RENDERER_MAP = {
12
+ json: Renderers::JSON,
13
+ xml: Renderers::XML,
14
+ ruby: Renderers::Hash,
15
+ plist: Renderers::PLIST
16
+ }.freeze
17
+
9
18
  def initialize
10
19
  @cached_templates = ThreadSafe::Cache.new
11
20
  @mutex = Monitor.new
@@ -17,8 +26,9 @@ module RablRails
17
26
 
18
27
  def get_rendered_template(source, view, locals = nil)
19
28
  compiled_template = compile_template_from_source(source, view)
20
- format = view.params[:format] ? view.params[:format].to_s.upcase : :JSON
21
- Renderers.const_get(format).render(compiled_template, view, locals)
29
+ format = view.lookup_context.rendered_format || :json
30
+ raise UnknownFormat, "#{format} is not supported in rabl-rails" unless RENDERER_MAP.key?(format)
31
+ RENDERER_MAP[format].render(compiled_template, view, locals)
22
32
  end
23
33
 
24
34
  def compile_template_from_source(source, view)
@@ -16,6 +16,10 @@ module RablRails
16
16
  @format = format.downcase
17
17
  end
18
18
 
19
+ def rendered_format
20
+ @format.to_sym
21
+ end
22
+
19
23
  #
20
24
  # Manually find given rabl template file with given format.
21
25
  # View path can be set via options, otherwise default Rails
@@ -42,7 +46,7 @@ module RablRails
42
46
 
43
47
  def initialize(path, options)
44
48
  @virtual_path = path
45
- @format = options.delete(:format) || 'json'
49
+ @format = options.delete(:format) || :json
46
50
  @_assigns = {}
47
51
  @options = options
48
52
 
@@ -1,3 +1,3 @@
1
1
  module RablRails
2
- VERSION = '0.4.0'
2
+ VERSION = '0.4.1'
3
3
  end
@@ -46,11 +46,23 @@ module ActionController
46
46
  end
47
47
 
48
48
  class Context
49
+ class LookupContext
50
+ def initialize(format)
51
+ @format = format
52
+ end
53
+
54
+ def rendered_format
55
+ @format.to_sym
56
+ end
57
+ end
58
+
49
59
  attr_writer :virtual_path
60
+ attr_reader :lookup_context
50
61
 
51
- def initialize
62
+ def initialize(format = :json)
52
63
  @_assigns = {}
53
64
  @virtual_path = nil
65
+ @lookup_context = LookupContext.new(format)
54
66
  end
55
67
 
56
68
  def assigns
@@ -0,0 +1,23 @@
1
+ require 'helper'
2
+ require 'set'
3
+
4
+ class TestHelpers < MINITEST_TEST_CLASS
5
+ include RablRails::Helpers
6
+
7
+ def test_collection_with_default
8
+ assert collection?(['foo'])
9
+ refute collection?(User.new(1))
10
+ end
11
+
12
+ NotACollection = Class.new do
13
+ def each; end
14
+ end
15
+
16
+ def test_collection_with_configuration
17
+ assert collection?(NotACollection.new)
18
+
19
+ with_configuration(:non_collection_classes, Set.new(['Struct', 'TestHelpers::NotACollection'])) do
20
+ refute collection?(NotACollection.new), 'NotACollection triggers #collection?'
21
+ end
22
+ end
23
+ end
@@ -13,41 +13,29 @@ class TestLibrary < MINITEST_TEST_CLASS
13
13
 
14
14
  describe '#get_rendered_template' do
15
15
  it 'compiles and renders template' do
16
- renderer = MiniTest::Mock.new
17
- renderer.expect :render, '{}', [@template, @context, nil]
18
-
19
16
  result = @library.stub :compile_template_from_source, @template do
20
- RablRails::Renderers.stub :const_get, renderer do
21
- @library.get_rendered_template '', @context
22
- end
17
+ @library.get_rendered_template '', @context
23
18
  end
24
19
 
25
20
  assert_equal '{}', result
26
- assert renderer.verify
27
21
  end
28
22
 
29
- it 'accepts format as string' do
23
+ it 'uses for from lookup context' do
24
+ context = Context.new(:xml)
30
25
  result = @library.stub :compile_template_from_source, @template do
31
- @context.stub :params, { format: 'xml' } do
32
- RablRails::Renderers::XML.stub :render, '<xml>' do
33
- @library.get_rendered_template '', @context
34
- end
26
+ RablRails::Renderers::XML.stub :render, '<xml>' do
27
+ @library.get_rendered_template '', context
35
28
  end
36
29
  end
37
30
 
38
31
  assert_equal '<xml>', result
39
32
  end
40
33
 
41
- it 'accepts format as symbol' do
42
- result = @library.stub :compile_template_from_source, @template do
43
- @context.stub :params, { format: :plist } do
44
- RablRails::Renderers::PLIST.stub :render, '<plist>' do
45
- @library.get_rendered_template '', @context
46
- end
47
- end
34
+ it 'raises if format is not supported' do
35
+ context = Context.new(:unsupported)
36
+ @library.stub :compile_template_from_source, @template do
37
+ assert_raises(RablRails::Library::UnknownFormat) { @library.get_rendered_template '', context }
48
38
  end
49
-
50
- assert_equal '<plist>', result
51
39
  end
52
40
  end
53
41
 
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.4.0
4
+ version: 0.4.1
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: 2014-10-12 00:00:00.000000000 Z
12
+ date: 2014-12-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -108,6 +108,7 @@ files:
108
108
  - test/test_compiler.rb
109
109
  - test/test_configuration.rb
110
110
  - test/test_hash_visitor.rb
111
+ - test/test_helpers.rb
111
112
  - test/test_library.rb
112
113
  - test/test_render.rb
113
114
  homepage: https://github.com/ccocchi/rabl-rails
@@ -143,5 +144,6 @@ test_files:
143
144
  - test/test_compiler.rb
144
145
  - test/test_configuration.rb
145
146
  - test/test_hash_visitor.rb
147
+ - test/test_helpers.rb
146
148
  - test/test_library.rb
147
149
  - test/test_render.rb