enumy 0.3.0 → 0.5.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: a54e83ce101241eb1877bcbd84bdfa689d13daca88c05ee3c3cb707187e56083
4
+ data.tar.gz: 4f01d1ade132dd0ad4278d958886937f71ac194286a3e779a8b80f666cc08df1
5
5
  SHA512:
6
- metadata.gz: 90eb307fa980e73ee36f56fa64ddc98f99d2774d6e7998a80381d84ca94d308b97dc848dac41f5fc91007841374c5b039b53e581f5b5abe164ad7708556c9e30
7
- data.tar.gz: 49b0b61bffe6f652cd92f02f7ae940c82ad7c0ee0f16a8923647b1a4a2c85f2496df10f0c13b641ce56da97e8a36523a4244949e2d24533e1a647cf2f01d14c1
6
+ metadata.gz: fec439e1d839004c8257aadcafe26ae12d6a2dfc8c5756de3d8bcab5c324eab171c9fd7834d21b05d20af18ac41f896e7eba2c3579aec614c40fa8e74f13a53d
7
+ data.tar.gz: dc60e189394030f3256804f46e68ff354de2a36ed46339e726119067a51921b45b2f6da6d8720a1c04137bdbc37cbccca661641af22f5964219fbbb52f249027
@@ -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
 
@@ -19,11 +19,15 @@ module Enumy
19
19
  end
20
20
 
21
21
  def name
22
- self.key.to_s
22
+ human_attribute_name(:key)
23
+ end
24
+
25
+ def title
26
+ key.to_s.titleize
23
27
  end
24
28
 
25
29
  def to_s
26
- self.key.to_s
30
+ key.to_s
27
31
  end
28
32
 
29
33
  def inspect
@@ -33,8 +37,10 @@ module Enumy
33
37
  class << self
34
38
 
35
39
  def define(enum)
40
+ raise ArgumentError, "Expected an object of type `Enumy::Base`, got #{enum.class.name}" unless enum.is_a?(Enumy::Base)
41
+
36
42
  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}'."
43
+ raise Errors::DuplicateEnumInstanceError, "Enum `#{enum.key.to_s.upcase}` is using a duplicate key `#{enum.key}` for Enum '#{enum.class.name}'."
38
44
  else
39
45
  instances[enum.key] = enum
40
46
  end
@@ -54,13 +60,15 @@ module Enumy
54
60
  end
55
61
 
56
62
  def find_by(**args)
63
+ raise ArgumentError, "`find_by` requires at least one key-value pair" if args.empty?
64
+
57
65
  instances.values.find do |instance|
58
66
  args.all? { |attr, value| instance.send(attr) == value }
59
67
  end
60
68
  end
61
69
 
62
70
  def model_name
63
- @model_name ||= ActiveModel::Name.new(self, nil, self.name.to_s)
71
+ @model_name ||= ::ActiveModel::Name.new(self, nil, self.name.to_s)
64
72
  end
65
73
 
66
74
  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.5.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.5.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-06-23 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: []