rabl-rails 0.4.3 → 0.5.0
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.
- checksums.yaml +4 -4
- data/.travis.yml +16 -9
- data/CHANGELOG.md +8 -0
- data/Gemfile +4 -12
- data/README.md +5 -19
- data/lib/rabl-rails.rb +10 -6
- data/lib/rabl-rails/compiler.rb +27 -18
- data/lib/rabl-rails/configuration.rb +0 -10
- data/lib/rabl-rails/exceptions.rb +3 -0
- data/lib/rabl-rails/library.rb +6 -13
- data/lib/rabl-rails/nodes.rb +1 -1
- data/lib/rabl-rails/nodes/attribute.rb +8 -6
- data/lib/rabl-rails/nodes/code.rb +1 -3
- data/lib/rabl-rails/nodes/condition.rb +1 -3
- data/lib/rabl-rails/nodes/extend.rb +12 -0
- data/lib/rabl-rails/nodes/glue.rb +6 -14
- data/lib/rabl-rails/railtie.rb +14 -3
- data/lib/rabl-rails/renderers/hash.rb +1 -2
- data/lib/rabl-rails/template.rb +4 -3
- data/lib/rabl-rails/version.rb +1 -1
- data/lib/rabl-rails/visitors/to_hash.rb +21 -17
- data/lib/rabl-rails/visitors/visitor.rb +6 -2
- data/rabl-rails.gemspec +9 -6
- data/test/helper.rb +1 -8
- data/test/renderers/test_hash_renderer.rb +4 -10
- data/test/renderers/test_json_renderer.rb +1 -1
- data/test/renderers/test_plist_renderer.rb +1 -1
- data/test/renderers/test_xml_renderer.rb +1 -1
- data/test/test_compiler.rb +34 -17
- data/test/test_configuration.rb +2 -2
- data/test/test_hash_visitor.rb +19 -4
- data/test/test_helpers.rb +1 -1
- data/test/test_library.rb +3 -3
- metadata +31 -20
- data/lib/rabl-rails/nodes/node.rb +0 -9
- data/lib/rabl-rails/renderer.rb +0 -97
- data/lib/rabl-rails/responder.rb +0 -47
- data/test/test_render.rb +0 -86
data/test/test_helpers.rb
CHANGED
data/test/test_library.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
|
-
class TestLibrary <
|
3
|
+
class TestLibrary < Minitest::Test
|
4
4
|
RablRails::Library.send(:attr_reader, :cached_templates)
|
5
5
|
|
6
6
|
describe 'library' do
|
@@ -62,7 +62,7 @@ class TestLibrary < MINITEST_TEST_CLASS
|
|
62
62
|
|
63
63
|
it 'compiles source without caching it if options is not set' do
|
64
64
|
@context.virtual_path = 'users/base'
|
65
|
-
|
65
|
+
with_configuration :cache_templates, false do
|
66
66
|
@library.compile_template_from_source("attribute :id", @context)
|
67
67
|
end
|
68
68
|
|
@@ -70,4 +70,4 @@ class TestLibrary < MINITEST_TEST_CLASS
|
|
70
70
|
end
|
71
71
|
end
|
72
72
|
end
|
73
|
-
end
|
73
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rabl-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher Cocchi-Perrier
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-08-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,57 +16,71 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '4.2'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '4.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: railties
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '4.2'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '4.2'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: concurrent-ruby
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
47
|
+
version: 1.0.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
54
|
+
version: 1.0.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: actionpack
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '4.2'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
69
|
-
|
68
|
+
version: '4.2'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: actionview
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '4.2'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '4.2'
|
83
|
+
description: Fast Rails 4+ templating system with JSON, XML and PList support
|
70
84
|
email:
|
71
85
|
- cocchi.c@gmail.com
|
72
86
|
executables: []
|
@@ -83,6 +97,7 @@ files:
|
|
83
97
|
- lib/rabl-rails.rb
|
84
98
|
- lib/rabl-rails/compiler.rb
|
85
99
|
- lib/rabl-rails/configuration.rb
|
100
|
+
- lib/rabl-rails/exceptions.rb
|
86
101
|
- lib/rabl-rails/handler.rb
|
87
102
|
- lib/rabl-rails/helpers.rb
|
88
103
|
- lib/rabl-rails/library.rb
|
@@ -91,15 +106,13 @@ files:
|
|
91
106
|
- lib/rabl-rails/nodes/child.rb
|
92
107
|
- lib/rabl-rails/nodes/code.rb
|
93
108
|
- lib/rabl-rails/nodes/condition.rb
|
109
|
+
- lib/rabl-rails/nodes/extend.rb
|
94
110
|
- lib/rabl-rails/nodes/glue.rb
|
95
|
-
- lib/rabl-rails/nodes/node.rb
|
96
111
|
- lib/rabl-rails/railtie.rb
|
97
|
-
- lib/rabl-rails/renderer.rb
|
98
112
|
- lib/rabl-rails/renderers/hash.rb
|
99
113
|
- lib/rabl-rails/renderers/json.rb
|
100
114
|
- lib/rabl-rails/renderers/plist.rb
|
101
115
|
- lib/rabl-rails/renderers/xml.rb
|
102
|
-
- lib/rabl-rails/responder.rb
|
103
116
|
- lib/rabl-rails/template.rb
|
104
117
|
- lib/rabl-rails/version.rb
|
105
118
|
- lib/rabl-rails/visitors.rb
|
@@ -117,7 +130,6 @@ files:
|
|
117
130
|
- test/test_hash_visitor.rb
|
118
131
|
- test/test_helpers.rb
|
119
132
|
- test/test_library.rb
|
120
|
-
- test/test_render.rb
|
121
133
|
homepage: https://github.com/ccocchi/rabl-rails
|
122
134
|
licenses:
|
123
135
|
- MIT
|
@@ -130,7 +142,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
130
142
|
requirements:
|
131
143
|
- - ">="
|
132
144
|
- !ruby/object:Gem::Version
|
133
|
-
version:
|
145
|
+
version: 2.2.0
|
134
146
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
147
|
requirements:
|
136
148
|
- - ">="
|
@@ -138,10 +150,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
150
|
version: '0'
|
139
151
|
requirements: []
|
140
152
|
rubyforge_project:
|
141
|
-
rubygems_version: 2.5.
|
153
|
+
rubygems_version: 2.4.5.2
|
142
154
|
signing_key:
|
143
155
|
specification_version: 4
|
144
|
-
summary: Fast Rails
|
156
|
+
summary: Fast Rails 4+ templating system with JSON, XML and PList support
|
145
157
|
test_files:
|
146
158
|
- test/helper.rb
|
147
159
|
- test/renderers/test_hash_renderer.rb
|
@@ -153,4 +165,3 @@ test_files:
|
|
153
165
|
- test/test_hash_visitor.rb
|
154
166
|
- test/test_helpers.rb
|
155
167
|
- test/test_library.rb
|
156
|
-
- test/test_render.rb
|
data/lib/rabl-rails/renderer.rb
DELETED
@@ -1,97 +0,0 @@
|
|
1
|
-
require 'rabl-rails/renderers/hash'
|
2
|
-
require 'rabl-rails/renderers/json'
|
3
|
-
require 'rabl-rails/renderers/xml'
|
4
|
-
require 'rabl-rails/renderers/plist'
|
5
|
-
|
6
|
-
module RablRails
|
7
|
-
module Renderer
|
8
|
-
class TemplateNotFound < StandardError; end
|
9
|
-
class PartialError < StandardError; end
|
10
|
-
|
11
|
-
class LookupContext
|
12
|
-
T = Struct.new(:source)
|
13
|
-
|
14
|
-
def initialize(view_path, format)
|
15
|
-
@view_path = view_path || 'app/views'
|
16
|
-
@format = format.downcase
|
17
|
-
end
|
18
|
-
|
19
|
-
def rendered_format
|
20
|
-
@format.to_sym
|
21
|
-
end
|
22
|
-
|
23
|
-
#
|
24
|
-
# Manually find given rabl template file with given format.
|
25
|
-
# View path can be set via options, otherwise default Rails
|
26
|
-
# path is used
|
27
|
-
#
|
28
|
-
def find_template(name, opt, partial = false)
|
29
|
-
paths = Dir["#@view_path/#{name}{.#@format,}.rabl"]
|
30
|
-
file_path = paths.find { |path| File.exist?(path) }
|
31
|
-
|
32
|
-
if file_path
|
33
|
-
T.new(File.read(file_path))
|
34
|
-
else
|
35
|
-
raise TemplateNotFound
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
#
|
41
|
-
# Context class to emulate normal Rails view
|
42
|
-
# context
|
43
|
-
#
|
44
|
-
class ViewContext
|
45
|
-
attr_reader :format
|
46
|
-
|
47
|
-
def initialize(path, options)
|
48
|
-
@virtual_path = path
|
49
|
-
@format = options.delete(:format) || :json
|
50
|
-
@_assigns = {}
|
51
|
-
@options = options
|
52
|
-
|
53
|
-
options[:locals].each { |k, v| @_assigns[k.to_s] = v } if options[:locals]
|
54
|
-
end
|
55
|
-
|
56
|
-
def assigns
|
57
|
-
@_assigns
|
58
|
-
end
|
59
|
-
|
60
|
-
def params
|
61
|
-
{ format: format }
|
62
|
-
end
|
63
|
-
|
64
|
-
def lookup_context
|
65
|
-
@lookup_context ||= LookupContext.new(@options[:view_path], format)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
#
|
70
|
-
# Renders object with the given rabl template.
|
71
|
-
#
|
72
|
-
# Object can also be passed as an option :
|
73
|
-
# { locals: { object: obj_to_render } }
|
74
|
-
#
|
75
|
-
# Default render format is JSON, but can be changed via
|
76
|
-
# an option: { format: 'xml' }
|
77
|
-
#
|
78
|
-
# If template includes uses of instance variables (usually
|
79
|
-
# defined in the controller), you can passed them as locals
|
80
|
-
# options.
|
81
|
-
# For example, if you have this template:
|
82
|
-
# object :@user
|
83
|
-
# node(:read) { |u| u.has_read?(@post) }
|
84
|
-
#
|
85
|
-
# Your method call should look like this:
|
86
|
-
# RablRails.render(user, 'users/show', locals: { post: Post.new })
|
87
|
-
#
|
88
|
-
def render(object, template, options = {})
|
89
|
-
object = options[:locals].delete(:object) if !object && options[:locals]
|
90
|
-
|
91
|
-
c = ViewContext.new(template, options)
|
92
|
-
t = c.lookup_context.find_template(template, [], false)
|
93
|
-
|
94
|
-
Library.instance.get_rendered_template(t.source, c, resource: object)
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
data/lib/rabl-rails/responder.rb
DELETED
@@ -1,47 +0,0 @@
|
|
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
|
-
def initialize(controller, resources, options = {})
|
9
|
-
super
|
10
|
-
if options[:locals]
|
11
|
-
options[:locals][:resource] = resource
|
12
|
-
else
|
13
|
-
options[:locals] = { resource: resource }
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def to_format
|
18
|
-
if get? || response_overridden?
|
19
|
-
default_render
|
20
|
-
elsif has_errors?
|
21
|
-
display_errors
|
22
|
-
else
|
23
|
-
api_behavior
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
protected
|
28
|
-
|
29
|
-
def api_behavior
|
30
|
-
if post?
|
31
|
-
template = if controller.respond_to?(:responder_default_template, true)
|
32
|
-
controller.send(:responder_default_template)
|
33
|
-
else
|
34
|
-
RablRails.configuration.responder_default_template
|
35
|
-
end
|
36
|
-
options[:prefixes] = controller._prefixes
|
37
|
-
options[:template] ||= template
|
38
|
-
|
39
|
-
controller.default_render options.merge(status: :created)
|
40
|
-
else
|
41
|
-
head :no_content
|
42
|
-
end
|
43
|
-
rescue ActionView::MissingTemplate => e
|
44
|
-
super
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
data/test/test_render.rb
DELETED
@@ -1,86 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'pathname'
|
3
|
-
require 'tmpdir'
|
4
|
-
|
5
|
-
class TestRender < MINITEST_TEST_CLASS
|
6
|
-
@@tmp_path = Pathname.new(Dir.mktmpdir)
|
7
|
-
|
8
|
-
def setup
|
9
|
-
@user = User.new(1, 'Marty')
|
10
|
-
@tmp_path = @@tmp_path
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_object_as_option
|
14
|
-
File.open(@tmp_path + "nil.json.rabl", "w") do |f|
|
15
|
-
f.puts %q{
|
16
|
-
object :@user
|
17
|
-
attributes :name
|
18
|
-
}
|
19
|
-
end
|
20
|
-
assert_equal %q({"user":{"name":"Marty"}}), RablRails.render(nil, 'nil', locals: { object: @user }, view_path: @tmp_path)
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_load_source_from_file
|
24
|
-
File.open(@tmp_path + "show.json.rabl", "w") do |f|
|
25
|
-
f.puts %q{
|
26
|
-
object :@user
|
27
|
-
attributes :id, :name
|
28
|
-
}
|
29
|
-
end
|
30
|
-
assert_equal %q({"user":{"id":1,"name":"Marty"}}), RablRails.render(@user, 'show', view_path: @tmp_path)
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_template_not_found
|
34
|
-
assert_raises(RablRails::Renderer::TemplateNotFound) { RablRails.render(@user, 'not_found') }
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_with_locals_options
|
38
|
-
File.open(@tmp_path + "instance.json.rabl", "w") do |f|
|
39
|
-
f.puts %q{
|
40
|
-
object false
|
41
|
-
node(:username) { |_| @user.name }
|
42
|
-
}
|
43
|
-
end
|
44
|
-
assert_equal %q({"username":"Marty"}), RablRails.render(nil, 'instance', view_path: @tmp_path, locals: { user: @user })
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_extend_with_view_path
|
48
|
-
File.open(@tmp_path + "extend.json.rabl", "w") do |f|
|
49
|
-
f.puts %q{
|
50
|
-
object :@user
|
51
|
-
extends 'base'
|
52
|
-
}
|
53
|
-
end
|
54
|
-
|
55
|
-
File.open(@tmp_path + "base.json.rabl", "w") do |f|
|
56
|
-
f.puts %q{
|
57
|
-
attribute :name, as: :extended_name
|
58
|
-
}
|
59
|
-
end
|
60
|
-
|
61
|
-
assert_equal %q({"user":{"extended_name":"Marty"}}), RablRails.render(@user, 'extend', view_path: @tmp_path)
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_format_as_symbol_or_string
|
65
|
-
File.open(@tmp_path + "show.json.rabl", "w") do |f|
|
66
|
-
f.puts %q{
|
67
|
-
object :@user
|
68
|
-
attributes :id, :name
|
69
|
-
}
|
70
|
-
end
|
71
|
-
|
72
|
-
assert_equal %q({"user":{"id":1,"name":"Marty"}}), RablRails.render(@user, 'show', view_path: @tmp_path, format: :json)
|
73
|
-
assert_equal %q({"user":{"id":1,"name":"Marty"}}), RablRails.render(@user, 'show', view_path: @tmp_path, format: 'json')
|
74
|
-
assert_equal %q({"user":{"id":1,"name":"Marty"}}), RablRails.render(@user, 'show', view_path: @tmp_path, format: 'JSON')
|
75
|
-
end
|
76
|
-
|
77
|
-
def test_format_omitted
|
78
|
-
File.open(@tmp_path + "show.rabl", "w") do |f|
|
79
|
-
f.puts %q{
|
80
|
-
object :@user
|
81
|
-
attributes :id, :name
|
82
|
-
}
|
83
|
-
end
|
84
|
-
assert_equal %q({"user":{"id":1,"name":"Marty"}}), RablRails.render(@user, 'show', view_path: @tmp_path)
|
85
|
-
end
|
86
|
-
end
|