activerecord_json_validator 2.1.0 → 2.1.2

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
  SHA256:
3
- metadata.gz: 4d73e408cd69522e53d830509f0a4772607eeee5b7a0102b25aea4a0e3f2fb62
4
- data.tar.gz: 9f3b97d92b0c5f8a55608fdd590e906b576d00036c87cff151967392244b7ada
3
+ metadata.gz: 79e0a6948c155c358b3345637b6df84dc3b77ac1ea22ded1db53b35eefa4ad7c
4
+ data.tar.gz: 1a4c6092ee7635dd0b43767d08272a5b389c10ce9daa7ff379e89e04d4ee6766
5
5
  SHA512:
6
- metadata.gz: f2fcf0da7354630f8619d075988f904dbb8b61b977e2f2fdd87f2f29fc545d5aaf0a0331e57c5e8d2bce5eeef9913900392a3a2978f6df17dd840546b9a706ca
7
- data.tar.gz: 7fd00e24032a036bccf04d1e9c677de07ae085ee7d46f658b8dcda0e2bc35d0cb0c263662b18c0fb86ed144eb3d248cfc213f9216641abae84d0c5afd9403675
6
+ metadata.gz: 1f4f46c2db2c1b5f808fc98e003c4728b07a958a233218b1c565cb71a0bcf50118b7c1fb921735b4ee4e071f51fe458dca0e85e2267f262f30815c7b816afaac
7
+ data.tar.gz: 823a2e6c404e9939976177d6c0221d2ed1d0762315ec1767721492ce764302f734c0563c4e04d2f1ccf114ac40aeeb07027550dc48f1977616df548882fcf4d7
@@ -0,0 +1,37 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+ branches:
9
+ - '**'
10
+
11
+ jobs:
12
+ ci:
13
+ runs-on: ubuntu-latest
14
+
15
+ services:
16
+ db:
17
+ image: postgres:10.19
18
+ env:
19
+ POSTGRES_DB: activerecord_json_validator_test
20
+ POSTGRES_USER: postgres
21
+ POSTGRES_PASSWORD: postgres
22
+ ports: ['5432:5432']
23
+ options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
24
+
25
+ env:
26
+ CANONICAL_HOST: localhost
27
+ DATABASE_URL: postgres://postgres:postgres@localhost/activerecord_json_validator_test
28
+ DB_ADAPTER: postgresql
29
+
30
+ steps:
31
+ - uses: actions/checkout@v2
32
+ - uses: ruby/setup-ruby@v1
33
+ with:
34
+ ruby-version: '2.7.5'
35
+ bundler-cache: true
36
+ - run: bundle exec rubocop
37
+ - run: bundle exec rake spec
data/.rubocop.yml CHANGED
@@ -1,6 +1,11 @@
1
1
  AllCops:
2
+ Include:
3
+ - Rakefile
4
+ - Gemfile
5
+ - '**/*.rb'
2
6
  Exclude:
3
7
  - activerecord_json_validator.gemspec
8
+ - vendor/**/*
4
9
 
5
10
  Documentation:
6
11
  Enabled: false
data/LICENSE.md CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013-2016, Mirego
1
+ Copyright (c) 2013-2022, Mirego
2
2
  All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without
data/README.md CHANGED
@@ -3,10 +3,10 @@
3
3
  <img src="https://user-images.githubusercontent.com/11348/126779905-3468eb15-d554-46d5-925b-235f68169d86.png" alt="" />
4
4
  </a>
5
5
  <br />
6
- <code>ActiveRecord::JSONValidator</code> makes it easy to validate<br /> JSON attributes against a <a href="http://json-schema.org/">JSON schema</a>.
6
+ <code>ActiveRecord::JSONValidator</code> makes it easy to validate<br /> JSON attributes against a <a href="https://json-schema.org/">JSON schema</a>.
7
7
  <br /><br />
