representative 1.0.5 → 1.2.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 +7 -0
- data/LICENSE +1 -1
- data/README.markdown +9 -6
- data/Rakefile +0 -1
- data/lib/representative/abstract_xml.rb +1 -0
- data/lib/representative/base.rb +2 -2
- data/lib/representative/json.rb +2 -2
- data/lib/representative/nokogiri.rb +7 -8
- data/lib/representative/version.rb +1 -1
- data/lib/representative/xml.rb +4 -4
- data/spec/representative/json_spec.rb +42 -25
- data/spec/representative/nokogiri_spec.rb +6 -6
- data/spec/representative/tilt_integration_spec.rb +7 -7
- data/spec/representative/xml_behaviour.rb +36 -37
- metadata +41 -43
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: fc5e48edec35400a5461c71ba4627468910096372de5963d2f324c4e4c4b3596
|
4
|
+
data.tar.gz: e4752a8734226a997f9eef820cc6b57683640cd3b0426b1de148305b1f59083e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5c174f553dada2ef722f402703fa253f3f6a5b0d431dd5cd81cf1af3fc0f3d56f39207cd9da9d6f817f510b38051fe1232296d1ca2bab186e95b8d51fa3c21ed
|
7
|
+
data.tar.gz: 380a2542367e38778bdcb35e80df6e2f9c0e395b32b26fd2acc882dd462b1d652cead243ea06072e828b0b7800c5f05c443841977119774c055d3a819a96a560
|
data/LICENSE
CHANGED
data/README.markdown
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
Representative
|
2
2
|
==============
|
3
3
|
|
4
|
+
[](http://badge.fury.io/rb/representative)
|
5
|
+
[](https://travis-ci.org/mdub/representative)
|
6
|
+
|
4
7
|
"Representative" makes it easier to create XML or JSON representations of your Ruby objects.
|
5
8
|
|
6
9
|
It works best when you want the output to roughly follow the object structure, but still want complete control of the result.
|
@@ -12,7 +15,7 @@ Given a Ruby data-structure:
|
|
12
15
|
|
13
16
|
@books = [
|
14
17
|
Book.new(
|
15
|
-
:title => "Sailing for old dogs",
|
18
|
+
:title => "Sailing for old dogs",
|
16
19
|
:authors => ["Jim Watson"],
|
17
20
|
:published => Publication.new(
|
18
21
|
:by => "Credulous Print",
|
@@ -20,7 +23,7 @@ Given a Ruby data-structure:
|
|
20
23
|
)
|
21
24
|
),
|
22
25
|
Book.new(
|
23
|
-
:title => "On the horizon",
|
26
|
+
:title => "On the horizon",
|
24
27
|
:authors => ["Zoe Primpton", "Stan Ford"],
|
25
28
|
:published => Publication.new(
|
26
29
|
:by => "McGraw-Hill",
|
@@ -37,7 +40,7 @@ Given a Ruby data-structure:
|
|
37
40
|
Representative::Nokogiri can be used to generate XML:
|
38
41
|
|
39
42
|
xml = Representative::Nokogiri.new do |r|
|
40
|
-
|
43
|
+
|
41
44
|
r.list_of :books, @books do
|
42
45
|
r.element :title
|
43
46
|
r.list_of :authors
|
@@ -46,7 +49,7 @@ Representative::Nokogiri can be used to generate XML:
|
|
46
49
|
r.element :year
|
47
50
|
end
|
48
51
|
end
|
49
|
-
|
52
|
+
|
50
53
|
end
|
51
54
|
|
52
55
|
puts xml.to_s
|
@@ -98,7 +101,7 @@ Generating JSON
|
|
98
101
|
Representative::Json can be used to generate JSON, using exactly the same DSL:
|
99
102
|
|
100
103
|
json = Representative::Json.new do |r|
|
101
|
-
|
104
|
+
|
102
105
|
r.list_of :books, @books do
|
103
106
|
r.element :title
|
104
107
|
r.list_of :authors
|
@@ -169,7 +172,7 @@ This registers handlers for "`.xml.rep`" and "`.json.rep`" templates.
|
|
169
172
|
Copyright
|
170
173
|
---------
|
171
174
|
|
172
|
-
Copyright (c) 2009 Mike Williams. See LICENSE for details.
|
175
|
+
Copyright (c) 2009-2018 Mike Williams. See LICENSE for details.
|
173
176
|
|
174
177
|
Similar projects
|
175
178
|
----------------
|
data/Rakefile
CHANGED
data/lib/representative/base.rb
CHANGED
@@ -43,8 +43,8 @@ module Representative
|
|
43
43
|
current_subject
|
44
44
|
elsif value_generator.kind_of?(Symbol)
|
45
45
|
current_subject.send(value_generator) unless current_subject.nil?
|
46
|
-
elsif value_generator.
|
47
|
-
value_generator.
|
46
|
+
elsif value_generator.kind_of?(Proc)
|
47
|
+
value_generator.call(current_subject) unless current_subject.nil?
|
48
48
|
else
|
49
49
|
value_generator
|
50
50
|
end
|
data/lib/representative/json.rb
CHANGED
@@ -1,14 +1,13 @@
|
|
1
|
-
require "active_support/core_ext"
|
2
1
|
require "nokogiri"
|
3
2
|
require "representative/abstract_xml"
|
4
3
|
require "representative/empty"
|
5
4
|
|
6
5
|
module Representative
|
7
|
-
|
6
|
+
|
8
7
|
# Easily generate XML while traversing an object-graph.
|
9
8
|
#
|
10
9
|
class Nokogiri < AbstractXml
|
11
|
-
|
10
|
+
|
12
11
|
def initialize(subject = nil, options = {})
|
13
12
|
super(subject, options)
|
14
13
|
@doc = ::Nokogiri::XML::Document.new
|
@@ -35,7 +34,7 @@ module Representative
|
|
35
34
|
comment_node = ::Nokogiri::XML::Comment.new(doc, " #{text} ")
|
36
35
|
current_element.add_child(comment_node)
|
37
36
|
end
|
38
|
-
|
37
|
+
|
39
38
|
def attribute(name, value_generator = name)
|
40
39
|
attribute_name = name.to_s.dasherize
|
41
40
|
value = resolve_value(value_generator)
|
@@ -45,7 +44,7 @@ module Representative
|
|
45
44
|
end
|
46
45
|
|
47
46
|
private
|
48
|
-
|
47
|
+
|
49
48
|
def generate_element(name, resolved_attributes, content_string)
|
50
49
|
tag_args = [content_string, resolved_attributes].compact
|
51
50
|
new_element = doc.create_element(name, *tag_args)
|
@@ -54,13 +53,13 @@ module Representative
|
|
54
53
|
old_element = @current_element
|
55
54
|
begin
|
56
55
|
@current_element = new_element
|
57
|
-
yield
|
56
|
+
yield
|
58
57
|
ensure
|
59
58
|
@current_element = old_element
|
60
59
|
end
|
61
60
|
end
|
62
61
|
end
|
63
|
-
|
62
|
+
|
64
63
|
end
|
65
|
-
|
64
|
+
|
66
65
|
end
|
data/lib/representative/xml.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require "active_support/
|
1
|
+
require "active_support/inflector"
|
2
2
|
require "builder"
|
3
3
|
require "representative/abstract_xml"
|
4
4
|
require "representative/empty"
|
@@ -24,14 +24,14 @@ module Representative
|
|
24
24
|
def comment(text)
|
25
25
|
@xml.comment!(text)
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
protected
|
29
|
-
|
29
|
+
|
30
30
|
def generate_element(name, resolved_attributes, content_string, &content_block)
|
31
31
|
tag_args = [content_string, resolved_attributes].compact
|
32
32
|
@xml.tag!(name, *tag_args, &content_block)
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
end
|
36
36
|
|
37
37
|
end
|
@@ -20,7 +20,7 @@ describe Representative::Json do
|
|
20
20
|
|
21
21
|
it "outputs the value as JSON" do
|
22
22
|
r.element :name, "Fred"
|
23
|
-
resulting_json.
|
23
|
+
expect(resulting_json).to eq %{"Fred"\n}
|
24
24
|
end
|
25
25
|
|
26
26
|
end
|
@@ -29,7 +29,7 @@ describe Representative::Json do
|
|
29
29
|
|
30
30
|
it "outputs the value as JSON" do
|
31
31
|
r.element :age, 36
|
32
|
-
resulting_json.
|
32
|
+
expect(resulting_json).to eq "36\n"
|
33
33
|
end
|
34
34
|
|
35
35
|
end
|
@@ -38,7 +38,7 @@ describe Representative::Json do
|
|
38
38
|
|
39
39
|
it "generates null" do
|
40
40
|
r.element :flavour, nil
|
41
|
-
resulting_json.
|
41
|
+
expect(resulting_json).to eq "null\n"
|
42
42
|
end
|
43
43
|
|
44
44
|
describe "and a block" do
|
@@ -47,7 +47,7 @@ describe Representative::Json do
|
|
47
47
|
r.element :book, nil do
|
48
48
|
r.element :author
|
49
49
|
end
|
50
|
-
resulting_json.
|
50
|
+
expect(resulting_json).to eq "null\n"
|
51
51
|
end
|
52
52
|
|
53
53
|
end
|
@@ -63,7 +63,7 @@ describe Representative::Json do
|
|
63
63
|
r.element :book, @book, :lang => :lang do
|
64
64
|
r.element :title
|
65
65
|
end
|
66
|
-
resulting_json.
|
66
|
+
expect(resulting_json).to eq undent(<<-JSON)
|
67
67
|
{
|
68
68
|
"@lang": "fr",
|
69
69
|
"title": "En Edge"
|
@@ -77,7 +77,7 @@ describe Representative::Json do
|
|
77
77
|
|
78
78
|
it "ignores the attributes" do
|
79
79
|
r.element :review, "Blah de blah", :lang => "fr"
|
80
|
-
resulting_json.
|
80
|
+
expect(resulting_json).to eq undent(<<-JSON)
|
81
81
|
"Blah de blah"
|
82
82
|
JSON
|
83
83
|
end
|
@@ -93,7 +93,7 @@ describe Representative::Json do
|
|
93
93
|
r.representing(@author) do
|
94
94
|
r.element :name
|
95
95
|
end
|
96
|
-
resulting_json.
|
96
|
+
expect(resulting_json).to eq %{"Fred"\n}
|
97
97
|
end
|
98
98
|
|
99
99
|
end
|
@@ -103,7 +103,7 @@ describe Representative::Json do
|
|
103
103
|
it "outputs an object" do
|
104
104
|
r.element :something, Object.new do
|
105
105
|
end
|
106
|
-
resulting_json.
|
106
|
+
expect(resulting_json).to eq "{}\n"
|
107
107
|
end
|
108
108
|
|
109
109
|
end
|
@@ -116,7 +116,7 @@ describe Representative::Json do
|
|
116
116
|
|
117
117
|
it "outputs the array as JSON" do
|
118
118
|
r.list_of :names, %w(Hewey Dewey Louie)
|
119
|
-
resulting_json.
|
119
|
+
expect(resulting_json).to eq undent(<<-JSON)
|
120
120
|
[
|
121
121
|
"Hewey",
|
122
122
|
"Dewey",
|
@@ -134,7 +134,7 @@ describe Representative::Json do
|
|
134
134
|
r.element(:duck, @donald) do
|
135
135
|
r.list_of :nephews
|
136
136
|
end
|
137
|
-
resulting_json.
|
137
|
+
expect(resulting_json).to eq undent(<<-JSON)
|
138
138
|
{
|
139
139
|
"nephews": [
|
140
140
|
"Hewey",
|
@@ -159,7 +159,7 @@ describe Representative::Json do
|
|
159
159
|
r.element :name
|
160
160
|
r.element :age
|
161
161
|
end
|
162
|
-
resulting_json.
|
162
|
+
expect(resulting_json).to eq undent(<<-JSON)
|
163
163
|
[
|
164
164
|
{
|
165
165
|
"name": "Hewey",
|
@@ -190,7 +190,7 @@ describe Representative::Json do
|
|
190
190
|
r.element :name
|
191
191
|
r.element :age
|
192
192
|
end
|
193
|
-
resulting_json.
|
193
|
+
expect(resulting_json).to eq undent(<<-JSON)
|
194
194
|
[
|
195
195
|
{
|
196
196
|
"@about": "Hewey is 3 years old",
|
@@ -215,16 +215,18 @@ describe Representative::Json do
|
|
215
215
|
describe "with list attributes" do
|
216
216
|
it "raises an ArgumentError" do
|
217
217
|
@authors = []
|
218
|
-
|
218
|
+
expect(-> {
|
219
|
+
r.list_of(:authors, @authors, :list_attributes => {}) {}
|
220
|
+
}).to raise_exception(ArgumentError)
|
219
221
|
end
|
220
222
|
end
|
221
223
|
|
222
224
|
describe "with unnecessary arguments" do
|
223
225
|
it "raises an ArgumentError" do
|
224
226
|
@authors = []
|
225
|
-
|
227
|
+
expect(-> {
|
226
228
|
r.list_of(:authors, @authors, :unecessary_arg_should_cause_failure, :item_attributes => {}){}
|
227
|
-
}.
|
229
|
+
}).to raise_exception(ArgumentError)
|
228
230
|
end
|
229
231
|
end
|
230
232
|
|
@@ -234,7 +236,7 @@ describe Representative::Json do
|
|
234
236
|
|
235
237
|
it "inserts a comment" do
|
236
238
|
r.comment "now pay attention"
|
237
|
-
resulting_json.
|
239
|
+
expect(resulting_json).to eq undent(<<-JSON)
|
238
240
|
// now pay attention
|
239
241
|
JSON
|
240
242
|
end
|
@@ -252,7 +254,7 @@ describe Representative::Json do
|
|
252
254
|
r.element :name, "Fred"
|
253
255
|
r.element :age, 36
|
254
256
|
end
|
255
|
-
resulting_json.
|
257
|
+
expect(resulting_json).to eq undent(<<-JSON)
|
256
258
|
{
|
257
259
|
"name": "Fred",
|
258
260
|
"age": 36
|
@@ -268,7 +270,7 @@ describe Representative::Json do
|
|
268
270
|
r.element :name
|
269
271
|
r.element :age
|
270
272
|
end
|
271
|
-
resulting_json.
|
273
|
+
expect(resulting_json).to eq undent(<<-JSON)
|
272
274
|
{
|
273
275
|
"name": "Fred",
|
274
276
|
"age": 36
|
@@ -278,6 +280,21 @@ describe Representative::Json do
|
|
278
280
|
|
279
281
|
end
|
280
282
|
|
283
|
+
describe "when value is a Hash" do
|
284
|
+
|
285
|
+
it "renders the Hash as JSON" do
|
286
|
+
@article = OpenStruct.new(:title => "blah", :tags => {:foo => "bar"})
|
287
|
+
r.element :article, @article do
|
288
|
+
r.element :tags
|
289
|
+
end
|
290
|
+
expect(resulting_json).to eq undent(<<-JSON)
|
291
|
+
{
|
292
|
+
"tags": {"foo":"bar"}
|
293
|
+
}
|
294
|
+
JSON
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
281
298
|
end
|
282
299
|
|
283
300
|
describe "#attribute" do
|
@@ -287,7 +304,7 @@ describe Representative::Json do
|
|
287
304
|
r.attribute :href, "http://example.com/authors/1"
|
288
305
|
r.element :name, "Fred"
|
289
306
|
end
|
290
|
-
resulting_json.
|
307
|
+
expect(resulting_json).to eq undent(<<-JSON)
|
291
308
|
{
|
292
309
|
"@href": "http://example.com/authors/1",
|
293
310
|
"name": "Fred"
|
@@ -306,7 +323,7 @@ describe Representative::Json do
|
|
306
323
|
r.comment "age is irrelevant"
|
307
324
|
r.element :age
|
308
325
|
end
|
309
|
-
resulting_json.
|
326
|
+
expect(resulting_json).to eq undent(<<-JSON)
|
310
327
|
{
|
311
328
|
"name": "Fred",
|
312
329
|
// age is irrelevant
|
@@ -325,7 +342,7 @@ describe Representative::Json do
|
|
325
342
|
r.element :user, Object.new do
|
326
343
|
r.element :full_name, "Fred Bloggs"
|
327
344
|
end
|
328
|
-
resulting_json.
|
345
|
+
expect(resulting_json).to eq undent(<<-JSON)
|
329
346
|
{
|
330
347
|
"full_name": "Fred Bloggs"
|
331
348
|
}
|
@@ -342,7 +359,7 @@ describe Representative::Json do
|
|
342
359
|
r.attribute :alt_url, "http://xyz.com"
|
343
360
|
r.element :full_name
|
344
361
|
end
|
345
|
-
resulting_json.
|
362
|
+
expect(resulting_json).to eq undent(<<-JSON)
|
346
363
|
{
|
347
364
|
"@altUrl": "http://xyz.com",
|
348
365
|
"fullName": "Fred Bloggs"
|
@@ -368,7 +385,7 @@ describe Representative::Json do
|
|
368
385
|
r.element :name
|
369
386
|
r.element :age
|
370
387
|
end
|
371
|
-
resulting_json.
|
388
|
+
expect(resulting_json).to eq undent(<<-JSON)
|
372
389
|
[
|
373
390
|
{
|
374
391
|
"name": "Hewey",
|
@@ -391,7 +408,7 @@ describe Representative::Json do
|
|
391
408
|
r.element :name
|
392
409
|
r.element :age
|
393
410
|
end
|
394
|
-
resulting_json.
|
411
|
+
expect(resulting_json).to eq undent(<<-JSON)
|
395
412
|
[
|
396
413
|
\t{
|
397
414
|
\t\t"name": "Hewey",
|
@@ -414,7 +431,7 @@ describe Representative::Json do
|
|
414
431
|
r.element :name
|
415
432
|
r.element :age
|
416
433
|
end
|
417
|
-
resulting_json.
|
434
|
+
expect(resulting_json).to eq %([{"name":"Hewey","age":3},{"name":"Dewey","age":4}])
|
418
435
|
end
|
419
436
|
|
420
437
|
end
|
@@ -29,7 +29,7 @@ describe Representative::Nokogiri do
|
|
29
29
|
r.element :person, @subject do
|
30
30
|
r.attribute :name
|
31
31
|
end
|
32
|
-
resulting_xml.
|
32
|
+
expect(resulting_xml).to eq %(<person name="Fred"/>)
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -38,16 +38,16 @@ describe Representative::Nokogiri do
|
|
38
38
|
r.element :person, @subject do
|
39
39
|
r.attribute :lang, "fr"
|
40
40
|
end
|
41
|
-
resulting_xml.
|
41
|
+
expect(resulting_xml).to eq %(<person lang="fr"/>)
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
45
|
describe "with a value that supports #to_proc" do
|
46
46
|
it "calls the Proc on the subject to generate attribute value" do
|
47
47
|
r.element :person, @subject do
|
48
|
-
r.attribute :name, lambda { |person| person.name.reverse }
|
48
|
+
r.attribute :name, lambda { |person| person.name.reverse }
|
49
49
|
end
|
50
|
-
resulting_xml.
|
50
|
+
expect(resulting_xml).to eq %(<person name="derF"/>)
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
@@ -55,7 +55,7 @@ describe Representative::Nokogiri do
|
|
55
55
|
r.element :name do
|
56
56
|
r.attribute :sourced_from, "phonebook"
|
57
57
|
end
|
58
|
-
resulting_xml.
|
58
|
+
expect(resulting_xml).to eq %(<name sourced-from="phonebook"/>)
|
59
59
|
end
|
60
60
|
|
61
61
|
describe "with value nil" do
|
@@ -63,7 +63,7 @@ describe Representative::Nokogiri do
|
|
63
63
|
r.element :person, @subject do
|
64
64
|
r.attribute :name, nil
|
65
65
|
end
|
66
|
-
resulting_xml.
|
66
|
+
expect(resulting_xml).to eq %(<person/>)
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
@@ -26,7 +26,7 @@ describe Representative::Tilt do
|
|
26
26
|
r.element :foo, "bar"
|
27
27
|
RUBY
|
28
28
|
render
|
29
|
-
resulting_xml.
|
29
|
+
expect(resulting_xml).to eq %{<foo>bar</foo>\n}
|
30
30
|
end
|
31
31
|
|
32
32
|
it "provides access to scope" do
|
@@ -43,7 +43,7 @@ describe Representative::Tilt do
|
|
43
43
|
end
|
44
44
|
render(scope)
|
45
45
|
|
46
|
-
resulting_xml.
|
46
|
+
expect(resulting_xml).to eq undent(<<-XML)
|
47
47
|
<author>
|
48
48
|
<name>Mike</name>
|
49
49
|
</author>
|
@@ -61,7 +61,7 @@ describe Representative::Tilt do
|
|
61
61
|
|
62
62
|
render(Object.new, {:author => OpenStruct.new(:name => "Mike")})
|
63
63
|
|
64
|
-
resulting_xml.
|
64
|
+
expect(resulting_xml).to eq undent(<<-XML)
|
65
65
|
<author>
|
66
66
|
<name>Mike</name>
|
67
67
|
</author>
|
@@ -72,7 +72,7 @@ describe Representative::Tilt do
|
|
72
72
|
end
|
73
73
|
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
describe "JSON template" do
|
77
77
|
|
78
78
|
def resulting_json
|
@@ -86,7 +86,7 @@ describe Representative::Tilt do
|
|
86
86
|
r.element :foo, "bar"
|
87
87
|
RUBY
|
88
88
|
render
|
89
|
-
resulting_json.
|
89
|
+
expect(resulting_json).to eq %{"bar"\n}
|
90
90
|
end
|
91
91
|
|
92
92
|
it "provides access to scope" do
|
@@ -103,7 +103,7 @@ describe Representative::Tilt do
|
|
103
103
|
end
|
104
104
|
render(scope)
|
105
105
|
|
106
|
-
resulting_json.
|
106
|
+
expect(resulting_json).to eq undent(<<-JSON)
|
107
107
|
{
|
108
108
|
"name": "Mike"
|
109
109
|
}
|
@@ -121,7 +121,7 @@ describe Representative::Tilt do
|
|
121
121
|
|
122
122
|
render(Object.new, {:author => OpenStruct.new(:name => "Mike")})
|
123
123
|
|
124
|
-
resulting_json.
|
124
|
+
expect(resulting_json).to eq undent(<<-JSON)
|
125
125
|
{
|
126
126
|
"name": "Mike"
|
127
127
|
}
|
@@ -19,31 +19,31 @@ shared_examples_for "an XML Representative" do
|
|
19
19
|
|
20
20
|
it "generates an element with content extracted from the subject" do
|
21
21
|
r.element :name
|
22
|
-
resulting_xml.
|
22
|
+
expect(resulting_xml).to eq %(<name>Fred</name>)
|
23
23
|
end
|
24
24
|
|
25
25
|
it "dasherizes the property name" do
|
26
26
|
r.element :full_name
|
27
|
-
resulting_xml.
|
27
|
+
expect(resulting_xml).to eq %(<full-name>Fredrick</full-name>)
|
28
28
|
end
|
29
29
|
|
30
30
|
describe "with attributes" do
|
31
31
|
|
32
32
|
it "generates attributes on the element" do
|
33
33
|
r.element :name, :lang => "fr"
|
34
|
-
resulting_xml.
|
34
|
+
expect(resulting_xml).to eq %(<name lang="fr">Fred</name>)
|
35
35
|
end
|
36
36
|
|
37
37
|
it "dasherizes the attribute name" do
|
38
38
|
r.element :name, :sourced_from => "phonebook"
|
39
|
-
resulting_xml.
|
39
|
+
expect(resulting_xml).to eq %(<name sourced-from="phonebook">Fred</name>)
|
40
40
|
end
|
41
41
|
|
42
42
|
describe "whose value supports #to_proc" do
|
43
43
|
|
44
44
|
it "calls the Proc on the subject to generate a value" do
|
45
45
|
r.element :name, :rev => :reverse
|
46
|
-
resulting_xml.
|
46
|
+
expect(resulting_xml).to eq %(<name rev="derF">Fred</name>)
|
47
47
|
end
|
48
48
|
|
49
49
|
end
|
@@ -52,7 +52,7 @@ shared_examples_for "an XML Representative" do
|
|
52
52
|
|
53
53
|
it "omits the attribute" do
|
54
54
|
r.element :name, :lang => nil
|
55
|
-
resulting_xml.
|
55
|
+
expect(resulting_xml).to eq %(<name>Fred</name>)
|
56
56
|
end
|
57
57
|
|
58
58
|
end
|
@@ -63,14 +63,14 @@ shared_examples_for "an XML Representative" do
|
|
63
63
|
|
64
64
|
it "generates an element with explicitly provided content" do
|
65
65
|
r.element :name, "Bloggs"
|
66
|
-
resulting_xml.
|
66
|
+
expect(resulting_xml).to eq %(<name>Bloggs</name>)
|
67
67
|
end
|
68
68
|
|
69
69
|
describe "AND attributes" do
|
70
70
|
|
71
71
|
it "generates attributes on the element" do
|
72
72
|
r.element :name, "Bloggs", :lang => "fr"
|
73
|
-
resulting_xml.
|
73
|
+
expect(resulting_xml).to eq %(<name lang="fr">Bloggs</name>)
|
74
74
|
end
|
75
75
|
|
76
76
|
end
|
@@ -81,7 +81,7 @@ shared_examples_for "an XML Representative" do
|
|
81
81
|
|
82
82
|
it "calls the named method to generate a value" do
|
83
83
|
r.element :name, :width
|
84
|
-
resulting_xml.
|
84
|
+
expect(resulting_xml).to eq %(<name>200</name>)
|
85
85
|
end
|
86
86
|
|
87
87
|
end
|
@@ -90,7 +90,7 @@ shared_examples_for "an XML Representative" do
|
|
90
90
|
|
91
91
|
it "calls the Proc on the subject to generate a value" do
|
92
92
|
r.element :name, (lambda { |x| x.width * 3 })
|
93
|
-
resulting_xml.
|
93
|
+
expect(resulting_xml).to eq %(<name>600</name>)
|
94
94
|
end
|
95
95
|
|
96
96
|
end
|
@@ -101,7 +101,7 @@ shared_examples_for "an XML Representative" do
|
|
101
101
|
r.element :info, :self do
|
102
102
|
r.element :name
|
103
103
|
end
|
104
|
-
resulting_xml.
|
104
|
+
expect(resulting_xml).to eq %(<info><name>Fred</name></info>)
|
105
105
|
end
|
106
106
|
|
107
107
|
end
|
@@ -110,19 +110,19 @@ shared_examples_for "an XML Representative" do
|
|
110
110
|
|
111
111
|
it "builds an empty element" do
|
112
112
|
r.element :name, nil
|
113
|
-
resulting_xml.
|
113
|
+
expect(resulting_xml).to eq %(<name/>)
|
114
114
|
end
|
115
115
|
|
116
116
|
describe "and attributes" do
|
117
117
|
|
118
118
|
it "omits attributes derived from the subject" do
|
119
119
|
r.element :name, nil, :size => :size
|
120
|
-
resulting_xml.
|
120
|
+
expect(resulting_xml).to eq %(<name/>)
|
121
121
|
end
|
122
122
|
|
123
123
|
it "retains attributes with explicit values" do
|
124
124
|
r.element :name, nil, :lang => "en"
|
125
|
-
resulting_xml.
|
125
|
+
expect(resulting_xml).to eq %(<name lang="en"/>)
|
126
126
|
end
|
127
127
|
|
128
128
|
end
|
@@ -133,7 +133,7 @@ shared_examples_for "an XML Representative" do
|
|
133
133
|
r.element :name, nil do
|
134
134
|
raise "hell"
|
135
135
|
end
|
136
|
-
resulting_xml.
|
136
|
+
expect(resulting_xml).to eq %(<name/>)
|
137
137
|
end
|
138
138
|
|
139
139
|
end
|
@@ -147,14 +147,14 @@ shared_examples_for "an XML Representative" do
|
|
147
147
|
r.element :year
|
148
148
|
r.element :make
|
149
149
|
end
|
150
|
-
resulting_xml.
|
150
|
+
expect(resulting_xml).to eq %(<vehicle><year>1959</year><make>Chevrolet</make></vehicle>)
|
151
151
|
end
|
152
152
|
|
153
153
|
it "yields each new subject" do
|
154
154
|
r.element :vehicle do |vehicle|
|
155
155
|
r.element :year, vehicle.year
|
156
156
|
end
|
157
|
-
resulting_xml.
|
157
|
+
expect(resulting_xml).to eq %(<vehicle><year>1959</year></vehicle>)
|
158
158
|
end
|
159
159
|
|
160
160
|
end
|
@@ -163,7 +163,7 @@ shared_examples_for "an XML Representative" do
|
|
163
163
|
|
164
164
|
it "generates an empty element" do
|
165
165
|
r.element :vehicle, :year => :year, &r.empty
|
166
|
-
resulting_xml.
|
166
|
+
expect(resulting_xml).to eq %(<vehicle year="1959"/>)
|
167
167
|
end
|
168
168
|
|
169
169
|
end
|
@@ -178,21 +178,21 @@ shared_examples_for "an XML Representative" do
|
|
178
178
|
|
179
179
|
it "generates an array element" do
|
180
180
|
r.list_of(:nick_names)
|
181
|
-
resulting_xml.
|
181
|
+
expect(resulting_xml).to eq %(<nick-names type="array"><nick-name>Freddie</nick-name><nick-name>Knucklenose</nick-name></nick-names>)
|
182
182
|
end
|
183
183
|
|
184
184
|
describe "with a Symbol value argument" do
|
185
185
|
|
186
186
|
it "calls the named method to generate a value" do
|
187
187
|
r.list_of(:foo_bars, :nick_names)
|
188
|
-
resulting_xml.
|
188
|
+
expect(resulting_xml).to eq %(<foo-bars type="array"><foo-bar>Freddie</foo-bar><foo-bar>Knucklenose</foo-bar></foo-bars>)
|
189
189
|
end
|
190
190
|
|
191
191
|
end
|
192
192
|
|
193
193
|
it "generates an array element" do
|
194
194
|
r.list_of(:nick_names)
|
195
|
-
resulting_xml.
|
195
|
+
expect(resulting_xml).to eq %(<nick-names type="array"><nick-name>Freddie</nick-name><nick-name>Knucklenose</nick-name></nick-names>)
|
196
196
|
end
|
197
197
|
|
198
198
|
describe "with :list_attributes" do
|
@@ -200,10 +200,10 @@ shared_examples_for "an XML Representative" do
|
|
200
200
|
it "attaches attributes to the array element" do
|
201
201
|
r.list_of(:nick_names, :list_attributes => {:color => "blue", :size => :size})
|
202
202
|
array_element_attributes = REXML::Document.new(resulting_xml).root.attributes
|
203
|
-
array_element_attributes["type"].
|
204
|
-
array_element_attributes["color"].
|
205
|
-
array_element_attributes["size"].
|
206
|
-
array_element_attributes.size.
|
203
|
+
expect(array_element_attributes["type"]).to eq "array"
|
204
|
+
expect(array_element_attributes["color"]).to eq "blue"
|
205
|
+
expect(array_element_attributes["size"]).to eq "2"
|
206
|
+
expect(array_element_attributes.size).to eq 3
|
207
207
|
end
|
208
208
|
|
209
209
|
end
|
@@ -212,7 +212,7 @@ shared_examples_for "an XML Representative" do
|
|
212
212
|
|
213
213
|
it "attaches attributes to each item element" do
|
214
214
|
r.list_of(:nick_names, :item_attributes => {:length => :size})
|
215
|
-
resulting_xml.
|
215
|
+
expect(resulting_xml).to eq %(<nick-names type="array"><nick-name length="7">Freddie</nick-name><nick-name length="11">Knucklenose</nick-name></nick-names>)
|
216
216
|
end
|
217
217
|
|
218
218
|
end
|
@@ -220,7 +220,7 @@ shared_examples_for "an XML Representative" do
|
|
220
220
|
describe "with an explicit :item_name" do
|
221
221
|
it "uses the name provided" do
|
222
222
|
r.list_of(:nick_names, :item_name => :nick)
|
223
|
-
resulting_xml.
|
223
|
+
expect(resulting_xml).to eq %(<nick-names type="array"><nick>Freddie</nick><nick>Knucklenose</nick></nick-names>)
|
224
224
|
end
|
225
225
|
end
|
226
226
|
|
@@ -230,7 +230,7 @@ shared_examples_for "an XML Representative" do
|
|
230
230
|
r.list_of(:services) do
|
231
231
|
r.date
|
232
232
|
end
|
233
|
-
resulting_xml.
|
233
|
+
expect(resulting_xml).to eq %(<services/>)
|
234
234
|
end
|
235
235
|
|
236
236
|
end
|
@@ -241,7 +241,7 @@ shared_examples_for "an XML Representative" do
|
|
241
241
|
r.list_of(:nick_names) do
|
242
242
|
r.element :length
|
243
243
|
end
|
244
|
-
resulting_xml.
|
244
|
+
expect(resulting_xml).to eq %(<nick-names type="array"><nick-name><length>7</length></nick-name><nick-name><length>11</length></nick-name></nick-names>)
|
245
245
|
end
|
246
246
|
|
247
247
|
end
|
@@ -250,7 +250,7 @@ shared_examples_for "an XML Representative" do
|
|
250
250
|
|
251
251
|
it "generates empty elements for each list element" do
|
252
252
|
r.list_of(:nick_names, :item_attributes => {:value => :to_s}, &r.empty)
|
253
|
-
resulting_xml.
|
253
|
+
expect(resulting_xml).to eq %(<nick-names type="array"><nick-name value="Freddie"/><nick-name value="Knucklenose"/></nick-names>)
|
254
254
|
end
|
255
255
|
|
256
256
|
end
|
@@ -261,7 +261,7 @@ shared_examples_for "an XML Representative" do
|
|
261
261
|
r.list_of(:nick_names, :item_attributes => {:length => :size}) do
|
262
262
|
r.element :reverse
|
263
263
|
end
|
264
|
-
resulting_xml.
|
264
|
+
expect(resulting_xml).to eq %(<nick-names type="array"><nick-name length="7"><reverse>eidderF</reverse></nick-name><nick-name length="11"><reverse>esonelkcunK</reverse></nick-name></nick-names>)
|
265
265
|
end
|
266
266
|
|
267
267
|
end
|
@@ -274,7 +274,7 @@ shared_examples_for "an XML Representative" do
|
|
274
274
|
r.representing :vehicle do
|
275
275
|
r.element :make
|
276
276
|
end
|
277
|
-
resulting_xml.
|
277
|
+
expect(resulting_xml).to eq %(<make>Chevrolet</make>)
|
278
278
|
end
|
279
279
|
|
280
280
|
end
|
@@ -286,8 +286,7 @@ shared_examples_for "an XML Representative" do
|
|
286
286
|
r.comment "Year of manufacture"
|
287
287
|
r.element :year
|
288
288
|
end
|
289
|
-
resulting_xml.
|
290
|
-
%(<vehicle><!-- Year of manufacture --><year>1959</year></vehicle>)
|
289
|
+
expect(resulting_xml).to eq %(<vehicle><!-- Year of manufacture --><year>1959</year></vehicle>)
|
291
290
|
end
|
292
291
|
|
293
292
|
end
|
@@ -296,7 +295,7 @@ shared_examples_for "an XML Representative" do
|
|
296
295
|
|
297
296
|
it "generates camelCased element and attribute names" do
|
298
297
|
r(:naming_strategy => :camelcase).element :full_name, :foo_bar => 5
|
299
|
-
resulting_xml.
|
298
|
+
expect(resulting_xml).to eq %(<fullName fooBar="5">Fredrick</fullName>)
|
300
299
|
end
|
301
300
|
|
302
301
|
end
|
@@ -306,7 +305,7 @@ shared_examples_for "an XML Representative" do
|
|
306
305
|
it "generates suitably transformed names" do
|
307
306
|
biff = lambda { |name| name.upcase }
|
308
307
|
r(:naming_strategy => biff).element :full_name
|
309
|
-
resulting_xml.
|
308
|
+
expect(resulting_xml).to eq %(<FULL_NAME>Fredrick</FULL_NAME>)
|
310
309
|
end
|
311
310
|
|
312
311
|
end
|
@@ -315,7 +314,7 @@ shared_examples_for "an XML Representative" do
|
|
315
314
|
|
316
315
|
it "uses raw names" do
|
317
316
|
r(:naming_strategy => nil).element :full_name
|
318
|
-
resulting_xml.
|
317
|
+
expect(resulting_xml).to eq %(<full_name>Fredrick</full_name>)
|
319
318
|
end
|
320
319
|
|
321
320
|
end
|
metadata
CHANGED
@@ -1,78 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: representative
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
5
|
-
prerelease:
|
4
|
+
version: 1.2.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Mike Williams
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2018-06-28 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
14
|
+
name: rspec
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
19
|
+
version: 3.4.0
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.4.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport-json_encoder
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.1.0
|
22
34
|
type: :runtime
|
23
35
|
prerelease: false
|
24
36
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
37
|
requirements:
|
27
|
-
- -
|
38
|
+
- - ">="
|
28
39
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
40
|
+
version: 1.1.0
|
30
41
|
- !ruby/object:Gem::Dependency
|
31
42
|
name: i18n
|
32
43
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
44
|
requirements:
|
35
|
-
- -
|
45
|
+
- - ">="
|
36
46
|
- !ruby/object:Gem::Version
|
37
47
|
version: 0.4.1
|
38
48
|
type: :runtime
|
39
49
|
prerelease: false
|
40
50
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
51
|
requirements:
|
43
|
-
- -
|
52
|
+
- - ">="
|
44
53
|
- !ruby/object:Gem::Version
|
45
54
|
version: 0.4.1
|
46
55
|
- !ruby/object:Gem::Dependency
|
47
56
|
name: builder
|
48
57
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
58
|
requirements:
|
51
|
-
- -
|
59
|
+
- - ">="
|
52
60
|
- !ruby/object:Gem::Version
|
53
61
|
version: 2.1.2
|
54
62
|
type: :runtime
|
55
63
|
prerelease: false
|
56
64
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
65
|
requirements:
|
59
|
-
- -
|
66
|
+
- - ">="
|
60
67
|
- !ruby/object:Gem::Version
|
61
68
|
version: 2.1.2
|
62
69
|
- !ruby/object:Gem::Dependency
|
63
70
|
name: nokogiri
|
64
71
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
72
|
requirements:
|
67
|
-
- -
|
73
|
+
- - ">="
|
68
74
|
- !ruby/object:Gem::Version
|
69
75
|
version: 1.4.2
|
70
76
|
type: :runtime
|
71
77
|
prerelease: false
|
72
78
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
79
|
requirements:
|
75
|
-
- -
|
80
|
+
- - ">="
|
76
81
|
- !ruby/object:Gem::Version
|
77
82
|
version: 1.4.2
|
78
83
|
description:
|
@@ -81,6 +86,11 @@ executables: []
|
|
81
86
|
extensions: []
|
82
87
|
extra_rdoc_files: []
|
83
88
|
files:
|
89
|
+
- LICENSE
|
90
|
+
- README.markdown
|
91
|
+
- Rakefile
|
92
|
+
- examples/books.rb
|
93
|
+
- lib/representative.rb
|
84
94
|
- lib/representative/abstract_xml.rb
|
85
95
|
- lib/representative/base.rb
|
86
96
|
- lib/representative/empty.rb
|
@@ -90,52 +100,40 @@ files:
|
|
90
100
|
- lib/representative/tilt_integration.rb
|
91
101
|
- lib/representative/version.rb
|
92
102
|
- lib/representative/xml.rb
|
93
|
-
- lib/representative.rb
|
94
|
-
- examples/books.rb
|
95
|
-
- README.markdown
|
96
|
-
- LICENSE
|
97
103
|
- spec/representative/json_spec.rb
|
98
104
|
- spec/representative/nokogiri_spec.rb
|
99
105
|
- spec/representative/tilt_integration_spec.rb
|
100
106
|
- spec/representative/xml_behaviour.rb
|
101
107
|
- spec/representative/xml_spec.rb
|
102
108
|
- spec/spec_helper.rb
|
103
|
-
- Rakefile
|
104
109
|
homepage: http://github.com/mdub/representative
|
105
110
|
licenses: []
|
111
|
+
metadata: {}
|
106
112
|
post_install_message:
|
107
113
|
rdoc_options: []
|
108
114
|
require_paths:
|
109
115
|
- lib
|
110
116
|
required_ruby_version: !ruby/object:Gem::Requirement
|
111
|
-
none: false
|
112
117
|
requirements:
|
113
|
-
- -
|
118
|
+
- - ">="
|
114
119
|
- !ruby/object:Gem::Version
|
115
|
-
version:
|
116
|
-
segments:
|
117
|
-
- 0
|
118
|
-
hash: 868732793501301304
|
120
|
+
version: 2.0.0
|
119
121
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
|
-
none: false
|
121
122
|
requirements:
|
122
|
-
- -
|
123
|
+
- - ">="
|
123
124
|
- !ruby/object:Gem::Version
|
124
125
|
version: '0'
|
125
|
-
segments:
|
126
|
-
- 0
|
127
|
-
hash: 868732793501301304
|
128
126
|
requirements: []
|
129
127
|
rubyforge_project:
|
130
|
-
rubygems_version:
|
128
|
+
rubygems_version: 2.7.6
|
131
129
|
signing_key:
|
132
|
-
specification_version:
|
130
|
+
specification_version: 4
|
133
131
|
summary: Builds XML and JSON representations of your Ruby objects
|
134
132
|
test_files:
|
133
|
+
- spec/spec_helper.rb
|
134
|
+
- spec/representative/xml_spec.rb
|
135
135
|
- spec/representative/json_spec.rb
|
136
|
+
- spec/representative/xml_behaviour.rb
|
136
137
|
- spec/representative/nokogiri_spec.rb
|
137
138
|
- spec/representative/tilt_integration_spec.rb
|
138
|
-
- spec/representative/xml_behaviour.rb
|
139
|
-
- spec/representative/xml_spec.rb
|
140
|
-
- spec/spec_helper.rb
|
141
139
|
- Rakefile
|