rabl 0.7.1 → 0.7.2
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/.travis.yml +0 -1
- data/CHANGELOG.md +6 -1
- data/Gemfile +9 -5
- data/Gemfile.ci +2 -0
- data/README.md +18 -11
- data/fixtures/ashared/views_rails_3/posts/show.rabl +4 -2
- data/fixtures/padrino_test/Gemfile +2 -2
- data/fixtures/rails3/Gemfile +1 -1
- data/fixtures/rails3_2/Gemfile +1 -2
- data/fixtures/rails3_2/test/functional/posts_controller_test.rb +1 -0
- data/fixtures/sinatra_test/Gemfile +2 -2
- data/lib/rabl.rb +1 -0
- data/lib/rabl/configuration.rb +3 -20
- data/lib/rabl/engine.rb +1 -0
- data/lib/rabl/json_engine.rb +33 -0
- data/lib/rabl/renderer.rb +0 -6
- data/lib/rabl/version.rb +1 -1
- data/rabl.gemspec +2 -2
- data/test.watchr +0 -1
- data/test/bson_engine_test.rb +1 -3
- data/test/builder_test.rb +0 -1
- data/test/configuration_test.rb +20 -3
- data/test/engine_test.rb +30 -36
- data/test/helpers_test.rb +0 -1
- data/test/integration/rails3_2/posts_controller_test.rb +1 -0
- data/test/models/ormless.rb +1 -0
- data/test/models/user.rb +19 -15
- data/test/msgpack_engine_test.rb +1 -3
- data/test/partials_test.rb +0 -1
- data/test/plist_engine_test.rb +1 -3
- data/test/renderer_test.rb +47 -26
- data/test/template_test.rb +1 -1
- data/test/teststrap.rb +4 -1
- data/test/xml_test.rb +287 -0
- metadata +7 -4
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
-
## 0.7.
|
3
|
+
## 0.7.3 (unreleased)
|
4
|
+
|
5
|
+
## 0.7.2
|
6
|
+
|
7
|
+
* Set instance variables for locals in engine instead of renderer (Thanks @geehsien)
|
8
|
+
* Changes default JSON engine for Rails, move logic to separate class (Thanks @shmeltex)
|
4
9
|
|
5
10
|
## 0.7.1
|
6
11
|
|
data/Gemfile
CHANGED
@@ -3,17 +3,21 @@ source :rubygems
|
|
3
3
|
# Specify your gem's dependencies in rabl.gemspec
|
4
4
|
gemspec
|
5
5
|
|
6
|
-
gem
|
7
|
-
gem
|
6
|
+
gem 'rake', :require => false
|
7
|
+
gem 'i18n', '~> 0.6'
|
8
8
|
|
9
9
|
platforms :mri_18 do
|
10
10
|
gem 'SystemTimer'
|
11
11
|
end
|
12
12
|
|
13
|
-
# FIXTURES
|
14
13
|
group :test do
|
15
|
-
|
16
|
-
gem '
|
14
|
+
# RABL TEST
|
15
|
+
gem 'activesupport', :require => 'active_support'
|
16
|
+
gem 'builder'
|
17
|
+
|
18
|
+
# FIXTURES
|
19
|
+
gem 'rack-test', :require => 'rack/test'
|
20
|
+
gem 'activerecord', :require => 'active_record'
|
17
21
|
gem 'sqlite3'
|
18
22
|
gem 'sinatra', '>= 1.2.0'
|
19
23
|
end
|
data/Gemfile.ci
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# RABL #
|
2
2
|
|
3
|
+
[](http://travis-ci.org/nesquena/rabl)
|
4
|
+
[](https://gemnasium.com/nesquena/rabl)
|
5
|
+
|
3
6
|
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
7
|
This is especially frustrating when the JSON representation is complex or doesn't match the exact schema defined in the database.
|
5
8
|
|
@@ -109,7 +112,7 @@ Rabl.configure do |config|
|
|
109
112
|
# config.cache_sources = Rails.env != 'development' # Defaults to false
|
110
113
|
# config.cache_engine = Rabl::CacheEngine.new # Defaults to Rails cache
|
111
114
|
# config.escape_all_output = false
|
112
|
-
# config.json_engine = nil # Any
|
115
|
+
# config.json_engine = nil # Any multi_json engines or a Class with #encode method
|
113
116
|
# config.msgpack_engine = nil # Defaults to ::MessagePack
|
114
117
|
# config.bson_engine = nil # Defaults to ::BSON
|
115
118
|
# config.plist_engine = nil # Defaults to ::Plist::Emit
|
@@ -148,7 +151,7 @@ If `view_paths` is set to a path, this view path will be checked for every rabl
|
|
148
151
|
Add to this path especially when including Rabl in an engine and using view paths within a another Rails app.
|
149
152
|
|
150
153
|
Note that the `json_engine` option uses [multi_json](http://intridea.com/2010/6/14/multi-json-the-swappable-json-handler) engine
|
151
|
-
defaults so that in most cases you **don't need to configure this** directly.
|
154
|
+
defaults so that in most cases you **don't need to configure this** directly. For example, if you wish to use yajl as
|
152
155
|
the primary JSON encoding engine simply add that to your Gemfile:
|
153
156
|
|
154
157
|
```ruby
|
@@ -158,6 +161,13 @@ gem 'yajl-ruby', :require => "yajl"
|
|
158
161
|
|
159
162
|
and RABL will automatically start using that engine for encoding your JSON responses!
|
160
163
|
|
164
|
+
To use RABL with JSON engine not supported by `multi_json`, ensure that JSON engine
|
165
|
+
supports `encode` method and set `json_engine` option to the engine's Class name:
|
166
|
+
|
167
|
+
```ruby
|
168
|
+
config.json_engine = ActiveSupport::JSON
|
169
|
+
```
|
170
|
+
|
161
171
|
### Format Configuration ###
|
162
172
|
|
163
173
|
RABL supports configuration for MessagePack, BSON, and Plist. Check the
|
@@ -347,7 +357,7 @@ node :location do
|
|
347
357
|
end
|
348
358
|
```
|
349
359
|
|
350
|
-
or
|
360
|
+
or even access an object associated with the parent model:
|
351
361
|
|
352
362
|
```ruby
|
353
363
|
node :location do |m|
|
@@ -449,17 +459,20 @@ Rabl.render(object, template, :view_path => 'app/views', :format => :json) #=> "
|
|
449
459
|
You can use convenience methods on `Rabl::Renderer` to render the objects as well:
|
450
460
|
|
451
461
|
```ruby
|
452
|
-
Rabl::Renderer.new(@post, 'posts/show', :view_path => 'app/views')
|
453
462
|
Rabl::Renderer.json(@post, 'posts/show')
|
454
463
|
Rabl::Renderer.xml(@post, 'posts/show')
|
455
464
|
```
|
456
465
|
|
457
466
|
These methods allow RABL to be used for arbitrary conversions of an object into a desired format.
|
458
467
|
|
468
|
+
```ruby
|
469
|
+
Rabl::Renderer.new('posts/show', @post, :view_path => 'app/views', :format => 'hash').render
|
470
|
+
```
|
471
|
+
|
459
472
|
You can also pass in other instance variables to be used in your template as:
|
460
473
|
|
461
474
|
```ruby
|
462
|
-
Rabl::Renderer.new(
|
475
|
+
Rabl::Renderer.new('posts/show', @post, :locals => { :custom_title => "Hello world!" })
|
463
476
|
````
|
464
477
|
|
465
478
|
Then, in your template, you can use `@custom_title` as:
|
@@ -535,12 +548,6 @@ Check out the [Issues](https://github.com/nesquena/rabl/issues) tab for a full l
|
|
535
548
|
|
536
549
|
* Rigorous benchmarking and performance optimizations
|
537
550
|
|
538
|
-
## Continuous Integration ##
|
539
|
-
|
540
|
-
[](http://travis-ci.org/nesquena/rabl)
|
541
|
-
|
542
|
-
CI is hosted by [travis-ci.org](http://travis-ci.org).
|
543
|
-
|
544
551
|
## Authors and Contributors ##
|
545
552
|
|
546
553
|
Thanks to [Miso](http://gomiso.com) for allowing me to create this for our applications and release this project!
|
@@ -16,8 +16,10 @@ code(:created_date) do |p|
|
|
16
16
|
partial("posts/date", :object => p.created_at)
|
17
17
|
end
|
18
18
|
|
19
|
-
node(:foo) { helper_foo }
|
20
|
-
|
21
19
|
node(:post) do |post|
|
22
20
|
[post.title, post.body]
|
23
21
|
end
|
22
|
+
|
23
|
+
node(:foo) { helper_foo }
|
24
|
+
|
25
|
+
node(:created_at_in_words) {|p| time_ago_in_words(p.created_at) }
|
@@ -12,6 +12,6 @@ gem 'riot', :group => "test"
|
|
12
12
|
gem 'rack-test', :require => "rack/test", :group => "test"
|
13
13
|
|
14
14
|
# Padrino
|
15
|
-
gem 'padrino', '0.10.
|
15
|
+
gem 'padrino', '~> 0.10.7'
|
16
16
|
gem 'json'
|
17
|
-
gem 'rabl', :path => File.expand_path(File.dirname(__FILE__) + "/../../")
|
17
|
+
gem 'rabl', :path => File.expand_path(File.dirname(__FILE__) + "/../../")
|
data/fixtures/rails3/Gemfile
CHANGED
data/fixtures/rails3_2/Gemfile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
gem 'rails', '3.2.
|
3
|
+
gem 'rails', '~> 3.2.8'
|
4
4
|
|
5
5
|
# Bundle edge Rails instead:
|
6
6
|
# gem 'rails', :git => 'git://github.com/rails/rails.git'
|
@@ -9,7 +9,6 @@ gem 'sqlite3'
|
|
9
9
|
gem 'rabl', :path => File.expand_path(File.dirname(__FILE__) + "/../../")
|
10
10
|
gem 'riot', :group => "test"
|
11
11
|
|
12
|
-
|
13
12
|
# Gems used only for assets and not required
|
14
13
|
# in production environments by default.
|
15
14
|
group :assets do
|
@@ -134,6 +134,7 @@ context "PostsController" do
|
|
134
134
|
end # date node
|
135
135
|
|
136
136
|
asserts("contains helper action") { topic["foo"] }.equals { "BAR!" }
|
137
|
+
denies("contains helper action") { topic["created_at_in_words"] }.nil
|
137
138
|
|
138
139
|
asserts("contains post attributes via node") { topic["post"] }.equals { [@post1.title, @post1.body] }
|
139
140
|
end # show action, json
|
@@ -4,10 +4,10 @@ gem 'rake'
|
|
4
4
|
gem 'activerecord', :require => "active_record"
|
5
5
|
gem 'sqlite3'
|
6
6
|
|
7
|
-
gem 'sinatra', '>= 1.
|
7
|
+
gem 'sinatra', '>= 1.3.3'
|
8
8
|
gem 'json'
|
9
9
|
gem 'rabl', :path => File.expand_path(File.dirname(__FILE__) + "/../../")
|
10
10
|
|
11
11
|
# Test requirements
|
12
12
|
gem 'riot', :group => "test"
|
13
|
-
gem 'rack-test', :require => "rack/test", :group => "test"
|
13
|
+
gem 'rack-test', :require => "rack/test", :group => "test"
|
data/lib/rabl.rb
CHANGED
data/lib/rabl/configuration.rb
CHANGED
@@ -16,9 +16,6 @@ begin
|
|
16
16
|
rescue LoadError
|
17
17
|
end
|
18
18
|
|
19
|
-
# Load MultiJSON
|
20
|
-
require 'multi_json'
|
21
|
-
|
22
19
|
module Rabl
|
23
20
|
# Rabl.host
|
24
21
|
class Configuration
|
@@ -65,19 +62,16 @@ module Rabl
|
|
65
62
|
@cache_engine = Rabl::CacheEngine.new
|
66
63
|
end
|
67
64
|
|
68
|
-
# @param [Symbol,
|
65
|
+
# @param [Symbol, Class] engine_name The name of a JSON engine,
|
69
66
|
# or class that responds to `encode`, to use to encode Rabl templates
|
70
67
|
# into JSON. For more details, see the MultiJson gem.
|
71
68
|
def json_engine=(engine_name_or_class)
|
72
|
-
|
73
|
-
# multi_json compatibility TODO
|
74
|
-
MultiJson.respond_to?(:use) ? MultiJson.use(@engine_name) :
|
75
|
-
MultiJson.engine = @engine_name
|
69
|
+
JsonEngine.instance.set(engine_name_or_class)
|
76
70
|
end
|
77
71
|
|
78
72
|
# @return The JSON engine used to encode Rabl templates into JSON
|
79
73
|
def json_engine
|
80
|
-
|
74
|
+
JsonEngine.instance.current_engine
|
81
75
|
end
|
82
76
|
|
83
77
|
##
|
@@ -109,16 +103,5 @@ module Rabl
|
|
109
103
|
def default_xml_options
|
110
104
|
@_default_xml_options ||= @xml_options.reverse_merge(DEFAULT_XML_OPTIONS)
|
111
105
|
end
|
112
|
-
|
113
|
-
private
|
114
|
-
|
115
|
-
def get_json_engine
|
116
|
-
if !defined?(@engine_name) && defined?(Rails)
|
117
|
-
ActiveSupport::JSON
|
118
|
-
else # use multi_json
|
119
|
-
# multi_json compatibility TODO
|
120
|
-
MultiJson.respond_to?(:adapter) ? MultiJson.adapter : MultiJson.engine
|
121
|
-
end
|
122
|
-
end
|
123
106
|
end
|
124
107
|
end
|
data/lib/rabl/engine.rb
CHANGED
@@ -23,6 +23,7 @@ module Rabl
|
|
23
23
|
reset_options!
|
24
24
|
@_locals, @_scope = locals, scope
|
25
25
|
self.copy_instance_variables_from(@_scope, [:@assigns, :@helpers])
|
26
|
+
locals.each { |k,v| instance_variable_set(:"@#{k}", v) }
|
26
27
|
@_options[:scope] = @_scope
|
27
28
|
@_options[:format] ||= self.request_format
|
28
29
|
@_data = locals[:object] || self.default_object
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# Defines the default JSON engine for RABL when rendering JSON is invoked on a template.
|
2
|
+
# You can define your own json engine by creating an object that responds to the `encode` method
|
3
|
+
# and setting the corresponding configuration option:
|
4
|
+
#
|
5
|
+
# config.json_engine = ActiveSupport::JSON
|
6
|
+
#
|
7
|
+
|
8
|
+
require 'multi_json'
|
9
|
+
require 'singleton'
|
10
|
+
|
11
|
+
module Rabl
|
12
|
+
class JsonEngine
|
13
|
+
include Singleton
|
14
|
+
|
15
|
+
attr_reader :current_engine
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@current_engine = MultiJson.respond_to?(:adapter) ? MultiJson.adapter : MultiJson.engine
|
19
|
+
end
|
20
|
+
|
21
|
+
def set(engine_name_or_class)
|
22
|
+
@current_engine = begin
|
23
|
+
MultiJson.respond_to?(:use) ?
|
24
|
+
MultiJson.use(engine_name_or_class) :
|
25
|
+
MultiJson.engine = engine_name_or_class
|
26
|
+
rescue RuntimeError => e #
|
27
|
+
# Re-raise if engine_name_or_class is invalid
|
28
|
+
raise e unless engine_name_or_class.respond_to?(:encode)
|
29
|
+
engine_name_or_class
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end # JsonEngine
|
33
|
+
end # Rabl
|
data/lib/rabl/renderer.rb
CHANGED
@@ -32,12 +32,6 @@ module Rabl
|
|
32
32
|
@options = options
|
33
33
|
@object = object
|
34
34
|
|
35
|
-
if @options[:locals]
|
36
|
-
@options[:locals].delete(:object) if @object
|
37
|
-
@options[:locals].each do |k,v|
|
38
|
-
instance_variable_set(:"@#{k}", v)
|
39
|
-
end
|
40
|
-
end
|
41
35
|
engine.source = self.process_source(source)
|
42
36
|
end
|
43
37
|
|
data/lib/rabl/version.rb
CHANGED
data/rabl.gemspec
CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |s|
|
|
27
27
|
s.add_development_dependency 'rake'
|
28
28
|
s.add_development_dependency 'tilt'
|
29
29
|
s.add_development_dependency 'yajl-ruby'
|
30
|
-
s.add_development_dependency 'msgpack',
|
31
|
-
s.add_development_dependency 'bson',
|
30
|
+
s.add_development_dependency 'msgpack', '~> 0.4.5'
|
31
|
+
s.add_development_dependency 'bson', '~> 1.7.0'
|
32
32
|
s.add_development_dependency 'plist'
|
33
33
|
end
|
data/test.watchr
CHANGED
data/test/bson_engine_test.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
require File.expand_path('../teststrap', __FILE__)
|
2
|
-
require
|
3
|
-
require File.expand_path('../../lib/rabl/template', __FILE__)
|
4
|
-
require File.expand_path('../models/user', __FILE__)
|
2
|
+
require 'rabl/template'
|
5
3
|
|
6
4
|
context "Rabl::Engine" do
|
7
5
|
helper(:rabl) { |t| RablTemplate.new("code", :format => 'bson') { t } }
|
data/test/builder_test.rb
CHANGED
data/test/configuration_test.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require File.expand_path('../teststrap', __FILE__)
|
2
|
-
require File.expand_path('../../lib/rabl', __FILE__)
|
3
2
|
|
4
3
|
context 'Rabl::Configuration' do
|
5
4
|
context 'defaults' do
|
@@ -16,7 +15,7 @@ context 'Rabl::Configuration' do
|
|
16
15
|
asserts(:cache_engine).is_a?(Rabl::CacheEngine)
|
17
16
|
end
|
18
17
|
|
19
|
-
context 'custom JSON engine' do
|
18
|
+
context 'custom JSON engine configured as Symbol' do
|
20
19
|
setup do
|
21
20
|
Rabl.configure do |c|
|
22
21
|
c.json_engine = :yajl
|
@@ -24,5 +23,23 @@ context 'Rabl::Configuration' do
|
|
24
23
|
end
|
25
24
|
|
26
25
|
asserts('uses a custom JSON engine') { topic.json_engine.to_s =~ /MultiJson.*::Yajl/ }
|
27
|
-
end
|
26
|
+
end # custom json, symbol
|
27
|
+
|
28
|
+
context 'custom JSON engine configured as Class' do
|
29
|
+
setup do
|
30
|
+
Rabl.configure do |c|
|
31
|
+
c.json_engine = ActiveSupport::JSON
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
asserts('uses a custom JSON engine') { topic.json_engine.to_s == 'ActiveSupport::JSON' }
|
36
|
+
end # custom JSON, class
|
37
|
+
|
38
|
+
context 'invalid JSON engine configured' do
|
39
|
+
asserts {
|
40
|
+
Rabl.configure do |c|
|
41
|
+
c.json_engine = Kernel
|
42
|
+
end
|
43
|
+
}.raises(RuntimeError)
|
44
|
+
end # invalid
|
28
45
|
end
|
data/test/engine_test.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
+
require 'json'
|
1
2
|
require File.expand_path('../teststrap', __FILE__)
|
2
|
-
require
|
3
|
-
require File.expand_path('../../lib/rabl/template', __FILE__)
|
4
|
-
require File.expand_path('../models/user', __FILE__)
|
3
|
+
require 'rabl/template'
|
5
4
|
require File.expand_path('../models/ormless', __FILE__)
|
6
5
|
|
7
6
|
context "Rabl::Engine" do
|
@@ -173,8 +172,8 @@ context "Rabl::Engine" do
|
|
173
172
|
}
|
174
173
|
scope = Object.new
|
175
174
|
scope.instance_variable_set :@user, User.new(:name => 'irvine')
|
176
|
-
template.render(scope)
|
177
|
-
end.equals "{\"user\":{\"name\":\"irvine\"}}"
|
175
|
+
JSON.parse(template.render(scope))
|
176
|
+
end.equals JSON.parse("{\"user\":{\"name\":\"irvine\"}}")
|
178
177
|
|
179
178
|
asserts "that it can add attribute under a different key name through :as" do
|
180
179
|
template = rabl %{
|
@@ -183,8 +182,8 @@ context "Rabl::Engine" do
|
|
183
182
|
}
|
184
183
|
scope = Object.new
|
185
184
|
scope.instance_variable_set :@user, User.new(:name => 'irvine')
|
186
|
-
template.render(scope)
|
187
|
-
end.equals "{\"user\":{\"city\":\"irvine\"}}"
|
185
|
+
JSON.parse(template.render(scope))
|
186
|
+
end.equals JSON.parse("{\"user\":{\"city\":\"irvine\"}}")
|
188
187
|
|
189
188
|
asserts "that it can add attribute under a different key name through hash" do
|
190
189
|
template = rabl %{
|
@@ -193,8 +192,8 @@ context "Rabl::Engine" do
|
|
193
192
|
}
|
194
193
|
scope = Object.new
|
195
194
|
scope.instance_variable_set :@user, User.new(:name => 'irvine')
|
196
|
-
template.render(scope)
|
197
|
-
end.equals "{\"user\":{\"city\":\"irvine\"}}"
|
195
|
+
JSON.parse(template.render(scope))
|
196
|
+
end.equals JSON.parse("{\"user\":{\"city\":\"irvine\"}}")
|
198
197
|
end
|
199
198
|
|
200
199
|
context "#code" do
|
@@ -202,15 +201,15 @@ context "Rabl::Engine" do
|
|
202
201
|
template = rabl %{
|
203
202
|
code(:foo) { 'bar' }
|
204
203
|
}
|
205
|
-
template.render(Object.new)
|
206
|
-
end.equals "{\"foo\":\"bar\"}"
|
204
|
+
template.render(Object.new)
|
205
|
+
end.equals "{\"foo\":\"bar\"}"
|
207
206
|
|
208
207
|
asserts "that it can be passed conditionals" do
|
209
208
|
template = rabl %{
|
210
209
|
code(:foo, :if => lambda { |i| false }) { 'bar' }
|
211
210
|
}
|
212
|
-
template.render(Object.new)
|
213
|
-
end.equals "{}"
|
211
|
+
template.render(Object.new)
|
212
|
+
end.equals "{}"
|
214
213
|
|
215
214
|
asserts "that it can merge the result with a collection element given no name" do
|
216
215
|
template = rabl %{
|
@@ -221,8 +220,8 @@ context "Rabl::Engine" do
|
|
221
220
|
}
|
222
221
|
scope = Object.new
|
223
222
|
scope.instance_variable_set :@users, [User.new(:name => 'a'), User.new(:name => 'b')]
|
224
|
-
template.render(scope)
|
225
|
-
end.equals "[{\"user\":{\"name\":\"a\"}},{\"user\":{\"name\":\"b\"}}]"
|
223
|
+
JSON.parse(template.render(scope))
|
224
|
+
end.equals JSON.parse("[{\"user\":{\"name\":\"a\"}},{\"user\":{\"name\":\"b\"}}]")
|
226
225
|
|
227
226
|
asserts "that it can merge the result on a child node given no name" do
|
228
227
|
template = rabl %{
|
@@ -236,8 +235,8 @@ context "Rabl::Engine" do
|
|
236
235
|
}
|
237
236
|
scope = Object.new
|
238
237
|
scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA')
|
239
|
-
template.render(scope)
|
240
|
-
end.equals "{\"user\":{\"name\":\"leo\",\"user\":{\"city\":\"LA\"}}}"
|
238
|
+
JSON.parse(template.render(scope))
|
239
|
+
end.equals JSON.parse("{\"user\":{\"name\":\"leo\",\"user\":{\"city\":\"LA\"}}}")
|
241
240
|
end
|
242
241
|
|
243
242
|
context "#child" do
|
@@ -249,8 +248,8 @@ context "Rabl::Engine" do
|
|
249
248
|
}
|
250
249
|
scope = Object.new
|
251
250
|
scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA')
|
252
|
-
template.render(scope)
|
253
|
-
end.equals "{\"user\":{\"name\":\"leo\",\"user\":{\"city\":\"LA\"}}}"
|
251
|
+
JSON.parse(template.render(scope))
|
252
|
+
end.equals JSON.parse("{\"user\":{\"name\":\"leo\",\"user\":{\"city\":\"LA\"}}}")
|
254
253
|
|
255
254
|
asserts "that it can create a child node with different key" do
|
256
255
|
template = rabl %{
|
@@ -260,9 +259,8 @@ context "Rabl::Engine" do
|
|
260
259
|
}
|
261
260
|
scope = Object.new
|
262
261
|
scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA')
|
263
|
-
template.render(scope)
|
264
|
-
|
265
|
-
end.equals "{\"user\":{\"name\":\"leo\",\"person\":{\"city\":\"LA\"}}}".split('').sort
|
262
|
+
JSON.parse(template.render(scope))
|
263
|
+
end.equals JSON.parse("{\"user\":{\"name\":\"leo\",\"person\":{\"city\":\"LA\"}}}")
|
266
264
|
|
267
265
|
asserts "that it passes the data object to the block" do
|
268
266
|
template = rabl %{
|
@@ -287,8 +285,8 @@ context "Rabl::Engine" do
|
|
287
285
|
}
|
288
286
|
scope = Object.new
|
289
287
|
scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA', :age => 12)
|
290
|
-
template.render(scope)
|
291
|
-
end.equals "{\"user\":{\"name\":\"leo\",\"city\":\"LA\",\"age\":12}}"
|
288
|
+
JSON.parse(template.render(scope))
|
289
|
+
end.equals JSON.parse("{\"user\":{\"name\":\"leo\",\"city\":\"LA\",\"age\":12}}")
|
292
290
|
|
293
291
|
asserts "that it passes the data object to the block" do
|
294
292
|
template = rabl %{
|
@@ -451,8 +449,8 @@ context "Rabl::Engine" do
|
|
451
449
|
}
|
452
450
|
scope = Object.new
|
453
451
|
scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA')
|
454
|
-
template.render(scope)
|
455
|
-
end.equals "{\"name\":\"leo\",\"user\":{\"city\":\"LA\"}}"
|
452
|
+
JSON.parse(template.render(scope))
|
453
|
+
end.equals JSON.parse("{\"name\":\"leo\",\"user\":{\"city\":\"LA\"}}")
|
456
454
|
|
457
455
|
asserts "that it can create a child node with different key" do
|
458
456
|
template = rabl %{
|
@@ -462,9 +460,8 @@ context "Rabl::Engine" do
|
|
462
460
|
}
|
463
461
|
scope = Object.new
|
464
462
|
scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA')
|
465
|
-
template.render(scope)
|
466
|
-
|
467
|
-
end.equals "{\"name\":\"leo\",\"person\":{\"city\":\"LA\"}}".split('').sort
|
463
|
+
JSON.parse(template.render(scope))
|
464
|
+
end.equals JSON.parse("{\"name\":\"leo\",\"person\":{\"city\":\"LA\"}}")
|
468
465
|
|
469
466
|
asserts "that it can be passed conditionals" do
|
470
467
|
template = rabl %{
|
@@ -474,9 +471,8 @@ context "Rabl::Engine" do
|
|
474
471
|
}
|
475
472
|
scope = Object.new
|
476
473
|
scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA')
|
477
|
-
template.render(scope)
|
478
|
-
|
479
|
-
end.equals "{\"name\":\"leo\"}".split('').sort
|
474
|
+
template.render(scope)
|
475
|
+
end.equals "{\"name\":\"leo\"}"
|
480
476
|
end
|
481
477
|
|
482
478
|
context "#glue" do
|
@@ -489,8 +485,8 @@ context "Rabl::Engine" do
|
|
489
485
|
}
|
490
486
|
scope = Object.new
|
491
487
|
scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA', :age => 12)
|
492
|
-
template.render(scope)
|
493
|
-
end.equals "{\"name\":\"leo\",\"city\":\"LA\",\"age\":12}"
|
488
|
+
JSON.parse(template.render(scope))
|
489
|
+
end.equals JSON.parse("{\"name\":\"leo\",\"city\":\"LA\",\"age\":12}")
|
494
490
|
end
|
495
491
|
|
496
492
|
teardown do
|
@@ -508,7 +504,6 @@ context "Rabl::Engine" do
|
|
508
504
|
end
|
509
505
|
|
510
506
|
context "#child" do
|
511
|
-
|
512
507
|
asserts "that it can create a child node without child root" do
|
513
508
|
template = rabl %{
|
514
509
|
child @users
|
@@ -517,7 +512,6 @@ context "Rabl::Engine" do
|
|
517
512
|
scope.instance_variable_set :@users, [User.new, User.new]
|
518
513
|
template.render(scope)
|
519
514
|
end.equals "{\"users\":[{},{}]}"
|
520
|
-
|
521
515
|
end
|
522
516
|
|
523
517
|
teardown do
|
data/test/helpers_test.rb
CHANGED
@@ -134,6 +134,7 @@ context "PostsController" do
|
|
134
134
|
end # date node
|
135
135
|
|
136
136
|
asserts("contains helper action") { topic["foo"] }.equals { "BAR!" }
|
137
|
+
denies("contains helper action") { topic["created_at_in_words"] }.nil
|
137
138
|
|
138
139
|
asserts("contains post attributes via node") { topic["post"] }.equals { [@post1.title, @post1.body] }
|
139
140
|
end # show action, json
|
data/test/models/ormless.rb
CHANGED
data/test/models/user.rb
CHANGED
@@ -1,22 +1,26 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
unless defined?(User)
|
2
|
+
class User
|
3
|
+
attr_accessor :age, :city, :name, :first
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
DEFAULT_AGE = 24
|
6
|
+
DEFAULT_CITY = 'irvine'
|
7
|
+
DEFAULT_NAME = 'rabl'
|
8
|
+
DEFAULT_FIRST = 'bob'
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
def initialize(attributes={})
|
11
|
+
self.age = attributes[:age] || DEFAULT_AGE
|
12
|
+
self.city = attributes[:city] || DEFAULT_CITY
|
13
|
+
self.name = attributes[:name] || DEFAULT_NAME
|
14
|
+
self.first = attributes[:first] || DEFAULT_FIRST
|
15
|
+
end
|
14
16
|
end
|
15
17
|
end
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
unless defined?(NestedScope::User)
|
20
|
+
module NestedScope
|
21
|
+
class User
|
22
|
+
def controller; self; end
|
23
|
+
def controller_name; self.class.name.downcase; end
|
24
|
+
end
|
21
25
|
end
|
22
26
|
end
|
data/test/msgpack_engine_test.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
require File.expand_path('../teststrap', __FILE__)
|
2
|
-
require
|
3
|
-
require File.expand_path('../../lib/rabl/template', __FILE__)
|
4
|
-
require File.expand_path('../models/user', __FILE__)
|
2
|
+
require 'rabl/template'
|
5
3
|
|
6
4
|
context "Rabl::Engine" do
|
7
5
|
helper(:rabl) { |t| RablTemplate.new("code", :format => 'msgpack') { t } }
|
data/test/partials_test.rb
CHANGED
data/test/plist_engine_test.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
require File.expand_path('../teststrap', __FILE__)
|
2
|
-
require
|
3
|
-
require File.expand_path('../../lib/rabl/template', __FILE__)
|
4
|
-
require File.expand_path('../models/user', __FILE__)
|
2
|
+
require 'rabl/template'
|
5
3
|
|
6
4
|
context "Rabl::Engine" do
|
7
5
|
helper(:rabl) { |t| RablTemplate.new("code", :format => 'plist') { t } }
|
data/test/renderer_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'tmpdir'
|
2
2
|
require 'pathname'
|
3
|
+
require 'json'
|
3
4
|
require File.expand_path('../teststrap', __FILE__)
|
4
|
-
require File.expand_path('../../lib/rabl', __FILE__)
|
5
5
|
|
6
6
|
context "Rabl::Renderer" do
|
7
7
|
helper(:tmp_path) { @tmp_path ||= Pathname.new(Dir.mktmpdir) }
|
@@ -29,8 +29,8 @@ context "Rabl::Renderer" do
|
|
29
29
|
user = User.new(:name => 'irvine')
|
30
30
|
|
31
31
|
renderer = Rabl::Renderer.new(source, user, { :format => 'json', :root => true, :view_path => '/path/to/views' })
|
32
|
-
renderer.render
|
33
|
-
end.equals "{\"user\":{\"city\":\"irvine\"}}"
|
32
|
+
JSON.parse(renderer.render)
|
33
|
+
end.equals JSON.parse("{\"user\":{\"city\":\"irvine\"}}")
|
34
34
|
|
35
35
|
asserts 'allows redirecting scope to another object' do
|
36
36
|
source = %q{
|
@@ -42,8 +42,8 @@ context "Rabl::Renderer" do
|
|
42
42
|
scope.instance_variable_set :@user, User.new(:name => 'irvine')
|
43
43
|
|
44
44
|
renderer = Rabl::Renderer.new(source, nil, { :format => 'json', :scope => scope })
|
45
|
-
renderer.render
|
46
|
-
end.equals "{\"user\":{\"city\":\"irvine\"}}"
|
45
|
+
JSON.parse(renderer.render)
|
46
|
+
end.equals JSON.parse("{\"user\":{\"city\":\"irvine\"}}")
|
47
47
|
|
48
48
|
asserts 'accepts scope on render' do
|
49
49
|
source = %q{
|
@@ -55,8 +55,8 @@ context "Rabl::Renderer" do
|
|
55
55
|
scope.instance_variable_set :@user, User.new(:name => 'irvine')
|
56
56
|
|
57
57
|
renderer = Rabl::Renderer.new(source)
|
58
|
-
renderer.render(scope)
|
59
|
-
end.equals "{\"user\":{\"city\":\"irvine\"}}"
|
58
|
+
JSON.parse(renderer.render(scope))
|
59
|
+
end.equals JSON.parse("{\"user\":{\"city\":\"irvine\"}}")
|
60
60
|
|
61
61
|
asserts 'passes :locals to render' do
|
62
62
|
source = %q{
|
@@ -67,8 +67,8 @@ context "Rabl::Renderer" do
|
|
67
67
|
user = User.new(:name => 'irvine')
|
68
68
|
|
69
69
|
renderer = Rabl::Renderer.new(source, nil, { :format => 'json', :locals => {:object => user, :zipcode => "92602"} })
|
70
|
-
renderer.render
|
71
|
-
end.equals "{\"user\":{\"city\":\"irvine\",\"zipcode\":\"92602\"}}"
|
70
|
+
JSON.parse(renderer.render)
|
71
|
+
end.equals JSON.parse("{\"user\":{\"city\":\"irvine\",\"zipcode\":\"92602\"}}")
|
72
72
|
|
73
73
|
asserts 'loads source from file' do
|
74
74
|
File.open(tmp_path + "test.json.rabl", "w") do |f|
|
@@ -81,8 +81,8 @@ context "Rabl::Renderer" do
|
|
81
81
|
user = User.new(:name => 'irvine')
|
82
82
|
|
83
83
|
renderer = Rabl::Renderer.new('test', user, :view_path => tmp_path)
|
84
|
-
renderer.render
|
85
|
-
end.equals "{\"user\":{\"age\":24,\"name\":\"irvine\"}}"
|
84
|
+
JSON.parse(renderer.render)
|
85
|
+
end.equals JSON.parse("{\"user\":{\"age\":24,\"name\":\"irvine\"}}")
|
86
86
|
|
87
87
|
asserts 'uses globally configured view paths' do
|
88
88
|
Rabl.configure do |config|
|
@@ -98,9 +98,8 @@ context "Rabl::Renderer" do
|
|
98
98
|
user = User.new(:name => 'irvine')
|
99
99
|
|
100
100
|
renderer = Rabl::Renderer.new('test', user)
|
101
|
-
renderer.render
|
102
|
-
end.equals "{\"user\":{\"age\":24,\"name\":\"irvine\"}}"
|
103
|
-
|
101
|
+
JSON.parse(renderer.render)
|
102
|
+
end.equals JSON.parse("{\"user\":{\"age\":24,\"name\":\"irvine\"}}")
|
104
103
|
|
105
104
|
asserts 'handles paths for extends' do
|
106
105
|
File.open(tmp_path + "test.json.rabl", "w") do |f|
|
@@ -120,8 +119,30 @@ context "Rabl::Renderer" do
|
|
120
119
|
user = User.new(:name => 'irvine')
|
121
120
|
|
122
121
|
renderer = Rabl::Renderer.new('user', user, :view_path => tmp_path)
|
123
|
-
renderer.render
|
124
|
-
end.equals "{\"user\":{\"age\":24,\"name\":\"irvine\"}}"
|
122
|
+
JSON.parse(renderer.render)
|
123
|
+
end.equals JSON.parse("{\"user\":{\"age\":24,\"name\":\"irvine\"}}")
|
124
|
+
|
125
|
+
# FIXME template is found and rendered but not included in final results
|
126
|
+
# asserts 'handles paths for partial' do
|
127
|
+
# File.open(tmp_path + "test.json.rabl", "w") do |f|
|
128
|
+
# f.puts %q{
|
129
|
+
# attributes :age
|
130
|
+
# }
|
131
|
+
# end
|
132
|
+
|
133
|
+
# File.open(tmp_path + "user.json.rabl", "w") do |f|
|
134
|
+
# f.puts %(
|
135
|
+
# object @user
|
136
|
+
# attribute :name
|
137
|
+
# partial 'test', :object => @user
|
138
|
+
# )
|
139
|
+
# end
|
140
|
+
|
141
|
+
# user = User.new(:name => 'irvine')
|
142
|
+
|
143
|
+
# renderer = Rabl::Renderer.new('user', user, :view_path => tmp_path)
|
144
|
+
# JSON.parse(renderer.render)
|
145
|
+
# end.equals JSON.parse("{\"user\":{\"age\":24,\"name\":\"irvine\"}}")
|
125
146
|
|
126
147
|
asserts 'Rabl.render calls Renderer' do
|
127
148
|
File.open(tmp_path + "test.json.rabl", "w") do |f|
|
@@ -133,8 +154,8 @@ context "Rabl::Renderer" do
|
|
133
154
|
|
134
155
|
user = User.new(:name => 'irvine')
|
135
156
|
|
136
|
-
Rabl.render(user, 'test', :view_path => tmp_path)
|
137
|
-
end.equals "{\"user\":{\"age\":24,\"name\":\"irvine\"}}"
|
157
|
+
JSON.parse(Rabl.render(user, 'test', :view_path => tmp_path))
|
158
|
+
end.equals JSON.parse("{\"user\":{\"age\":24,\"name\":\"irvine\"}}")
|
138
159
|
|
139
160
|
asserts 'it renders collections' do
|
140
161
|
File.open(tmp_path + "test.json.rabl", "w") do |f|
|
@@ -146,8 +167,8 @@ context "Rabl::Renderer" do
|
|
146
167
|
|
147
168
|
scope = Object.new
|
148
169
|
scope.instance_variable_set :@users, nil
|
149
|
-
Rabl.render([], 'test', :view_path => tmp_path, :scope => scope)
|
150
|
-
end.equals "{\"users\":[]}"
|
170
|
+
Rabl.render([], 'test', :view_path => tmp_path, :scope => scope)
|
171
|
+
end.equals "{\"users\":[]}"
|
151
172
|
|
152
173
|
asserts 'it renders an array when given an empty collection' do
|
153
174
|
File.open(tmp_path + "test.json.rabl", "w") do |f|
|
@@ -188,8 +209,8 @@ context "Rabl::Renderer" do
|
|
188
209
|
stub(user).profile { stub!.gender { "male" } }
|
189
210
|
|
190
211
|
renderer = Rabl::Renderer.new('user', user, :view_path => tmp_path)
|
191
|
-
renderer.render
|
192
|
-
end.equals "{\"user\":{\"name\":\"irvine\",\"object\":{\"gender\":\"male\"},\"gender\":\"male\"}}"
|
212
|
+
JSON.parse(renderer.render)
|
213
|
+
end.equals JSON.parse("{\"user\":{\"name\":\"irvine\",\"object\":{\"gender\":\"male\"},\"gender\":\"male\"}}")
|
193
214
|
end
|
194
215
|
|
195
216
|
context '.json' do
|
@@ -202,8 +223,8 @@ context "Rabl::Renderer" do
|
|
202
223
|
end
|
203
224
|
|
204
225
|
user = User.new(:name => 'ivan')
|
205
|
-
Rabl::Renderer.json(user, 'test', :view_path => tmp_path)
|
206
|
-
end.equals "{\"user\":{\"age\":24,\"name\":\"ivan\"}}"
|
226
|
+
JSON.parse(Rabl::Renderer.json(user, 'test', :view_path => tmp_path))
|
227
|
+
end.equals JSON.parse("{\"user\":{\"age\":24,\"name\":\"ivan\"}}")
|
207
228
|
end
|
208
229
|
|
209
230
|
context '.msgpack' do
|
@@ -216,8 +237,8 @@ context "Rabl::Renderer" do
|
|
216
237
|
end
|
217
238
|
|
218
239
|
user = User.new(:name => 'ivan')
|
219
|
-
Rabl::Renderer.msgpack(user, 'test', :view_path => tmp_path)
|
220
|
-
end.equals "\x81\xA4user\x82\xA3age\x18\xA4name\xA4ivan"
|
240
|
+
Rabl::Renderer.msgpack(user, 'test', :view_path => tmp_path)
|
241
|
+
end.equals "\x81\xA4user\x82\xA3age\x18\xA4name\xA4ivan"
|
221
242
|
end
|
222
243
|
|
223
244
|
context '.plist' do
|
data/test/template_test.rb
CHANGED
data/test/teststrap.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.expand_path("../../lib", __FILE__))
|
2
|
+
|
1
3
|
module Kernel
|
2
4
|
def silence_warnings
|
3
5
|
with_warnings(nil) { yield }
|
@@ -15,7 +17,8 @@ silence_warnings do
|
|
15
17
|
require 'riot'
|
16
18
|
require 'riot/rr'
|
17
19
|
require 'tilt'
|
18
|
-
require
|
20
|
+
require 'rabl'
|
21
|
+
require File.expand_path('../models/user', __FILE__)
|
19
22
|
end
|
20
23
|
|
21
24
|
Riot.pretty_dots
|
data/test/xml_test.rb
ADDED
@@ -0,0 +1,287 @@
|
|
1
|
+
require 'active_support/core_ext/hash/conversions'
|
2
|
+
require File.expand_path('../teststrap', __FILE__)
|
3
|
+
require 'rabl/template'
|
4
|
+
|
5
|
+
context "Rabl::Engine" do
|
6
|
+
helper(:rabl) { |t| RablTemplate.new("code", :format => 'xml') { t } }
|
7
|
+
|
8
|
+
# TODO fix annoying warnings in this file:
|
9
|
+
# gems/builder-3.0.3/lib/builder/xmlbase.rb:181: warning: method redefined; discarding old user
|
10
|
+
setup { @old_verbose, $VERBOSE = $VERBOSE, nil }
|
11
|
+
teardown { $VERBOSE = @old_verbose }
|
12
|
+
|
13
|
+
context "with xml defaults" do
|
14
|
+
setup do
|
15
|
+
Rabl.configure do |config|
|
16
|
+
# Comment this line out because include_xml_root to false is default.
|
17
|
+
#config.include_xml_root = false
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "#object" do
|
22
|
+
asserts "that it sets data source" do
|
23
|
+
template = rabl %q{
|
24
|
+
object @user
|
25
|
+
}
|
26
|
+
scope = Object.new
|
27
|
+
scope.instance_variable_set :@user, User.new
|
28
|
+
template.render(scope)
|
29
|
+
end.matches ""
|
30
|
+
|
31
|
+
asserts "that it can set root node" do
|
32
|
+
template = rabl %q{
|
33
|
+
object @user => :person
|
34
|
+
}
|
35
|
+
scope = Object.new
|
36
|
+
scope.instance_variable_set :@user, User.new
|
37
|
+
template.render(scope)
|
38
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<person>\n</person>\n"
|
39
|
+
end
|
40
|
+
|
41
|
+
context "#collection" do
|
42
|
+
asserts "that it sets object to be casted as a simple array" do
|
43
|
+
template = rabl %{
|
44
|
+
collection @users
|
45
|
+
}
|
46
|
+
scope = Object.new
|
47
|
+
scope.instance_variable_set :@users, [User.new, User.new]
|
48
|
+
template.render(scope)
|
49
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<users type=\"array\">\n <user>\n </user>\n <user>\n </user>\n</users>\n"
|
50
|
+
|
51
|
+
asserts "that it sets root node for objects" do
|
52
|
+
template = rabl %{
|
53
|
+
collection @users => :person
|
54
|
+
}
|
55
|
+
scope = Object.new
|
56
|
+
scope.instance_variable_set :@users, [User.new, User.new]
|
57
|
+
template.render(scope)
|
58
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<people type=\"array\">\n <person>\n </person>\n <person>\n </person>\n</people>\n"
|
59
|
+
end
|
60
|
+
|
61
|
+
context "#attribute" do
|
62
|
+
asserts "that it adds an attribute or method to be included in output" do
|
63
|
+
template = rabl %{
|
64
|
+
object @user
|
65
|
+
attribute :name
|
66
|
+
}
|
67
|
+
scope = Object.new
|
68
|
+
scope.instance_variable_set :@user, User.new(:name => 'irvine')
|
69
|
+
template.render(scope)
|
70
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>\n <name>irvine</name>\n</user>\n"
|
71
|
+
|
72
|
+
asserts "that it can add attribute under a different key name through :as" do
|
73
|
+
template = rabl %{
|
74
|
+
object @user
|
75
|
+
attribute :name, :as => 'city'
|
76
|
+
}
|
77
|
+
scope = Object.new
|
78
|
+
scope.instance_variable_set :@user, User.new(:name => 'irvine')
|
79
|
+
template.render(scope)
|
80
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>\n <city>irvine</city>\n</user>\n"
|
81
|
+
|
82
|
+
asserts "that it can add attribute under a different key name through hash" do
|
83
|
+
template = rabl %{
|
84
|
+
object @user
|
85
|
+
attribute :name => :city
|
86
|
+
}
|
87
|
+
scope = Object.new
|
88
|
+
scope.instance_variable_set :@user, User.new(:name => 'irvine')
|
89
|
+
template.render(scope)
|
90
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>\n <city>irvine</city>\n</user>\n"
|
91
|
+
end
|
92
|
+
|
93
|
+
context "#code" do
|
94
|
+
asserts "that it can create an arbitraty code node" do
|
95
|
+
template = rabl %{
|
96
|
+
code(:foo) { 'bar' }
|
97
|
+
}
|
98
|
+
template.render(Object.new)
|
99
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<hash>\n <foo>bar</foo>\n</hash>\n"
|
100
|
+
|
101
|
+
asserts "that it can be passed conditionals" do
|
102
|
+
template = rabl %{
|
103
|
+
code(:foo, :if => lambda { |i| false }) { 'bar' }
|
104
|
+
}
|
105
|
+
template.render(Object.new)
|
106
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<hash>\n</hash>\n"
|
107
|
+
end
|
108
|
+
|
109
|
+
context "#child" do
|
110
|
+
asserts "that it can create a child node" do
|
111
|
+
template = rabl %{
|
112
|
+
object @user
|
113
|
+
child(@user) { attribute :city }
|
114
|
+
}
|
115
|
+
scope = Object.new
|
116
|
+
scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA')
|
117
|
+
template.render(scope)
|
118
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>\n <user>\n <city>LA</city>\n </user>\n</user>\n"
|
119
|
+
|
120
|
+
asserts "that it can create a child node with different key" do
|
121
|
+
template = rabl %{
|
122
|
+
object @user
|
123
|
+
attribute :name
|
124
|
+
child(@user => :person) { attribute :city }
|
125
|
+
}
|
126
|
+
scope = Object.new
|
127
|
+
scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA')
|
128
|
+
template.render(scope)
|
129
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>\n <name>leo</name>\n <person>\n <city>LA</city>\n </person>\n</user>\n"
|
130
|
+
end
|
131
|
+
|
132
|
+
context "#glue" do
|
133
|
+
asserts "that it glues data from a child node" do
|
134
|
+
template = rabl %{
|
135
|
+
object @user
|
136
|
+
attribute :name
|
137
|
+
glue(@user) { attribute :city }
|
138
|
+
glue(@user) { attribute :age }
|
139
|
+
}
|
140
|
+
scope = Object.new
|
141
|
+
scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA', :age => 12)
|
142
|
+
template.render(scope)
|
143
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>\n <name>leo</name>\n <city>LA</city>\n <age type=\"integer\">12</age>\n</user>\n"
|
144
|
+
end
|
145
|
+
|
146
|
+
teardown do
|
147
|
+
Rabl.reset_configuration!
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
context "with xml root" do
|
152
|
+
setup do
|
153
|
+
Rabl.configure do |config|
|
154
|
+
config.include_xml_root = true
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
context "#object" do
|
159
|
+
asserts "that it sets data source" do
|
160
|
+
template = rabl %q{
|
161
|
+
object @user
|
162
|
+
}
|
163
|
+
scope = Object.new
|
164
|
+
scope.instance_variable_set :@user, User.new
|
165
|
+
template.render(scope)
|
166
|
+
end.matches "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>\n <user>\n </user>\n</user>\n"
|
167
|
+
|
168
|
+
asserts "that it can set root node" do
|
169
|
+
template = rabl %q{
|
170
|
+
object @user => :person
|
171
|
+
}
|
172
|
+
scope = Object.new
|
173
|
+
scope.instance_variable_set :@user, User.new
|
174
|
+
template.render(scope)
|
175
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<person>\n <person>\n </person>\n</person>\n"
|
176
|
+
end
|
177
|
+
|
178
|
+
context "#collection" do
|
179
|
+
asserts "that it sets object to be casted as a simple array" do
|
180
|
+
template = rabl %{
|
181
|
+
collection @users
|
182
|
+
}
|
183
|
+
scope = Object.new
|
184
|
+
scope.instance_variable_set :@users, [User.new, User.new]
|
185
|
+
template.render(scope)
|
186
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<users type=\"array\">\n <user>\n <user>\n </user>\n </user>\n <user>\n <user>\n </user>\n </user>\n</users>\n"
|
187
|
+
|
188
|
+
asserts "that it sets root node for objects" do
|
189
|
+
template = rabl %{
|
190
|
+
collection @users => :person
|
191
|
+
}
|
192
|
+
scope = Object.new
|
193
|
+
scope.instance_variable_set :@users, [User.new, User.new]
|
194
|
+
template.render(scope)
|
195
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<people type=\"array\">\n <person>\n <person>\n </person>\n </person>\n <person>\n <person>\n </person>\n </person>\n</people>\n"
|
196
|
+
end
|
197
|
+
|
198
|
+
context "#attribute" do
|
199
|
+
asserts "that it adds an attribute or method to be included in output" do
|
200
|
+
template = rabl %{
|
201
|
+
object @user
|
202
|
+
attribute :name
|
203
|
+
}
|
204
|
+
scope = Object.new
|
205
|
+
scope.instance_variable_set :@user, User.new(:name => 'irvine')
|
206
|
+
template.render(scope)
|
207
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>\n <user>\n <name>irvine</name>\n </user>\n</user>\n"
|
208
|
+
|
209
|
+
asserts "that it can add attribute under a different key name through :as" do
|
210
|
+
template = rabl %{
|
211
|
+
object @user
|
212
|
+
attribute :name, :as => 'city'
|
213
|
+
}
|
214
|
+
scope = Object.new
|
215
|
+
scope.instance_variable_set :@user, User.new(:name => 'irvine')
|
216
|
+
template.render(scope)
|
217
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>\n <user>\n <city>irvine</city>\n </user>\n</user>\n"
|
218
|
+
|
219
|
+
asserts "that it can add attribute under a different key name through hash" do
|
220
|
+
template = rabl %{
|
221
|
+
object @user
|
222
|
+
attribute :name => :city
|
223
|
+
}
|
224
|
+
scope = Object.new
|
225
|
+
scope.instance_variable_set :@user, User.new(:name => 'irvine')
|
226
|
+
template.render(scope)
|
227
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>\n <user>\n <city>irvine</city>\n </user>\n</user>\n"
|
228
|
+
end
|
229
|
+
|
230
|
+
context "#code" do
|
231
|
+
asserts "that it can create an arbitrary code node" do
|
232
|
+
template = rabl %{
|
233
|
+
code(:foo) { 'bar' }
|
234
|
+
}
|
235
|
+
template.render(Object.new)
|
236
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<hash>\n <foo>bar</foo>\n</hash>\n"
|
237
|
+
|
238
|
+
asserts "that it can be passed conditionals" do
|
239
|
+
template = rabl %{
|
240
|
+
code(:foo, :if => lambda { |i| false }) { 'bar' }
|
241
|
+
}
|
242
|
+
template.render(Object.new)
|
243
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<hash>\n</hash>\n"
|
244
|
+
end
|
245
|
+
|
246
|
+
context "#child" do
|
247
|
+
asserts "that it can create a child node" do
|
248
|
+
template = rabl %{
|
249
|
+
object @user
|
250
|
+
child(@user) { attribute :city }
|
251
|
+
}
|
252
|
+
scope = Object.new
|
253
|
+
scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA')
|
254
|
+
template.render(scope)
|
255
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>\n <user>\n <user>\n <city>LA</city>\n </user>\n </user>\n</user>\n"
|
256
|
+
|
257
|
+
asserts "that it can create a child node with different key" do
|
258
|
+
template = rabl %{
|
259
|
+
object @user
|
260
|
+
attribute :name
|
261
|
+
child(@user => :person) { attribute :city }
|
262
|
+
}
|
263
|
+
scope = Object.new
|
264
|
+
scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA')
|
265
|
+
template.render(scope)
|
266
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>\n <user>\n <name>leo</name>\n <person>\n <city>LA</city>\n </person>\n </user>\n</user>\n"
|
267
|
+
end
|
268
|
+
|
269
|
+
context "#glue" do
|
270
|
+
asserts "that it glues data from a child node" do
|
271
|
+
template = rabl %{
|
272
|
+
object @user
|
273
|
+
attribute :name
|
274
|
+
glue(@user) { attribute :city }
|
275
|
+
glue(@user) { attribute :age }
|
276
|
+
}
|
277
|
+
scope = Object.new
|
278
|
+
scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA', :age => 12)
|
279
|
+
template.render(scope)
|
280
|
+
end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>\n <user>\n <name>leo</name>\n <city>LA</city>\n <age type=\"integer\">12</age>\n </user>\n</user>\n"
|
281
|
+
end
|
282
|
+
|
283
|
+
teardown do
|
284
|
+
Rabl.reset_configuration!
|
285
|
+
end
|
286
|
+
end
|
287
|
+
end
|
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.
|
4
|
+
version: 0.7.2
|
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-
|
12
|
+
date: 2012-09-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -146,7 +146,7 @@ dependencies:
|
|
146
146
|
requirements:
|
147
147
|
- - ~>
|
148
148
|
- !ruby/object:Gem::Version
|
149
|
-
version: 1.
|
149
|
+
version: 1.7.0
|
150
150
|
type: :development
|
151
151
|
prerelease: false
|
152
152
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -154,7 +154,7 @@ dependencies:
|
|
154
154
|
requirements:
|
155
155
|
- - ~>
|
156
156
|
- !ruby/object:Gem::Version
|
157
|
-
version: 1.
|
157
|
+
version: 1.7.0
|
158
158
|
- !ruby/object:Gem::Dependency
|
159
159
|
name: plist
|
160
160
|
requirement: !ruby/object:Gem::Requirement
|
@@ -398,6 +398,7 @@ files:
|
|
398
398
|
- lib/rabl/configuration.rb
|
399
399
|
- lib/rabl/engine.rb
|
400
400
|
- lib/rabl/helpers.rb
|
401
|
+
- lib/rabl/json_engine.rb
|
401
402
|
- lib/rabl/partials.rb
|
402
403
|
- lib/rabl/railtie.rb
|
403
404
|
- lib/rabl/renderer.rb
|
@@ -424,6 +425,7 @@ files:
|
|
424
425
|
- test/silence.rb
|
425
426
|
- test/template_test.rb
|
426
427
|
- test/teststrap.rb
|
428
|
+
- test/xml_test.rb
|
427
429
|
homepage: https://github.com/nesquena/rabl
|
428
430
|
licenses: []
|
429
431
|
post_install_message:
|
@@ -468,3 +470,4 @@ test_files:
|
|
468
470
|
- test/silence.rb
|
469
471
|
- test/template_test.rb
|
470
472
|
- test/teststrap.rb
|
473
|
+
- test/xml_test.rb
|