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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4be368a0917bd00a79be8fc0ab6ac7ab4530bff7c3feec32fa731a5ccee2d5e3
4
- data.tar.gz: 4cb0120a7cacd178b16253d04bdab2e5aed1edc37195609bf176b510700b4824
3
+ metadata.gz: 0ab852e62f93186581c39db4f69ba44c3d14a7cdfa70af2964c44c6ce33dea8c
4
+ data.tar.gz: b1825adcc71a209f86861ff198c282e90ac08a178915166e5b08d689cb1ed0f4
5
5
  SHA512:
6
- metadata.gz: 542791763e87ecc0f8f54fd18e3df3d41aaf4db6c7e146f158d1d4b2d74f75f1e7d69ea6f5aa2235cdcad18fa454849cd3b93396d75d7b67e1570918713d4d48
7
- data.tar.gz: bd238fa0f5cc5953202e96893070e1c1c30b823949a11889854ccdba5765ec277192743bad6e018c8c7e287306ea9731716dd91664e9810f6f352368f78c2a59
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
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = 'generated_schema_validations'
5
- spec.version = '0.3.1'
5
+ spec.version = '0.5.0'
6
6
  spec.authors = ['Georg Limbach']
7
7
  spec.email = ['georg.limbach@lichtbit.com']
8
8
 
@@ -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 = File.read(Rails.root.join('db/schema.rb'))
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, 294275) # see https://www.postgresql.org/docs/9.3/datatype-datetime.html
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, 5874896) # see https://www.postgresql.org/docs/9.3/datatype-datetime.html
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.3.1
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: 2024-05-13 00:00:00.000000000 Z
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: []