activerecord_json_validator 0.0.1 → 0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b2e14ebf0558c907c5f2fc289f223cf4a6d0231b
4
- data.tar.gz: ae51252742c95fc74872aa574c619269efcf9393
3
+ metadata.gz: e29421d6ac9835c09df419b687bdc6b018314d7c
4
+ data.tar.gz: 7aa8a0cb8c45e9869a245b3db8da51df08e28393
5
5
  SHA512:
6
- metadata.gz: 4238c09464f4a25bb409046897fc7d56d1f13235d64999f4fc01b0e7db3fe9407cea121550a0ef8de4405a12813fb4b3397cc646f659186a4013ad7fb890d6be
7
- data.tar.gz: 4c963fcccd39a4fe0629f69962dcd32a88fc0267b61179b5829a7ac664c8136bac43d46a081fd4ec3cf873d5143a8890df159713b25bb245efeda4c6cbc71a81
6
+ metadata.gz: 43bc39dab8b9630be6bbfbf242b1e71374a51e59a192597b81eabe3751633c4b7f15f164f4bf728bee99aa3c1d376b6b40a6e6f913d2b393798efa97f3bedbcd
7
+ data.tar.gz: 97ca990aeb1785b15e0ce2db84b9301e26dea7267680f140dd2e22ddb2aab7e3bf0c7984dfae7947bf2e1cea5fad051bdbbfb621f6a64647e59620a5486bf9b9
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
@@ -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 "name"
16
- t.json "profile"
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,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec path: '../'
4
+
5
+ gem 'activerecord', '~> 3.2.0'
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec path: '../'
4
+
5
+ gem 'activerecord', '~> 4.0.0'
@@ -1,5 +1,5 @@
1
1
  module ActiveRecord
2
2
  module JSONValidator
3
- VERSION = '0.0.1'
3
+ VERSION = '0.1'
4
4
  end
5
5
  end
@@ -1,3 +1,4 @@
1
1
  require 'active_record'
2
+ require 'json-schema'
2
3
  require 'active_record/json_validator/version'
3
4
  require 'active_record/json_validator/validator'
@@ -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
@@ -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,9 @@
1
+ class DatabaseAdapter
2
+ def initialize(opts = {})
3
+ @database = opts[:database]
4
+ end
5
+
6
+ def establish_connection!
7
+ ActiveRecord::Base.establish_connection(database_configuration)
8
+ end
9
+ 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.0.1
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