rabl 0.5.5.g → 0.5.5.h

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,14 +1,15 @@
1
1
  # CHANGELOG
2
2
 
3
- ## 0.5.5.a-f
3
+ ## 0.5.5.a-h
4
4
 
5
5
  * Change engine to only instantiate one builder when rendering a collection
6
6
  * Alias to\_msgpack to to\_mpac
7
- * Cache template sources for faster partial lookups (thanks cj)
8
- * Adds BSON format support (thanks Antiarchitect)
9
- * Use template lookup mechanism to find templates in Rails 3 (thanks blakewatters)
10
- * Adds a 'object_root' option to collection (thanks blakewatters)
7
+ * Cache template sources for faster partial lookups (thanks @cj)
8
+ * Adds BSON format support (thanks @Antiarchitect)
9
+ * Use template lookup mechanism to find templates in Rails 3 (thanks @blakewatters)
10
+ * Adds a 'object_root' option to collection (thanks @blakewatters)
11
11
  * Adds a 'root_name' option to collection
12
+ * Adds PList format support (thanks @alzeih)
12
13
 
13
14
  ## 0.5.4
14
15
 
data/README.md CHANGED
@@ -102,9 +102,11 @@ Rabl.configure do |config|
102
102
  # config.json_engine = nil # Any multi\_json engines
103
103
  # config.msgpack_engine = nil # Defaults to ::MessagePack
104
104
  # config.bson_engine = nil # Defaults to ::BSON
105
+ # config.plist_engine = nil # Defaults to ::Plist::Emit
105
106
  # config.include_json_root = true
106
107
  # config.include_msgpack_root = true
107
108
  # config.include_bson_root = true
109
+ # config.include_plist_root = true
108
110
  # config.include_xml_root = false
109
111
  # config.enable_json_callbacks = false
110
112
  # config.xml_options = { :dasherize => true, :skip_types => false }
@@ -191,6 +193,32 @@ end
191
193
  *NOTE*: Attempting to render the bson format without either including the bson gem or
192
194
  setting a `bson_engine` will cause an exception to be raised.
193
195
 
