enumy 0.3.0 → 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: 48c034d7276e26bde26c3ab1af9042e7965f60e6aaf049e30dedb0ed8d288b3e
4
- data.tar.gz: 9aa548c28f86f7ae8f2ef0cf994ac989c705665a06212f37cd2fdd56d1228f38
3
+ metadata.gz: 0c55b6f482c9297c67a5149c3d2c349c89018f89eec176d2e76fdb993bcc6d39
4
+ data.tar.gz: 0076a894f5661321360342fb1d3264f0e26b86d64858201b308908131a95714a
5
5
  SHA512:
6
- metadata.gz: 90eb307fa980e73ee36f56fa64ddc98f99d2774d6e7998a80381d84ca94d308b97dc848dac41f5fc91007841374c5b039b53e581f5b5abe164ad7708556c9e30
7
- data.tar.gz: 49b0b61bffe6f652cd92f02f7ae940c82ad7c0ee0f16a8923647b1a4a2c85f2496df10f0c13b641ce56da97e8a36523a4244949e2d24533e1a647cf2f01d14c1
6
+ metadata.gz: 402f4d93a29fcfb54a940c063f95e2d11ba430cca569710e94283e12405a66f9c47df7de77c7cee8e0e1aea718b0ebe01ac53a59273a34a11ada78e05f68de75
7
+ data.tar.gz: 075243c844f724728cfc7dfc645d68fc24cc3f62e25a0367be9bacadb50918e563ca9fc70cf2198798c79bdd4f9522484b603fe8115c38eb07a0255e21c10824
@@ -6,11 +6,15 @@ module Enumy
6
6
  class EnumSerializer < ::ActiveJob::Serializers::ObjectSerializer
7
7
 
8
8
  def serialize(enum)
9
- super({ class: enum.class.name, key: enum.key })
9
+ super({ class: enum.class.name, key: enum.key.to_s })
10
10
  end
11
11
 
12
12
  def deserialize(hash)
13
- hash['class'].constantize.find(hash['key'])
13
+ hash[:class].constantize.find_by_key(hash[:key])
14
+ end
15
+
16
+ def serialize?(value)
17
+ value.is_a?(klass)
14
18
  end
15
19
 
16
20
  private
@@ -12,7 +12,11 @@ module Enumy
12
12
  end
13
13
 
14
14
  def serialize(value)
15
- value.is_a?(@enum_class) ? value.key : value&.to_s
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
16
20
  end
17
21
 
18
22
  def deserialize(value)
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
 
@@ -33,8 +33,10 @@ module Enumy
33
33
  class << self
34
34
 
35
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
+
36
38
  if instances[enum.key]
37
- 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}'."
38
40
  else
39
41
  instances[enum.key] = enum
40
42
  end
@@ -54,13 +56,15 @@ module Enumy
54
56
  end
55
57
 
56
58
  def find_by(**args)
59
+ raise ArgumentError, "`find_by` requires at least one key-value pair" if args.empty?
60
+
57
61
  instances.values.find do |instance|
58
62
  args.all? { |attr, value| instance.send(attr) == value }
59
63
  end
60
64
  end
61
65
 
62
66
  def model_name
63
- @model_name ||= ActiveModel::Name.new(self, nil, self.name.to_s)
67
+ @model_name ||= ::ActiveModel::Name.new(self, nil, self.name.to_s)
64
68
  end
65
69
 
66
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
@@ -3,7 +3,9 @@ require 'enumy/active_job/serializers/enum_serializer'
3
3
  module Enumy
4
4
  class Railtie < Rails::Railtie
5
5
  initializer "enumy.register_active_job_serializer" do |app|
6
- app.config.active_job.custom_serializers << Enumy::ActiveJob::Serializers::EnumSerializer
6
+ if Rails::VERSION::MAJOR >= 6
7
+ app.config.active_job.custom_serializers << Enumy::ActiveJob::Serializers::EnumSerializer
8
+ end
7
9
  end
8
10
  end
9
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.3.0"
4
+ VERSION = "0.4.0"
5
5
  end
data/lib/enumy.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'enumy/version'
2
+
1
3
  if defined?(ActiveModel)
2
4
  require 'enumy/base'
3
5
  end
@@ -8,6 +10,6 @@ if defined?(Rails)
8
10
  require 'enumy/model'
9
11
 
10
12
  if defined?(Rails::Railtie)
11
- require 'enumy/railtie'
13
+ require 'enumy/rails/railtie'
12
14
  end
13
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.3.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-03-26 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,7 +38,22 @@ 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: []
@@ -50,13 +66,15 @@ files:
50
66
  - lib/enumy/generators/enumy/install/install_generator.rb
51
67
  - lib/enumy/generators/enumy/install/templates/app/enums/application_enum.rb
52
68
  - lib/enumy/model.rb
53
- - lib/enumy/railtie.rb
69
+ - lib/enumy/rails/railtie.rb
70
+ - lib/enumy/test_helpers.rb
54
71
  - lib/enumy/version.rb
55
72
  homepage: https://rubygems.org/gems/enumy
56
73
  licenses:
57
74
  - MIT
58
75
  metadata:
59
76
  source_code_uri: https://gitlab.com/BevanHolborn/enumy
77
+ post_install_message:
60
78
  rdoc_options: []
61
79
  require_paths:
62
80
  - lib
@@ -64,14 +82,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
64
82
  requirements:
65
83
  - - ">="
66
84
  - !ruby/object:Gem::Version
67
- version: 2.7.0
85
+ version: 3.1.0
68
86
  required_rubygems_version: !ruby/object:Gem::Requirement
69
87
  requirements:
70
88
  - - ">="
71
89
  - !ruby/object:Gem::Version
72
90
  version: '0'
73
91
  requirements: []
74
- rubygems_version: 3.6.2
92
+ rubygems_version: 3.3.27
93
+ signing_key:
75
94
  specification_version: 4
76
95
  summary: ActiveRecord like enum associations
77
96
  test_files: []