openc-json_schema 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/Gemfile.lock +1 -1
- data/lib/openc/json_schema.rb +8 -1
- data/lib/openc/json_schema/date_converter.rb +48 -0
- data/lib/openc/json_schema/utils.rb +21 -0
- data/lib/openc/json_schema/validator.rb +2 -8
- data/lib/openc/json_schema/version.rb +1 -1
- data/spec/openc_json_schema_spec.rb +66 -0
- data/spec/schemas/includes/zzz.json +11 -0
- data/spec/schemas/yyy.json +20 -0
- data/spec/spec_helper.rb +14 -4
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MmM4OTcxOWE4NDM5YTcxYzQyYWMwYjNmYTczMzhkN2I2YjVjNDA2Nw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MThkMzRkMTNjYWYxYTNhYmRlNGFjYjg1YjQ3ZDc4OGNmOTZlZDBiOA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MjJjZWMzMjZlOWI4ODk2NDc4OGIyMjgyMzg5Y2Y5ZTNjOTY5OTcyMWZhNDkz
|
10
|
+
Y2MwZTI5ZTQ2ZGZhYjc5MTc1ODkzZTRiOGQ0Y2UyNzlkZjIzYmUxYjg3YzAw
|
11
|
+
YTgzOTFiNzg2ZmZmNzdhYjliMDUwMDIzNjdlMjk2MmFiYzc2YzY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZjRjNDZhNTkyNGU5MGVhY2ExMTU4NzkyNGY0NTg2Mzc4N2UxYmFlZDdhMzFj
|
14
|
+
OTY1MjFlNDE4YzNlMGY4M2VhYjdhNjk2OGM2ZDE4OTIzM2MyMjYwZmUwYmVl
|
15
|
+
ZGFkMjcyOTZjNzU1YTZiMDNmYjVkMjgwOTgyZTk5MDQxYmNkMTI=
|
data/Gemfile.lock
CHANGED
data/lib/openc/json_schema.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
require 'json-schema'
|
2
2
|
|
3
|
-
require 'openc/json_schema/
|
3
|
+
require 'openc/json_schema/date_converter'
|
4
4
|
require 'openc/json_schema/format_validators'
|
5
|
+
require 'openc/json_schema/utils'
|
6
|
+
require 'openc/json_schema/validator'
|
7
|
+
require 'openc/json_schema/version'
|
5
8
|
|
6
9
|
module Openc
|
7
10
|
module JsonSchema
|
@@ -10,5 +13,9 @@ module Openc
|
|
10
13
|
def validate(schema_path, record)
|
11
14
|
Validator.validate(schema_path, record)
|
12
15
|
end
|
16
|
+
|
17
|
+
def convert_dates(schema_path, record)
|
18
|
+
DateConverter.convert_dates(schema_path, record)
|
19
|
+
end
|
13
20
|
end
|
14
21
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Openc
|
2
|
+
module JsonSchema
|
3
|
+
module DateConverter
|
4
|
+
extend self
|
5
|
+
|
6
|
+
def convert_dates(schema_path, record)
|
7
|
+
validator = Utils.load_validator(schema_path, record)
|
8
|
+
json_schema = Utils.extract_json_schema(validator)
|
9
|
+
_convert_dates(record, validator, json_schema, json_schema.schema)
|
10
|
+
end
|
11
|
+
|
12
|
+
def _convert_dates(record, validator, json_schema, schema)
|
13
|
+
return record if schema.nil?
|
14
|
+
|
15
|
+
if (ref = schema['$ref'])
|
16
|
+
schema_uri = validator.absolutize_ref_uri(ref, json_schema.uri)
|
17
|
+
json_schema = JSON::Validator.schema_reader.read(schema_uri)
|
18
|
+
schema = json_schema.schema
|
19
|
+
end
|
20
|
+
|
21
|
+
case record
|
22
|
+
when Hash
|
23
|
+
pairs = record.map do |k, v|
|
24
|
+
properties = schema['properties']
|
25
|
+
if properties.nil?
|
26
|
+
[k, v]
|
27
|
+
else
|
28
|
+
[k, _convert_dates(v, validator, json_schema, properties[k])]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
Hash[pairs]
|
32
|
+
when Array
|
33
|
+
record.map {|e| _convert_dates(e, validator, json_schema, schema['items'])}
|
34
|
+
else
|
35
|
+
if schema['format'] == 'date'
|
36
|
+
begin
|
37
|
+
Date.strptime(record, '%Y-%m-%d').strftime('%Y-%m-%d')
|
38
|
+
rescue ArgumentError
|
39
|
+
record
|
40
|
+
end
|
41
|
+
else
|
42
|
+
record
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Openc
|
2
|
+
module JsonSchema
|
3
|
+
module Utils
|
4
|
+
extend self
|
5
|
+
|
6
|
+
def load_validator(schema_path, record)
|
7
|
+
validator = JSON::Validator.new(
|
8
|
+
schema_path,
|
9
|
+
record,
|
10
|
+
:record_errors => true,
|
11
|
+
:errors_as_objects => true,
|
12
|
+
:validate_schema => true
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
def extract_json_schema(validator)
|
17
|
+
validator.instance_variable_get(:@base_schema)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -4,13 +4,7 @@ module Openc
|
|
4
4
|
extend self
|
5
5
|
|
6
6
|
def validate(schema_path, record)
|
7
|
-
validator =
|
8
|
-
schema_path,
|
9
|
-
record,
|
10
|
-
:record_errors => true,
|
11
|
-
:errors_as_objects => true,
|
12
|
-
:validate_schema => true
|
13
|
-
)
|
7
|
+
validator = Utils.load_validator(schema_path, record)
|
14
8
|
errors = validator.validate
|
15
9
|
|
16
10
|
# For now, we just handle the first error.
|
@@ -25,7 +19,7 @@ module Openc
|
|
25
19
|
if error[:message].match(/did not match any/)
|
26
20
|
path_elements = fragment_to_path(error[:fragment]).split('.')
|
27
21
|
|
28
|
-
json_schema =
|
22
|
+
json_schema = Utils.extract_json_schema(validator)
|
29
23
|
schema = json_schema.schema
|
30
24
|
|
31
25
|
path_elements.each do |element|
|
@@ -457,4 +457,70 @@ describe Openc::JsonSchema do
|
|
457
457
|
)
|
458
458
|
end
|
459
459
|
end
|
460
|
+
|
461
|
+
describe '.convert_dates' do
|
462
|
+
it 'converts dates when schema has no $refs' do
|
463
|
+
schema = {
|
464
|
+
'$schema' => 'http://json-schema.org/draft-04/schema#',
|
465
|
+
'type' => 'object',
|
466
|
+
'properties' => {
|
467
|
+
'aaa' => {
|
468
|
+
'type' => 'string',
|
469
|
+
'format' => 'date'
|
470
|
+
},
|
471
|
+
'bbb' => {
|
472
|
+
'type' => 'array',
|
473
|
+
'items' => {
|
474
|
+
'type' => 'string',
|
475
|
+
'format' => 'date'
|
476
|
+
}
|
477
|
+
},
|
478
|
+
'ccc' => {
|
479
|
+
'type' => 'object',
|
480
|
+
'properties' => {
|
481
|
+
'ddd' => {
|
482
|
+
'type' => 'string',
|
483
|
+
'format' => 'date'
|
484
|
+
}
|
485
|
+
}
|
486
|
+
}
|
487
|
+
}
|
488
|
+
}
|
489
|
+
|
490
|
+
record = {
|
491
|
+
'aaa' => '2015-01-01 extra',
|
492
|
+
'bbb' => ['2015-01-01 extra', '2015-01-01 extra'],
|
493
|
+
'ccc' => {
|
494
|
+
'ddd' => '2015-01-01 extra'
|
495
|
+
}
|
496
|
+
}
|
497
|
+
|
498
|
+
expect([schema, record]).to convert_dates_to({
|
499
|
+
'aaa' => '2015-01-01',
|
500
|
+
'bbb' => ['2015-01-01', '2015-01-01'],
|
501
|
+
'ccc' => {
|
502
|
+
'ddd' => '2015-01-01'
|
503
|
+
}
|
504
|
+
})
|
505
|
+
end
|
506
|
+
|
507
|
+
it 'converts dates when schema has $refs' do
|
508
|
+
schema_path = 'spec/schemas/yyy.json'
|
509
|
+
record = {
|
510
|
+
'aaa' => '2015-01-01 extra',
|
511
|
+
'bbb' => ['2015-01-01 extra', '2015-01-01 extra'],
|
512
|
+
'ccc' => {
|
513
|
+
'ddd' => '2015-01-01 extra'
|
514
|
+
}
|
515
|
+
}
|
516
|
+
|
517
|
+
expect([schema_path, record]).to convert_dates_to({
|
518
|
+
'aaa' => '2015-01-01',
|
519
|
+
'bbb' => ['2015-01-01', '2015-01-01'],
|
520
|
+
'ccc' => {
|
521
|
+
'ddd' => '2015-01-01'
|
522
|
+
}
|
523
|
+
})
|
524
|
+
end
|
525
|
+
end
|
460
526
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
{
|
2
|
+
"$schema": "http://json-schema.org/draft-04/schema#",
|
3
|
+
"type": "object",
|
4
|
+
"properties": {
|
5
|
+
"aaa": {
|
6
|
+
"type": "string",
|
7
|
+
"format": "date"
|
8
|
+
},
|
9
|
+
"bbb": {
|
10
|
+
"type": "array",
|
11
|
+
"items": {
|
12
|
+
"type": "string",
|
13
|
+
"format": "date"
|
14
|
+
}
|
15
|
+
},
|
16
|
+
"ccc": {
|
17
|
+
"$ref": "includes/zzz.json"
|
18
|
+
}
|
19
|
+
}
|
20
|
+
}
|
data/spec/spec_helper.rb
CHANGED
@@ -3,7 +3,7 @@ SimpleCov.start
|
|
3
3
|
|
4
4
|
require 'openc/json_schema'
|
5
5
|
|
6
|
-
def
|
6
|
+
def get_schema_path(schema_or_path)
|
7
7
|
case schema_or_path
|
8
8
|
when Hash
|
9
9
|
json_data = schema_or_path.to_json
|
@@ -16,13 +16,13 @@ def get_error(schema_or_path, record)
|
|
16
16
|
raise
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
schema_path
|
20
20
|
end
|
21
21
|
|
22
22
|
RSpec::Matchers.define(:fail_validation_with) do |expected|
|
23
23
|
match do |actual|
|
24
24
|
schema_or_path, record = actual
|
25
|
-
@error =
|
25
|
+
@error = Openc::JsonSchema.validate(get_schema_path(schema_or_path), record)
|
26
26
|
expect(@error).to eq(expected)
|
27
27
|
end
|
28
28
|
|
@@ -34,7 +34,17 @@ end
|
|
34
34
|
RSpec::Matchers.define(:be_valid) do
|
35
35
|
match do |actual|
|
36
36
|
schema_or_path, record = actual
|
37
|
-
error =
|
37
|
+
error = Openc::JsonSchema.validate(get_schema_path(schema_or_path), record)
|
38
38
|
expect(error).to eq(nil)
|
39
39
|
end
|
40
40
|
end
|
41
|
+
|
42
|
+
RSpec::Matchers.define(:convert_dates_to) do |expected|
|
43
|
+
match do |actual|
|
44
|
+
schema_or_path, record = actual
|
45
|
+
schema_path = get_schema_path(schema_or_path)
|
46
|
+
|
47
|
+
converted_record = Openc::JsonSchema.convert_dates(schema_path, record)
|
48
|
+
expect(converted_record).to eq(expected)
|
49
|
+
end
|
50
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openc-json_schema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- OpenCorporates
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -65,7 +65,9 @@ files:
|
|
65
65
|
- README.md
|
66
66
|
- Rakefile
|
67
67
|
- lib/openc/json_schema.rb
|
68
|
+
- lib/openc/json_schema/date_converter.rb
|
68
69
|
- lib/openc/json_schema/format_validators.rb
|
70
|
+
- lib/openc/json_schema/utils.rb
|
69
71
|
- lib/openc/json_schema/validator.rb
|
70
72
|
- lib/openc/json_schema/version.rb
|
71
73
|
- openc-json_schema.gemspec
|
@@ -82,8 +84,10 @@ files:
|
|
82
84
|
- spec/schemas/includes/hhh.json
|
83
85
|
- spec/schemas/includes/jjj.json
|
84
86
|
- spec/schemas/includes/mmm.json
|
87
|
+
- spec/schemas/includes/zzz.json
|
85
88
|
- spec/schemas/kkk.json
|
86
89
|
- spec/schemas/lll.json
|
90
|
+
- spec/schemas/yyy.json
|
87
91
|
- spec/spec_helper.rb
|
88
92
|
- spec/tmp/.gitkeep
|
89
93
|
homepage:
|
@@ -123,8 +127,10 @@ test_files:
|
|
123
127
|
- spec/schemas/includes/hhh.json
|
124
128
|
- spec/schemas/includes/jjj.json
|
125
129
|
- spec/schemas/includes/mmm.json
|
130
|
+
- spec/schemas/includes/zzz.json
|
126
131
|
- spec/schemas/kkk.json
|
127
132
|
- spec/schemas/lll.json
|
133
|
+
- spec/schemas/yyy.json
|
128
134
|
- spec/spec_helper.rb
|
129
135
|
- spec/tmp/.gitkeep
|
130
136
|
has_rdoc:
|