196
+ ### Plist ###
197
+
198
+ Rabl also includes optional support for [Plist](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/PropertyLists/Introduction/Introduction.html]) serialization format using the [plist gem](http://plist.rubyforge.org/).
199
+ To enable, include the plist gem in your project's Gemfile. Then use Rabl as normal with the `plist` format (akin to other formats).
200
+
201
+ ```ruby
202
+ # Gemfile
203
+ gem 'plist'
204
+ ```
205
+
206
+ There is also an option for a custom Plist implementation by setting the Rabl `plist_engine` configuration attribute.
207
+
208
+ ```ruby
209
+ class CustomEncodeEngine
210
+ def self.dump string
211
+ # Custom Encoding by your own engine.
212
+ end
213
+ end
214
+
215
+ Rabl.configure do |config|
216
+ config.plist_engine = CustomEncodeEngine
217
+ end
218
+ ```
219
+
220
+ *NOTE*: Attempting to render the plist format without either including the plist gem or setting a `plist_engine` will cause an exception to be raised.
221
+
194
222
  ## Usage ##
195
223
 
196
224
  ### Object Assignment ###
@@ -482,12 +510,13 @@ Thanks to [Miso](http://gomiso.com) for allowing me to create this for our appli
482
510
  * [Matthew Schulkind](https://github.com/mschulkind) - Cleanup of configuration and tests
483
511
  * [Luke van der Hoeven](https://github.com/plukevdh) - Support non-ORM objects in templates
484
512
  * [Andrey Voronkov](https://github.com/Antiarchitect) - Added BSON format support
513
+ * [Alli Witheford](https://github.com/alzeih) - Added Plist format support
485
514
 
486
515
  and many more contributors listed in the [CHANGELOG](https://github.com/nesquena/rabl/blob/master/CHANGELOG.md).
487
516
 
488
517
  Want to contribute support for another format?
489
- Check out the patch for [msgpack support](https://github.com/nesquena/rabl/pull/69) and
490
- [BSON support](https://github.com/nesquena/rabl/pull/163).
518
+ Check out the patches for [msgpack support](https://github.com/nesquena/rabl/pull/69), [plist support](https://github.com/nesquena/rabl/pull/153) and
519
+ [BSON support](https://github.com/nesquena/rabl/pull/163) for reference.
491
520
 
492
521
  Please fork and contribute, any help in making this project better is appreciated!
493
522
 
@@ -10,6 +10,12 @@ begin
10
10
  rescue LoadError
11
11
  end
12
12
 
13
+ # We load the plist library if it is available.
14
+ begin
15
+ require 'plist'
16
+ rescue LoadError
17
+ end
18
+
13
19
  # Load MultiJSON
14
20
  require 'multi_json'
15
21
 
@@ -18,6 +24,7 @@ module Rabl
18
24
  class Configuration
19
25
  attr_accessor :include_json_root
20
26
  attr_accessor :include_msgpack_root
27
+ attr_accessor :include_plist_root
21
28
  attr_accessor :include_xml_root
22
29
  attr_accessor :include_bson_root
23
30
  attr_accessor :enable_json_callbacks
@@ -25,6 +32,7 @@ module Rabl
25
32
  attr_accessor :bson_move_id
26
33
  attr_writer :msgpack_engine
27
34
  attr_writer :bson_engine
35
+ attr_writer :plist_engine
28
36
  attr_writer :xml_options
29
37
  attr_accessor :cache_sources
30
38
 
@@ -33,6 +41,7 @@ module Rabl
33
41
  def initialize
34
42
  @include_json_root = true
35
43
  @include_msgpack_root = true
44
+ @include_plist_root = true
36
45
  @include_xml_root = false
37
46
  @include_bson_root = true
38
47
  @enable_json_callbacks = false
@@ -41,6 +50,7 @@ module Rabl
41
50
  @json_engine = nil
42
51
  @msgpack_engine = nil
43
52
  @bson_engine = nil
53
+ @plist_engine = nil
44
54
  @xml_options = {}
45
55
  @cache_sources = false
46
56
  end
@@ -69,6 +79,12 @@ module Rabl
69
79
  @bson_engine || ::BSON
70
80
  end
71
81
 
82
+ ##
83
+ # @return the Plist encoder/engine to use.
84
+ def plist_engine
85
+ @plist_engine || ::Plist::Emit
86
+ end
87
+
72
88
  # Allows config options to be read like a hash
73
89
  #
74
90
  # @param [Symbol] option Key for a given attribute
data/lib/rabl/engine.rb CHANGED
@@ -62,6 +62,15 @@ module Rabl
62
62
  end
63
63
  alias_method :to_mpac, :to_msgpack
64
64
 
65
+ # Returns a plist representation of the data object
66
+ # to_plist(:root => true)
67
+ def to_plist(options={})
68
+ include_root = Rabl.configuration.include_plist_root
69
+ options = options.reverse_merge(:root => include_root, :child_root => include_root)
70
+ result = defined?(@_collection_name) ? { @_collection_name => to_hash(options) } : to_hash(options)
71
+ Rabl.configuration.plist_engine.dump(result)
72
+ end
73
+
65
74
  # Returns an xml representation of the data object
66
75
  # to_xml(:root => true)
67
76
  def to_xml(options={})
data/lib/rabl/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rabl
2
- VERSION = "0.5.5.g"
2
+ VERSION = "0.5.5.h"
3
3
  end
data/rabl.gemspec CHANGED
@@ -29,4 +29,5 @@ Gem::Specification.new do |s|
29
29
  s.add_development_dependency 'yajl-ruby'
30
30
  s.add_development_dependency 'msgpack', '~> 0.4.5'
31
31
  s.add_development_dependency 'bson', '~> 1.5.2'
32
+ s.add_development_dependency 'plist'
32
33
  end
@@ -0,0 +1,332 @@
1
+ require File.expand_path('../teststrap', __FILE__)
2
+ require File.expand_path('../../lib/rabl', __FILE__)
3
+ require File.expand_path('../../lib/rabl/template', __FILE__)
4
+ require File.expand_path('../models/user', __FILE__)
5
+
6
+ context "Rabl::Engine" do
7
+
8
+ helper(:rabl) { |t| RablTemplate.new("code", :format => 'plist') { t } }
9
+
10
+ context "with plist defaults" do
11
+ setup do
12
+ Rabl.configure do |config|
13
+ # Comment this line out because include_plist_root is default.
14
+ #config.include_plist_root = true
15
+ end
16
+ end
17
+
18
+ context "#object" do
19
+
20
+ asserts "that it sets data source" do
21
+ template = rabl %q{
22
+ object @user
23
+ }
24
+ scope = Object.new
25
+ scope.instance_variable_set :@user, User.new
26
+ template.render(scope)
27
+ end.matches "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>user</key>\n\t<dict/>\n</dict>\n</plist>\n"
28
+
29
+ asserts "that it can set root node" do
30
+ template = rabl %q{
31
+ object @user => :person
32
+ }
33
+ scope = Object.new
34
+ scope.instance_variable_set :@user, User.new
35
+ template.render(scope)
36
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>person</key>\n\t<dict/>\n</dict>\n</plist>\n"
37
+ end
38
+
39
+ context "#collection" do
40
+
41
+ asserts "that it sets object to be casted as a simple array" do
42
+ template = rabl %{
43
+ collection @users
44
+ }
45
+ scope = Object.new
46
+ scope.instance_variable_set :@users, [User.new, User.new]
47
+ template.render(scope)
48
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<array>\n\t<dict>\n\t\t<key>user</key>\n\t\t<dict/>\n\t</dict>\n\t<dict>\n\t\t<key>user</key>\n\t\t<dict/>\n\t</dict>\n</array>\n</plist>\n"
49
+
50
+ asserts "that it sets root node for objects" do
51
+ template = rabl %{
52
+ collection @users => :person
53
+ }
54
+ scope = Object.new
55
+ scope.instance_variable_set :@users, [User.new, User.new]
56
+ template.render(scope)
57
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>person</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>person</key>\n\t\t\t<dict/>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>person</key>\n\t\t\t<dict/>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
58
+
59
+ end
60
+
61
+ context "#attribute" do
62
+
63
+ asserts "that it adds an attribute or method to be included in output" do
64
+ template = rabl %{
65
+ object @user
66
+ attribute :name
67
+ }
68
+ scope = Object.new
69
+ scope.instance_variable_set :@user, User.new(:name => 'irvine')
70
+ template.render(scope)
71
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>user</key>\n\t<dict>\n\t\t<key>name</key>\n\t\t<string>irvine</string>\n\t</dict>\n</dict>\n</plist>\n"
72
+
73
+ asserts "that it can add attribute under a different key name through :as" do
74
+ template = rabl %{
75
+ object @user
76
+ attribute :name, :as => 'city'
77
+ }
78
+ scope = Object.new
79
+ scope.instance_variable_set :@user, User.new(:name => 'irvine')
80
+ template.render(scope)
81
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>user</key>\n\t<dict>\n\t\t<key>city</key>\n\t\t<string>irvine</string>\n\t</dict>\n</dict>\n</plist>\n"
82
+
83
+ asserts "that it can add attribute under a different key name through hash" do
84
+ template = rabl %{
85
+ object @user
86
+ attribute :name => :city
87
+ }
88
+ scope = Object.new
89
+ scope.instance_variable_set :@user, User.new(:name => 'irvine')
90
+ template.render(scope)
91
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>user</key>\n\t<dict>\n\t\t<key>city</key>\n\t\t<string>irvine</string>\n\t</dict>\n</dict>\n</plist>\n"
92
+
93
+ end
94
+
95
+ context "#code" do
96
+
97
+ asserts "that it can create an arbitraty code node" do
98
+ template = rabl %{
99
+ code(:foo) { 'bar' }
100
+ }
101
+ template.render(Object.new)
102
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>foo</key>\n\t<string>bar</string>\n</dict>\n</plist>\n"
103
+
104
+ asserts "that it can be passed conditionals" do
105
+ template = rabl %{
106
+ code(:foo, :if => lambda { |i| false }) { 'bar' }
107
+ }
108
+ template.render(Object.new)
109
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
110
+
111
+ end
112
+
113
+ context "#child" do
114
+
115
+ asserts "that it can create a child node" do
116
+ template = rabl %{
117
+ object @user
118
+ attribute :name
119
+ child(@user) { attribute :city }
120
+ }
121
+ scope = Object.new
122
+ scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA')
123
+ template.render(scope)
124
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>user</key>\n\t<dict>\n\t\t<key>name</key>\n\t\t<string>leo</string>\n\t\t<key>user</key>\n\t\t<dict>\n\t\t\t<key>city</key>\n\t\t\t<string>LA</string>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
125
+
126
+ asserts "that it can create a child node with different key" do
127
+ template = rabl %{
128
+ object @user
129
+ attribute :name
130
+ child(@user => :person) { attribute :city }
131
+ }
132
+ scope = Object.new
133
+ scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA')
134
+ template.render(scope)
135
+
136
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>user</key>\n\t<dict>\n\t\t<key>name</key>\n\t\t<string>leo</string>\n\t\t<key>person</key>\n\t\t<dict>\n\t\t\t<key>city</key>\n\t\t\t<string>LA</string>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
137
+ end
138
+
139
+ context "#glue" do
140
+
141
+ asserts "that it glues data from a child node" do
142
+ template = rabl %{
143
+ object @user
144
+ attribute :name
145
+ glue(@user) { attribute :city }
146
+ glue(@user) { attribute :age }
147
+ }
148
+ scope = Object.new
149
+ scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA', :age => 12)
150
+ template.render(scope)
151
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>user</key>\n\t<dict>\n\t\t<key>age</key>\n\t\t<integer>12</integer>\n\t\t<key>city</key>\n\t\t<string>LA</string>\n\t\t<key>name</key>\n\t\t<string>leo</string>\n\t</dict>\n</dict>\n</plist>\n"
152
+ end
153
+
154
+ teardown do
155
+ Rabl.reset_configuration!
156
+ end
157
+ end
158
+
159
+ context "with plist_engine" do
160
+ setup do
161
+ class CustomPlistEncodeEngine
162
+ def self.dump string
163
+ 42
164
+ end
165
+ end
166
+
167
+ Rabl.configure do |config|
168
+ config.plist_engine = CustomPlistEncodeEngine
169
+ end
170
+ end
171
+
172
+ asserts 'that it returns process by custom to_json' do
173
+ template = rabl %q{
174
+ object @user
175
+ }
176
+ scope = Object.new
177
+ scope.instance_variable_set :@user, User.new
178
+ template.render(scope)
179
+ end.equals 42
180
+
181
+ teardown do
182
+ Rabl.reset_configuration!
183
+ end
184
+ end
185
+
186
+ context "without plist root" do
187
+ setup do
188
+ Rabl.configure do |config|
189
+ config.include_plist_root = false
190
+ end
191
+ end
192
+
193
+ context "#object" do
194
+
195
+ asserts "that it sets data source" do
196
+ template = rabl %q{
197
+ object @user
198
+ }
199
+ scope = Object.new
200
+ scope.instance_variable_set :@user, User.new
201
+ template.render(scope)
202
+ end.matches "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
203
+
204
+ asserts "that it can set root node" do
205
+ template = rabl %q{
206
+ object @user => :person
207
+ }
208
+ scope = Object.new
209
+ scope.instance_variable_set :@user, User.new
210
+ template.render(scope)
211
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
212
+ end
213
+
214
+ context "#collection" do
215
+
216
+ asserts "that it sets object to be casted as a simple array" do
217
+ template = rabl %{
218
+ collection @users
219
+ }
220
+ scope = Object.new
221
+ scope.instance_variable_set :@users, [User.new, User.new]
222
+ template.render(scope)
223
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<array>\n\t<dict/>\n\t<dict/>\n</array>\n</plist>\n"
224
+
225
+ asserts "that it sets root node for objects" do
226
+ template = rabl %{
227
+ collection @users => :person
228
+ }
229
+ scope = Object.new
230
+ scope.instance_variable_set :@users, [User.new, User.new]
231
+ template.render(scope)
232
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>person</key>\n\t<array>\n\t\t<dict/>\n\t\t<dict/>\n\t</array>\n</dict>\n</plist>\n"
233
+
234
+ end
235
+
236
+ context "#attribute" do
237
+
238
+ asserts "that it adds an attribute or method to be included in output" do
239
+ template = rabl %{
240
+ object @user
241
+ attribute :name
242
+ }
243
+ scope = Object.new
244
+ scope.instance_variable_set :@user, User.new(:name => 'irvine')
245
+ template.render(scope)
246
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>name</key>\n\t<string>irvine</string>\n</dict>\n</plist>\n"
247
+
248
+ asserts "that it can add attribute under a different key name through :as" do
249
+ template = rabl %{
250
+ object @user
251
+ attribute :name, :as => 'city'
252
+ }
253
+ scope = Object.new
254
+ scope.instance_variable_set :@user, User.new(:name => 'irvine')
255
+ template.render(scope)
256
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>city</key>\n\t<string>irvine</string>\n</dict>\n</plist>\n"
257
+
258
+ asserts "that it can add attribute under a different key name through hash" do
259
+ template = rabl %{
260
+ object @user
261
+ attribute :name => :city
262
+ }
263
+ scope = Object.new
264
+ scope.instance_variable_set :@user, User.new(:name => 'irvine')
265
+ template.render(scope)
266
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>city</key>\n\t<string>irvine</string>\n</dict>\n</plist>\n"
267
+
268
+ end
269
+
270
+ context "#code" do
271
+
272
+ asserts "that it can create an arbitraty code node" do
273
+ template = rabl %{
274
+ code(:foo) { 'bar' }
275
+ }
276
+ template.render(Object.new)
277
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>foo</key>\n\t<string>bar</string>\n</dict>\n</plist>\n"
278
+
279
+ asserts "that it can be passed conditionals" do
280
+ template = rabl %{
281
+ code(:foo, :if => lambda { |i| false }) { 'bar' }
282
+ }
283
+ template.render(Object.new)
284
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
285
+
286
+ end
287
+
288
+ context "#child" do
289
+
290
+ asserts "that it can create a child node" do
291
+ template = rabl %{
292
+ object @user
293
+ attribute :name
294
+ child(@user) { attribute :city }
295
+ }
296
+ scope = Object.new
297
+ scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA')
298
+ template.render(scope)
299
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>name</key>\n\t<string>leo</string>\n\t<key>user</key>\n\t<dict>\n\t\t<key>city</key>\n\t\t<string>LA</string>\n\t</dict>\n</dict>\n</plist>\n"
300
+
301
+ asserts "that it can create a child node with different key" do
302
+ template = rabl %{
303
+ object @user
304
+ attribute :name
305
+ child(@user => :person) { attribute :city }
306
+ }
307
+ scope = Object.new
308
+ scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA')
309
+ template.render(scope)
310
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>name</key>\n\t<string>leo</string>\n\t<key>person</key>\n\t<dict>\n\t\t<key>city</key>\n\t\t<string>LA</string>\n\t</dict>\n</dict>\n</plist>\n"
311
+ end
312
+
313
+ context "#glue" do
314
+
315
+ asserts "that it glues data from a child node" do
316
+ template = rabl %{
317
+ object @user
318
+ attribute :name
319
+ glue(@user) { attribute :city }
320
+ glue(@user) { attribute :age }
321
+ }
322
+ scope = Object.new
323
+ scope.instance_variable_set :@user, User.new(:name => 'leo', :city => 'LA', :age => 12)
324
+ template.render(scope)
325
+ end.equals "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>age</key>\n\t<integer>12</integer>\n\t<key>city</key>\n\t<string>LA</string>\n\t<key>name</key>\n\t<string>leo</string>\n</dict>\n</plist>\n"
326
+ end
327
+
328
+ teardown do
329
+ Rabl.reset_configuration!
330
+ end
331
+ end
332
+ end
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.g
5
+ version: 0.5.5.h
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-15 00:00:00 Z
13
+ date: 2012-02-16 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: multi_json
@@ -111,6 +111,17 @@ dependencies:
111
111
  version: 1.5.2
112
112
  type: :development
113
113
  version_requirements: *id009
114
+ - !ruby/object:Gem::Dependency
115
+ name: plist
116
+ prerelease: false
117
+ requirement: &id010 !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: "0"
123
+ type: :development
124
+ version_requirements: *id010
114
125
  description: General ruby templating with json, bson, xml and msgpack support
115
126
  email:
116
127
  - nesquena@gmail.com
@@ -274,6 +285,7 @@ files:
274
285
  - test/models/user.rb
275
286
  - test/msgpack_engine_test.rb
276
287
  - test/partials_test.rb
288
+ - test/plist_engine_test.rb
277
289
  - test/silence.rb
278
290
  - test/template_test.rb
279
291
  - test/teststrap.rb
@@ -317,6 +329,7 @@ test_files:
317
329
  - test/models/user.rb
318
330
  - test/msgpack_engine_test.rb
319
331
  - test/partials_test.rb
332
+ - test/plist_engine_test.rb
320
333
  - test/silence.rb
321
334
  - test/template_test.rb
322
335
  - test/teststrap.rb