activerecord_json_validator 0.0.1 → 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 +4 -4
- data/.rspec +1 -0
- data/.travis.yml +19 -0
- data/README.md +29 -2
- data/activerecord_json_validator.gemspec +5 -0
- data/gemfiles/Gemfile.activerecord-3.2.x +5 -0
- data/gemfiles/Gemfile.activerecord-4.0 +5 -0
- data/lib/active_record/json_validator/version.rb +1 -1
- data/lib/activerecord_json_validator.rb +1 -0
- data/spec/json_validator_spec.rb +42 -0
- data/spec/spec_helper.rb +25 -0
- data/spec/support/macros/database/database_adapter.rb +9 -0
- data/spec/support/macros/database/mysql_adapter.rb +16 -0
- data/spec/support/macros/database/postgresql_adapter.rb +17 -0
- data/spec/support/macros/database_macros.rb +22 -0
- data/spec/support/macros/model_macros.rb +8 -0
- metadata +90 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e29421d6ac9835c09df419b687bdc6b018314d7c
|
4
|
+
data.tar.gz: 7aa8a0cb8c45e9869a245b3db8da51df08e28393
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 43bc39dab8b9630be6bbfbf242b1e71374a51e59a192597b81eabe3751633c4b7f15f164f4bf728bee99aa3c1d376b6b40a6e6f913d2b393798efa97f3bedbcd
|
7
|
+
data.tar.gz: 97ca990aeb1785b15e0ce2db84b9301e26dea7267680f140dd2e22ddb2aab7e3bf0c7984dfae7947bf2e1cea5fad051bdbbfb621f6a64647e59620a5486bf9b9
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/.travis.yml
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
language: ruby
|
2
|
+
|
3
|
+
rvm:
|
4
|
+
- 2.0.0
|
5
|
+
- 1.9.3
|
6
|
+
|
7
|
+
gemfile:
|
8
|
+
- gemfiles/Gemfile.activerecord-4.0
|
9
|
+
- gemfiles/Gemfile.activerecord-3.2.x
|
10
|
+
|
11
|
+
env:
|
12
|
+
- DB_ADAPTER=mysql2
|
13
|
+
- DB_ADAPTER=postgresql
|
14
|
+
|
15
|
+
before_script:
|
16
|
+
- mysql -e 'create database activerecord_json_validator_test;'
|
17
|
+
- psql -c 'create database activerecord_json_validator_test;' -U postgres
|
18
|
+
|
19
|
+
script: "echo 'DO IT' && bundle exec rake spec"
|
data/README.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# ActiveRecord::JSONValidator
|
2
2
|
|
3
|
+
`ActiveRecord::JSONValidator` makes it easy to validate JSON attributes against a JSON schema.
|
4
|
+
|
5
|
+
<a href="https://rubygems.org/gems/activerecord_json_validator"><img src="https://badge.fury.io/rb/activerecord_json_validator.png" /></a>
|
6
|
+
<a href="https://travis-ci.org/mirego/activerecord_json_validator"><img src="https://travis-ci.org/mirego/activerecord_json_validator.png?branch=master" /></a>
|
7
|
+
<a href='https://coveralls.io/r/mirego/activerecord_json_validator?branch=master'><img src='https://coveralls.io/repos/mirego/activerecord_json_validator/badge.png?branch=master' alt='Coverage Status' /></a>
|
8
|
+
|
3
9
|
## Installation
|
4
10
|
|
5
11
|
Add this line to your application's Gemfile:
|
@@ -10,10 +16,25 @@ gem 'activerecord_json_validator'
|
|
10
16
|
|
11
17
|
## Usage
|
12
18
|
|
19
|
+
### JSON Schema
|
20
|
+
|
21
|
+
```json
|
22
|
+
{
|
23
|
+
"type": "object",
|
24
|
+
"$schema": "http://json-schema.org/draft-03/schema",
|
25
|
+
"properties": {
|
26
|
+
"city": { "type": "string", "required": false },
|
27
|
+
"country": { "type": "string", "required": true }
|
28
|
+
}
|
29
|
+
}
|
30
|
+
```
|
31
|
+
|
32
|
+
### Ruby
|
33
|
+
|
13
34
|
```ruby
|
14
35
|
create_table "users" do |t|
|
15
|
-
t.string
|
16
|
-
t.json
|
36
|
+
t.string "name"
|
37
|
+
t.json "profile" # First-class JSON with PostgreSQL, yo.
|
17
38
|
end
|
18
39
|
|
19
40
|
class User < ActiveRecord::Base
|
@@ -24,6 +45,12 @@ class User < ActiveRecord::Base
|
|
24
45
|
validates :name, presence: true
|
25
46
|
validates :profile, presence: true, json: { schema: PROFILE_JSON_SCHEMA }
|
26
47
|
end
|
48
|
+
|
49
|
+
user = User.new(name: 'Samuel Garneau', profile: { city: 'Quebec City' })
|
50
|
+
user.valid? # => false
|
51
|
+
|
52
|
+
user = User.new(name: 'Samuel Garneau', profile: { city: 'Quebec City', country: 'Canada' })
|
53
|
+
user.valid? # => true
|
27
54
|
```
|
28
55
|
|
29
56
|
## License
|
@@ -21,6 +21,11 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
22
22
|
spec.add_development_dependency 'rake'
|
23
23
|
spec.add_development_dependency 'rspec', '~> 2.14'
|
24
|
+
spec.add_development_dependency 'pg'
|
25
|
+
spec.add_development_dependency 'mysql2'
|
26
|
+
spec.add_development_dependency 'coveralls'
|
27
|
+
spec.add_development_dependency 'activesupport', '>= 3.0.0'
|
24
28
|
|
29
|
+
spec.add_dependency 'json-schema', '~> 2.1'
|
25
30
|
spec.add_dependency 'activerecord', '>= 3.0.0'
|
26
31
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe JsonValidator do
|
4
|
+
before do
|
5
|
+
run_migration do
|
6
|
+
create_table(:users, force: true) do |t|
|
7
|
+
t.string :name
|
8
|
+
t.text :profile
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
spawn_model :User do
|
13
|
+
schema = {
|
14
|
+
type: 'object',
|
15
|
+
:'$schema' => 'http://json-schema.org/draft-03/schema',
|
16
|
+
properties: {
|
17
|
+
city: { type: 'string', required: false },
|
18
|
+
country: { type: 'string', required: true }
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
serialize :profile, JSON
|
23
|
+
validates :name, presence: true
|
24
|
+
validates :profile, presence: true, json: { schema: schema }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'with blank JSON value' do
|
29
|
+
let(:attributes) { { name: 'Samuel Garneau', profile: {} } }
|
30
|
+
it { expect(User.new(attributes)).to_not be_valid }
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'with invalid JSON value' do
|
34
|
+
let(:attributes) { { name: 'Samuel Garneau', profile: { city: 'Quebec City' } } }
|
35
|
+
it { expect(User.new(attributes)).to_not be_valid }
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'with valid JSON value' do
|
39
|
+
let(:attributes) { { name: 'Samuel Garneau', profile: { country: 'CA' } } }
|
40
|
+
it { expect(User.new(attributes)).to be_valid }
|
41
|
+
end
|
42
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
$:.unshift File.expand_path('../lib', __FILE__)
|
2
|
+
|
3
|
+
require 'coveralls'
|
4
|
+
Coveralls.wear!
|
5
|
+
|
6
|
+
require 'active_support/all'
|
7
|
+
require 'rspec'
|
8
|
+
require 'mysql2'
|
9
|
+
require 'pg'
|
10
|
+
|
11
|
+
require 'activerecord_json_validator'
|
12
|
+
|
13
|
+
# Require our macros and extensions
|
14
|
+
Dir[File.expand_path('../../spec/support/macros/**/*.rb', __FILE__)].map(&method(:require))
|
15
|
+
|
16
|
+
RSpec.configure do |config|
|
17
|
+
# Include our macros
|
18
|
+
config.include DatabaseMacros
|
19
|
+
config.include ModelMacros
|
20
|
+
|
21
|
+
config.before :each do
|
22
|
+
adapter = ENV['DB_ADAPTER'] || 'postgresql'
|
23
|
+
setup_database(adapter: adapter, database: 'activerecord_json_validator_test')
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require_relative 'database_adapter'
|
2
|
+
|
3
|
+
class Mysql2Adapter < DatabaseAdapter
|
4
|
+
def database_configuration
|
5
|
+
{
|
6
|
+
adapter: 'mysql2',
|
7
|
+
database: @database,
|
8
|
+
username: 'travis',
|
9
|
+
encoding: 'utf8'
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def reset_database!
|
14
|
+
ActiveRecord::Base.connection.execute("SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') FROM information_schema.tables WHERE table_schema = '#{@database}';")
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative 'database_adapter'
|
2
|
+
|
3
|
+
class PostgresqlAdapter < DatabaseAdapter
|
4
|
+
def database_configuration
|
5
|
+
{
|
6
|
+
adapter: 'postgresql',
|
7
|
+
database: @database,
|
8
|
+
user: 'postgres',
|
9
|
+
schema_search_path: 'public'
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def reset_database!
|
14
|
+
ActiveRecord::Base.connection.execute('drop schema public cascade;')
|
15
|
+
ActiveRecord::Base.connection.execute('create schema public;')
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module DatabaseMacros
|
2
|
+
# Run migrations in the test database
|
3
|
+
def run_migration(&block)
|
4
|
+
# Create a new migration class
|
5
|
+
klass = Class.new(ActiveRecord::Migration)
|
6
|
+
|
7
|
+
# Create a new `up` that executes the argument
|
8
|
+
klass.send(:define_method, :up) { self.instance_exec(&block) }
|
9
|
+
|
10
|
+
# Create a new instance of it and execute its `up` method
|
11
|
+
klass.new.up
|
12
|
+
end
|
13
|
+
|
14
|
+
def setup_database(opts = {})
|
15
|
+
adapter = "#{opts[:adapter].capitalize}Adapter".constantize.new(database: opts[:database])
|
16
|
+
adapter.establish_connection!
|
17
|
+
adapter.reset_database!
|
18
|
+
|
19
|
+
# Silence everything
|
20
|
+
ActiveRecord::Base.logger = ActiveRecord::Migration.verbose = false
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module ModelMacros
|
2
|
+
# Create a new model class
|
3
|
+
def spawn_model(klass_name, parent_klass = ActiveRecord::Base, &block)
|
4
|
+
Object.instance_eval { remove_const klass_name } if Object.const_defined?(klass_name)
|
5
|
+
Object.const_set(klass_name, Class.new(parent_klass))
|
6
|
+
Object.const_get(klass_name).class_eval(&block) if block_given?
|
7
|
+
end
|
8
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord_json_validator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.1'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rémi Prévost
|
@@ -52,6 +52,76 @@ dependencies:
|
|
52
52
|
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '2.14'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pg
|
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: mysql2
|
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: coveralls
|
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: activesupport
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 3.0.0
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 3.0.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: '2.1'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ~>
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '2.1'
|
55
125
|
- !ruby/object:Gem::Dependency
|
56
126
|
name: activerecord
|
57
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -75,14 +145,25 @@ extensions: []
|
|
75
145
|
extra_rdoc_files: []
|
76
146
|
files:
|
77
147
|
- .gitignore
|
148
|
+
- .rspec
|
149
|
+
- .travis.yml
|
78
150
|
- Gemfile
|
79
151
|
- LICENSE.md
|
80
152
|
- README.md
|
81
153
|
- Rakefile
|
82
154
|
- activerecord_json_validator.gemspec
|
155
|
+
- gemfiles/Gemfile.activerecord-3.2.x
|
156
|
+
- gemfiles/Gemfile.activerecord-4.0
|
83
157
|
- lib/active_record/json_validator/validator.rb
|
84
158
|
- lib/active_record/json_validator/version.rb
|
85
159
|
- lib/activerecord_json_validator.rb
|
160
|
+
- spec/json_validator_spec.rb
|
161
|
+
- spec/spec_helper.rb
|
162
|
+
- spec/support/macros/database/database_adapter.rb
|
163
|
+
- spec/support/macros/database/mysql_adapter.rb
|
164
|
+
- spec/support/macros/database/postgresql_adapter.rb
|
165
|
+
- spec/support/macros/database_macros.rb
|
166
|
+
- spec/support/macros/model_macros.rb
|
86
167
|
homepage: https://open.mirego.com/activerecord_json_validator
|
87
168
|
licenses:
|
88
169
|
- BSD 3-Clause
|
@@ -108,4 +189,11 @@ signing_key:
|
|
108
189
|
specification_version: 4
|
109
190
|
summary: ActiveRecord::JSONValidator makes it easy to validate JSON attributes with
|
110
191
|
a JSON schema.
|
111
|
-
test_files:
|
192
|
+
test_files:
|
193
|
+
- spec/json_validator_spec.rb
|
194
|
+
- spec/spec_helper.rb
|
195
|
+
- spec/support/macros/database/database_adapter.rb
|
196
|
+
- spec/support/macros/database/mysql_adapter.rb
|
197
|
+
- spec/support/macros/database/postgresql_adapter.rb
|
198
|
+
- spec/support/macros/database_macros.rb
|
199
|
+
- spec/support/macros/model_macros.rb
|