model_validator 1.2.0 → 1.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d39b8ed8b26347cd45b16cd9c446bc30a926c79f507c06c2e6d86b1df354aa90
4
- data.tar.gz: a5fef5baa38f2e5ee415ff8bcc30b5f31c344d86fd02b50bad772b2b4c6a0968
3
+ metadata.gz: f891705a9cd1d3195f54ba04d7d1a4634fb921527dd2472975d249ad43835fab
4
+ data.tar.gz: b133ec1cbdbb89c9b43d42871dd65cbbc2baa614f776b89ce5b5cae545bd21f0
5
5
  SHA512:
6
- metadata.gz: 3359f10c445f0bf9a7f6f186e3e8a96d087b92720bca005782f4edcc3b9a1ce0f2dbbc9d8dea938e9302a89b0f64db93d3494ed0683a5280cd34ac4daf0c2af5
7
- data.tar.gz: db3cd3080195468d3e338775c52749418063156562944d2ac2e6ade738bda764b039c942caf9492ed0044333d53282a39d028e37f9e4d0952dad20ad0f31699b
6
+ metadata.gz: 54adca12ba9576cb7b12eea53cdd04717dabc3dfc2bb494a8fae30ae664453b75707f3929fabd37a0f32f324b0d9dd32af351e0394716e3ac2f544b2f6529ba5
7
+ data.tar.gz: 63e5029d404976f34008d2e9bc5dc5713dd7ba26681c3e8bb8fa76567c3b5dbab4acfcc7146da67340b7a66566b57008f7ef435ca7c3e5a40f3dcbe8050aad33
data/.travis.yml CHANGED
@@ -4,3 +4,4 @@ cache: bundler
4
4
  rvm:
5
5
  - 2.7.2
6
6
  before_install: gem install bundler -v 2.2.7
7
+ script: make test
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- model_validator (1.2.0)
4
+ model_validator (1.2.1)
5
5
  rails (>= 4.0)
6
6
 
7
7
  GEM
data/Makefile CHANGED
@@ -5,6 +5,7 @@ install: ## Install dependencies
5
5
  bundle install
6
6
 
7
7
  test: ## Test application
8
+ rm -f db/test.sqlite3
8
9
  bundle exec rspec
9
10
 
