representative 1.0.4 → 1.0.5
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/lib/representative/json.rb +32 -8
- data/lib/representative/version.rb +1 -1
- data/spec/representative/json_spec.rb +102 -33
- metadata +27 -51
data/lib/representative/json.rb
CHANGED
@@ -7,12 +7,14 @@ module Representative
|
|
7
7
|
class Json < Base
|
8
8
|
|
9
9
|
DEFAULT_ATTRIBUTE_PREFIX = "@".freeze
|
10
|
+
DEFAULT_INDENTATION = 2 # two spaces
|
10
11
|
|
11
12
|
def initialize(subject = nil, options = {})
|
12
13
|
super(subject, options)
|
13
14
|
@buffer = []
|
14
15
|
@indent_level = 0
|
15
|
-
@
|
16
|
+
@indent_string = resolve_indentation(options.fetch(:indentation, DEFAULT_INDENTATION))
|
17
|
+
@attribute_prefix = options.fetch(:attribute_prefix, DEFAULT_ATTRIBUTE_PREFIX)
|
16
18
|
now_at :beginning_of_buffer
|
17
19
|
yield self if block_given?
|
18
20
|
end
|
@@ -82,7 +84,7 @@ module Representative
|
|
82
84
|
end
|
83
85
|
|
84
86
|
def to_json
|
85
|
-
|
87
|
+
emit("\n") if indenting?
|
86
88
|
@buffer.join
|
87
89
|
end
|
88
90
|
|
@@ -92,6 +94,19 @@ module Representative
|
|
92
94
|
|
93
95
|
private
|
94
96
|
|
97
|
+
def resolve_indentation(arg)
|
98
|
+
case arg
|
99
|
+
when Integer
|
100
|
+
" " * arg
|
101
|
+
when /\A[ \t]*\Z/
|
102
|
+
arg
|
103
|
+
when nil, false
|
104
|
+
false
|
105
|
+
else
|
106
|
+
raise ArgumentError, "invalid indentation setting"
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
95
110
|
def emit(s)
|
96
111
|
@buffer << s
|
97
112
|
end
|
@@ -100,20 +115,27 @@ module Representative
|
|
100
115
|
ActiveSupport::JSON.encode(data)
|
101
116
|
end
|
102
117
|
|
103
|
-
def
|
104
|
-
|
118
|
+
def indenting?
|
119
|
+
!!@indent_string
|
120
|
+
end
|
121
|
+
|
122
|
+
def current_indentation
|
123
|
+
(@indent_string * @indent_level)
|
105
124
|
end
|
106
125
|
|
107
126
|
def label(name)
|
108
127
|
return false if @indent_level == 0
|
109
128
|
new_item
|
110
|
-
emit(format_name(name).inspect + ":
|
129
|
+
emit(format_name(name).inspect + ":")
|
130
|
+
emit(" ") if indenting?
|
111
131
|
end
|
112
132
|
|
113
133
|
def new_item
|
114
134
|
emit(",") if at? :end_of_item
|
115
|
-
|
116
|
-
|
135
|
+
if indenting?
|
136
|
+
emit("\n") unless at? :beginning_of_buffer
|
137
|
+
emit(current_indentation)
|
138
|
+
end
|
117
139
|
@pending_comma = ","
|
118
140
|
end
|
119
141
|
|
@@ -123,7 +145,9 @@ module Representative
|
|
123
145
|
now_at :beginning_of_block
|
124
146
|
yield
|
125
147
|
@indent_level -= 1
|
126
|
-
|
148
|
+
if indenting?
|
149
|
+
emit("\n" + current_indentation) unless at? :beginning_of_block
|
150
|
+
end
|
127
151
|
emit(closing_char)
|
128
152
|
now_at :end_of_item
|
129
153
|
end
|
@@ -33,9 +33,9 @@ describe Representative::Json do
|
|
33
33
|
end
|
34
34
|
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
describe "with a nil value" do
|
38
|
-
|
38
|
+
|
39
39
|
it "generates null" do
|
40
40
|
r.element :flavour, nil
|
41
41
|
resulting_json.should == "null\n"
|
@@ -51,13 +51,13 @@ describe Representative::Json do
|
|
51
51
|
end
|
52
52
|
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
describe "with attributes" do
|
58
|
-
|
58
|
+
|
59
59
|
describe "and a block" do
|
60
|
-
|
60
|
+
|
61
61
|
it "generates labelled fields for the attributes" do
|
62
62
|
@book = OpenStruct.new(:lang => "fr", :title => "En Edge")
|
63
63
|
r.element :book, @book, :lang => :lang do
|
@@ -70,20 +70,20 @@ describe Representative::Json do
|
|
70
70
|
}
|
71
71
|
JSON
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
end
|
75
75
|
|
76
76
|
describe "and an explicit value" do
|
77
|
-
|
77
|
+
|
78
78
|
it "ignores the attributes" do
|
79
79
|
r.element :review, "Blah de blah", :lang => "fr"
|
80
80
|
resulting_json.should == undent(<<-JSON)
|
81
81
|
"Blah de blah"
|
82
82
|
JSON
|
83
83
|
end
|
84
|
-
|
84
|
+
|
85
85
|
end
|
86
|
-
|
86
|
+
|
87
87
|
end
|
88
88
|
|
89
89
|
describe "without an explicit value" do
|
@@ -144,7 +144,7 @@ describe Representative::Json do
|
|
144
144
|
}
|
145
145
|
JSON
|
146
146
|
end
|
147
|
-
|
147
|
+
|
148
148
|
end
|
149
149
|
|
150
150
|
describe "with a block" do
|
@@ -176,9 +176,9 @@ describe Representative::Json do
|
|
176
176
|
]
|
177
177
|
JSON
|
178
178
|
end
|
179
|
-
|
179
|
+
|
180
180
|
end
|
181
|
-
|
181
|
+
|
182
182
|
describe "with item attributes" do
|
183
183
|
it "adds the attributes with an @ sign to child elements" do
|
184
184
|
@authors = [
|
@@ -198,7 +198,7 @@ describe Representative::Json do
|
|
198
198
|
"age": 3
|
199
199
|
},
|
200
200
|
{
|
201
|
-
"@about": "Dewey is 4 years old",
|
201
|
+
"@about": "Dewey is 4 years old",
|
202
202
|
"name": "Dewey",
|
203
203
|
"age": 4
|
204
204
|
},
|
@@ -211,19 +211,19 @@ describe Representative::Json do
|
|
211
211
|
JSON
|
212
212
|
end
|
213
213
|
end
|
214
|
-
|
214
|
+
|
215
215
|
describe "with list attributes" do
|
216
216
|
it "raises an ArgumentError" do
|
217
217
|
@authors = []
|
218
218
|
lambda{ r.list_of(:authors, @authors, :list_attributes => {}) {} }.should raise_exception(ArgumentError)
|
219
219
|
end
|
220
220
|
end
|
221
|
-
|
221
|
+
|
222
222
|
describe "with unnecessary arguments" do
|
223
223
|
it "raises an ArgumentError" do
|
224
224
|
@authors = []
|
225
|
-
lambda{
|
226
|
-
r.list_of(:authors, @authors, :unecessary_arg_should_cause_failure, :item_attributes => {}){}
|
225
|
+
lambda{
|
226
|
+
r.list_of(:authors, @authors, :unecessary_arg_should_cause_failure, :item_attributes => {}){}
|
227
227
|
}.should raise_exception(ArgumentError)
|
228
228
|
end
|
229
229
|
end
|
@@ -231,16 +231,16 @@ describe Representative::Json do
|
|
231
231
|
end
|
232
232
|
|
233
233
|
describe "#comment" do
|
234
|
-
|
234
|
+
|
235
235
|
it "inserts a comment" do
|
236
236
|
r.comment "now pay attention"
|
237
237
|
resulting_json.should == undent(<<-JSON)
|
238
238
|
// now pay attention
|
239
239
|
JSON
|
240
240
|
end
|
241
|
-
|
241
|
+
|
242
242
|
end
|
243
|
-
|
243
|
+
|
244
244
|
end
|
245
245
|
|
246
246
|
describe "within an element block" do
|
@@ -269,7 +269,7 @@ describe Representative::Json do
|
|
269
269
|
r.element :age
|
270
270
|
end
|
271
271
|
resulting_json.should == undent(<<-JSON)
|
272
|
-
{
|
272
|
+
{
|
273
273
|
"name": "Fred",
|
274
274
|
"age": 36
|
275
275
|
}
|
@@ -281,7 +281,7 @@ describe Representative::Json do
|
|
281
281
|
end
|
282
282
|
|
283
283
|
describe "#attribute" do
|
284
|
-
|
284
|
+
|
285
285
|
it "generates labelled values, with a label prefix" do
|
286
286
|
r.element :author, Object.new do
|
287
287
|
r.attribute :href, "http://example.com/authors/1"
|
@@ -294,11 +294,11 @@ describe Representative::Json do
|
|
294
294
|
}
|
295
295
|
JSON
|
296
296
|
end
|
297
|
-
|
297
|
+
|
298
298
|
end
|
299
|
-
|
299
|
+
|
300
300
|
describe "#comment" do
|
301
|
-
|
301
|
+
|
302
302
|
it "inserts a comment" do
|
303
303
|
@author = OpenStruct.new(:name => "Fred", :age => 36)
|
304
304
|
r.element :author, @author do
|
@@ -307,33 +307,33 @@ describe Representative::Json do
|
|
307
307
|
r.element :age
|
308
308
|
end
|
309
309
|
resulting_json.should == undent(<<-JSON)
|
310
|
-
{
|
310
|
+
{
|
311
311
|
"name": "Fred",
|
312
312
|
// age is irrelevant
|
313
313
|
"age": 36
|
314
314
|
}
|
315
315
|
JSON
|
316
316
|
end
|
317
|
-
|
317
|
+
|
318
318
|
end
|
319
|
-
|
319
|
+
|
320
320
|
end
|
321
321
|
|
322
322
|
context "by default" do
|
323
|
-
|
323
|
+
|
324
324
|
it "does not tranform element names" do
|
325
325
|
r.element :user, Object.new do
|
326
326
|
r.element :full_name, "Fred Bloggs"
|
327
327
|
end
|
328
328
|
resulting_json.should == undent(<<-JSON)
|
329
|
-
{
|
329
|
+
{
|
330
330
|
"full_name": "Fred Bloggs"
|
331
331
|
}
|
332
332
|
JSON
|
333
333
|
end
|
334
334
|
|
335
335
|
end
|
336
|
-
|
336
|
+
|
337
337
|
context "with naming_strategy :camelcase" do
|
338
338
|
|
339
339
|
it "generates camelCased element and attribute names" do
|
@@ -343,7 +343,7 @@ describe Representative::Json do
|
|
343
343
|
r.element :full_name
|
344
344
|
end
|
345
345
|
resulting_json.should == undent(<<-JSON)
|
346
|
-
{
|
346
|
+
{
|
347
347
|
"@altUrl": "http://xyz.com",
|
348
348
|
"fullName": "Fred Bloggs"
|
349
349
|
}
|
@@ -352,4 +352,73 @@ describe Representative::Json do
|
|
352
352
|
|
353
353
|
end
|
354
354
|
|
355
|
+
context "with :indentation option" do
|
356
|
+
|
357
|
+
before do
|
358
|
+
@authors = [
|
359
|
+
OpenStruct.new(:name => "Hewey", :age => 3),
|
360
|
+
OpenStruct.new(:name => "Dewey", :age => 4)
|
361
|
+
]
|
362
|
+
end
|
363
|
+
|
364
|
+
context "set to an integer" do
|
365
|
+
|
366
|
+
it "indents the specified number of spaces" do
|
367
|
+
r(:indentation => 3).list_of :authors, @authors do
|
368
|
+
r.element :name
|
369
|
+
r.element :age
|
370
|
+
end
|
371
|
+
resulting_json.should == undent(<<-JSON)
|
372
|
+
[
|
373
|
+
{
|
374
|
+
"name": "Hewey",
|
375
|
+
"age": 3
|
376
|
+
},
|
377
|
+
{
|
378
|
+
"name": "Dewey",
|
379
|
+
"age": 4
|
380
|
+
}
|
381
|
+
]
|
382
|
+
JSON
|
383
|
+
end
|
384
|
+
|
385
|
+
end
|
386
|
+
|
387
|
+
context "set to a whitespace String" do
|
388
|
+
|
389
|
+
it "indents the specified number of spaces" do
|
390
|
+
r(:indentation => "\t").list_of :authors, @authors do
|
391
|
+
r.element :name
|
392
|
+
r.element :age
|
393
|
+
end
|
394
|
+
resulting_json.should == undent(<<-JSON)
|
395
|
+
[
|
396
|
+
\t{
|
397
|
+
\t\t"name": "Hewey",
|
398
|
+
\t\t"age": 3
|
399
|
+
\t},
|
400
|
+
\t{
|
401
|
+
\t\t"name": "Dewey",
|
402
|
+
\t\t"age": 4
|
403
|
+
\t}
|
404
|
+
]
|
405
|
+
JSON
|
406
|
+
end
|
407
|
+
|
408
|
+
end
|
409
|
+
|
410
|
+
context "set false" do
|
411
|
+
|
412
|
+
it "does not indent, or wrap" do
|
413
|
+
r(:indentation => false).list_of :authors, @authors do
|
414
|
+
r.element :name
|
415
|
+
r.element :age
|
416
|
+
end
|
417
|
+
resulting_json.should == %([{"name":"Hewey","age":3},{"name":"Dewey","age":4}])
|
418
|
+
end
|
419
|
+
|
420
|
+
end
|
421
|
+
|
422
|
+
end
|
423
|
+
|
355
424
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: representative
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-08-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,84 +21,60 @@ dependencies:
|
|
21
21
|
version: 2.2.2
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: i18n
|
27
|
-
requirement: &70110341852520 !ruby/object:Gem::Requirement
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
25
|
none: false
|
29
26
|
requirements:
|
30
27
|
- - ! '>='
|
31
28
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
33
|
-
type: :runtime
|
34
|
-
prerelease: false
|
35
|
-
version_requirements: *70110341852520
|
29
|
+
version: 2.2.2
|
36
30
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
38
|
-
requirement:
|
31
|
+
name: i18n
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
39
33
|
none: false
|
40
34
|
requirements:
|
41
35
|
- - ! '>='
|
42
36
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
37
|
+
version: 0.4.1
|
44
38
|
type: :runtime
|
45
39
|
prerelease: false
|
46
|
-
version_requirements:
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: nokogiri
|
49
|
-
requirement: &70110341850920 !ruby/object:Gem::Requirement
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
41
|
none: false
|
51
42
|
requirements:
|
52
43
|
- - ! '>='
|
53
44
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
55
|
-
type: :runtime
|
56
|
-
prerelease: false
|
57
|
-
version_requirements: *70110341850920
|
45
|
+
version: 0.4.1
|
58
46
|
- !ruby/object:Gem::Dependency
|
59
|
-
name:
|
60
|
-
requirement:
|
47
|
+
name: builder
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
61
49
|
none: false
|
62
50
|
requirements:
|
63
|
-
- -
|
51
|
+
- - ! '>='
|
64
52
|
- !ruby/object:Gem::Version
|
65
|
-
version:
|
66
|
-
type: :
|
53
|
+
version: 2.1.2
|
54
|
+
type: :runtime
|
67
55
|
prerelease: false
|
68
|
-
version_requirements:
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rspec
|
71
|
-
requirement: &70110341848720 !ruby/object:Gem::Requirement
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
72
57
|
none: false
|
73
58
|
requirements:
|
74
|
-
- -
|
59
|
+
- - ! '>='
|
75
60
|
- !ruby/object:Gem::Version
|
76
|
-
version: 2.
|
77
|
-
type: :development
|
78
|
-
prerelease: false
|
79
|
-
version_requirements: *70110341848720
|
61
|
+
version: 2.1.2
|
80
62
|
- !ruby/object:Gem::Dependency
|
81
|
-
name:
|
82
|
-
requirement:
|
63
|
+
name: nokogiri
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
83
65
|
none: false
|
84
66
|
requirements:
|
85
67
|
- - ! '>='
|
86
68
|
- !ruby/object:Gem::Version
|
87
|
-
version:
|
88
|
-
type: :
|
69
|
+
version: 1.4.2
|
70
|
+
type: :runtime
|
89
71
|
prerelease: false
|
90
|
-
version_requirements:
|
91
|
-
- !ruby/object:Gem::Dependency
|
92
|
-
name: diff-lcs
|
93
|
-
requirement: &70110341840580 !ruby/object:Gem::Requirement
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
73
|
none: false
|
95
74
|
requirements:
|
96
75
|
- - ! '>='
|
97
76
|
- !ruby/object:Gem::Version
|
98
|
-
version:
|
99
|
-
type: :development
|
100
|
-
prerelease: false
|
101
|
-
version_requirements: *70110341840580
|
77
|
+
version: 1.4.2
|
102
78
|
description:
|
103
79
|
email: mdub@dogbiscuit.org
|
104
80
|
executables: []
|
@@ -139,7 +115,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
139
115
|
version: '0'
|
140
116
|
segments:
|
141
117
|
- 0
|
142
|
-
hash:
|
118
|
+
hash: 868732793501301304
|
143
119
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
144
120
|
none: false
|
145
121
|
requirements:
|
@@ -148,10 +124,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
124
|
version: '0'
|
149
125
|
segments:
|
150
126
|
- 0
|
151
|
-
hash:
|
127
|
+
hash: 868732793501301304
|
152
128
|
requirements: []
|
153
129
|
rubyforge_project:
|
154
|
-
rubygems_version: 1.8.
|
130
|
+
rubygems_version: 1.8.23
|
155
131
|
signing_key:
|
156
132
|
specification_version: 3
|
157
133
|
summary: Builds XML and JSON representations of your Ruby objects
|