schemacop 0.0.1
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 +7 -0
- data/.gitignore +15 -0
- data/.rubocop.yml +42 -0
- data/.travis.yml +6 -0
- data/.yardopts +1 -0
- data/Gemfile +4 -0
- data/LICENSE +21 -0
- data/README.md +346 -0
- data/RUBY_VERSION +1 -0
- data/Rakefile +38 -0
- data/VERSION +1 -0
- data/doc/Schemacop.html +208 -0
- data/doc/Schemacop/Exceptions.html +115 -0
- data/doc/Schemacop/Exceptions/Base.html +127 -0
- data/doc/Schemacop/Exceptions/InvalidSchema.html +141 -0
- data/doc/Schemacop/Exceptions/Validation.html +142 -0
- data/doc/Schemacop/Validator.html +254 -0
- data/doc/_index.html +177 -0
- data/doc/class_list.html +58 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +57 -0
- data/doc/css/style.css +339 -0
- data/doc/file.README.html +405 -0
- data/doc/file_list.html +60 -0
- data/doc/frames.html +26 -0
- data/doc/index.html +405 -0
- data/doc/js/app.js +219 -0
- data/doc/js/full_list.js +181 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +69 -0
- data/doc/top-level-namespace.html +112 -0
- data/lib/schemacop.rb +11 -0
- data/lib/schemacop/exceptions.rb +10 -0
- data/lib/schemacop/validator.rb +138 -0
- data/schemacop.gemspec +49 -0
- data/test/schemacop_validator_test.rb +197 -0
- metadata +192 -0
data/schemacop.gemspec
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
# stub: schemacop 0.0.1 ruby lib
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "schemacop"
|
6
|
+
s.version = "0.0.1"
|
7
|
+
|
8
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
|
+
s.authors = ["Sitrox"]
|
10
|
+
s.date = "2016-06-06"
|
11
|
+
s.files = [".gitignore", ".rubocop.yml", ".travis.yml", ".yardopts", "Gemfile", "LICENSE", "README.md", "RUBY_VERSION", "Rakefile", "VERSION", "doc/Schemacop.html", "doc/Schemacop/Exceptions.html", "doc/Schemacop/Exceptions/Base.html", "doc/Schemacop/Exceptions/InvalidSchema.html", "doc/Schemacop/Exceptions/Validation.html", "doc/Schemacop/Validator.html", "doc/_index.html", "doc/class_list.html", "doc/css/common.css", "doc/css/full_list.css", "doc/css/style.css", "doc/file.README.html", "doc/file_list.html", "doc/frames.html", "doc/index.html", "doc/js/app.js", "doc/js/full_list.js", "doc/js/jquery.js", "doc/method_list.html", "doc/top-level-namespace.html", "lib/schemacop.rb", "lib/schemacop/exceptions.rb", "lib/schemacop/validator.rb", "schemacop.gemspec", "test/schemacop_validator_test.rb"]
|
12
|
+
s.require_paths = ["lib"]
|
13
|
+
s.rubygems_version = "2.1.11"
|
14
|
+
s.summary = "Schemacop validates ruby structures consisting of nested hashes and arrays against simple schema definitions."
|
15
|
+
s.test_files = ["test/schemacop_validator_test.rb"]
|
16
|
+
|
17
|
+
if s.respond_to? :specification_version then
|
18
|
+
s.specification_version = 4
|
19
|
+
|
20
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
21
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.3"])
|
22
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
23
|
+
s.add_development_dependency(%q<ci_reporter>, ["~> 2.0"])
|
24
|
+
s.add_development_dependency(%q<ci_reporter_minitest>, [">= 0"])
|
25
|
+
s.add_development_dependency(%q<activesupport>, [">= 0"])
|
26
|
+
s.add_development_dependency(%q<haml>, [">= 0"])
|
27
|
+
s.add_development_dependency(%q<yard>, [">= 0"])
|
28
|
+
s.add_development_dependency(%q<redcarpet>, [">= 0"])
|
29
|
+
else
|
30
|
+
s.add_dependency(%q<bundler>, ["~> 1.3"])
|
31
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
32
|
+
s.add_dependency(%q<ci_reporter>, ["~> 2.0"])
|
33
|
+
s.add_dependency(%q<ci_reporter_minitest>, [">= 0"])
|
34
|
+
s.add_dependency(%q<activesupport>, [">= 0"])
|
35
|
+
s.add_dependency(%q<haml>, [">= 0"])
|
36
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
37
|
+
s.add_dependency(%q<redcarpet>, [">= 0"])
|
38
|
+
end
|
39
|
+
else
|
40
|
+
s.add_dependency(%q<bundler>, ["~> 1.3"])
|
41
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
42
|
+
s.add_dependency(%q<ci_reporter>, ["~> 2.0"])
|
43
|
+
s.add_dependency(%q<ci_reporter_minitest>, [">= 0"])
|
44
|
+
s.add_dependency(%q<activesupport>, [">= 0"])
|
45
|
+
s.add_dependency(%q<haml>, [">= 0"])
|
46
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
47
|
+
s.add_dependency(%q<redcarpet>, [">= 0"])
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,197 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'schemacop'
|
3
|
+
|
4
|
+
# rubocop: disable Metrics/ClassLength
|
5
|
+
class SchemacopValidatorTest < Minitest::Test
|
6
|
+
def test_top_level_schema
|
7
|
+
assert_schema({ type: :integer }, 1)
|
8
|
+
assert_schema({ type: :hash, null: true }, nil)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_short_type_schema
|
12
|
+
assert_schema({ type: :array, array: :string }, %w(Hello world))
|
13
|
+
assert_schema({ array: :string }, %w(Hello world))
|
14
|
+
assert_schema({ hash: { first_name: :string, last_name: :string } }, first_name: 'John', last_name: 'Doe')
|
15
|
+
|
16
|
+
assert_schema_failure({ type: :array }, %w(Hello world))
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_many_types_schema
|
20
|
+
assert_schema({ type: [String, :integer] }, 'Hello world')
|
21
|
+
assert_schema({ type: [:string, 'integer'] }, 123)
|
22
|
+
assert_schema({ type: String }, 'Hello world')
|
23
|
+
assert_schema({ type: :string }, 'Hello world')
|
24
|
+
assert_schema({ type: :array, array: :string }, %w(John Doe))
|
25
|
+
assert_schema({ type: :hash, hash: { name: :string } }, name: 'John Doe')
|
26
|
+
assert_schema({ type: [:array, :hash], array: { type: :string }, hash: { name: :string } }, name: 'John Doe')
|
27
|
+
assert_schema({ type: [:array, :hash], array: { type: :string }, hash: { name: :string } }, %w(John Doe))
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_unify_schema
|
31
|
+
schema_rules = {
|
32
|
+
hash: {
|
33
|
+
id: [Integer, String],
|
34
|
+
name: :string,
|
35
|
+
meta: {
|
36
|
+
hash: {
|
37
|
+
groups: { array: :integer },
|
38
|
+
birthday: Date,
|
39
|
+
comment: {
|
40
|
+
type: :string,
|
41
|
+
required: false,
|
42
|
+
null: true
|
43
|
+
}
|
44
|
+
}
|
45
|
+
}
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
assert_schema(schema_rules, id: 123, name: 'John Doe', meta: { groups: [1, 2, 3], birthday: Date.today, comment: 'Hello world' })
|
50
|
+
assert_schema(schema_rules, id: 'XYZ', name: 'John Doe', meta: { groups: [1, 2, 3], birthday: Date.today })
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_nested_hash_schema
|
54
|
+
schema_rules = {
|
55
|
+
type: :hash,
|
56
|
+
hash: {
|
57
|
+
name: {
|
58
|
+
type: :hash,
|
59
|
+
hash: {
|
60
|
+
first_name: { type: :string },
|
61
|
+
last_name: { type: :string }
|
62
|
+
}
|
63
|
+
}
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
assert_schema(schema_rules, name: { first_name: 'John', last_name: 'Doe' })
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_flat_hash_old_schema
|
71
|
+
schema_rules = {
|
72
|
+
type: :hash,
|
73
|
+
fields: {
|
74
|
+
name: {
|
75
|
+
type: :string, null: true
|
76
|
+
}
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
assert_schema schema_rules, name: 'John Doe'
|
81
|
+
assert_schema schema_rules, name: ''
|
82
|
+
assert_schema schema_rules, name: nil
|
83
|
+
|
84
|
+
assert_schema_failure schema_rules, name: 123
|
85
|
+
assert_schema_failure schema_rules, name: true
|
86
|
+
assert_schema_failure schema_rules, name: []
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_array_hash_old_schema
|
90
|
+
schema_rules = {
|
91
|
+
type: :array,
|
92
|
+
array: {
|
93
|
+
type: :hash,
|
94
|
+
fields: {
|
95
|
+
required: { type: :boolean },
|
96
|
+
name: { type: :string }
|
97
|
+
}
|
98
|
+
}
|
99
|
+
}
|
100
|
+
|
101
|
+
assert_schema schema_rules, [{ name: 'John', required: true }, { name: 'Alex', required: false }]
|
102
|
+
|
103
|
+
assert_schema_failure schema_rules, name: 'John Doe'
|
104
|
+
assert_schema_failure schema_rules, [{ name: 'John Doe' }]
|
105
|
+
assert_schema_failure schema_rules, [{ required: true }]
|
106
|
+
assert_schema_failure schema_rules, [{ name: 0, required: true }]
|
107
|
+
assert_schema_failure schema_rules, [{ name: 'John Doe', required: 'string' }]
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_fields_array_old_schema
|
111
|
+
schema_rules = {
|
112
|
+
type: :hash,
|
113
|
+
fields: {
|
114
|
+
ids: {
|
115
|
+
type: :array,
|
116
|
+
array: {
|
117
|
+
type: :integer
|
118
|
+
}
|
119
|
+
}
|
120
|
+
}
|
121
|
+
}
|
122
|
+
|
123
|
+
assert_schema schema_rules, ids: []
|
124
|
+
assert_schema schema_rules, ids: [1, 2, 3]
|
125
|
+
|
126
|
+
assert_schema_failure schema_rules, ids: [1, '2']
|
127
|
+
assert_schema_failure schema_rules, ids: '3'
|
128
|
+
assert_schema_failure schema_rules, ids: nil
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_validate_fields_old_schema
|
132
|
+
schema_rules = {
|
133
|
+
type: :hash,
|
134
|
+
fields: {
|
135
|
+
name: { type: :string, null: true, required: true },
|
136
|
+
age: { type: :integer, required: false, null: true },
|
137
|
+
id: { type: :integer, null: false },
|
138
|
+
ids: { type: :array, array: { type: :integer }, null: true },
|
139
|
+
currency: { type: :string, allowed_values: %w(CHF USD EUR) }
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
143
|
+
assert_schema schema_rules, name: 'John', id: 2, ids: [1, 2, 3], currency: 'CHF'
|
144
|
+
assert_schema schema_rules, name: nil, id: 2, ids: [1, 2, 3], currency: 'CHF'
|
145
|
+
assert_schema schema_rules, name: nil, age: 2, id: 2, ids: nil, currency: 'CHF'
|
146
|
+
assert_schema schema_rules, name: nil, id: 2, ids: nil, currency: 'CHF'
|
147
|
+
|
148
|
+
assert_schema_failure schema_rules, id: 2, ids: [1, 2, 3], currency: 'CHF'
|
149
|
+
assert_schema_failure schema_rules, name: nil, id: nil, ids: [1, 2, 3], currency: 'CHF'
|
150
|
+
assert_schema_failure schema_rules, name: nil, id: 2, ids: [1, 2, 3], currency: 'JPN'
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_nested_old_schema
|
154
|
+
schema_rules = {
|
155
|
+
type: :array,
|
156
|
+
array: {
|
157
|
+
type: :hash,
|
158
|
+
fields: {
|
159
|
+
id: { type: :integer },
|
160
|
+
hosts: {
|
161
|
+
type: :array,
|
162
|
+
array: {
|
163
|
+
type: :hash,
|
164
|
+
fields: {
|
165
|
+
hostname: { type: :string }
|
166
|
+
}
|
167
|
+
}
|
168
|
+
}
|
169
|
+
}
|
170
|
+
}
|
171
|
+
}
|
172
|
+
|
173
|
+
assert_schema schema_rules, [
|
174
|
+
{ id: 1, hosts: [{ hostname: 'localhost' }, { hostname: '127.0.0.1' }] },
|
175
|
+
{ id: 2, hosts: [{ hostname: '192.168.0.1' }, { hostname: 'somedomain.com' }] }
|
176
|
+
]
|
177
|
+
end
|
178
|
+
|
179
|
+
private
|
180
|
+
|
181
|
+
def assert_schema_failure(schema, data)
|
182
|
+
assert_raises Schemacop::Exceptions::Validation do
|
183
|
+
Schemacop.validate!(schema, data)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def assert_schema(schema, data)
|
188
|
+
begin
|
189
|
+
Schemacop.validate!(schema, data)
|
190
|
+
success = true
|
191
|
+
rescue
|
192
|
+
success = false
|
193
|
+
end
|
194
|
+
|
195
|
+
assert success
|
196
|
+
end
|
197
|
+
end
|
metadata
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: schemacop
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sitrox
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-06-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: ci_reporter
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: ci_reporter_minitest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: activesupport
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: haml
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: yard
|
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: redcarpet
|
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
|
+
description:
|
126
|
+
email:
|
127
|
+
executables: []
|
128
|
+
extensions: []
|
129
|
+
extra_rdoc_files: []
|
130
|
+
files:
|
131
|
+
- ".gitignore"
|
132
|
+
- ".rubocop.yml"
|
133
|
+
- ".travis.yml"
|
134
|
+
- ".yardopts"
|
135
|
+
- Gemfile
|
136
|
+
- LICENSE
|
137
|
+
- README.md
|
138
|
+
- RUBY_VERSION
|
139
|
+
- Rakefile
|
140
|
+
- VERSION
|
141
|
+
- doc/Schemacop.html
|
142
|
+
- doc/Schemacop/Exceptions.html
|
143
|
+
- doc/Schemacop/Exceptions/Base.html
|
144
|
+
- doc/Schemacop/Exceptions/InvalidSchema.html
|
145
|
+
- doc/Schemacop/Exceptions/Validation.html
|
146
|
+
- doc/Schemacop/Validator.html
|
147
|
+
- doc/_index.html
|
148
|
+
- doc/class_list.html
|
149
|
+
- doc/css/common.css
|
150
|
+
- doc/css/full_list.css
|
151
|
+
- doc/css/style.css
|
152
|
+
- doc/file.README.html
|
153
|
+
- doc/file_list.html
|
154
|
+
- doc/frames.html
|
155
|
+
- doc/index.html
|
156
|
+
- doc/js/app.js
|
157
|
+
- doc/js/full_list.js
|
158
|
+
- doc/js/jquery.js
|
159
|
+
- doc/method_list.html
|
160
|
+
- doc/top-level-namespace.html
|
161
|
+
- lib/schemacop.rb
|
162
|
+
- lib/schemacop/exceptions.rb
|
163
|
+
- lib/schemacop/validator.rb
|
164
|
+
- schemacop.gemspec
|
165
|
+
- test/schemacop_validator_test.rb
|
166
|
+
homepage:
|
167
|
+
licenses: []
|
168
|
+
metadata: {}
|
169
|
+
post_install_message:
|
170
|
+
rdoc_options: []
|
171
|
+
require_paths:
|
172
|
+
- lib
|
173
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
174
|
+
requirements:
|
175
|
+
- - ">="
|
176
|
+
- !ruby/object:Gem::Version
|
177
|
+
version: '0'
|
178
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
|
+
requirements:
|
180
|
+
- - ">="
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: '0'
|
183
|
+
requirements: []
|
184
|
+
rubyforge_project:
|
185
|
+
rubygems_version: 2.4.5.1
|
186
|
+
signing_key:
|
187
|
+
specification_version: 4
|
188
|
+
summary: Schemacop validates ruby structures consisting of nested hashes and arrays
|
189
|
+
against simple schema definitions.
|
190
|
+
test_files:
|
191
|
+
- test/schemacop_validator_test.rb
|
192
|
+
has_rdoc:
|