validation_hints 0.2.3 → 6.1.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/.gitignore +2 -0
- data/CHANGELOG.md +63 -0
- data/Gemfile +3 -1
- data/Gemfile.lock +273 -0
- data/Rakefile +14 -1
- data/lib/active_model/hints.rb +180 -193
- data/lib/validation_hints/locale/en.yml +5 -10
- data/lib/validation_hints/railtie.rb +13 -0
- data/lib/validation_hints/validations_patch.rb +39 -0
- data/lib/validation_hints/version.rb +1 -1
- data/lib/validation_hints.rb +19 -32
- data/test/active_model/hints_test.rb +77 -0
- data/test/test_helper.rb +34 -0
- data/test/validation_hints_test.rb +13 -0
- data/validation_hints.gemspec +24 -16
- metadata +43 -26
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
class ActiveModelHintsTest < Minitest::Test
|
|
6
|
+
def setup
|
|
7
|
+
@person = Person.new
|
|
8
|
+
@profile = Profile.new
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def test_presence_hint
|
|
12
|
+
assert_includes @person.hints[:name], "can't be blank"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_full_messages_for_includes_human_attribute_name
|
|
16
|
+
messages = @person.hints.full_messages_for(:name)
|
|
17
|
+
assert_equal ["Name can't be blank"], messages
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_has_validations_for
|
|
21
|
+
assert @person.has_validations_for?(:name)
|
|
22
|
+
refute @person.has_validations_for?(:missing)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_has_validations_on_class_and_instance
|
|
26
|
+
assert Person.has_validations?
|
|
27
|
+
assert @person.has_validations?
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_length_within_hint
|
|
31
|
+
hints = @person.hints[:password]
|
|
32
|
+
assert_includes hints, "must be between 1 and 4 characters"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_numericality_option_hints
|
|
36
|
+
hints = @person.hints[:age]
|
|
37
|
+
assert_includes hints, "must be an integer"
|
|
38
|
+
assert_includes hints, "must be greater than 19"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_inclusion_hint_uses_list
|
|
42
|
+
hints = @person.hints[:status]
|
|
43
|
+
assert_equal 1, hints.size
|
|
44
|
+
assert_match(/must be one of/, hints.first)
|
|
45
|
+
assert_match(/active/, hints.first)
|
|
46
|
+
assert_match(/inactive/, hints.first)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def test_virtual_attribute_with_validators_is_included
|
|
50
|
+
assert_includes @profile.hints.keys, :nickname
|
|
51
|
+
assert_includes @profile.hints[:nickname], "can't be blank"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_empty_returns_true_when_no_hint_messages
|
|
55
|
+
person = Class.new do
|
|
56
|
+
include ActiveModel::Model
|
|
57
|
+
include ActiveModel::Validations
|
|
58
|
+
|
|
59
|
+
def self.name
|
|
60
|
+
"EmptyModel"
|
|
61
|
+
end
|
|
62
|
+
end.new
|
|
63
|
+
|
|
64
|
+
assert person.hints.empty?
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def test_add_and_added_with_symbol_message
|
|
68
|
+
person = Person.new
|
|
69
|
+
person.hints.add(:name, :blank)
|
|
70
|
+
assert person.hints.added?(:name, :blank)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def test_validator_keys_for_rails_7_validators
|
|
74
|
+
validators = Person.validators_on(:name).map { |v| v.class.name.demodulize }
|
|
75
|
+
assert_includes validators, "PresenceValidator"
|
|
76
|
+
end
|
|
77
|
+
end
|
data/test/test_helper.rb
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "minitest/autorun"
|
|
5
|
+
require "active_record"
|
|
6
|
+
require "active_model"
|
|
7
|
+
|
|
8
|
+
require "validation_hints"
|
|
9
|
+
|
|
10
|
+
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
|
|
11
|
+
|
|
12
|
+
ActiveRecord::Schema.define do
|
|
13
|
+
create_table :people, force: true do |t|
|
|
14
|
+
t.string :name
|
|
15
|
+
t.string :password
|
|
16
|
+
t.integer :age
|
|
17
|
+
t.string :status
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class Person < ActiveRecord::Base
|
|
22
|
+
validates :name, presence: true
|
|
23
|
+
validates :password, length: { within: 1...5 }
|
|
24
|
+
validates :age, numericality: { only_integer: true, greater_than: 19 }
|
|
25
|
+
validates :status, inclusion: { in: %w[active inactive] }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
class Profile < ActiveRecord::Base
|
|
29
|
+
self.table_name = "people"
|
|
30
|
+
|
|
31
|
+
attr_accessor :nickname
|
|
32
|
+
|
|
33
|
+
validates :nickname, presence: true
|
|
34
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
class ValidationHintsTest < Minitest::Test
|
|
6
|
+
def test_version
|
|
7
|
+
assert_equal "6.1.0", ValidationHints::VERSION
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_locale_path_exists
|
|
11
|
+
assert File.file?(ValidationHints::LOCALE_PATH)
|
|
12
|
+
end
|
|
13
|
+
end
|
data/validation_hints.gemspec
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "lib/validation_hints/version"
|
|
4
4
|
|
|
5
5
|
Gem::Specification.new do |s|
|
|
6
6
|
s.name = "validation_hints"
|
|
@@ -8,22 +8,30 @@ Gem::Specification.new do |s|
|
|
|
8
8
|
s.platform = Gem::Platform::RUBY
|
|
9
9
|
s.authors = ["Ace Suares"]
|
|
10
10
|
s.email = ["ace@suares.com"]
|
|
11
|
-
s.homepage =
|
|
12
|
-
s.summary =
|
|
13
|
-
s.description =
|
|
14
|
-
s.
|
|
11
|
+
s.homepage = "https://github.com/acesuares/validation_hints"
|
|
12
|
+
s.summary = "Proactive validation hints derived from model validators"
|
|
13
|
+
s.description = "Shows what a field expects before validation fails — complementary to ActiveModel errors."
|
|
14
|
+
s.license = "MIT"
|
|
15
|
+
s.required_ruby_version = ">= 3.2.0"
|
|
15
16
|
|
|
16
|
-
|
|
17
|
+
if File.directory?(File.join(__dir__, ".git"))
|
|
18
|
+
s.files = `git ls-files`.split("\n")
|
|
19
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
20
|
+
else
|
|
21
|
+
s.files = Dir.chdir(__dir__) do
|
|
22
|
+
Dir.glob("{lib,test}/**/*", File::FNM_DOTMATCH).reject do |f|
|
|
23
|
+
f.end_with?(".gem") || f.start_with?("stuff/")
|
|
24
|
+
end + %w[README.md LICENSE.txt CHANGELOG.md Gemfile Rakefile validation_hints.gemspec]
|
|
25
|
+
end
|
|
26
|
+
s.test_files = Dir.glob("{test,spec}/**/*", base: __dir__)
|
|
27
|
+
end
|
|
17
28
|
|
|
18
|
-
s.files = `git ls-files`.split("\n")
|
|
19
|
-
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
20
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
21
29
|
s.require_paths = ["lib"]
|
|
22
30
|
|
|
23
|
-
s.
|
|
24
|
-
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
|
25
|
-
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
|
26
|
-
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
|
27
|
-
s.add_development_dependency(%q<rcov>, [">= 0"])
|
|
31
|
+
s.add_dependency "activerecord", ">= 7.0", "< 7.1"
|
|
28
32
|
|
|
33
|
+
s.add_development_dependency "rails", ">= 7.0", "< 7.1"
|
|
34
|
+
s.add_development_dependency "sqlite3", "~> 1.4"
|
|
35
|
+
s.add_development_dependency "minitest", "~> 5.0"
|
|
36
|
+
s.add_development_dependency "bundler", ">= 2.0"
|
|
29
37
|
end
|
metadata
CHANGED
|
@@ -1,86 +1,98 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: validation_hints
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 6.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ace Suares
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
|
-
name:
|
|
13
|
+
name: activerecord
|
|
15
14
|
requirement: !ruby/object:Gem::Requirement
|
|
16
15
|
requirements:
|
|
17
16
|
- - ">="
|
|
18
17
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '0'
|
|
20
|
-
|
|
18
|
+
version: '7.0'
|
|
19
|
+
- - "<"
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '7.1'
|
|
22
|
+
type: :runtime
|
|
21
23
|
prerelease: false
|
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
25
|
requirements:
|
|
24
26
|
- - ">="
|
|
25
27
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '0'
|
|
28
|
+
version: '7.0'
|
|
29
|
+
- - "<"
|
|
30
|
+
- !ruby/object:Gem::Version
|
|
31
|
+
version: '7.1'
|
|
27
32
|
- !ruby/object:Gem::Dependency
|
|
28
|
-
name:
|
|
33
|
+
name: rails
|
|
29
34
|
requirement: !ruby/object:Gem::Requirement
|
|
30
35
|
requirements:
|
|
31
36
|
- - ">="
|
|
32
37
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '0'
|
|
38
|
+
version: '7.0'
|
|
39
|
+
- - "<"
|
|
40
|
+
- !ruby/object:Gem::Version
|
|
41
|
+
version: '7.1'
|
|
34
42
|
type: :development
|
|
35
43
|
prerelease: false
|
|
36
44
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
45
|
requirements:
|
|
38
46
|
- - ">="
|
|
39
47
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '0'
|
|
48
|
+
version: '7.0'
|
|
49
|
+
- - "<"
|
|
50
|
+
- !ruby/object:Gem::Version
|
|
51
|
+
version: '7.1'
|
|
41
52
|
- !ruby/object:Gem::Dependency
|
|
42
|
-
name:
|
|
53
|
+
name: sqlite3
|
|
43
54
|
requirement: !ruby/object:Gem::Requirement
|
|
44
55
|
requirements:
|
|
45
56
|
- - "~>"
|
|
46
57
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: 1.
|
|
58
|
+
version: '1.4'
|
|
48
59
|
type: :development
|
|
49
60
|
prerelease: false
|
|
50
61
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
62
|
requirements:
|
|
52
63
|
- - "~>"
|
|
53
64
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: 1.
|
|
65
|
+
version: '1.4'
|
|
55
66
|
- !ruby/object:Gem::Dependency
|
|
56
|
-
name:
|
|
67
|
+
name: minitest
|
|
57
68
|
requirement: !ruby/object:Gem::Requirement
|
|
58
69
|
requirements:
|
|
59
70
|
- - "~>"
|
|
60
71
|
- !ruby/object:Gem::Version
|
|
61
|
-
version:
|
|
72
|
+
version: '5.0'
|
|
62
73
|
type: :development
|
|
63
74
|
prerelease: false
|
|
64
75
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
76
|
requirements:
|
|
66
77
|
- - "~>"
|
|
67
78
|
- !ruby/object:Gem::Version
|
|
68
|
-
version:
|
|
79
|
+
version: '5.0'
|
|
69
80
|
- !ruby/object:Gem::Dependency
|
|
70
|
-
name:
|
|
81
|
+
name: bundler
|
|
71
82
|
requirement: !ruby/object:Gem::Requirement
|
|
72
83
|
requirements:
|
|
73
84
|
- - ">="
|
|
74
85
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '0'
|
|
86
|
+
version: '2.0'
|
|
76
87
|
type: :development
|
|
77
88
|
prerelease: false
|
|
78
89
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
90
|
requirements:
|
|
80
91
|
- - ">="
|
|
81
92
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: '0'
|
|
83
|
-
description:
|
|
93
|
+
version: '2.0'
|
|
94
|
+
description: Shows what a field expects before validation fails — complementary to
|
|
95
|
+
ActiveModel errors.
|
|
84
96
|
email:
|
|
85
97
|
- ace@suares.com
|
|
86
98
|
executables: []
|
|
@@ -89,20 +101,26 @@ extra_rdoc_files: []
|
|
|
89
101
|
files:
|
|
90
102
|
- ".document"
|
|
91
103
|
- ".gitignore"
|
|
104
|
+
- CHANGELOG.md
|
|
92
105
|
- Gemfile
|
|
106
|
+
- Gemfile.lock
|
|
93
107
|
- LICENSE.txt
|
|
94
108
|
- README.md
|
|
95
109
|
- Rakefile
|
|
96
110
|
- lib/active_model/hints.rb
|
|
97
111
|
- lib/validation_hints.rb
|
|
98
112
|
- lib/validation_hints/locale/en.yml
|
|
113
|
+
- lib/validation_hints/railtie.rb
|
|
114
|
+
- lib/validation_hints/validations_patch.rb
|
|
99
115
|
- lib/validation_hints/version.rb
|
|
116
|
+
- test/active_model/hints_test.rb
|
|
117
|
+
- test/test_helper.rb
|
|
118
|
+
- test/validation_hints_test.rb
|
|
100
119
|
- validation_hints.gemspec
|
|
101
|
-
homepage:
|
|
120
|
+
homepage: https://github.com/acesuares/validation_hints
|
|
102
121
|
licenses:
|
|
103
122
|
- MIT
|
|
104
123
|
metadata: {}
|
|
105
|
-
post_install_message:
|
|
106
124
|
rdoc_options: []
|
|
107
125
|
require_paths:
|
|
108
126
|
- lib
|
|
@@ -110,15 +128,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
110
128
|
requirements:
|
|
111
129
|
- - ">="
|
|
112
130
|
- !ruby/object:Gem::Version
|
|
113
|
-
version:
|
|
131
|
+
version: 3.2.0
|
|
114
132
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
115
133
|
requirements:
|
|
116
134
|
- - ">="
|
|
117
135
|
- !ruby/object:Gem::Version
|
|
118
136
|
version: '0'
|
|
119
137
|
requirements: []
|
|
120
|
-
rubygems_version: 3.2
|
|
121
|
-
signing_key:
|
|
138
|
+
rubygems_version: 3.7.2
|
|
122
139
|
specification_version: 4
|
|
123
|
-
summary:
|
|
140
|
+
summary: Proactive validation hints derived from model validators
|
|
124
141
|
test_files: []
|