openc-json_schema 0.0.4 → 0.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.
- 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:
|