enum_fields 0.0.4 → 0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8331e8cbd798d1826d88aeaab4c935f0fcba72d46883fad5bafa401fe3e66442
4
- data.tar.gz: 557779cd5bec13707d33b0555186d00ebca2204e8f1ef7ac5aef332641866851
3
+ metadata.gz: 9a282e3cb07038a6db32bfed63217bc85ec6901541b26e373e1c5a78e4ee4106
4
+ data.tar.gz: 26cc2fccb3171185ac16e0edeab889b235c64b7d7b289b9958234c5da7064e73
5
5
  SHA512:
6
- metadata.gz: df074afe483cf5f97705a117ce61651a46bf2a75ce475b72de22724187ae0683810931faca9370edd848ee9a23173892c5337d70aea5278ee35a11a03d9f55e4
7
- data.tar.gz: 97ec7086ad9bf133312eac94be5ff03383851dcdfff5166e0d44fe6282ab984e1e6e38a3fcb15ade05bf810e0e0cf0ce7ad39250d74fdb0c4b15594b4989b176
6
+ metadata.gz: b989a5b41c4e07609bf00dd08db9555ee7f544cda58f91ca4db114ba3a66fbeecfd892077ae22f96721bfd40478b609fe77bbea123853e2e5ba4aa10354a1bb4
7
+ data.tar.gz: 2e1c2fbdeee50ee23a328cd160b25ee1d86b52d0e4a42198841c167d1fff231045340171adfbacf0fe5d406ce4bcd83d5a4d151aff63dedeeaf54de9e1dc7832
data/README.md CHANGED
@@ -156,6 +156,11 @@ Campaign.stages_values # ['draft', 'scheduled', 'completed']
156
156
 
157
157
  # Returns the options for form helpers
158
158
  Campaign.stages_options # [['Draft', 'draft'], ['Scheduled', 'scheduled'], ['Completed', 'completed']]
159
+
160
+ # Returns the value for a specific key
161
+ Campaign.draft_stage_value # 'draft'
162
+ Campaign.scheduled_stage_value # 'scheduled'
163
+ Campaign.completed_stage_value # 'completed'
159
164
  ```
160
165
 
161
166
  #### Instance Getter/Setter
@@ -11,11 +11,13 @@ module EnumFields
11
11
  @accessor = accessor.to_sym
12
12
  @column_name = options.fetch(:column, @accessor).to_sym
13
13
  @definition = Definition.new(definition)
14
+ @options = options
14
15
  end
15
16
 
16
17
  def define!
17
18
  store_definition!
18
19
  define_class_methods!
20
+ define_class_value_accessors!
19
21
  define_instance_getter!
20
22
  define_instance_setter!
21
23
  define_metadata_methods!
@@ -54,6 +56,18 @@ module EnumFields
54
56
  end
55
57
  end
56
58
 
59
+ def define_class_value_accessors!
60
+ accessor = @accessor
61
+
62
+ @definition.each do |key, metadata|
63
+ definition_value = metadata[:value]
64
+
65
+ @model_class.define_singleton_method("#{key}_#{accessor}_value") do
66
+ definition_value
67
+ end
68
+ end
69
+ end
70
+
57
71
  def define_instance_getter!
58
72
  return if @accessor == @column_name
59
73
 
@@ -130,13 +144,56 @@ module EnumFields
130
144
  end
131
145
 
132
146
  def define_validation!
133
- return if @definition.blank?
147
+ return unless column_validatable?
148
+
149
+ if column_polymorphic_association_name.present?
150
+ define_polymorphic_validation!
151
+ else
152
+ define_standard_validation!
153
+ end
154
+ end
134
155
 
156
+ def define_standard_validation!
135
157
  valid_values = @definition.values.pluck(:value)
158
+
136
159
  @model_class.validates(@column_name, inclusion: {
137
160
  in: valid_values,
138
161
  allow_nil: true,
139
162
  })
140
163
  end
164
+
165
+ def define_polymorphic_validation!
166
+ association_name = column_polymorphic_association_name
167
+ column_name = @column_name
168
+ accessor = @accessor
169
+
170
+ @model_class.validate do
171
+ association_obj = respond_to?(association_name) ? public_send(association_name) : nil
172
+ valid_values = self.class.public_send("#{accessor}_values")
173
+
174
+ if association_obj
175
+ errors.add(association_name, "must be one of: #{valid_values.join(', ')}") unless valid_values.include?(association_obj.class.name)
176
+ else
177
+ column_value = attributes[column_name.to_s]
178
+ next if column_value.nil?
179
+
180
+ errors.add(column_name, "must be one of: #{valid_values.join(', ')}") unless valid_values.include?(column_value)
181
+ end
182
+ end
183
+ end
184
+
185
+ def column_validatable?
186
+ @definition.present? && @options.fetch(:validate, true)
187
+ end
188
+
189
+ def column_polymorphic_association_name
190
+ return nil unless @model_class.respond_to?(:reflect_on_all_associations)
191
+
192
+ reflection = @model_class.reflect_on_all_associations(:belongs_to).find do |r|
193
+ r.options[:polymorphic] && "#{r.name}_type" == @column_name.to_s
194
+ end
195
+
196
+ reflection&.name
197
+ end
141
198
  end
142
199
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EnumFields
4
- VERSION = '0.0.4'
4
+ VERSION = '0.1.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enum_fields
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kinnell Shah
@@ -63,7 +63,6 @@ files:
63
63
  - CHANGELOG.md
64
64
  - LICENSE
65
65
  - README.md
66
- - ___DEPLOY.md
67
66
  - lib/enum_fields.rb
68
67
  - lib/enum_fields/base.rb
69
68
  - lib/enum_fields/definition.rb
@@ -94,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
93
  - !ruby/object:Gem::Version
95
94
  version: '2.0'
96
95
  requirements: []
97
- rubygems_version: 3.7.2
96
+ rubygems_version: 4.0.3
98
97
  specification_version: 4
99
98
  summary: Enhanced enum-like fields for ActiveRecord models with metadata support
100
99
  test_files: []
data/___DEPLOY.md DELETED
@@ -1 +0,0 @@
1
- GEM_HOST_API_KEY=rubygems_db84a0b325ee57c261e6377227b29755def62cc2d8201c2e rake release