enumy 0.1.5 → 0.2.1
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/lib/active_model/type/enum.rb +26 -0
- data/lib/enumy/base.rb +23 -16
- data/lib/enumy/model.rb +17 -35
- data/lib/enumy/version.rb +1 -1
- data/lib/enumy.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eaa9f4a13fabe8f6011960a4df6ef9dcba23b7005f18aa19a898b0b1af6e273e
|
4
|
+
data.tar.gz: bbfd3f1b0c2ce4ecab2d55ffbe87b70859e7f858b914b514b9fadb77f857fc66
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8679f98840a6f998b59135357f23817833de47f2c1311779af1a14220faacaac1f9c9f83faecf5a186401d2731e1d955fa7b5d9d984a74b6f404f2487b1adf90
|
7
|
+
data.tar.gz: ba4c1b04664e3d4d8b697050a5068d01207744610027306046c9413c4593423dddfd5b725224551b21d7aa96841568aeda5d46e3af79142d1ffcc5926d8c7d4b
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module ActiveModel
|
2
|
+
module Type
|
3
|
+
class Enum < ActiveModel::Type::Value
|
4
|
+
def initialize(enum_class)
|
5
|
+
@enum_class = enum_class
|
6
|
+
super()
|
7
|
+
end
|
8
|
+
|
9
|
+
def cast(value)
|
10
|
+
value.is_a?(@enum_class) ? value : @enum_class.find_by_key(value&.to_sym)
|
11
|
+
end
|
12
|
+
|
13
|
+
def serialize(value)
|
14
|
+
value.is_a?(@enum_class) ? value.key : value&.to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
def deserialize(value)
|
18
|
+
value.is_a?(@enum_class) ? value : @enum_class.find_by_key(value&.to_sym)
|
19
|
+
end
|
20
|
+
|
21
|
+
def type
|
22
|
+
:enum
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/enumy/base.rb
CHANGED
@@ -5,27 +5,34 @@ module Enumy
|
|
5
5
|
include ActiveModel::Model
|
6
6
|
include ActiveModel::Attributes
|
7
7
|
|
8
|
-
attribute :
|
9
|
-
attribute :name
|
8
|
+
attribute :key
|
10
9
|
|
11
|
-
def initialize(
|
12
|
-
raise ArgumentError, "#{self.class.name.upcase} enum requires
|
13
|
-
|
10
|
+
def initialize(key, **attrs)
|
11
|
+
raise ArgumentError, "#{self.class.name.upcase} enum requires a `key`" if key.nil?
|
12
|
+
key = key.to_sym
|
14
13
|
|
15
|
-
super(
|
14
|
+
super(key: key, **attrs)
|
16
15
|
end
|
17
16
|
|
18
17
|
def human_attribute_name(attribute)
|
19
|
-
I18n.t("#{self.class.i18n_scope}.attributes.models.#{self.class.model_name.i18n_key}/#{self.
|
18
|
+
I18n.t("#{self.class.i18n_scope}.attributes.models.#{self.class.model_name.i18n_key}/#{self.key}.#{attribute}")
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_s
|
22
|
+
self.key.to_s
|
23
|
+
end
|
24
|
+
|
25
|
+
def inspect
|
26
|
+
"#<#{self.class.name} #{attributes.map { |name, value| "#{name}: #{value.inspect}" }.join(', ')}>"
|
20
27
|
end
|
21
28
|
|
22
29
|
class << self
|
23
30
|
|
24
|
-
def
|
25
|
-
if instances[enum.
|
26
|
-
raise ArgumentError, "Enum `#{enum.
|
31
|
+
def define(enum)
|
32
|
+
if instances[enum.key]
|
33
|
+
raise ArgumentError, "Enum `#{enum.key.to_s.upcase}` is using a duplicate key `#{enum.key}` for Enum '#{enum.class.name}'."
|
27
34
|
else
|
28
|
-
instances[enum.
|
35
|
+
instances[enum.key] = enum
|
29
36
|
end
|
30
37
|
end
|
31
38
|
|
@@ -33,12 +40,12 @@ module Enumy
|
|
33
40
|
instances.values
|
34
41
|
end
|
35
42
|
|
36
|
-
def find(
|
37
|
-
|
43
|
+
def find(key)
|
44
|
+
find_by_key(key) || raise(Errors::EnumNotFoundError.new("Could not find a `#{self.name}` enum with a `key` of #{key}"))
|
38
45
|
end
|
39
46
|
|
40
|
-
def
|
41
|
-
instances[
|
47
|
+
def find_by_key(key)
|
48
|
+
instances[key]
|
42
49
|
end
|
43
50
|
|
44
51
|
def find_by(**args)
|
@@ -48,7 +55,7 @@ module Enumy
|
|
48
55
|
end
|
49
56
|
|
50
57
|
def model_name
|
51
|
-
@model_name ||= ActiveModel::Name.new(self, nil, name.to_s)
|
58
|
+
@model_name ||= ActiveModel::Name.new(self, nil, self.name.to_s)
|
52
59
|
end
|
53
60
|
|
54
61
|
def i18n_scope
|
data/lib/enumy/model.rb
CHANGED
@@ -3,48 +3,30 @@ require_relative 'errors'
|
|
3
3
|
|
4
4
|
module Enumy
|
5
5
|
module Model
|
6
|
-
def
|
6
|
+
def has_enum(name, class_name: name, **options)
|
7
7
|
enum_class = class_name.to_s.classify.safe_constantize
|
8
|
-
|
9
|
-
if enum_class.nil?
|
10
|
-
raise Errors::InvalidEnumClassError, "Could not resolve class `#{class_name.to_s.classify}`"
|
11
|
-
elsif !enum_class.ancestors.include?(Enumy::Base)
|
12
|
-
raise Errors::InvalidEnumClassError, "`#{enum_class.name}` does not inherit from `Enumy::Base`"
|
13
|
-
end
|
14
|
-
|
15
|
-
define_method "#{name}=" do |enum|
|
16
|
-
raise NameError, "Enum `#{enum_class.name}` expected #{self.class.name} to have attribute `#{name}_id`." unless self.has_attribute?("#{name}_id")
|
17
8
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
self.send("#{name}_id=", nil)
|
23
|
-
end
|
24
|
-
|
25
|
-
instance_variable_set("@#{name}", enum)
|
26
|
-
end
|
9
|
+
assert_valid_enum_type!(enum_class)
|
10
|
+
define_enum_attributes(name, enum_class, default: options[:default])
|
11
|
+
define_enum_validations(name, enum_class) unless options[:optional]
|
12
|
+
end
|
27
13
|
|
28
|
-
|
29
|
-
enum = instance_variable_get("@#{name}")
|
30
|
-
return enum if enum
|
14
|
+
private
|
31
15
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end
|
16
|
+
def define_enum_attributes(name, enum_class, **options)
|
17
|
+
attribute name, ActiveModel::Type::Enum.new(enum_class), default: -> { options[:default] }
|
18
|
+
end
|
36
19
|
|
37
|
-
|
38
|
-
|
20
|
+
def define_enum_validations(name, enum_class)
|
21
|
+
validates name, presence: true, inclusion: { in: enum_class.all }
|
22
|
+
end
|
39
23
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
24
|
+
def assert_valid_enum_type!(enum_class)
|
25
|
+
if enum_class.nil?
|
26
|
+
raise Errors::InvalidEnumClassError, "Could not resolve class `#{enum_class.name.to_s.classify}`"
|
27
|
+
elsif !enum_class.ancestors.include?(Enumy::Base)
|
28
|
+
raise Errors::InvalidEnumClassError, "`#{enum_class.name}` does not inherit from `#{Enumy::Base.name}`"
|
45
29
|
end
|
46
|
-
|
47
|
-
after_initialize -> { self.send("#{name}=", default) if self.has_attribute?("#{name}_id") && self.send("#{name}").nil? && default.present? }
|
48
30
|
end
|
49
31
|
end
|
50
32
|
end
|
data/lib/enumy/version.rb
CHANGED
data/lib/enumy.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enumy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bevan Holborn
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-03-
|
10
|
+
date: 2025-03-21 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: rake
|
@@ -42,6 +42,7 @@ executables: []
|
|
42
42
|
extensions: []
|
43
43
|
extra_rdoc_files: []
|
44
44
|
files:
|
45
|
+
- lib/active_model/type/enum.rb
|
45
46
|
- lib/enumy.rb
|
46
47
|
- lib/enumy/base.rb
|
47
48
|
- lib/enumy/errors.rb
|