fidor_schema 0.5.1 → 0.6.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 +4 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile +0 -3
- data/Rakefile +5 -5
- data/fidor_schema.gemspec +10 -2
- data/lib/fidor_schema_version.rb +2 -2
- data/lib/validator/base.rb +105 -0
- data/lib/validator/j_schema.rb +34 -0
- data/lib/validator/json-schema.rb +51 -0
- data/lib/validator/json_schema.rb +37 -0
- data/lib/{validate → validator}/schema.json +0 -0
- data/lib/validator.rb +4 -0
- data/schema/v1.0/account.json +9 -6
- data/schema/v1.0/base_types/base_types.json +1 -0
- data/schema/v1.0/batch_direct_debit.json +5 -10
- data/schema/v1.0/batch_transfer.json +5 -14
- data/schema/v1.0/customer.json +6 -6
- data/schema/v1.0/error.json +2 -2
- data/schema/v1.0/internal_transfer.json +2 -2
- data/schema/v1.0/rate_limit.json +2 -2
- data/schema/v1.0/sepa_credit_transfer.json +2 -2
- data/schema/v1.0/sepa_direct_debit.json +2 -2
- data/schema/v1.0/sepa_mandate.json +2 -2
- data/schema/v1.0/transaction.json +10 -18
- data/schema/v1.0/transaction_type_details/credit_card_details.json +2 -2
- data/schema/v1.0/transaction_type_details/internal_transfer_details.json +2 -2
- data/schema/v1.0/transaction_type_details/sepa_credit_transfer_details.json +2 -2
- data/schema/v1.0/transaction_type_details/sepa_direct_debit_details.json +2 -2
- data/schema/v1.0/user.json +2 -2
- data/spec/fidor_schema_spec.rb +1 -2
- data/spec/validator/j_schema_spec.rb +22 -0
- data/spec/validator/json-schema_spec.rb +22 -0
- data/spec/validator/json_schema_spec.rb +13 -0
- metadata +58 -7
- data/lib/validate/validate.rb +0 -184
- data/schema/v1.0/base_types/lists.json +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e1217869917c2c480782fe5be4b130eeb390b964
|
4
|
+
data.tar.gz: 74cf5f1880959b32af62a69037baa2e4f75801d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 462793875cc0c364bf31614e5064da0ef3ac7f475d96b580ba795196e82a673af19c568c1a827660f22c0567c0fcf989585263643d102f2fbeefbd8ccc45d448
|
7
|
+
data.tar.gz: 965d875c3d985d42dd6bcf746bb84aa523c3a44daccbc91b1c65a48d0535e6373a02cf8b9661996476ea64134007f6e7b63552bd3243b0abb4e9932a04b5c206
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,13 @@
|
|
2
2
|
|
3
3
|
A more detailed view of the changes can be found in the [commit messages](https://github.com/fidor/fidor_schema/commits/)
|
4
4
|
|
5
|
+
##2015-03
|
6
|
+
|
7
|
+
* remove name attribute in favour of title
|
8
|
+
* remove nested $refs pointing to properties in favour of direct link to the related schema
|
9
|
+
* validate the schema files against three different ruby validators
|
10
|
+
* add $schema version to each file
|
11
|
+
|
5
12
|
##2015-02
|
6
13
|
|
7
14
|
* SepaMandates filter by multiple references and ibans
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -8,21 +8,21 @@ RSpec::Core::RakeTask.new
|
|
8
8
|
task :default => :spec
|
9
9
|
|
10
10
|
|
11
|
-
require '
|
11
|
+
require 'validator'
|
12
12
|
|
13
13
|
|
14
14
|
task :validate_dash do
|
15
|
-
|
15
|
+
Validator.run :dash
|
16
16
|
end
|
17
17
|
|
18
18
|
task :validate_underscore do
|
19
|
-
|
19
|
+
Validator.run :underscore
|
20
20
|
end
|
21
21
|
|
22
22
|
task :validate_jschema do
|
23
|
-
|
23
|
+
Validator.run :jschema
|
24
24
|
end
|
25
25
|
|
26
26
|
task :validate_schema => [:validate_dash, :validate_underscore, :validate_jschema] do
|
27
|
-
|
27
|
+
|
28
28
|
end
|
data/fidor_schema.gemspec
CHANGED
@@ -21,8 +21,16 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency 'bundler', '~> 1.5'
|
22
22
|
spec.add_development_dependency 'rspec'
|
23
23
|
spec.add_development_dependency 'activesupport'
|
24
|
-
spec.add_development_dependency 'json_schema_tools', '>=0.
|
24
|
+
spec.add_development_dependency 'json_schema_tools', '>=0.6.1'
|
25
25
|
spec.add_development_dependency 'activemodel' # required by above
|
26
26
|
spec.add_development_dependency 'rake'
|
27
|
+
# schema validation gems, for now all of them. must see which one is the most valid ;-)
|
27
28
|
|
28
|
-
|
29
|
+
# most downloads on rubygems, last updated feb 2015
|
30
|
+
spec.add_development_dependency 'json-schema'
|
31
|
+
# 2nd most downloads on rubygems, last updated March 2015
|
32
|
+
spec.add_development_dependency 'json_schema'
|
33
|
+
# pretty new , last udpate sep 2014
|
34
|
+
spec.add_development_dependency 'jschema'
|
35
|
+
|
36
|
+
end
|
data/lib/fidor_schema_version.rb
CHANGED
@@ -0,0 +1,105 @@
|
|
1
|
+
# This functionality is intended to run the schema, through
|
2
|
+
# any available Schema Validators for Ruby.
|
3
|
+
#
|
4
|
+
# They should be valid according to draft-4 ...
|
5
|
+
#
|
6
|
+
# The schema validators currently being considered are:
|
7
|
+
#
|
8
|
+
# https://github.com/ruby-json-schema/json-schema
|
9
|
+
# https://github.com/brandur/json_schema (note the underscore!)
|
10
|
+
# https://github.com/Soylent/jschema
|
11
|
+
#
|
12
|
+
# These are the three currently available ruby validators that
|
13
|
+
# support draft-4. (According to json-schema.org).
|
14
|
+
#
|
15
|
+
# Each has their quirks, we'll try to:
|
16
|
+
# * use each to validate each fidor schema against the json-schema meta-schema
|
17
|
+
# * try to load each fidor schema as a schema for validation.
|
18
|
+
#
|
19
|
+
require 'pathname'
|
20
|
+
|
21
|
+
module Validator
|
22
|
+
class Base
|
23
|
+
# @return [Array<String>] file paths
|
24
|
+
attr_accessor :files_to_validate
|
25
|
+
|
26
|
+
# Run the given validator with all schema files
|
27
|
+
def self.run(files)
|
28
|
+
puts "Running validation with #{name} for #{files.length} schemas"
|
29
|
+
v = new(files)
|
30
|
+
v.validate_all
|
31
|
+
puts v.log_fmt
|
32
|
+
v
|
33
|
+
end
|
34
|
+
|
35
|
+
def validate_all
|
36
|
+
validate_schemas
|
37
|
+
validate_data
|
38
|
+
end
|
39
|
+
|
40
|
+
def validate_schemas
|
41
|
+
files_to_validate.each do |file|
|
42
|
+
schema = File.read file
|
43
|
+
log << "validate schema: #{file}"
|
44
|
+
validate schema
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def validate_data
|
49
|
+
files_to_validate.each do |file|
|
50
|
+
schema = File.read file
|
51
|
+
log << "validate data against: #{file}"
|
52
|
+
use_for_validation schema
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
# Joins the logs before display
|
58
|
+
def log_fmt
|
59
|
+
res = []
|
60
|
+
if errors.length > 0
|
61
|
+
res << "#{errors.join("\n\n")}"
|
62
|
+
res << "="*50
|
63
|
+
res << "#{errors.length} with errors"
|
64
|
+
end
|
65
|
+
res << "#{success.uniq.length} Schemas passed"
|
66
|
+
res.join("\n")
|
67
|
+
end
|
68
|
+
# @return [Array<String>] error schemas
|
69
|
+
def errors
|
70
|
+
@errors ||= []
|
71
|
+
end
|
72
|
+
# @return [Array<String>] test log
|
73
|
+
def log
|
74
|
+
@log ||= []
|
75
|
+
end
|
76
|
+
# @return [Array<String>] successfull schema titles
|
77
|
+
def success
|
78
|
+
@success ||= []
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.find_all_schema
|
84
|
+
# asssume we're running from rake and pwd is project root ...
|
85
|
+
this_dir = File.dirname(__FILE__)
|
86
|
+
repo_dir = Pathname.new(this_dir+"/../..").cleanpath.to_s
|
87
|
+
|
88
|
+
Dir.glob("#{repo_dir}/schema/**/*.json")
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
# @param [Symbol] validator to use
|
93
|
+
def self.run(validator)
|
94
|
+
case validator
|
95
|
+
when :underscore
|
96
|
+
Json_Schema.run find_all_schema
|
97
|
+
when :dash
|
98
|
+
JsonSchema.run find_all_schema
|
99
|
+
when :jschema
|
100
|
+
JSchema.run find_all_schema
|
101
|
+
else
|
102
|
+
puts "Unknown validator: #{validator}"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'jschema'
|
2
|
+
module Validator
|
3
|
+
class JSchema < Base
|
4
|
+
|
5
|
+
def initialize(files_to_validate)
|
6
|
+
@files_to_validate = files_to_validate
|
7
|
+
schema_data = File.read("#{File.dirname(__FILE__)}/schema.json")
|
8
|
+
schema_json = JSON.parse(schema_data)
|
9
|
+
@meta_schema = ::JSchema.build(schema_json)
|
10
|
+
end
|
11
|
+
|
12
|
+
def validate(schema)
|
13
|
+
schema_to_test = JSON.parse(schema)
|
14
|
+
result = @meta_schema.validate schema_to_test
|
15
|
+
if !result || result.length == 0
|
16
|
+
success << schema_to_test['title'] || schema_to_test.keys[0]
|
17
|
+
else
|
18
|
+
errors << "Schema validation failed: #{schema_to_test['title']}\n#{result.join("\n")}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def use_for_validation(schema)
|
23
|
+
schema_to_test = JSON.parse(schema)
|
24
|
+
begin
|
25
|
+
::JSchema.build(schema_to_test)
|
26
|
+
rescue
|
27
|
+
errors << "Data validation failed: #{schema_to_test['title']}\n#{$!}"
|
28
|
+
# puts $!.backtrace
|
29
|
+
else
|
30
|
+
success << schema_to_test['title'] || schema_to_test.keys[0]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'json-schema'
|
2
|
+
# https://github.com/ruby-json-schema/json-schema
|
3
|
+
module Validator
|
4
|
+
class JsonSchema < Base
|
5
|
+
def initialize(files_to_validate)
|
6
|
+
@files_to_validate = files_to_validate
|
7
|
+
@meta_schema_path = "#{File.dirname(__FILE__)}/schema.json"
|
8
|
+
|
9
|
+
# need to know the base dir of the schema to resolve relative uris.
|
10
|
+
# see below.
|
11
|
+
@schemadir = File.dirname(@files_to_validate[0])
|
12
|
+
end
|
13
|
+
|
14
|
+
# @param [String] schema to test against the meta schema
|
15
|
+
def validate(schema)
|
16
|
+
schema_to_test = JSON.parse(schema)
|
17
|
+
begin
|
18
|
+
result = JSON::Validator.fully_validate(@meta_schema_path, schema_to_test)
|
19
|
+
if !result || result.length == 0
|
20
|
+
success << schema_to_test['title'] || schema_to_test.keys[0]
|
21
|
+
else
|
22
|
+
errors << "Schema validation failed: #{schema_to_test['title']}\n#{result.join("\n")}"
|
23
|
+
end
|
24
|
+
rescue => e
|
25
|
+
errors << "Schema validation failed: #{schema_to_test['title']}\n#{e}"
|
26
|
+
# puts e.backtrace
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def use_for_validation(schema)
|
31
|
+
schema_to_test = JSON.parse(schema)
|
32
|
+
|
33
|
+
# json-schema resolves relatives path relative to it's own "."
|
34
|
+
# not relative to the file containing the reference ...
|
35
|
+
base_dir = Dir.pwd
|
36
|
+
|
37
|
+
begin
|
38
|
+
Dir.chdir @schemadir
|
39
|
+
data = {}
|
40
|
+
result = JSON::Validator.fully_validate(schema_to_test, data)
|
41
|
+
if !result || result.length == 0
|
42
|
+
success << schema_to_test['title']
|
43
|
+
else
|
44
|
+
errors << "Data validation failed: #{schema_to_test['title']}\n#{result.join("\n")}"
|
45
|
+
end
|
46
|
+
ensure
|
47
|
+
Dir.chdir base_dir
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'json_schema'
|
2
|
+
module Validator
|
3
|
+
class Json_Schema < Base
|
4
|
+
|
5
|
+
def initialize files_to_validate
|
6
|
+
@files_to_validate = files_to_validate
|
7
|
+
schema_data = File.read("#{File.dirname(__FILE__)}/schema.json")
|
8
|
+
schema_json = JSON.parse(schema_data)
|
9
|
+
@schema = ::JsonSchema.parse!(schema_json)
|
10
|
+
@errors, @success = [], []
|
11
|
+
end
|
12
|
+
|
13
|
+
# @param [String] schema to test against the meta schema
|
14
|
+
def validate(schema)
|
15
|
+
schema_to_test = JSON.parse(schema)
|
16
|
+
begin
|
17
|
+
@schema.validate! schema_to_test
|
18
|
+
rescue
|
19
|
+
errors << "Schema validation failed: #{schema_to_test['title']}\n#{$!}"
|
20
|
+
else
|
21
|
+
success << File.basename(schema)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def use_for_validation(schema)
|
26
|
+
schema_to_test = JSON.parse(schema)
|
27
|
+
begin
|
28
|
+
::JsonSchema.parse!(schema_to_test)
|
29
|
+
rescue
|
30
|
+
errors << "Data validation failed: #{schema_to_test['title']}\n#{$!}"
|
31
|
+
else
|
32
|
+
success << schema_to_test['title']
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
File without changes
|
data/lib/validator.rb
ADDED
data/schema/v1.0/account.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
|
+
"$schema" : "http://json-schema.org/draft-04/schema#",
|
2
3
|
"type" : "object",
|
3
|
-
"title" : "
|
4
|
-
"name" : "account",
|
4
|
+
"title" : "account",
|
5
5
|
"description" : "A fidor bank account.",
|
6
6
|
"properties" : {
|
7
7
|
"id" : {
|
@@ -68,9 +68,12 @@
|
|
68
68
|
"type" : "array",
|
69
69
|
"items" : {
|
70
70
|
"type" : "object",
|
71
|
-
"
|
72
|
-
|
73
|
-
|
71
|
+
"$ref" : "./customer.json#"
|
72
|
+
// "items" : {
|
73
|
+
// "type" : "object",
|
74
|
+
// "properties" : {
|
75
|
+
// "$ref" : "./customer.json#properties"
|
76
|
+
// }
|
74
77
|
},
|
75
78
|
"readOnly" : true
|
76
79
|
},
|
@@ -107,4 +110,4 @@
|
|
107
110
|
"href" : "accounts/{id}/sepa_direct_debits"
|
108
111
|
}
|
109
112
|
]
|
110
|
-
}
|
113
|
+
}
|
@@ -1,9 +1,8 @@
|
|
1
1
|
{
|
2
|
-
"
|
3
|
-
"
|
2
|
+
"$schema" : "http://json-schema.org/draft-04/schema#",
|
3
|
+
"NOTE" : "THIS OBJECT IS NOT SUPPORTED IN THE CURRENT API VERSION, this file is for future reference only!",
|
4
4
|
"type" : "object",
|
5
|
-
"title" : "
|
6
|
-
"name" : "batch_direct_debit",
|
5
|
+
"title" : "batch_direct_debit",
|
7
6
|
"description" : "PREVIEW: A direct debit batch contains multiple direct debits which are processed asynchronously.",
|
8
7
|
"required" : ["account_id", "external_uid"],
|
9
8
|
"properties" : {
|
@@ -24,9 +23,7 @@
|
|
24
23
|
"type" : "array",
|
25
24
|
"items" : {
|
26
25
|
"type" : "object",
|
27
|
-
"
|
28
|
-
"$ref" : "./sepa_direct_debit.json#properties"
|
29
|
-
}
|
26
|
+
"$ref" : "./sepa_direct_debit.json#"
|
30
27
|
}
|
31
28
|
},
|
32
29
|
"sepa_direct_debit_ids" : {
|
@@ -47,9 +44,7 @@
|
|
47
44
|
},
|
48
45
|
"error" : {
|
49
46
|
"type" : "object",
|
50
|
-
"
|
51
|
-
"$ref" : "./error.json#properties"
|
52
|
-
}
|
47
|
+
"$ref" : "./error.json#"
|
53
48
|
}
|
54
49
|
}
|
55
50
|
}
|
@@ -2,8 +2,7 @@
|
|
2
2
|
"NOTE" : "THIS OBJECT IS NOT SUPPORTED IN THE CURRENT API VERSION",
|
3
3
|
"note" : "this file is for future reference only!",
|
4
4
|
"type" : "object",
|
5
|
-
"title" : "
|
6
|
-
"name" : "batch_transfer",
|
5
|
+
"title" : "batch_transfer",
|
7
6
|
"description" : "PREVIEW: A transfer batch contains multiple transfers which are processed asynchronously.",
|
8
7
|
"required" : ["account_id", "external_uid"],
|
9
8
|
"properties" : {
|
@@ -24,9 +23,7 @@
|
|
24
23
|
"type" : "array",
|
25
24
|
"items" : {
|
26
25
|
"type" : "object",
|
27
|
-
"
|
28
|
-
"$ref" : "./sepa_credit_transfer.json#properties"
|
29
|
-
}
|
26
|
+
"$ref" : "./sepa_credit_transfer.json#"
|
30
27
|
}
|
31
28
|
},
|
32
29
|
"internal_transfers" : {
|
@@ -34,9 +31,7 @@
|
|
34
31
|
"type" : "array",
|
35
32
|
"items" : {
|
36
33
|
"type" : "object",
|
37
|
-
"
|
38
|
-
"$ref" : "./internal_transfer.json#properties"
|
39
|
-
}
|
34
|
+
"$ref" : "./internal_transfer.json#"
|
40
35
|
}
|
41
36
|
},
|
42
37
|
"sepa_credit_transfer_ids" : {
|
@@ -64,9 +59,7 @@
|
|
64
59
|
},
|
65
60
|
"error" : {
|
66
61
|
"type" : "object",
|
67
|
-
"
|
68
|
-
"$ref" : "./error.json#properties"
|
69
|
-
}
|
62
|
+
"$ref" : "./error.json#"
|
70
63
|
}
|
71
64
|
}
|
72
65
|
}
|
@@ -82,9 +75,7 @@
|
|
82
75
|
},
|
83
76
|
"error" : {
|
84
77
|
"type" : "object",
|
85
|
-
"
|
86
|
-
"$ref" : "./error.json#properties"
|
87
|
-
}
|
78
|
+
"$ref" : "./error.json#"
|
88
79
|
}
|
89
80
|
}
|
90
81
|
}
|
data/schema/v1.0/customer.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
|
+
"$schema" : "http://json-schema.org/draft-04/schema#",
|
2
3
|
"type" : "object",
|
3
|
-
"title" : "
|
4
|
-
"name" : "customer",
|
4
|
+
"title" : "customer",
|
5
5
|
"description" : "",
|
6
6
|
"required" : ["email", "first_name", "last_name", "gender", "title", "nick"],
|
7
7
|
"properties" : {
|
@@ -193,12 +193,12 @@
|
|
193
193
|
"href" : "customers/{id}"
|
194
194
|
},
|
195
195
|
{
|
196
|
-
"rel"
|
197
|
-
"href"
|
196
|
+
"rel" : "instances",
|
197
|
+
"href" : "customers"
|
198
198
|
},
|
199
199
|
{
|
200
|
-
"rel"
|
201
|
-
"href"
|
200
|
+
"rel" : "accounts",
|
201
|
+
"href" : "customers/{id}/accounts"
|
202
202
|
}
|
203
203
|
]
|
204
204
|
}
|
data/schema/v1.0/error.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
|
+
"$schema" : "http://json-schema.org/draft-04/schema#",
|
2
3
|
"type" : "object",
|
3
|
-
"title" : "
|
4
|
-
"name" : "internal_transfer",
|
4
|
+
"title" : "internal_transfer",
|
5
5
|
"description" : "A transfer initiates a transaction e.g get / send money. If the transfer fails no transaction is created!",
|
6
6
|
"required" : ["account_id", "receiver", "amount", "external_uid"],
|
7
7
|
"properties" : {
|
data/schema/v1.0/rate_limit.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
|
+
"$schema" : "http://json-schema.org/draft-04/schema#",
|
2
3
|
"type" : "object",
|
3
|
-
"title" : "
|
4
|
-
"name" : "rate_limit",
|
4
|
+
"title" : "rate_limit",
|
5
5
|
"description" : "Overall, remaining rate limits and the time frame until the reset.",
|
6
6
|
"properties" : {
|
7
7
|
"limit" : {
|
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
|
+
"$schema" : "http://json-schema.org/draft-04/schema#",
|
2
3
|
"type" : "object",
|
3
|
-
"title" : "
|
4
|
-
"name" : "sepa_credit_transfer",
|
4
|
+
"title" : "sepa_credit_transfer",
|
5
5
|
"description" : "A transfer initiates a transaction e.g get / send money. If the transfer fails no transaction is created!",
|
6
6
|
"required" : ["account_id", "amount", "external_uid"],
|
7
7
|
"properties" : {
|
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
|
+
"$schema" : "http://json-schema.org/draft-04/schema#",
|
2
3
|
"type" : "object",
|
3
|
-
"title" : "
|
4
|
-
"name" : "sepa_direct_debit",
|
4
|
+
"title" : "sepa_direct_debit",
|
5
5
|
"description" : "A direct debit can only be performed with a valid sepa mandate, authorizing access to the debtor's account.",
|
6
6
|
"required" : ["account_id", "mandate_id", "amount", "collection_date", "external_uid"],
|
7
7
|
"properties" : {
|
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
|
+
"$schema" : "http://json-schema.org/draft-04/schema#",
|
2
3
|
"type" : "object",
|
3
|
-
"title" : "
|
4
|
-
"name" : "sepa_mandate",
|
4
|
+
"title" : "sepa_mandate",
|
5
5
|
"description" : "A mandate object authorizing debits from an account.",
|
6
6
|
"required" : ["external_uid", "customer_id", "mandate_reference", "remote_title", "remote_name", "remote_email",
|
7
7
|
"remote_address_line1", "remote_address_line2", "remote_country", "remote_iban", "remote_bic",
|
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
|
+
"$schema" : "http://json-schema.org/draft-04/schema#",
|
2
3
|
"type" : "object",
|
3
|
-
"title" : "
|
4
|
-
"name" : "transaction",
|
4
|
+
"title" : "transaction",
|
5
5
|
"description" : "A transaction is the result of a successful transfer or debit.",
|
6
6
|
"properties" : {
|
7
7
|
"id" : {
|
@@ -21,28 +21,20 @@
|
|
21
21
|
"type" : "object",
|
22
22
|
"oneOf" : [
|
23
23
|
{
|
24
|
-
"
|
25
|
-
"
|
26
|
-
"$ref" : "./transaction_type_details/credit_card_details.json#properties"
|
27
|
-
}
|
24
|
+
"title" : "credit_card_details",
|
25
|
+
"$ref" : "./transaction_type_details/credit_card_details.json#"
|
28
26
|
},
|
29
27
|
{
|
30
|
-
"
|
31
|
-
"
|
32
|
-
"$ref" : "./transaction_type_details/internal_transfer_details.json#properties"
|
33
|
-
}
|
28
|
+
"title" : "internal_transfer_details",
|
29
|
+
"$ref" : "./transaction_type_details/internal_transfer_details.json#"
|
34
30
|
},
|
35
31
|
{
|
36
|
-
"
|
37
|
-
"
|
38
|
-
"$ref" : "./transaction_type_details/sepa_credit_transfer_details.json#properties"
|
39
|
-
}
|
32
|
+
"title" : "sepa_credit_transfer_details",
|
33
|
+
"$ref" : "./transaction_type_details/sepa_credit_transfer_details.json#"
|
40
34
|
},
|
41
35
|
{
|
42
|
-
"
|
43
|
-
"
|
44
|
-
"$ref" : "./transaction_type_details/sepa_direct_debit_details.json#properties"
|
45
|
-
}
|
36
|
+
"title" : "sepa_direct_debit_details",
|
37
|
+
"$ref" : "./transaction_type_details/sepa_direct_debit_details.json#"
|
46
38
|
}
|
47
39
|
]
|
48
40
|
},
|
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
|
+
"$schema" : "http://json-schema.org/draft-04/schema#",
|
2
3
|
"type" : "object",
|
3
|
-
"title" : "
|
4
|
-
"name" : "credit_card_details",
|
4
|
+
"title" : "credit_card_details",
|
5
5
|
"description" : "Credit card information available in a CreditCard transaction",
|
6
6
|
"properties" : {
|
7
7
|
"cc_merchant_name" : {
|
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
|
+
"$schema" : "http://json-schema.org/draft-04/schema#",
|
2
3
|
"type" : "object",
|
3
|
-
"title" : "
|
4
|
-
"name" : "internal_transfer_details",
|
4
|
+
"title" : "internal_transfer_details",
|
5
5
|
"description" : "Remote account for a Fidor internal transfer",
|
6
6
|
"properties" : {
|
7
7
|
"remote_account_id" : {
|
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
|
+
"$schema" : "http://json-schema.org/draft-04/schema#",
|
2
3
|
"type" : "object",
|
3
|
-
"title" : "
|
4
|
-
"name" : "sepa_credit_transfer_details",
|
4
|
+
"title" : "sepa_credit_transfer_details",
|
5
5
|
"description" : "Remote account information available in a SEPA credit transfer",
|
6
6
|
"properties" : {
|
7
7
|
"sepa_credit_transfer_id" : {
|
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
|
+
"$schema" : "http://json-schema.org/draft-04/schema#",
|
2
3
|
"type" : "object",
|
3
|
-
"title" : "
|
4
|
-
"name" : "sepa_direct_debit_details",
|
4
|
+
"title" : "sepa_direct_debit_details",
|
5
5
|
"description" : "Remote account information for a SEPA direct debit",
|
6
6
|
"properties" : {
|
7
7
|
"remote_iban" : {
|
data/schema/v1.0/user.json
CHANGED
data/spec/fidor_schema_spec.rb
CHANGED
@@ -24,7 +24,6 @@ describe Fidor::Schema do
|
|
24
24
|
SchemaTools.schema_path = Fidor::Schema.path
|
25
25
|
schema = SchemaTools::Reader.read('account').to_h
|
26
26
|
expect(schema['properties']['customers']['items']['properties']['id']['type']).to eq 'string'
|
27
|
-
|
28
27
|
end
|
29
28
|
|
30
29
|
it 'should resolve all' do
|
@@ -38,4 +37,4 @@ describe Fidor::Schema do
|
|
38
37
|
end
|
39
38
|
|
40
39
|
end
|
41
|
-
end
|
40
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'validator'
|
3
|
+
|
4
|
+
describe Validator::JSchema do
|
5
|
+
it 'validates schemas against the meta schema' do
|
6
|
+
path = Fidor::Schema.path
|
7
|
+
files = Dir.glob("#{path}/**/*.json")
|
8
|
+
v = Validator::JSchema.new files
|
9
|
+
v.validate_schemas
|
10
|
+
expect(v.log[0]).to include('validate schema')
|
11
|
+
expect(v.errors).to be_empty
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'validates schemas against blank data' do
|
15
|
+
path = Fidor::Schema.path
|
16
|
+
files = Dir.glob("#{path}/**/*.json")
|
17
|
+
v = Validator::JSchema.new files
|
18
|
+
v.validate_data
|
19
|
+
expect(v.log[0]).to include('validate data')
|
20
|
+
# expect(v.errors).to be_empty
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'validator'
|
3
|
+
|
4
|
+
describe Validator::JsonSchema do
|
5
|
+
it 'validates schemas against the meta schema' do
|
6
|
+
path = Fidor::Schema.path
|
7
|
+
files = Dir.glob("#{path}/**/*.json")
|
8
|
+
v = Validator::JsonSchema.new files
|
9
|
+
v.validate_schemas
|
10
|
+
expect(v.log[0]).to include('validate schema')
|
11
|
+
expect(v.errors).to be_empty
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'validates schemas against blank data' do
|
15
|
+
path = Fidor::Schema.path
|
16
|
+
files = Dir.glob("#{path}/**/*.json")
|
17
|
+
v = Validator::JsonSchema.new files
|
18
|
+
v.validate_data
|
19
|
+
expect(v.log[0]).to include('validate data')
|
20
|
+
# expect(v.errors).to be_empty
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'validator'
|
3
|
+
|
4
|
+
describe Validator::Json_Schema do
|
5
|
+
it 'validates schemas against the meta schema' do
|
6
|
+
path = Fidor::Schema.path
|
7
|
+
files = Dir.glob("#{path}/**/*.json")
|
8
|
+
v = Validator::Json_Schema.new files
|
9
|
+
v.validate_schemas
|
10
|
+
expect(v.log[0]).to include('validate schema')
|
11
|
+
expect(v.errors).to be_empty
|
12
|
+
end
|
13
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fidor_schema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Georg Leciejewski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.
|
61
|
+
version: 0.6.1
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.
|
68
|
+
version: 0.6.1
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: activemodel
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +94,48 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: json-schema
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: json_schema
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: jschema
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
97
139
|
description: Fidor API description. Using JSON Schema to describe the available objects,
|
98
140
|
their fields and resource links. Beware of the BETA status, as things can change
|
99
141
|
slightly
|
@@ -111,11 +153,14 @@ files:
|
|
111
153
|
- lib/fidor/schema.rb
|
112
154
|
- lib/fidor_schema.rb
|
113
155
|
- lib/fidor_schema_version.rb
|
114
|
-
- lib/
|
115
|
-
- lib/
|
156
|
+
- lib/validator.rb
|
157
|
+
- lib/validator/base.rb
|
158
|
+
- lib/validator/j_schema.rb
|
159
|
+
- lib/validator/json-schema.rb
|
160
|
+
- lib/validator/json_schema.rb
|
161
|
+
- lib/validator/schema.json
|
116
162
|
- schema/v1.0/account.json
|
117
163
|
- schema/v1.0/base_types/base_types.json
|
118
|
-
- schema/v1.0/base_types/lists.json
|
119
164
|
- schema/v1.0/batch_direct_debit.json
|
120
165
|
- schema/v1.0/batch_transfer.json
|
121
166
|
- schema/v1.0/customer.json
|
@@ -133,6 +178,9 @@ files:
|
|
133
178
|
- schema/v1.0/user.json
|
134
179
|
- spec/fidor_schema_spec.rb
|
135
180
|
- spec/spec_helper.rb
|
181
|
+
- spec/validator/j_schema_spec.rb
|
182
|
+
- spec/validator/json-schema_spec.rb
|
183
|
+
- spec/validator/json_schema_spec.rb
|
136
184
|
homepage: https://www.fidor.de
|
137
185
|
licenses:
|
138
186
|
- MIT
|
@@ -160,3 +208,6 @@ summary: BETA Fidor API - JSON Schema
|
|
160
208
|
test_files:
|
161
209
|
- spec/fidor_schema_spec.rb
|
162
210
|
- spec/spec_helper.rb
|
211
|
+
- spec/validator/j_schema_spec.rb
|
212
|
+
- spec/validator/json-schema_spec.rb
|
213
|
+
- spec/validator/json_schema_spec.rb
|
data/lib/validate/validate.rb
DELETED
@@ -1,184 +0,0 @@
|
|
1
|
-
# This functionality is intended to run the schema, through
|
2
|
-
# any available Schema Validators for Ruby.
|
3
|
-
#
|
4
|
-
# They should be valid according to draft-4 ...
|
5
|
-
#
|
6
|
-
# The schema validators currently being considered are:
|
7
|
-
#
|
8
|
-
# https://github.com/ruby-json-schema/json-schema
|
9
|
-
# https://github.com/brandur/json_schema (note the underscore!)
|
10
|
-
# https://github.com/Soylent/jschema
|
11
|
-
#
|
12
|
-
# These are the three currently available ruby validators that
|
13
|
-
# support draft-4. (According to json-schema.org).
|
14
|
-
#
|
15
|
-
# Each has their quirks, we'll try to:
|
16
|
-
# * use each to validate each fidor schema against the json-schema meta-schema
|
17
|
-
# * try to load each fidor schema as a schema for validation.
|
18
|
-
#
|
19
|
-
require 'pathname'
|
20
|
-
require 'json-schema'
|
21
|
-
require 'json_schema'
|
22
|
-
require 'jschema'
|
23
|
-
|
24
|
-
module Fidor
|
25
|
-
module SchemaValidation
|
26
|
-
|
27
|
-
class Validator # Base
|
28
|
-
def validate_all
|
29
|
-
@files_to_validate.each do |file|
|
30
|
-
schema = File.read file
|
31
|
-
puts "\nvalidating: #{file}"
|
32
|
-
validate schema
|
33
|
-
puts "\nusing #{file} for validation."
|
34
|
-
use_for_validation schema
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
# https://github.com/ruby-json-schema/json-schema
|
40
|
-
class JsonDashSchemaValidator < Validator
|
41
|
-
def initialize files_to_validate
|
42
|
-
@files_to_validate = files_to_validate
|
43
|
-
@meta_schema_fn = "#{File.dirname(__FILE__)}/schema.json"
|
44
|
-
|
45
|
-
# need to know the base dir of the schema to resolve relative uris.
|
46
|
-
# see below.
|
47
|
-
@schemadir = File.dirname(@files_to_validate[0])
|
48
|
-
|
49
|
-
validate_all
|
50
|
-
end # init
|
51
|
-
|
52
|
-
def validate schema
|
53
|
-
begin
|
54
|
-
results = JSON::Validator.fully_validate(@meta_schema_fn, schema)
|
55
|
-
if !results || results.length == 0
|
56
|
-
puts "Passed!"
|
57
|
-
else
|
58
|
-
puts "Failed!"
|
59
|
-
puts results
|
60
|
-
end
|
61
|
-
rescue
|
62
|
-
puts "Failed! Error..."
|
63
|
-
puts $!
|
64
|
-
puts $!.backtrace
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def use_for_validation schema
|
69
|
-
# json-schema resolves relatives path relative to it's own "."
|
70
|
-
# not relative to the file containing the reference ...
|
71
|
-
baseDirectory = Dir.pwd
|
72
|
-
|
73
|
-
begin
|
74
|
-
Dir.chdir @schemadir
|
75
|
-
data = {}
|
76
|
-
results = JSON::Validator.fully_validate(schema, data)
|
77
|
-
if !results || results.length == 0
|
78
|
-
puts "Passed!"
|
79
|
-
else
|
80
|
-
puts "Failed!"
|
81
|
-
puts results
|
82
|
-
end
|
83
|
-
ensure
|
84
|
-
Dir.chdir baseDirectory
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
class JsonUnderscoreSchemaValidator < Validator
|
90
|
-
def initialize files_to_validate
|
91
|
-
@files_to_validate = files_to_validate
|
92
|
-
schema_data = File.read("#{File.dirname(__FILE__)}/schema.json")
|
93
|
-
schema_json = JSON.parse(schema_data)
|
94
|
-
@schema = JsonSchema.parse!(schema_json)
|
95
|
-
validate_all
|
96
|
-
end
|
97
|
-
|
98
|
-
def validate schema
|
99
|
-
begin
|
100
|
-
schema_to_test = JSON.parse(schema)
|
101
|
-
@schema.validate! schema_to_test
|
102
|
-
puts "Passed validation against meta-schema!"
|
103
|
-
JsonSchema.parse!(schema_to_test)
|
104
|
-
rescue
|
105
|
-
puts $!
|
106
|
-
puts "Failed!"
|
107
|
-
else
|
108
|
-
puts "Passed!"
|
109
|
-
end
|
110
|
-
end
|
111
|
-
def use_for_validation schema
|
112
|
-
begin
|
113
|
-
schema_to_test = JSON.parse(schema)
|
114
|
-
JsonSchema.parse!(schema_to_test)
|
115
|
-
rescue
|
116
|
-
puts $!
|
117
|
-
puts "Failed"
|
118
|
-
else
|
119
|
-
puts "Passed!"
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
class JSchemaValidator < Validator
|
125
|
-
def initialize files_to_validate
|
126
|
-
@files_to_validate = files_to_validate
|
127
|
-
schema_data = File.read("#{File.dirname(__FILE__)}/schema.json")
|
128
|
-
schema_json = JSON.parse(schema_data)
|
129
|
-
@schema = JSchema.build(schema_json)
|
130
|
-
validate_all
|
131
|
-
end
|
132
|
-
def validate schema
|
133
|
-
schema_to_test = JSON.parse(schema)
|
134
|
-
results = @schema.validate schema_to_test
|
135
|
-
if !results || results.length == 0
|
136
|
-
puts "Passed!"
|
137
|
-
else
|
138
|
-
puts "Failed!"
|
139
|
-
puts results
|
140
|
-
end
|
141
|
-
end
|
142
|
-
def use_for_validation schema
|
143
|
-
schema_to_test = JSON.parse(schema)
|
144
|
-
begin
|
145
|
-
JSchema.build(schema_to_test)
|
146
|
-
rescue
|
147
|
-
puts "Failed!"
|
148
|
-
puts $!
|
149
|
-
# puts $!.backtrace
|
150
|
-
else
|
151
|
-
puts "Passed!"
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
def self.find_all_schema
|
157
|
-
# asssume we're running from rake and
|
158
|
-
# pwd is project root ...
|
159
|
-
this_dir = File.dirname(__FILE__)
|
160
|
-
repo_dir = Pathname.new(this_dir+"/../..").cleanpath.to_s
|
161
|
-
|
162
|
-
Dir.glob("#{repo_dir}/schema/*/*.json")
|
163
|
-
end
|
164
|
-
|
165
|
-
|
166
|
-
def self.main validator
|
167
|
-
case validator
|
168
|
-
when :underscore
|
169
|
-
puts "Running validation with JSON_Schema"
|
170
|
-
JsonUnderscoreSchemaValidator.new find_all_schema
|
171
|
-
when :dash
|
172
|
-
puts "Running validation with JSON-Schema"
|
173
|
-
JsonDashSchemaValidator.new find_all_schema
|
174
|
-
when :jschema
|
175
|
-
puts "Running validation with JSchema"
|
176
|
-
JSchemaValidator.new find_all_schema
|
177
|
-
else
|
178
|
-
puts "Unknown validator: #{validator}"
|
179
|
-
end
|
180
|
-
|
181
|
-
end
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
@@ -1,32 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"type" : "object",
|
3
|
-
"title" : "List",
|
4
|
-
"name" : "list",
|
5
|
-
"description" : "A paginated list of objects",
|
6
|
-
"properties" : {
|
7
|
-
"data" : {
|
8
|
-
"description" : "The requested objects",
|
9
|
-
"type" : "array"
|
10
|
-
},
|
11
|
-
"collection" : {
|
12
|
-
"type" : "object",
|
13
|
-
"name" : "collection",
|
14
|
-
"description" : "Pagination information for a list of returned object (not standalone)",
|
15
|
-
"properties" : {
|
16
|
-
"current_page" : {
|
17
|
-
"type" : "integer"
|
18
|
-
},
|
19
|
-
"per_page" : {
|
20
|
-
"type" : "integer"
|
21
|
-
},
|
22
|
-
"total_entries" : {
|
23
|
-
"type" : "integer"
|
24
|
-
},
|
25
|
-
"total_pages" : {
|
26
|
-
"type" : "integer"
|
27
|
-
}
|
28
|
-
}
|
29
|
-
}
|
30
|
-
}
|
31
|
-
}
|
32
|
-
|