changeset 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c3607f08e2b07567b7e4440f9d2f69ace40832fc079aceafb3cee347b3c00e8a
4
+ data.tar.gz: 5ad7b9780c06fa12d7f3df41adb5216fb3fc5d7cb2ca7516a4aa77f5ed0d09a9
5
+ SHA512:
6
+ metadata.gz: a297b29b909fa0ad1fd8cd4f710a3cb5ca43652e6817719db258c5e04688881a3e025a21a3336116200cf4c287f9aa71ed8b37024d6258e63ccd640c8aaafc56
7
+ data.tar.gz: 119df950fb832ff4d2f74c2f961ea79af266a9672a74d3f4cb311a3ea215d93fca0c254225dbb59a91b949547d36d33145c6b5b067dbcb46283038222986337b
@@ -0,0 +1,39 @@
1
+ require_relative 'changeset/validators'
2
+ require_relative 'changeset/messages'
3
+
4
+ class Changeset
5
+
6
+ include Validators
7
+
8
+ attr_reader :changes, :errors
9
+ def initialize(params)
10
+ @changes = symbolized_keys(params)
11
+ @errors = {}
12
+ @changes.keys.each do |k|
13
+ @errors[k] = {}
14
+ end
15
+ end
16
+
17
+ def valid?
18
+ @errors.values.all?(&:empty?)
19
+ end
20
+
21
+ private
22
+
23
+ def generate_error_for(key, validation, message)
24
+ if @errors[key].nil?
25
+ @errors[key] = {}
26
+ end
27
+ @errors[key][validation] = message || Messages.const_get("#{validation}_MESSAGE".upcase.to_sym)
28
+ end
29
+
30
+ def symbolized_keys(hash)
31
+ sym_keys = {}
32
+ hash.each do |k, v|
33
+ sym_keys[k.to_sym] = v
34
+ end
35
+ sym_keys
36
+ end
37
+
38
+ end
39
+
@@ -0,0 +1,14 @@
1
+ module Messages
2
+
3
+ REQUIRED_MESSAGE = "Can't be blank"
4
+ LENGTH_MESSAGE = "Length does not match"
5
+ INCLUSION_MESSAGE = "Is not included in enumerable"
6
+ CONFIRMATION_MESSAGE = "Doesn't match confirmation"
7
+ FORMAT_MESSAGE = "Does not match the regex"
8
+ ACCEPTANCE_MESSAGE = "Is not true"
9
+ NUMBER_MESSAGE = "Number doesn't match"
10
+ EXCLUSION_MESSAGE = "Is included in enumerable"
11
+ SUBSET_MESSAGE = "Is not a subset of enumerable"
12
+ CUSTOM_VALIDATOR = "Custom validator returned false"
13
+
14
+ end
@@ -0,0 +1,113 @@
1
+ module Validators
2
+
3
+ def cast(*casted_keys)
4
+ new_changes = {}
5
+ @changes.each do |k, v|
6
+ if casted_keys.include?(k)
7
+ new_changes[k] = v
8
+ end
9
+ end
10
+ @changes = new_changes
11
+ @errors = @errors.select { |k, v| casted_keys.include?(k) }
12
+ self
13
+ end
14
+
15
+ def validate_required(*required_keys, opts)
16
+ required_keys.each do |key|
17
+ unless @changes.keys.include?(key) || @changes[key].empty? || @changes[key].nil?
18
+ generate_error_for(key, :required, message)
19
+ end
20
+ end
21
+ self
22
+ end
23
+
24
+ def validate_length(key, opts)
25
+ if opts.has_key?(:is)
26
+ cond = @changes[key].length == opts[:is]
27
+ elsif opts.has_key?(:in)
28
+ cond = opts[:in].include? @changes[key].length
29
+ elsif opts.has_key?(:min) && opts.has_key?(:max)
30
+ cond = (opts[:min]..opts[:max]).include? @changes[key].length
31
+ elsif opts.has_key?(:min)
32
+ cond = @changes[key].length >= opts[:min]
33
+ elsif opts.has_key?(:max)
34
+ cond = @changes[key].length <= opts[:max]
35
+ else
36
+ raise "Should define at least one option for validate_length()"
37
+ end
38
+ unless cond
39
+ generate_error_for(key, :length, opts[:message])
40
+ end
41
+ self
42
+ end
43
+
44
+ def validate_inclusion(key, inclusion, message: nil)
45
+ unless inclusion.include?(@changes[key])
46
+ generate_error_for(key, :inclusion, message)
47
+ end
48
+ self
49
+ end
50
+
51
+ def validate_confirmation(key, message: nil)
52
+ confirmation_key = "#{key}_confirmation".to_sym
53
+ unless @changes[key] == @changes[confirmation_key]
54
+ generate_error_for(key, :confirmation, message)
55
+ end
56
+ self
57
+ end
58
+
59
+ def validate_format(key, regex, message: nil)
60
+ unless @changes[key].match?(regex)
61
+ generate_error_for(key, :format, message)
62
+ end
63
+ self
64
+ end
65
+
66
+ def validate_acceptance(key, message: nil)
67
+ unless @changes[key] == true
68
+ generate_error_for(key, :acceptance, message)
69
+ end
70
+ self
71
+ end
72
+
73
+ def validate_number(key, opts)
74
+ if opts.has_key?(:less_than)
75
+ cond = @changes[key] < opts[:less_than]
76
+ elsif opts.has_key?(:greater_than)
77
+ cond = @changes[key] > opts[:greater_than]
78
+ elsif opts.has_key?(:less_than_or_equal_to)
79
+ cond = @changes[key] <= opts[:less_than_or_equal_to]
80
+ elsif opts.has_key?(:greater_than_or_equal_to)
81
+ cond = @changes[key] >= opts[:greater_than_or_equal_to]
82
+ elsif opts.has_key?(:equal_to)
83
+ cond = @changes[key] == opts[:equal_to]
84
+ elsif opts.has_key?(:not_equal_to)
85
+ cond = @changes[key] != opts[:not_equal_to]
86
+ end
87
+ unless cond
88
+ generate_error_for(key, :number, opts[:message])
89
+ end
90
+ self
91
+ end
92
+
93
+ def validate_exclusion(key, exclusion, message: nil)
94
+ if exclusion.include?(@changes[key])
95
+ generate_error_for(key, :exclusion, message)
96
+ end
97
+ self
98
+ end
99
+
100
+ def validate_subset(key, arr, message: nil)
101
+ unless @changes[key].all?{|k| arr.include?(k)}
102
+ generate_error_for(key, :subset, message)
103
+ end
104
+ self
105
+ end
106
+
107
+ def validate_change(key, message: nil, &validator)
108
+ unless validator.call(@changes[key])
109
+ generate_error_for(key, :custom_validator, message)
110
+ end
111
+ self
112
+ end
113
+ end
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: changeset
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Kourosh Alinaghi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-08-21 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A Ecto Changeset Like Validator For Ruby
14
+ email: kouroshalinaghi@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/changeset.rb
20
+ - lib/changeset/messages.rb
21
+ - lib/changeset/validators.rb
22
+ homepage: https://rubygems.org/gems/changeset
23
+ licenses:
24
+ - MIT
25
+ metadata: {}
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ required_rubygems_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ requirements: []
41
+ rubygems_version: 3.1.2
42
+ signing_key:
43
+ specification_version: 4
44
+ summary: Validator
45
+ test_files: []