generated_schema_validations 0.3.1 → 0.5.0
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/README.md +15 -0
- data/generated_schema_validations.gemspec +1 -1
- data/lib/generated_schema_validations/capistrano_tasks.rb +66 -0
- data/lib/generated_schema_validations/dump_checker.rb +14 -0
- data/lib/generated_schema_validations/dumper.rb +11 -4
- data/lib/generated_schema_validations/table.rb +2 -0
- data/lib/generated_schema_validations/tasks.rb +12 -0
- data/lib/generated_schema_validations/template.rb +2 -2
- metadata +7 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0ab852e62f93186581c39db4f69ba44c3d14a7cdfa70af2964c44c6ce33dea8c
|
|
4
|
+
data.tar.gz: b1825adcc71a209f86861ff198c282e90ac08a178915166e5b08d689cb1ed0f4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6192c01bbaf71055b38e23a6c7cf29dcd3781f2a9a2cd17932af868c7db50747a79591309549ae35fbe1bc9a3dfeea688974e5c3f6024e98a6fcb76f8fd3c986
|
|
7
|
+
data.tar.gz: cb4c78ea96469157aaf66d14589cfaef5edc0c8532f9f159f67795cac70e7c669377a639829bb124dd8f103df481988669e7947c9471c89842b18afa6bce37ec
|
data/README.md
CHANGED
|
@@ -97,6 +97,21 @@ You can watch changes on `schema_validations.rb` to understand the generated val
|
|
|
97
97
|
|
|
98
98
|
## Changelog
|
|
99
99
|
|
|
100
|
+
### 0.5
|
|
101
|
+
|
|
102
|
+
* Enables automatic testing after deployment using Capistrano to compare the online database with the local one and automatically warn of any differences.
|
|
103
|
+
|
|
104
|
+
```ruby
|
|
105
|
+
# Add to Capfile
|
|
106
|
+
|
|
107
|
+
require 'generated_schema_validations/capistrano_tasks'
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 0.4
|
|
112
|
+
|
|
113
|
+
* JSON and JSONB fields can have an empty hash and still be considered present
|
|
114
|
+
|
|
100
115
|
### 0.3.1
|
|
101
116
|
|
|
102
117
|
* Add exclusion for enum fields
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
namespace :generated_schema_validations do
|
|
4
|
+
desc 'compare remove dump with local variant'
|
|
5
|
+
task :compare_dumper do
|
|
6
|
+
on roles(:app) do
|
|
7
|
+
begin
|
|
8
|
+
require 'diff/lcs'
|
|
9
|
+
require 'diff/lcs/hunk'
|
|
10
|
+
diff_lcs_available = true
|
|
11
|
+
rescue LoadError
|
|
12
|
+
diff_lcs_available = false
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
local_file = 'app/models/concerns/schema_validations.rb'
|
|
16
|
+
local_content = File.read(local_file)
|
|
17
|
+
|
|
18
|
+
within release_path do
|
|
19
|
+
with(
|
|
20
|
+
rails_env: fetch(:rails_env),
|
|
21
|
+
rails_groups: fetch(:rails_assets_groups),
|
|
22
|
+
disable_database_environment_check: 1
|
|
23
|
+
) do
|
|
24
|
+
dump_output = capture :rake, 'db:validation_dump_direct'
|
|
25
|
+
|
|
26
|
+
if dump_output != local_content
|
|
27
|
+
warn '❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌'
|
|
28
|
+
warn 'The online version of the automatically generated validations differs from the local version.'
|
|
29
|
+
warn 'Please check immediately.'
|
|
30
|
+
|
|
31
|
+
if diff_lcs_available
|
|
32
|
+
old_lines = local_content.lines
|
|
33
|
+
new_lines = dump_output.lines
|
|
34
|
+
diffs = Diff::LCS.diff(old_lines, new_lines)
|
|
35
|
+
|
|
36
|
+
if diffs.any?
|
|
37
|
+
info '----- DIFF START -----'
|
|
38
|
+
|
|
39
|
+
file_length_difference = 0
|
|
40
|
+
|
|
41
|
+
diffs.each do |piece|
|
|
42
|
+
hunk = Diff::LCS::Hunk.new(
|
|
43
|
+
old_lines, new_lines, piece,
|
|
44
|
+
3, # context lines
|
|
45
|
+
file_length_difference
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
file_length_difference = hunk.file_length_difference
|
|
49
|
+
|
|
50
|
+
info hunk.diff(:unified)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
info '----- DIFF END -----'
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
warn '❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌'
|
|
57
|
+
else
|
|
58
|
+
info '✔ Schema OK'
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
after 'deploy:publishing', 'generated_schema_validations:compare_dumper'
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class GeneratedSchemaValidations::DumpChecker < GeneratedSchemaValidations::Dumper
|
|
4
|
+
def self.read_schema_content
|
|
5
|
+
stream = StringIO.new
|
|
6
|
+
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream)
|
|
7
|
+
stream.rewind
|
|
8
|
+
stream.read
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def write_schema_validations(template_ruby)
|
|
12
|
+
puts template_ruby
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -2,12 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
class GeneratedSchemaValidations::Dumper
|
|
4
4
|
def self.generate
|
|
5
|
-
return unless Rails.env.development?
|
|
6
|
-
|
|
7
5
|
file = Tempfile.new(['schema', '.rb'])
|
|
8
6
|
begin
|
|
9
|
-
schema_content =
|
|
10
|
-
schema_content.gsub!(/ActiveRecord::Schema(\[[^\]]+\])?/, 'GeneratedSchemaValidations::Dumper')
|
|
7
|
+
schema_content = read_schema_content.gsub(/ActiveRecord::Schema(\[[^\]]+\])?/, self.name)
|
|
11
8
|
raise 'The scheme is not well-formed.' if schema_content.include?('ActiveRecord')
|
|
12
9
|
|
|
13
10
|
file.write(schema_content)
|
|
@@ -19,6 +16,10 @@ class GeneratedSchemaValidations::Dumper
|
|
|
19
16
|
end
|
|
20
17
|
end
|
|
21
18
|
|
|
19
|
+
def self.read_schema_content
|
|
20
|
+
File.read(Rails.root.join('db/schema.rb'))
|
|
21
|
+
end
|
|
22
|
+
|
|
22
23
|
def self.define(info = {}, &block)
|
|
23
24
|
new.define(info, &block)
|
|
24
25
|
end
|
|
@@ -34,6 +35,12 @@ class GeneratedSchemaValidations::Dumper
|
|
|
34
35
|
end.join
|
|
35
36
|
template_ruby.gsub!("#{indention_spaces}TABLE_VALIDATIONS", table_validations_ruby)
|
|
36
37
|
|
|
38
|
+
write_schema_validations(template_ruby)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def write_schema_validations(template_ruby)
|
|
42
|
+
return unless Rails.env.development?
|
|
43
|
+
|
|
37
44
|
File.write(Rails.root.join('app/models/concerns/schema_validations.rb'), template_ruby)
|
|
38
45
|
end
|
|
39
46
|
|
|
@@ -55,6 +55,8 @@ class GeneratedSchemaValidations::Table
|
|
|
55
55
|
@possible_belongs_to_not_null_columns.push(name.to_sym) if datatype.in?(%i[bigint integer uuid])
|
|
56
56
|
if datatype == :boolean
|
|
57
57
|
validates name, :inclusion, in: [true, false], message: :blank
|
|
58
|
+
elsif datatype.in?(%i[json jsonb])
|
|
59
|
+
validates name, :exclusion, in: [nil], message: :blank
|
|
58
60
|
else
|
|
59
61
|
validates name, :presence
|
|
60
62
|
end
|
|
@@ -6,3 +6,15 @@ Rake::Task['db:schema:dump'].enhance do
|
|
|
6
6
|
require_relative 'table'
|
|
7
7
|
GeneratedSchemaValidations::Dumper.generate
|
|
8
8
|
end
|
|
9
|
+
|
|
10
|
+
namespace :db do
|
|
11
|
+
desc 'Dump validations to stdout'
|
|
12
|
+
task validation_dump_direct: :environment do
|
|
13
|
+
require 'generated_schema_validations'
|
|
14
|
+
require_relative 'dumper'
|
|
15
|
+
require_relative 'dump_checker'
|
|
16
|
+
require_relative 'table'
|
|
17
|
+
|
|
18
|
+
GeneratedSchemaValidations::DumpChecker.generate
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -102,7 +102,7 @@ module SchemaValidations
|
|
|
102
102
|
def validate_each(record, attr_name, value)
|
|
103
103
|
return if value.nil?
|
|
104
104
|
return unless value.is_a?(DateTime) || value.is_a?(Time)
|
|
105
|
-
return if value.year.between?(-4711,
|
|
105
|
+
return if value.year.between?(-4711, 294_275) # see https://www.postgresql.org/docs/9.3/datatype-datetime.html
|
|
106
106
|
|
|
107
107
|
record.errors.add(attr_name, :invalid, options)
|
|
108
108
|
end
|
|
@@ -112,7 +112,7 @@ module SchemaValidations
|
|
|
112
112
|
def validate_each(record, attr_name, value)
|
|
113
113
|
return if value.nil?
|
|
114
114
|
return unless value.is_a?(Date)
|
|
115
|
-
return if value.year.between?(-4711,
|
|
115
|
+
return if value.year.between?(-4711, 5_874_896) # see https://www.postgresql.org/docs/9.3/datatype-datetime.html
|
|
116
116
|
|
|
117
117
|
record.errors.add(attr_name, :invalid, options)
|
|
118
118
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: generated_schema_validations
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Georg Limbach
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2025-12-03 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description: After each migration it generates a file with some validations. Each
|
|
14
14
|
active record should include this file and can uns generated validations.
|
|
@@ -27,6 +27,8 @@ files:
|
|
|
27
27
|
- Rakefile
|
|
28
28
|
- generated_schema_validations.gemspec
|
|
29
29
|
- lib/generated_schema_validations.rb
|
|
30
|
+
- lib/generated_schema_validations/capistrano_tasks.rb
|
|
31
|
+
- lib/generated_schema_validations/dump_checker.rb
|
|
30
32
|
- lib/generated_schema_validations/dumper.rb
|
|
31
33
|
- lib/generated_schema_validations/railtie.rb
|
|
32
34
|
- lib/generated_schema_validations/table.rb
|
|
@@ -38,7 +40,7 @@ licenses:
|
|
|
38
40
|
metadata:
|
|
39
41
|
homepage_uri: https://github.com/Lichtbit/generated_schema_validations
|
|
40
42
|
source_code_uri: https://github.com/Lichtbit/generated_schema_validations
|
|
41
|
-
post_install_message:
|
|
43
|
+
post_install_message:
|
|
42
44
|
rdoc_options: []
|
|
43
45
|
require_paths:
|
|
44
46
|
- lib
|
|
@@ -54,7 +56,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
54
56
|
version: '0'
|
|
55
57
|
requirements: []
|
|
56
58
|
rubygems_version: 3.3.26
|
|
57
|
-
signing_key:
|
|
59
|
+
signing_key:
|
|
58
60
|
specification_version: 4
|
|
59
61
|
summary: Generate rails validations from schema.rb file
|
|
60
62
|
test_files: []
|