10
11
  lint: ## Check file format, smell code, conventions…
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
- [![Build Status](https://www.travis-ci.com/jibidus/model_validation.svg?branch=main)](https://www.travis-ci.com/jibidus/model_validation)
1
+ [![Build Status](https://www.travis-ci.com/jibidus/model_validator.svg?branch=main)](https://www.travis-ci.com/jibidus/model_validator)
2
2
  [![Coverage Status](https://coveralls.io/repos/github/jibidus/model_validation/badge.svg?branch=main)](https://coveralls.io/github/jibidus/model_validation?branch=main)
3
+ [![Gem Version](https://badge.fury.io/rb/model_validator.svg)](https://badge.fury.io/rb/model_validator)
3
4
 
4
5
  # model_validator
5
6
 
@@ -15,16 +16,16 @@ This is useful since error may occur when manipulating such data.
15
16
 
16
17
  It is recommended to use this gem during deployment step:
17
18
 
18
- - restore production database in a staging/preprod/non-production environment
19
- - validate the database
20
- - add missing migrations in case of violations
21
- - repeat validation and fix until there is no more violation
22
- - then, you are ready to deploy your application in production
19
+ 1. restore production database in a staging/preprod/non-production environment
20
+ 2. validate the database
21
+ 3. add missing migrations in case of violations
22
+ 4. repeat validation and fix until there is no more violation
23
+ 5. then, you are ready to deploy your application in production
23
24
 
24
25
  ## Limitations
25
26
 
26
27
  This gem fetch **all** record in database, and, for each record run the Active Record validation.
27
- So, because of performances reason, this is only acceptable for tiny databases (thousand of records).
28
+ So, because of performances reason, this may be only acceptable for tiny databases (thousand of records).
28
29
 
29
30
  ## Installation
30
31
 
@@ -92,8 +93,8 @@ Many already existing gems may do the same, but none are satisfying:
92
93
 
93
94
  - [validb](https://github.com/jgeiger/validb): depends on [sidekiq](https://github.com/mperham/sidekiq)
94
95
  - [validates_blacklist](https://www.rubydoc.info/gems/validates_blacklist/0.0.1): requires to add configuration in each model 😨
95
- - [valid_items](https://rubygems.org/gems/valid_items): requires rails eager load 🤔
96
- - [schema-validations](https://github.com/robworley/schema-validations): I don"t understand what it really does 🤪
96
+ - [valid_items](https://rubygems.org/gems/valid_items): not compliant with rails 6 + cannot find sources to contribute
97
+ - [schema-validations](https://github.com/robworley/schema-validations): I didn't understand what it really does 🤪
97
98
 
98
99
  ## Contributing
99
100
 
@@ -1,23 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rails"
4
+ require "./lib/model_validator/stats_handler"
5
+ require "./lib/model_validator/log_handler"
6
+ require "./lib/model_validator/validator"
4
7
 
5
8
  # Validate models in database according Active Record model validation rules
6
9
  module ModelValidator
7
10
  require "model_validator/railtie" if defined?(Rails)
8
11
 
9
- # Validations summary, with:
10
- # - violations: number of violations (i.e. number of model which validation failed)
11
- # - total: total number of validated models
12
- class Result
13
- attr_accessor :violations, :total
14
-
15
- def initialize(violations: 0, total: 0)
16
- @violations = violations
17
- @total = total
18
- end
19
- end
20
-
21
12
  def self.validate_all(skipped_models: [])
22
13
  if skipped_models.empty?
23
14
  Rails.logger.info "No model skipped"
@@ -29,58 +20,4 @@ module ModelValidator
29
20
  Validator.new(handlers: handlers, skip_models: skipped_models).run
30
21
  stats_handler.result
31
22
  end
32
-
33
- # Validation engine, which fetch, and validate each database records
34
- class Validator
35
- def initialize(handlers: [], skip_models: [])
36
- @handlers = handlers
37
- @skip_models = skip_models
38
- end
39
-
40
- def classes_to_validate
41
- ActiveRecord::Base.subclasses
42
- .reject { |type| type.to_s.include? "::" } # subclassed classes are not our own models
43
- .reject { |type| @skip_models.include? type }
44
- end
45
-
46
- def run
47
- classes_to_validate.each do |model_class|
48
- @handlers.each { |h| h.try(:on_new_class, model_class) }
49
- model_class.unscoped.find_each do |model|
50
- @handlers.each { |h| h.try(:on_violation, model) } unless model.valid?
51
- @handlers.each { |h| h.try(:after_validation, model) }
52
- end
53
- end
54
- end
55
- end
56
-
57
- # This handler logs validation progression
58
- class LogHandler
59
- def on_new_class(model_class)
60
- Rails.logger.info "Checking #{model_class.count} #{model_class}…"
61
- end
62
-
63
- def on_violation(model)
64
- Rails.logger.error "#<#{model.class} id: #{model.id}, errors: #{model.errors.full_messages}>" unless model.valid?
65
- end
66
- end
67
-
68
- # This handler computes validation statistics
69
- class StatsHandler
70
- attr_reader :result
71
-
72
- def initialize
73
- @result = Result.new(violations: 0, total: 0)
74
- end
75
-
76
- def on_new_class(_) end
77
-
78
- def on_violation(_)
79
- @result.violations += 1
80
- end
81
-
82
- def after_validation(_)
83
- @result.total += 1
84
- end
85
- end
86
23
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails"
4
+
5
+ module ModelValidator
6
+ # This handler logs validation progression
7
+ class LogHandler
8
+ def on_new_class(model_class)
9
+ Rails.logger.info "Checking #{model_class.count} #{model_class}…"
10
+ end
11
+
12
+ def on_violation(model)
13
+ Rails.logger.error "#<#{model.class} id: #{model.id}, errors: #{model.errors.full_messages}>" unless model.valid?
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ModelValidator
4
+ # Validations summary, with:
5
+ # - violations: number of violations (i.e. number of model which validation failed)
6
+ # - total: total number of validated models
7
+ Result = Struct.new(:violations, :total)
8
+
9
+ # This handler computes validation statistics
10
+ class StatsHandler
11
+ attr_reader :result
12
+
13
+ def initialize
14
+ @result = Result.new(0, 0)
15
+ end
16
+
17
+ def on_violation(_)
18
+ @result.violations += 1
19
+ end
20
+
21
+ def after_validation(_)
22
+ @result.total += 1
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails"
4
+
5
+ module ModelValidator
6
+ # Validation engine, which fetch, and validate each database records
7
+ class Validator
8
+ def initialize(handlers: [], skip_models: [])
9
+ @handlers = handlers
10
+ @skip_models = skip_models
11
+ end
12
+
13
+ def classes_to_validate
14
+ ActiveRecord::Base.descendants
15
+ .reject(&:abstract_class)
16
+ .select { |type| type.subclasses.empty? }
17
+ .reject { |type| @skip_models.include? type }
18
+ end
19
+
20
+ def run
21
+ classes_to_validate.each do |model_class|
22
+ @handlers.each { |h| h.try(:on_new_class, model_class) }
23
+ model_class.unscoped.find_each do |model|
24
+ @handlers.each { |h| h.try(:on_violation, model) } unless model.valid?
25
+ @handlers.each { |h| h.try(:after_validation, model) }
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ModelValidator
4
- VERSION = "1.2.0"
4
+ VERSION = "1.2.1"
5
5
  end
data/rakelib/release.rake CHANGED
@@ -18,20 +18,9 @@ namespace :release do
18
18
  puts "---------------------------------------------------------------------"
19
19
  puts release.changelog
20
20
  puts "---------------------------------------------------------------------"
21
-
22
21
  next if args[:dry_run]
23
22
 
24
23
  release.git_commit!
25
-
26
- puts <<~MSG
27
- Release built.
28
-
29
- Run following commands to publish version #{release.new_version}:
30
- $> git push && git push --tags
31
- $> bundle exec rake release
32
-
33
- After that, do not forget to report changelog in Github Releases page:
34
- https://github.com/jibidus/model_validator/releases
35
- MSG
24
+ puts release.publishing_instructions
36
25
  end
37
26
  end
@@ -54,6 +54,20 @@ class Release
54
54
  `git commit -m ":label: release version #{new_version}"`
55
55
  end
56
56
 
57
+ def publishing_instructions
58
+ <<~MSG
59
+ New commit created with the release.
60
+
61
+ Run following commands to publish version #{new_version}:
62
+ $> git push
63
+ $> bundle exec rake release
64
+
65
+ Then edit tag with changelog:
66
+ $> git tag v#{new_version} -f -a
67
+ $> git push -f --tags
68
+ MSG
69
+ end
70
+
57
71
  private
58
72
 
59
73
  def sub_file_content(file_path, from, to)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: model_validator
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jibidus
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-02-17 00:00:00.000000000 Z
11
+ date: 2021-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -158,8 +158,11 @@ files:
158
158
  - Rakefile
159
159
  - lib/model_validator.rb
160
160
  - lib/model_validator/Rakefile
161
+ - lib/model_validator/log_handler.rb
161
162
  - lib/model_validator/railtie.rb
163
+ - lib/model_validator/stats_handler.rb
162
164
  - lib/model_validator/tasks/db/validate.rake
165
+ - lib/model_validator/validator.rb
163
166
  - lib/model_validator/version.rb
164
167
  - model_validator.gemspec
165
168
  - rakelib/release.rake