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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eaa9f4a13fabe8f6011960a4df6ef9dcba23b7005f18aa19a898b0b1af6e273e
4
- data.tar.gz: bbfd3f1b0c2ce4ecab2d55ffbe87b70859e7f858b914b514b9fadb77f857fc66
3
+ metadata.gz: 0c55b6f482c9297c67a5149c3d2c349c89018f89eec176d2e76fdb993bcc6d39
4
+ data.tar.gz: 0076a894f5661321360342fb1d3264f0e26b86d64858201b308908131a95714a
5
5
  SHA512:
6
- metadata.gz: 8679f98840a6f998b59135357f23817833de47f2c1311779af1a14220faacaac1f9c9f83faecf5a186401d2731e1d955fa7b5d9d984a74b6f404f2487b1adf90
7
- data.tar.gz: ba4c1b04664e3d4d8b697050a5068d01207744610027306046c9413c4593423dddfd5b725224551b21d7aa96841568aeda5d46e3af79142d1ffcc5926d8c7d4b
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 ArgumentError, "Enum `#{enum.key.to_s.upcase}` is using a duplicate key `#{enum.key}` for Enum '#{enum.class.name}'."
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
@@ -3,6 +3,7 @@ module Enumy
3
3
 
4
4
  class EnumNotFoundError < StandardError; end
5
5
  class InvalidEnumClassError < NameError; end
6
+ class DuplicateEnumInstanceError < ArgumentError; end
6
7
 
7
8
  end
8
9
  end
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 `#{enum_class.name.to_s.classify}`"
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Enumy
4
- VERSION = "0.2.1"
4
+ VERSION = "0.4.0"
5
5
  end
data/lib/enumy.rb CHANGED
@@ -1,4 +1,15 @@
1
- require 'enumy/base'
2
- require 'enumy/model'
3
- require 'generators/enumy/install/install_generator'
4
- require 'active_model/type/enum'
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.2.1
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-03-21 00:00:00.000000000 Z
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: 2.7.0
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.6.2
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