autoparse 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +6 -0
- data/lib/autoparse.rb +39 -73
- data/lib/autoparse/instance.rb +54 -31
- data/lib/autoparse/version.rb +2 -2
- data/spec/autoparse/instance_spec.rb +193 -0
- data/spec/data/user-list.json +12 -0
- metadata +16 -7
data/CHANGELOG
CHANGED
data/lib/autoparse.rb
CHANGED
@@ -46,6 +46,11 @@ module AutoParse
|
|
46
46
|
def self.additional_properties_schema
|
47
47
|
# Override the superclass implementation so we're not always returning
|
48
48
|
# the empty schema.
|
49
|
+
if @additional_properties_schema.data['$ref']
|
50
|
+
# Dereference the schema if necessary.
|
51
|
+
@additional_properties_schema =
|
52
|
+
@additional_properties_schema.dereference
|
53
|
+
end
|
49
54
|
return @additional_properties_schema
|
50
55
|
end
|
51
56
|
|
@@ -81,89 +86,50 @@ module AutoParse
|
|
81
86
|
schema_data['additionalProperties'] == nil
|
82
87
|
# Schema-less unknown properties are allowed.
|
83
88
|
@additional_properties_schema = EMPTY_SCHEMA
|
84
|
-
define_method('method_missing') do |method, *params, &block|
|
85
|
-
# We need to convert from Ruby calling style to JavaScript calling
|
86
|
-
# style. If this fails, attempt to use JavaScript calling style
|
87
|
-
# directly.
|
88
|
-
|
89
|
-
# We can't modify the method in-place because this affects the call
|
90
|
-
# to super.
|
91
|
-
stripped_method = method.to_s
|
92
|
-
assignment = false
|
93
|
-
if stripped_method[-1..-1] == '='
|
94
|
-
assignment = true
|
95
|
-
stripped_method[-1..-1] = ''
|
96
|
-
end
|
97
|
-
key = INFLECTOR.camelize(stripped_method)
|
98
|
-
key[0..0] = key[0..0].downcase
|
99
|
-
if self[key] != nil
|
100
|
-
value = self[key]
|
101
|
-
elsif self[stripped_method] != nil
|
102
|
-
key = stripped_method
|
103
|
-
value = self[stripped_method]
|
104
|
-
else
|
105
|
-
# Method not found.
|
106
|
-
super(method, *params, &block)
|
107
|
-
end
|
108
|
-
# If additionalProperties is simply set to true, no parsing takes
|
109
|
-
# place and all values are treated as 'any'.
|
110
|
-
if assignment
|
111
|
-
new_value = params[0]
|
112
|
-
self[key] = new_value
|
113
|
-
else
|
114
|
-
value
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
89
|
elsif schema_data['additionalProperties']
|
119
90
|
# Unknown properties follow the supplied schema.
|
120
91
|
ap_schema = AutoParse.generate(
|
121
92
|
schema_data['additionalProperties'], :parent => self
|
122
93
|
)
|
123
94
|
@additional_properties_schema = ap_schema
|
124
|
-
define_method('method_missing') do |method, *params, &block|
|
125
|
-
# We need to convert from Ruby calling style to JavaScript calling
|
126
|
-
# style. If this fails, attempt to use JavaScript calling style
|
127
|
-
# directly.
|
128
|
-
|
129
|
-
# We can't modify the method in-place because this affects the call
|
130
|
-
# to super.
|
131
|
-
stripped_method = method.to_s
|
132
|
-
assignment = false
|
133
|
-
if stripped_method[-1..-1] == '='
|
134
|
-
assignment = true
|
135
|
-
stripped_method[-1..-1] = ''
|
136
|
-
end
|
137
|
-
key = INFLECTOR.camelize(stripped_method)
|
138
|
-
key[0..0] = key[0..0].downcase
|
139
|
-
if self[key] != nil
|
140
|
-
value = self[key]
|
141
|
-
elsif self[stripped_method] != nil
|
142
|
-
key = stripped_method
|
143
|
-
value = self[stripped_method]
|
144
|
-
else
|
145
|
-
# Method not found.
|
146
|
-
super
|
147
|
-
end
|
148
|
-
if assignment
|
149
|
-
# In the case of assignment, it's very likely the developer is
|
150
|
-
# passing in an unparsed Hash value. This value must be parsed.
|
151
|
-
# Unfortunately, we may accidentally reparse something that's
|
152
|
-
# already in a parsed state because Schema.new(Schema.new(data))
|
153
|
-
# is completely valid. This will cause performance issues if
|
154
|
-
# developers are careless, but since there's no good reason to
|
155
|
-
# do assignment on parsed objects, hopefully this should not
|
156
|
-
# cause problems often.
|
157
|
-
new_value = params[0]
|
158
|
-
self[key] = ap_schema.new(new_value)
|
159
|
-
else
|
160
|
-
ap_schema.new(value)
|
161
|
-
end
|
162
|
-
end
|
163
95
|
else
|
164
96
|
@additional_properties_schema = nil
|
165
97
|
end
|
166
98
|
|
99
|
+
define_method('method_missing') do |method, *params, &block|
|
100
|
+
# We need to convert from Ruby calling style to JavaScript calling
|
101
|
+
# style. If this fails, attempt to use JavaScript calling style
|
102
|
+
# directly.
|
103
|
+
|
104
|
+
# We can't modify the method in-place because this affects the call
|
105
|
+
# to super.
|
106
|
+
stripped_method = method.to_s
|
107
|
+
assignment = false
|
108
|
+
if stripped_method[-1..-1] == '='
|
109
|
+
assignment = true
|
110
|
+
stripped_method[-1..-1] = ''
|
111
|
+
end
|
112
|
+
key = INFLECTOR.camelize(stripped_method)
|
113
|
+
key[0..0] = key[0..0].downcase
|
114
|
+
if @data[key] != nil
|
115
|
+
# Data found
|
116
|
+
elsif @data[stripped_method] != nil
|
117
|
+
# Data found
|
118
|
+
key = stripped_method
|
119
|
+
else
|
120
|
+
# Method not found.
|
121
|
+
super(method, *params, &block)
|
122
|
+
end
|
123
|
+
# If additionalProperties is simply set to true, no parsing takes
|
124
|
+
# place and all values are treated as 'any'.
|
125
|
+
if assignment
|
126
|
+
new_value = params[0]
|
127
|
+
self.__set__(key, new_value)
|
128
|
+
else
|
129
|
+
self.__get__(key)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
167
133
|
if schema_data['dependencies']
|
168
134
|
for dependency_key, dependency_data in schema_data['dependencies']
|
169
135
|
self.property_dependencies[dependency_key] = dependency_data
|
data/lib/autoparse/instance.rb
CHANGED
@@ -84,11 +84,11 @@ module AutoParse
|
|
84
84
|
end
|
85
85
|
|
86
86
|
def self.data
|
87
|
-
return @schema_data
|
87
|
+
return @schema_data ||= {}
|
88
88
|
end
|
89
89
|
|
90
90
|
def self.description
|
91
|
-
return
|
91
|
+
return self.data['description']
|
92
92
|
end
|
93
93
|
|
94
94
|
def self.validate_string_property(property_value, schema_data)
|
@@ -323,47 +323,66 @@ module AutoParse
|
|
323
323
|
end
|
324
324
|
|
325
325
|
def __get__(property_name)
|
326
|
-
property_key = self.class.keys[property_name]
|
326
|
+
property_key = self.class.keys[property_name] || property_name
|
327
327
|
|
328
328
|
schema_class = self.class.properties[property_key]
|
329
|
+
schema_class = self.class.additional_properties_schema if !schema_class
|
329
330
|
if !schema_class
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
end
|
331
|
+
@data[property_key]
|
332
|
+
else
|
333
|
+
if schema_class.data['$ref']
|
334
|
+
# Dereference the schema if necessary.
|
335
|
+
schema_class = schema_class.dereference
|
336
|
+
# Avoid this dereference in the future.
|
337
|
+
self.class.properties[property_key] = schema_class
|
338
|
+
end
|
339
339
|
|
340
|
-
|
340
|
+
value = @data[property_key] || schema_class.data['default']
|
341
341
|
|
342
|
-
|
342
|
+
AutoParse.import(value, schema_class)
|
343
|
+
end
|
343
344
|
end
|
344
345
|
protected :__get__
|
345
346
|
|
346
347
|
def __set__(property_name, value)
|
347
|
-
property_key = self.class.keys[property_name]
|
348
|
+
property_key = self.class.keys[property_name] || property_name
|
348
349
|
|
349
350
|
schema_class = self.class.properties[property_key]
|
350
|
-
if schema_class
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
351
|
+
schema_class = self.class.additional_properties_schema if !schema_class
|
352
|
+
if !schema_class
|
353
|
+
@data[property_key] = value
|
354
|
+
else
|
355
|
+
if schema_class.data['$ref']
|
356
|
+
# Dereference the schema if necessary.
|
357
|
+
schema_class = schema_class.dereference
|
358
|
+
# Avoid this dereference in the future.
|
359
|
+
self.class.properties[property_key] = schema_class
|
360
|
+
end
|
356
361
|
|
357
|
-
|
362
|
+
@data[property_key] = AutoParse.export(value, schema_class)
|
363
|
+
end
|
358
364
|
end
|
359
365
|
protected :__set__
|
360
366
|
|
361
|
-
def [](key)
|
362
|
-
|
367
|
+
def [](key, raw=false)
|
368
|
+
if raw == true
|
369
|
+
return @data[key]
|
370
|
+
else
|
371
|
+
return self.__get__(key)
|
372
|
+
end
|
363
373
|
end
|
364
374
|
|
365
|
-
def []=(key, value)
|
366
|
-
|
375
|
+
def []=(key, raw=false, value=:undefined)
|
376
|
+
if value == :undefined
|
377
|
+
# Due to the way Ruby handles default values in assignment methods,
|
378
|
+
# we have to swap some values around here.
|
379
|
+
raw, value = false, raw
|
380
|
+
end
|
381
|
+
if raw == true
|
382
|
+
return @data[key] = value
|
383
|
+
else
|
384
|
+
return self.__set__(key, value)
|
385
|
+
end
|
367
386
|
end
|
368
387
|
|
369
388
|
##
|
@@ -371,7 +390,7 @@ module AutoParse
|
|
371
390
|
def valid?
|
372
391
|
unvalidated_fields = @data.keys.dup
|
373
392
|
for property_key, schema_class in self.class.properties
|
374
|
-
property_value =
|
393
|
+
property_value = @data[property_key]
|
375
394
|
if !self.class.validate_property_value(
|
376
395
|
property_value, schema_class.data)
|
377
396
|
return false
|
@@ -388,7 +407,7 @@ module AutoParse
|
|
388
407
|
when String, Array
|
389
408
|
property_dependencies = [property_dependencies].flatten
|
390
409
|
for dependency_key in property_dependencies
|
391
|
-
dependency_value =
|
410
|
+
dependency_value = @data[dependency_key]
|
392
411
|
return false if dependency_value == nil
|
393
412
|
end
|
394
413
|
when Class
|
@@ -406,9 +425,13 @@ module AutoParse
|
|
406
425
|
return false unless unvalidated_fields.empty?
|
407
426
|
elsif self.class.additional_properties_schema != EMPTY_SCHEMA
|
408
427
|
# Validate all remaining fields against this schema
|
409
|
-
|
410
|
-
|
411
|
-
|
428
|
+
for property_key in unvalidated_fields
|
429
|
+
property_value = @data[property_key]
|
430
|
+
if !self.class.additional_properties_schema.validate_property_value(
|
431
|
+
property_value, self.class.additional_properties_schema.data)
|
432
|
+
return false
|
433
|
+
end
|
434
|
+
end
|
412
435
|
end
|
413
436
|
if self.class.superclass && self.class.superclass != Instance &&
|
414
437
|
self.class.ancestors.first != Instance
|
data/lib/autoparse/version.rb
CHANGED
@@ -482,6 +482,184 @@ describe AutoParse::Instance, 'with the adult schema' do
|
|
482
482
|
end
|
483
483
|
end
|
484
484
|
|
485
|
+
describe AutoParse::Instance, 'with the user list schema' do
|
486
|
+
before do
|
487
|
+
@person_uri = Addressable::URI.new(
|
488
|
+
:scheme => 'file',
|
489
|
+
:host => '',
|
490
|
+
:path => File.expand_path(File.join(spec_dir, './data/person.json'))
|
491
|
+
)
|
492
|
+
@person_schema_data =
|
493
|
+
JSON.parse(File.open(@person_uri.path, 'r') { |f| f.read })
|
494
|
+
@person_parser = AutoParse.generate(
|
495
|
+
@person_schema_data, :uri => @person_uri
|
496
|
+
)
|
497
|
+
|
498
|
+
@user_list_uri = Addressable::URI.new(
|
499
|
+
:scheme => 'file',
|
500
|
+
:host => '',
|
501
|
+
:path => File.expand_path(File.join(spec_dir, './data/user-list.json'))
|
502
|
+
)
|
503
|
+
@user_list_schema_data =
|
504
|
+
JSON.parse(File.open(@user_list_uri.path, 'r') { |f| f.read })
|
505
|
+
@user_list_parser = AutoParse.generate(
|
506
|
+
@user_list_schema_data, :uri => @user_list_uri
|
507
|
+
)
|
508
|
+
end
|
509
|
+
|
510
|
+
it 'should have the correct URI' do
|
511
|
+
@user_list_parser.uri.should === @user_list_uri
|
512
|
+
end
|
513
|
+
|
514
|
+
it 'should accept a valid person input' do
|
515
|
+
instance = @user_list_parser.new({
|
516
|
+
"users" => {
|
517
|
+
"bobaman@google.com" => {
|
518
|
+
"name" => "Bob Aman",
|
519
|
+
"age" => 29
|
520
|
+
}
|
521
|
+
}
|
522
|
+
})
|
523
|
+
instance.should be_valid
|
524
|
+
end
|
525
|
+
|
526
|
+
it 'should accept extra fields' do
|
527
|
+
instance = @user_list_parser.new({
|
528
|
+
"users" => {
|
529
|
+
"bobaman@google.com" => {
|
530
|
+
"name" => "Bob Aman",
|
531
|
+
"age" => 29,
|
532
|
+
"extra" => "bonus!"
|
533
|
+
}
|
534
|
+
},
|
535
|
+
"extra" => "bonus!"
|
536
|
+
})
|
537
|
+
instance.should be_valid
|
538
|
+
end
|
539
|
+
|
540
|
+
it 'should not accept additional properties that do not validate' do
|
541
|
+
instance = @user_list_parser.new({
|
542
|
+
"users" => {
|
543
|
+
"bobaman@google.com" => {
|
544
|
+
"name" => "Bob Aman",
|
545
|
+
"age" => 29
|
546
|
+
},
|
547
|
+
"oldguy@example.com" => {
|
548
|
+
"name" => "Methuselah",
|
549
|
+
"age" => 969
|
550
|
+
}
|
551
|
+
}
|
552
|
+
})
|
553
|
+
instance.should_not be_valid
|
554
|
+
end
|
555
|
+
|
556
|
+
it 'should not accept additional properties that do not validate' do
|
557
|
+
instance = @user_list_parser.new({
|
558
|
+
"users" => {
|
559
|
+
"bobaman@google.com" => {
|
560
|
+
"name" => "Bob Aman",
|
561
|
+
"age" => 29.7
|
562
|
+
}
|
563
|
+
}
|
564
|
+
})
|
565
|
+
instance.should_not be_valid
|
566
|
+
end
|
567
|
+
|
568
|
+
it 'should expose values via generated accessors' do
|
569
|
+
instance = @user_list_parser.new({
|
570
|
+
"users" => {
|
571
|
+
"bobaman@google.com" => {
|
572
|
+
"name" => "Bob Aman",
|
573
|
+
"age" => 29
|
574
|
+
}
|
575
|
+
}
|
576
|
+
})
|
577
|
+
instance.users['bobaman@google.com'].name.should == "Bob Aman"
|
578
|
+
instance.users['bobaman@google.com'].age.should == 29
|
579
|
+
end
|
580
|
+
|
581
|
+
it 'should permit access to raw values' do
|
582
|
+
instance = @user_list_parser.new({
|
583
|
+
"users" => {
|
584
|
+
"bobaman@google.com" => {
|
585
|
+
"name" => "Bob Aman",
|
586
|
+
"age" => 29
|
587
|
+
}
|
588
|
+
}
|
589
|
+
})
|
590
|
+
instance.users['bobaman@google.com', true].should == {
|
591
|
+
"name" => "Bob Aman",
|
592
|
+
"age" => 29
|
593
|
+
}
|
594
|
+
end
|
595
|
+
|
596
|
+
it 'should alter output structure via generated mutators' do
|
597
|
+
instance = @user_list_parser.new
|
598
|
+
instance.users = {}
|
599
|
+
instance.users["bobaman@google.com"] = @person_parser.new
|
600
|
+
instance.users["bobaman@google.com"].name = "Bob Aman"
|
601
|
+
instance.users["bobaman@google.com"].age = 29
|
602
|
+
instance.to_hash.should == {
|
603
|
+
"users" => {
|
604
|
+
"bobaman@google.com" => {
|
605
|
+
"name" => "Bob Aman",
|
606
|
+
"age" => 29
|
607
|
+
}
|
608
|
+
}
|
609
|
+
}
|
610
|
+
end
|
611
|
+
|
612
|
+
it 'should allow raw assignment' do
|
613
|
+
instance = @user_list_parser.new
|
614
|
+
instance.users = {}
|
615
|
+
instance.users["bobaman@google.com", true] = {
|
616
|
+
"name" => "Bob Aman",
|
617
|
+
"age" => 29
|
618
|
+
}
|
619
|
+
instance.to_hash.should == {
|
620
|
+
"users" => {
|
621
|
+
"bobaman@google.com" => {
|
622
|
+
"name" => "Bob Aman",
|
623
|
+
"age" => 29
|
624
|
+
}
|
625
|
+
}
|
626
|
+
}
|
627
|
+
end
|
628
|
+
|
629
|
+
it 'should be coerceable to a Hash value' do
|
630
|
+
instance = @user_list_parser.new({
|
631
|
+
"users" => {
|
632
|
+
"bobaman@google.com" => {
|
633
|
+
"name" => "Bob Aman",
|
634
|
+
"age" => 29
|
635
|
+
}
|
636
|
+
}
|
637
|
+
})
|
638
|
+
instance.to_hash.should == {
|
639
|
+
"users" => {
|
640
|
+
"bobaman@google.com" => {
|
641
|
+
"name" => "Bob Aman",
|
642
|
+
"age" => 29
|
643
|
+
}
|
644
|
+
}
|
645
|
+
}
|
646
|
+
end
|
647
|
+
|
648
|
+
it 'should convert to a JSON string' do
|
649
|
+
instance = @user_list_parser.new({
|
650
|
+
"users" => {
|
651
|
+
"bobaman@google.com" => {
|
652
|
+
"name" => "Bob Aman",
|
653
|
+
"age" => 29
|
654
|
+
}
|
655
|
+
}
|
656
|
+
})
|
657
|
+
instance.to_json.should == (
|
658
|
+
'{"users":{"bobaman@google.com":{"name":"Bob Aman","age":29}}}'
|
659
|
+
)
|
660
|
+
end
|
661
|
+
end
|
662
|
+
|
485
663
|
describe AutoParse::Instance, 'with the positive schema' do
|
486
664
|
before do
|
487
665
|
@positive_uri = Addressable::URI.new(
|
@@ -661,6 +839,21 @@ describe AutoParse::Instance, 'with the card schema' do
|
|
661
839
|
@card_parser.uri.should === @card_uri
|
662
840
|
end
|
663
841
|
|
842
|
+
it 'should allow nested objects to be accessed in raw' do
|
843
|
+
instance = @card_parser.new({
|
844
|
+
"givenName" => "Robert",
|
845
|
+
"familyName" => "Aman",
|
846
|
+
"org" => {
|
847
|
+
"organizationName" => "Google, Inc.",
|
848
|
+
"organizationUnit" => "Developer Relations"
|
849
|
+
}
|
850
|
+
})
|
851
|
+
instance['org', true].should == {
|
852
|
+
"organizationName" => "Google, Inc.",
|
853
|
+
"organizationUnit" => "Developer Relations"
|
854
|
+
}
|
855
|
+
end
|
856
|
+
|
664
857
|
it 'should have the correct URI for anonymous nested objects' do
|
665
858
|
instance = @card_parser.new({
|
666
859
|
"givenName" => "Robert",
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: autoparse
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 19
|
5
|
+
prerelease:
|
5
6
|
segments:
|
6
7
|
- 0
|
7
|
-
- 2
|
8
8
|
- 3
|
9
|
-
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Bob Aman
|
@@ -14,8 +15,7 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date: 2011-10
|
18
|
-
default_executable:
|
18
|
+
date: 2011-11-10 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: addressable
|
@@ -25,6 +25,7 @@ dependencies:
|
|
25
25
|
requirements:
|
26
26
|
- - ~>
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
28
29
|
segments:
|
29
30
|
- 2
|
30
31
|
- 2
|
@@ -40,6 +41,7 @@ dependencies:
|
|
40
41
|
requirements:
|
41
42
|
- - ">="
|
42
43
|
- !ruby/object:Gem::Version
|
44
|
+
hash: 11
|
43
45
|
segments:
|
44
46
|
- 1
|
45
47
|
- 4
|
@@ -55,6 +57,7 @@ dependencies:
|
|
55
57
|
requirements:
|
56
58
|
- - ">="
|
57
59
|
- !ruby/object:Gem::Version
|
60
|
+
hash: 37
|
58
61
|
segments:
|
59
62
|
- 0
|
60
63
|
- 9
|
@@ -70,6 +73,7 @@ dependencies:
|
|
70
73
|
requirements:
|
71
74
|
- - ~>
|
72
75
|
- !ruby/object:Gem::Version
|
76
|
+
hash: 57
|
73
77
|
segments:
|
74
78
|
- 0
|
75
79
|
- 8
|
@@ -85,6 +89,7 @@ dependencies:
|
|
85
89
|
requirements:
|
86
90
|
- - ~>
|
87
91
|
- !ruby/object:Gem::Version
|
92
|
+
hash: 23
|
88
93
|
segments:
|
89
94
|
- 2
|
90
95
|
- 6
|
@@ -100,6 +105,7 @@ dependencies:
|
|
100
105
|
requirements:
|
101
106
|
- - ~>
|
102
107
|
- !ruby/object:Gem::Version
|
108
|
+
hash: 23
|
103
109
|
segments:
|
104
110
|
- 0
|
105
111
|
- 3
|
@@ -115,6 +121,7 @@ dependencies:
|
|
115
121
|
requirements:
|
116
122
|
- - ~>
|
117
123
|
- !ruby/object:Gem::Version
|
124
|
+
hash: 23
|
118
125
|
segments:
|
119
126
|
- 1
|
120
127
|
- 1
|
@@ -154,6 +161,7 @@ files:
|
|
154
161
|
- spec/data/person.json
|
155
162
|
- spec/data/positive.json
|
156
163
|
- spec/data/schema.json
|
164
|
+
- spec/data/user-list.json
|
157
165
|
- spec/spec.opts
|
158
166
|
- spec/spec_helper.rb
|
159
167
|
- tasks/clobber.rake
|
@@ -169,7 +177,6 @@ files:
|
|
169
177
|
- LICENSE
|
170
178
|
- Rakefile
|
171
179
|
- README.md
|
172
|
-
has_rdoc: true
|
173
180
|
homepage: http://autoparse.rubyforge.org/
|
174
181
|
licenses: []
|
175
182
|
|
@@ -184,6 +191,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
184
191
|
requirements:
|
185
192
|
- - ">="
|
186
193
|
- !ruby/object:Gem::Version
|
194
|
+
hash: 3
|
187
195
|
segments:
|
188
196
|
- 0
|
189
197
|
version: "0"
|
@@ -192,13 +200,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
192
200
|
requirements:
|
193
201
|
- - ">="
|
194
202
|
- !ruby/object:Gem::Version
|
203
|
+
hash: 3
|
195
204
|
segments:
|
196
205
|
- 0
|
197
206
|
version: "0"
|
198
207
|
requirements: []
|
199
208
|
|
200
209
|
rubyforge_project: autoparse
|
201
|
-
rubygems_version: 1.
|
210
|
+
rubygems_version: 1.8.6
|
202
211
|
signing_key:
|
203
212
|
specification_version: 3
|
204
213
|
summary: A parsing system based on JSON Schema.
|