enumy 0.2.1 → 0.4.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/lib/enumy/active_job/serializers/enum_serializer.rb +28 -0
- data/lib/enumy/active_model/type/enum.rb +32 -0
- data/lib/enumy/base.rb +13 -4
- data/lib/enumy/errors.rb +1 -0
- data/lib/enumy/model.rb +3 -3
- data/lib/enumy/rails/railtie.rb +11 -0
- data/lib/enumy/test_helpers.rb +28 -0
- data/lib/enumy/version.rb +1 -1
- data/lib/enumy.rb +15 -4
- metadata +32 -11
- data/lib/active_model/type/enum.rb +0 -26
- /data/lib/{generators → enumy/generators}/enumy/install/install_generator.rb +0 -0
- /data/lib/{generators → enumy/generators}/enumy/install/templates/app/enums/application_enum.rb +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c55b6f482c9297c67a5149c3d2c349c89018f89eec176d2e76fdb993bcc6d39
|
4
|
+
data.tar.gz: 0076a894f5661321360342fb1d3264f0e26b86d64858201b308908131a95714a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 402f4d93a29fcfb54a940c063f95e2d11ba430cca569710e94283e12405a66f9c47df7de77c7cee8e0e1aea718b0ebe01ac53a59273a34a11ada78e05f68de75
|
7
|
+
data.tar.gz: 075243c844f724728cfc7dfc645d68fc24cc3f62e25a0367be9bacadb50918e563ca9fc70cf2198798c79bdd4f9522484b603fe8115c38eb07a0255e21c10824
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'enumy/base.rb'
|
2
|
+
|
3
|
+
module Enumy
|
4
|
+
module ActiveJob
|
5
|
+
module Serializers
|
6
|
+
class EnumSerializer < ::ActiveJob::Serializers::ObjectSerializer
|
7
|
+
|
8
|
+
def serialize(enum)
|
9
|
+
super({ class: enum.class.name, key: enum.key.to_s })
|
10
|
+
end
|
11
|
+
|
12
|
+
def deserialize(hash)
|
13
|
+
hash[:class].constantize.find_by_key(hash[:key])
|
14
|
+
end
|
15
|
+
|
16
|
+
def serialize?(value)
|
17
|
+
value.is_a?(klass)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def klass
|
23
|
+
Enumy::Base
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Enumy
|
2
|
+
module ActiveModel
|
3
|
+
module Type
|
4
|
+
class Enum < ::ActiveModel::Type::Value
|
5
|
+
def initialize(enum_class)
|
6
|
+
@enum_class = enum_class
|
7
|
+
super()
|
8
|
+
end
|
9
|
+
|
10
|
+
def cast(value)
|
11
|
+
value.is_a?(@enum_class) ? value : @enum_class.find_by_key(value&.to_sym)
|
12
|
+
end
|
13
|
+
|
14
|
+
def serialize(value)
|
15
|
+
if value.is_a?(@enum_class)
|
16
|
+
value.key.to_s
|
17
|
+
else
|
18
|
+
@enum_class.find_by_key(value&.to_sym) ? value&.to_s : nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def deserialize(value)
|
23
|
+
value.is_a?(@enum_class) ? value : @enum_class.find_by_key(value&.to_sym)
|
24
|
+
end
|
25
|
+
|
26
|
+
def type
|
27
|
+
:enum
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/enumy/base.rb
CHANGED
@@ -2,8 +2,8 @@ require_relative 'errors'
|
|
2
2
|
|
3
3
|
module Enumy
|
4
4
|
class Base
|
5
|
-
include ActiveModel::Model
|
6
|
-
include ActiveModel::Attributes
|
5
|
+
include ::ActiveModel::Model
|
6
|
+
include ::ActiveModel::Attributes
|
7
7
|
|
8
8
|
attribute :key
|
9
9
|
|
@@ -18,6 +18,10 @@ module Enumy
|
|
18
18
|
I18n.t("#{self.class.i18n_scope}.attributes.models.#{self.class.model_name.i18n_key}/#{self.key}.#{attribute}")
|
19
19
|
end
|
20
20
|
|
21
|
+
def name
|
22
|
+
self.key.to_s
|
23
|
+
end
|
24
|
+
|
21
25
|
def to_s
|
22
26
|
self.key.to_s
|
23
27
|
end
|
@@ -29,8 +33,10 @@ module Enumy
|
|
29
33
|
class << self
|
30
34
|
|
31
35
|
def define(enum)
|
36
|
+
raise ArgumentError, "Expected an object of type `Enumy::Base`, got #{enum.class.name}" unless enum.is_a?(Enumy::Base)
|
37
|
+
|
32
38
|
if instances[enum.key]
|
33
|
-
raise
|
39
|
+
raise Errors::DuplicateEnumInstanceError, "Enum `#{enum.key.to_s.upcase}` is using a duplicate key `#{enum.key}` for Enum '#{enum.class.name}'."
|
34
40
|
else
|
35
41
|
instances[enum.key] = enum
|
36
42
|
end
|
@@ -45,17 +51,20 @@ module Enumy
|
|
45
51
|
end
|
46
52
|
|
47
53
|
def find_by_key(key)
|
54
|
+
key = key.to_sym if key.is_a?(String)
|
48
55
|
instances[key]
|
49
56
|
end
|
50
57
|
|
51
58
|
def find_by(**args)
|
59
|
+
raise ArgumentError, "`find_by` requires at least one key-value pair" if args.empty?
|
60
|
+
|
52
61
|
instances.values.find do |instance|
|
53
62
|
args.all? { |attr, value| instance.send(attr) == value }
|
54
63
|
end
|
55
64
|
end
|
56
65
|
|
57
66
|
def model_name
|
58
|
-
@model_name ||= ActiveModel::Name.new(self, nil, self.name.to_s)
|
67
|
+
@model_name ||= ::ActiveModel::Name.new(self, nil, self.name.to_s)
|
59
68
|
end
|
60
69
|
|
61
70
|
def i18n_scope
|
data/lib/enumy/errors.rb
CHANGED
data/lib/enumy/model.rb
CHANGED
@@ -6,7 +6,7 @@ module Enumy
|
|
6
6
|
def has_enum(name, class_name: name, **options)
|
7
7
|
enum_class = class_name.to_s.classify.safe_constantize
|
8
8
|
|
9
|
-
assert_valid_enum_type!(enum_class)
|
9
|
+
assert_valid_enum_type!(enum_class, class_name)
|
10
10
|
define_enum_attributes(name, enum_class, default: options[:default])
|
11
11
|
define_enum_validations(name, enum_class) unless options[:optional]
|
12
12
|
end
|
@@ -21,9 +21,9 @@ module Enumy
|
|
21
21
|
validates name, presence: true, inclusion: { in: enum_class.all }
|
22
22
|
end
|
23
23
|
|
24
|
-
def assert_valid_enum_type!(enum_class)
|
24
|
+
def assert_valid_enum_type!(enum_class, class_name)
|
25
25
|
if enum_class.nil?
|
26
|
-
raise Errors::InvalidEnumClassError, "Could not resolve class `#{
|
26
|
+
raise Errors::InvalidEnumClassError, "Could not resolve class `#{class_name.to_s.classify}`"
|
27
27
|
elsif !enum_class.ancestors.include?(Enumy::Base)
|
28
28
|
raise Errors::InvalidEnumClassError, "`#{enum_class.name}` does not inherit from `#{Enumy::Base.name}`"
|
29
29
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'enumy/active_job/serializers/enum_serializer'
|
2
|
+
|
3
|
+
module Enumy
|
4
|
+
class Railtie < Rails::Railtie
|
5
|
+
initializer "enumy.register_active_job_serializer" do |app|
|
6
|
+
if Rails::VERSION::MAJOR >= 6
|
7
|
+
app.config.active_job.custom_serializers << Enumy::ActiveJob::Serializers::EnumSerializer
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Enumy
|
2
|
+
module TestHelpers
|
3
|
+
def with_enum_defined(enum_class, enum_instance)
|
4
|
+
enum_class.define(enum_instance)
|
5
|
+
|
6
|
+
yield
|
7
|
+
|
8
|
+
enum_class.send(:instances).delete(enum_instance.key)
|
9
|
+
enum_const_name = enum_class.constants.find { |const_name| enum_class.const_get(const_name) == enum_instance }
|
10
|
+
remove_const(enum_const_name) if enum_const_name
|
11
|
+
end
|
12
|
+
|
13
|
+
def enum_model_class(&block)
|
14
|
+
base_class = Class.new(ApplicationRecord) do
|
15
|
+
extend Enumy::Model
|
16
|
+
|
17
|
+
class << self
|
18
|
+
def name
|
19
|
+
"TempModel"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
base_class.class_exec(&block) if block
|
25
|
+
base_class
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/enumy/version.rb
CHANGED
data/lib/enumy.rb
CHANGED
@@ -1,4 +1,15 @@
|
|
1
|
-
require 'enumy/
|
2
|
-
|
3
|
-
|
4
|
-
require '
|
1
|
+
require 'enumy/version'
|
2
|
+
|
3
|
+
if defined?(ActiveModel)
|
4
|
+
require 'enumy/base'
|
5
|
+
end
|
6
|
+
|
7
|
+
if defined?(Rails)
|
8
|
+
require 'enumy/generators/enumy/install/install_generator'
|
9
|
+
require 'enumy/active_model/type/enum'
|
10
|
+
require 'enumy/model'
|
11
|
+
|
12
|
+
if defined?(Rails::Railtie)
|
13
|
+
require 'enumy/rails/railtie'
|
14
|
+
end
|
15
|
+
end
|
metadata
CHANGED
@@ -1,28 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enumy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bevan Holborn
|
8
|
+
autorequire:
|
8
9
|
bindir: bin
|
9
10
|
cert_chain: []
|
10
|
-
date: 2025-
|
11
|
+
date: 2025-04-17 00:00:00.000000000 Z
|
11
12
|
dependencies:
|
12
13
|
- !ruby/object:Gem::Dependency
|
13
14
|
name: rake
|
14
15
|
requirement: !ruby/object:Gem::Requirement
|
15
16
|
requirements:
|
16
|
-
- - "
|
17
|
+
- - "~>"
|
17
18
|
- !ruby/object:Gem::Version
|
18
|
-
version: '0'
|
19
|
+
version: '13.0'
|
19
20
|
type: :development
|
20
21
|
prerelease: false
|
21
22
|
version_requirements: !ruby/object:Gem::Requirement
|
22
23
|
requirements:
|
23
|
-
- - "
|
24
|
+
- - "~>"
|
24
25
|
- !ruby/object:Gem::Version
|
25
|
-
version: '0'
|
26
|
+
version: '13.0'
|
26
27
|
- !ruby/object:Gem::Dependency
|
27
28
|
name: rspec
|
28
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -37,24 +38,43 @@ dependencies:
|
|
37
38
|
- - "~>"
|
38
39
|
- !ruby/object:Gem::Version
|
39
40
|
version: '3.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec-rails
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '7.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '7.0'
|
40
55
|
description: Use Enumeration objects as ActiveRecord like associations
|
56
|
+
email:
|
41
57
|
executables: []
|
42
58
|
extensions: []
|
43
59
|
extra_rdoc_files: []
|
44
60
|
files:
|
45
|
-
- lib/active_model/type/enum.rb
|
46
61
|
- lib/enumy.rb
|
62
|
+
- lib/enumy/active_job/serializers/enum_serializer.rb
|
63
|
+
- lib/enumy/active_model/type/enum.rb
|
47
64
|
- lib/enumy/base.rb
|
48
65
|
- lib/enumy/errors.rb
|
66
|
+
- lib/enumy/generators/enumy/install/install_generator.rb
|
67
|
+
- lib/enumy/generators/enumy/install/templates/app/enums/application_enum.rb
|
49
68
|
- lib/enumy/model.rb
|
69
|
+
- lib/enumy/rails/railtie.rb
|
70
|
+
- lib/enumy/test_helpers.rb
|
50
71
|
- lib/enumy/version.rb
|
51
|
-
- lib/generators/enumy/install/install_generator.rb
|
52
|
-
- lib/generators/enumy/install/templates/app/enums/application_enum.rb
|
53
72
|
homepage: https://rubygems.org/gems/enumy
|
54
73
|
licenses:
|
55
74
|
- MIT
|
56
75
|
metadata:
|
57
76
|
source_code_uri: https://gitlab.com/BevanHolborn/enumy
|
77
|
+
post_install_message:
|
58
78
|
rdoc_options: []
|
59
79
|
require_paths:
|
60
80
|
- lib
|
@@ -62,14 +82,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
62
82
|
requirements:
|
63
83
|
- - ">="
|
64
84
|
- !ruby/object:Gem::Version
|
65
|
-
version:
|
85
|
+
version: 3.1.0
|
66
86
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
87
|
requirements:
|
68
88
|
- - ">="
|
69
89
|
- !ruby/object:Gem::Version
|
70
90
|
version: '0'
|
71
91
|
requirements: []
|
72
|
-
rubygems_version: 3.
|
92
|
+
rubygems_version: 3.3.27
|
93
|
+
signing_key:
|
73
94
|
specification_version: 4
|
74
95
|
summary: ActiveRecord like enum associations
|
75
96
|
test_files: []
|
@@ -1,26 +0,0 @@
|
|
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
|
File without changes
|
/data/lib/{generators → enumy/generators}/enumy/install/templates/app/enums/application_enum.rb
RENAMED
File without changes
|