8
- <a href="https://rubygems.org/gems/activerecord_json_validator"><img src="http://img.shields.io/gem/v/activerecord_json_validator.svg" /></a>
9
- <a href="https://travis-ci.org/mirego/activerecord_json_validator"><img src="http://img.shields.io/travis/mirego/activerecord_json_validator.svg" /></a>
8
+ <a href="https://rubygems.org/gems/activerecord_json_validator"><img src="https://img.shields.io/gem/v/activerecord_json_validator.svg" /></a>
9
+ <a href="https://github.com/mirego/activerecord_json_validator/actions/workflows/ci.yaml"><img src="https://github.com/mirego/activerecord_json_validator/actions/workflows/ci.yaml/badge.svg" /></a>
10
10
  </p>
11
11
 
12
12
  ---
@@ -47,7 +47,7 @@ end
47
47
 
48
48
  class User < ActiveRecord::Base
49
49
  # Constants
50
- PROFILE_JSON_SCHEMA = Pathname.new(Rails.root.join('config', 'schemas', 'profile.json'))
50
+ PROFILE_JSON_SCHEMA = Rails.root.join('config', 'schemas', 'profile.json')
51
51
 
52
52
  # Validations
53
53
  validates :name, presence: true
@@ -85,8 +85,8 @@ context of the validated record (`Symbol` will be sent as a method and the
85
85
  ```ruby
86
86
  class User < ActiveRecord::Base
87
87
  # Constants
88
- PROFILE_REGULAR_JSON_SCHEMA = Rails.root.join('config', 'schemas', 'profile.json_schema').to_s
89
- PROFILE_ADMIN_JSON_SCHEMA = Rails.root.join('config', 'schemas', 'profile_admin.json_schema').to_s
88
+ PROFILE_REGULAR_JSON_SCHEMA = Rails.root.join('config', 'schemas', 'profile.json_schema')
89
+ PROFILE_ADMIN_JSON_SCHEMA = Rails.root.join('config', 'schemas', 'profile_admin.json_schema')
90
90
 
91
91
  # Validations
92
92
  validates :profile, presence: true, json: { schema: lambda { dynamic_profile_schema } } # `schema: :dynamic_profile_schema` would also work
@@ -97,6 +97,20 @@ class User < ActiveRecord::Base
97
97
  end
98
98
  ```
99
99
 
100
+ The schema is passed to the `JSONSchemer.schema` function, so it can be anything supported by it:
101
+
102
+ ```ruby
103
+ class User < ActiveRecord::Base
104
+ # Constants
105
+ JSON_SCHEMA = Rails.root.join('config', 'schemas', 'profile.json_schema')
106
+ # JSON_SCHEMA = { 'type' => 'object', 'properties' => { 'foo' => { 'type' => 'integer', 'minimum' => 3 } } }
107
+ # JSON_SCHEMA = '{"type":"object","properties":{"foo":{"type":"integer","minimum":3}}}'
108
+
109
+ # Validations
110
+ validates :profile, presence: true, json: { schema: JSON_SCHEMA }
111
+ end
112
+ ```
113
+
100
114
  ##### Message
101
115
 
102
116
  Like any other ActiveModel validation, you can specify either a `Symbol` or
@@ -123,12 +137,12 @@ user.errors.full_messages
123
137
 
124
138
  ## License
125
139
 
126
- `ActiveRecord::JSONValidator` is © 2013-2016 [Mirego](http://www.mirego.com) and may be freely distributed under the [New BSD license](http://opensource.org/licenses/BSD-3-Clause). See the [`LICENSE.md`](https://github.com/mirego/activerecord_json_validator/blob/master/LICENSE.md) file.
140
+ `ActiveRecord::JSONValidator` is © 2013-2022 [Mirego](https://www.mirego.com) and may be freely distributed under the [New BSD license](https://opensource.org/licenses/BSD-3-Clause). See the [`LICENSE.md`](https://github.com/mirego/activerecord_json_validator/blob/master/LICENSE.md) file.
127
141
 
128
- The tree logo is based on [this lovely icon](http://thenounproject.com/term/tree/51004/) by [Sara Quintana](http://thenounproject.com/sara.quintana.75), from The Noun Project. Used under a [Creative Commons BY 3.0](http://creativecommons.org/licenses/by/3.0/) license.
142
+ The tree logo is based on [this lovely icon](https://thenounproject.com/term/tree/51004/) by [Sara Quintana](https://thenounproject.com/sara.quintana.75), from The Noun Project. Used under a [Creative Commons BY 3.0](https://creativecommons.org/licenses/by/3.0/) license.
129
143
 
130
144
  ## About Mirego
131
145
 
132
- [Mirego](http://mirego.com) is a team of passionate people who believe that work is a place where you can innovate and have fun. We're a team of [talented people](http://life.mirego.com) who imagine and build beautiful Web and mobile applications. We come together to share ideas and [change the world](http://mirego.org).
146
+ [Mirego](https://www.mirego.com) is a team of passionate people who believe that work is a place where you can innovate and have fun. We're a team of [talented people](https://life.mirego.com) who imagine and build beautiful Web and mobile applications. We come together to share ideas and [change the world](https://www.mirego.org).
133
147
 
134
- We also [love open-source software](http://open.mirego.com) and we try to give back to the community as much as we can.
148
+ We also [love open-source software](https://open.mirego.com) and we try to give back to the community as much as we can.
@@ -22,10 +22,10 @@ Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency 'rake'
23
23
  spec.add_development_dependency 'rspec', '~> 3.5'
24
24
  spec.add_development_dependency 'pg'
25
- spec.add_development_dependency 'mysql2'
26
25
  spec.add_development_dependency 'activesupport', '>= 4.2.0', '< 8'
27
- spec.add_development_dependency 'phare'
28
26
  spec.add_development_dependency 'rubocop', '~> 0.28'
27
+ spec.add_development_dependency 'rubocop-rspec', '~> 1.44'
28
+ spec.add_development_dependency 'rubocop-standard', '~> 6.0'
29
29
 
30
30
  spec.add_dependency 'json_schemer', '~> 0.2.18'
31
31
  spec.add_dependency 'activerecord', '>= 4.2.0', '< 8'
@@ -13,7 +13,10 @@ class JsonValidator < ActiveModel::EachValidator
13
13
  end
14
14
 
15
15
  # Validate the JSON value with a JSON schema path or String
16
- def validate_each(record, attribute, value)
16
+ def validate_each(record, attribute, _value)
17
+ # Get the _actual_ attribute value, not the getter method value
18
+ value = record[attribute]
19
+
17
20
  # Validate value with JSON Schemer
18
21
  errors = JSONSchemer.schema(schema(record), **options.fetch(:options)).validate(value).to_a
19
22
 
@@ -22,6 +25,7 @@ class JsonValidator < ActiveModel::EachValidator
22
25
 
23
26
  # Add error message to the attribute
24
27
  message(errors).each do |error|
28
+ error = error.is_a?(Hash) ? JSONSchemer::Errors.pretty(error) : error
25
29
  record.errors.add(attribute, error, value: value)
26
30
  end
27
31
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module ActiveRecord
4
4
  module JSONValidator
5
- VERSION = '2.1.0'
5
+ VERSION = '2.1.2'
6
6
  end
7
7
  end
@@ -9,6 +9,7 @@ describe JsonValidator do
9
9
  run_migration do
10
10
  create_table(:users, force: true) do |t|
11
11
  t.text :data
12
+ t.json :smart_data
12
13
  end
13
14
  end
14
15
 
@@ -24,16 +25,29 @@ describe JsonValidator do
24
25
  }
25
26
  '
26
27
  serialize :data, JSON
27
- validates :data, json: { schema: schema, message: ->(errors) { errors.map { |error| error['details'].to_a.flatten.join(' ') } } }
28
+ serialize :other_data, JSON
29
+ validates :data, json: { schema: schema, message: ->(errors) { errors } }
30
+ validates :other_data, json: { schema: schema, message: ->(errors) { errors.map { |error| error['details'].to_a.flatten.join(' ') } } }
31
+ validates :smart_data, json: { schema: schema, message: ->(errors) { errors } }
32
+
33
+ def smart_data
34
+ OpenStruct.new(self[:smart_data])
35
+ end
28
36
  end
29
37
  end
30
38
 
31
39
  context 'with valid JSON data but schema errors' do
32
- let(:user) { User.new(data: '{"city":"Quebec City"}') }
40
+ let(:user) do
41
+ User.new(
42
+ data: '{"city":"Quebec City"}',
43
+ other_data: '{"city":"Quebec City"}',
44
+ smart_data: { country: 'Canada', city: 'Quebec City' }
45
+ )
46
+ end
33
47
 
34
48
  specify do
35
49
  expect(user).not_to be_valid
36
- expect(user.errors.full_messages).to eql(['Data missing_keys country'])
50
+ expect(user.errors.full_messages).to eql(['Data root is missing required keys: country', 'Other data missing_keys country'])
37
51
  expect(user.data).to eql({ 'city' => 'Quebec City' })
38
52
  expect(user.data_invalid_json).to be_nil
39
53
  end
data/spec/spec_helper.rb CHANGED
@@ -4,7 +4,6 @@ $LOAD_PATH.unshift File.expand_path('lib', __dir__)
4
4
 
5
5
  require 'active_support/all'
6
6
  require 'rspec'
7
- require 'mysql2'
8
7
  require 'pg'
9
8
 
10
9
  require 'activerecord_json_validator'
@@ -6,6 +6,6 @@ class DatabaseAdapter
6
6
  end
7
7
 
8
8
  def establish_connection!
9
- ActiveRecord::Base.establish_connection(database_configuration)
9
+ ActiveRecord::Base.establish_connection(ENV['DATABASE_URL'])
10
10
  end
11
11
  end
@@ -3,15 +3,6 @@
3
3
  require_relative 'database_adapter'
4
4
 
5
5
  class Mysql2Adapter < DatabaseAdapter
6
- def database_configuration
7
- {
8
- adapter: 'mysql2',
9
- database: @database,
10
- username: 'travis',
11
- encoding: 'utf8'
12
- }
13
- end
14
-
15
6
  def reset_database!
16
7
  ActiveRecord::Base.connection.execute("SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') FROM information_schema.tables WHERE table_schema = '#{@database}';")
17
8
  end
@@ -3,15 +3,6 @@
3
3
  require_relative 'database_adapter'
4
4
 
5
5
  class PostgresqlAdapter < DatabaseAdapter
6
- def database_configuration
7
- {
8
- adapter: 'postgresql',
9
- database: @database,
10
- user: 'postgres',
11
- schema_search_path: 'public'
12
- }
13
- end
14
-
15
6
  def reset_database!
16
7
  ActiveRecord::Base.connection.execute('drop schema public cascade;')
17
8
  ActiveRecord::Base.connection.execute('create schema public;')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord_json_validator
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rémi Prévost
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-08 00:00:00.000000000 Z
11
+ date: 2022-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,20 +66,6 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
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
69
  - !ruby/object:Gem::Dependency
84
70
  name: activesupport
85
71
  requirement: !ruby/object:Gem::Requirement
@@ -101,33 +87,47 @@ dependencies:
101
87
  - !ruby/object:Gem::Version
102
88
  version: '8'
103
89
  - !ruby/object:Gem::Dependency
104
- name: phare
90
+ name: rubocop
105
91
  requirement: !ruby/object:Gem::Requirement
106
92
  requirements:
107
- - - ">="
93
+ - - "~>"
108
94
  - !ruby/object:Gem::Version
109
- version: '0'
95
+ version: '0.28'
110
96
  type: :development
111
97
  prerelease: false
112
98
  version_requirements: !ruby/object:Gem::Requirement
113
99
  requirements:
114
- - - ">="
100
+ - - "~>"
115
101
  - !ruby/object:Gem::Version
116
- version: '0'
102
+ version: '0.28'
117
103
  - !ruby/object:Gem::Dependency
118
- name: rubocop
104
+ name: rubocop-rspec
119
105
  requirement: !ruby/object:Gem::Requirement
120
106
  requirements:
121
107
  - - "~>"
122
108
  - !ruby/object:Gem::Version
123
- version: '0.28'
109
+ version: '1.44'
124
110
  type: :development
125
111
  prerelease: false
126
112
  version_requirements: !ruby/object:Gem::Requirement
127
113
  requirements:
128
114
  - - "~>"
129
115
  - !ruby/object:Gem::Version
130
- version: '0.28'
116
+ version: '1.44'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rubocop-standard
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '6.0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '6.0'
131
131
  - !ruby/object:Gem::Dependency
132
132
  name: json_schemer
133
133
  requirement: !ruby/object:Gem::Requirement
@@ -170,19 +170,15 @@ executables: []
170
170
  extensions: []
171
171
  extra_rdoc_files: []
172
172
  files:
173
+ - ".github/workflows/ci.yaml"
173
174
  - ".gitignore"
174
175
  - ".rspec"
175
176
  - ".rubocop.yml"
176
- - ".travis.yml"
177
177
  - Gemfile
178
178
  - LICENSE.md
179
179
  - README.md
180
180
  - Rakefile
181
181
  - activerecord_json_validator.gemspec
182
- - gemfiles/Gemfile.activerecord-4.2.x
183
- - gemfiles/Gemfile.activerecord-5.0.x
184
- - gemfiles/Gemfile.activerecord-6.0.x
185
- - gemfiles/Gemfile.activerecord-7.0.x
186
182
  - lib/active_record/json_validator/validator.rb
187
183
  - lib/active_record/json_validator/version.rb
188
184
  - lib/activerecord_json_validator.rb
data/.travis.yml DELETED
@@ -1,41 +0,0 @@
1
- language: ruby
2
-
3
- rvm:
4
- - 2.4.6
5
- - 2.6.3
6
- - 2.7.5
7
-
8
- gemfile:
9
- - gemfiles/Gemfile.activerecord-4.2.x
10
- - gemfiles/Gemfile.activerecord-5.0.x
11
- - gemfiles/Gemfile.activerecord-6.0.x
12
- - gemfiles/Gemfile.activerecord-7.0.x
13
-
14
- matrix:
15
- exclude:
16
- - gemfile: gemfiles/Gemfile.activerecord-6.0.x
17
- rvm: 2.4.6
18
- - gemfile: gemfiles/Gemfile.activerecord-7.0.x
19
- rvm: 2.4.6
20
- - gemfile: gemfiles/Gemfile.activerecord-7.0.x
21
- rvm: 2.6.3
22
- - gemfile: gemfiles/Gemfile.activerecord-4.2.x
23
- rvm: 2.7.5
24
-
25
- sudo: false
26
-
27
- services:
28
- - mysql
29
- - postgresql
30
-
31
- env:
32
- - DB_ADAPTER=mysql2
33
- - DB_ADAPTER=postgresql
34
-
35
- before_script:
36
- - mysql -e 'create database activerecord_json_validator_test;'
37
- - psql -c 'create database activerecord_json_validator_test;' -U postgres
38
-
39
- script:
40
- - 'echo "Checking code style" && bundle exec phare'
41
- - 'echo "Running tests" && bundle exec rake spec'
@@ -1,6 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec path: '../'
4
-
5
- gem 'activerecord', '~> 4.2'
6
- gem 'pg', '~> 0.15'
@@ -1,5 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec path: '../'
4
-
5
- gem 'activerecord', '~> 5.0'
@@ -1,5 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec path: '../'
4
-
5
- gem 'activerecord', '~> 6.0'
@@ -1,5 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec path: '../'
4
-
5
- gem 'activerecord', '~> 7.0.0.rc1'