enumy 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2bfc350598385baf6ebb12df7a2585f9f9f60e0586cb62cea80d5b24147edc93
4
+ data.tar.gz: 977649afef0532bb37164c67f37cb455aaddf9b8146353170d28c69222ec413d
5
+ SHA512:
6
+ metadata.gz: ae0d236ea8a2af53589294683ada6eb3c7ad92acb01862dd970d3354d0c3d615f3499b27e61037d55d337e0eec7c016189e60fe22efc807640833b508c6da57a
7
+ data.tar.gz: 8c544baca8ebb6ee40d92ba8c9a7dd155234bfd4e97a1494061604eb364a36cbae7256c35a9f0404fbf2552ccf7390fee9f6ab9f34a30554f079d563b5958100
data/lib/enumy/base.rb ADDED
@@ -0,0 +1,64 @@
1
+ require_relative 'errors'
2
+
3
+ module Enumy
4
+ class Base
5
+ include ActiveModel::Model
6
+
7
+ attr_accessor :id
8
+ attr_accessor :name
9
+
10
+ def initialize(id = nil, name = nil)
11
+ @id = id
12
+ @name = name
13
+ end
14
+
15
+ def human_attribute_name(attribute)
16
+ I18n.t("#{self.class.i18n_scope}.attributes.models.#{self.class.model_name.i18n_key}/#{self.name}.#{attribute}")
17
+ end
18
+
19
+ class << self
20
+
21
+ def register(enum)
22
+ if instances[enum.id]
23
+ warn "Enum `#{enum.name.to_s.upcase}` is using a duplicate id `#{enum.id}` for Enum '#{enum.class.name}'. Ignoring the duplicate."
24
+ else
25
+ instances[enum.id] = enum
26
+ end
27
+ end
28
+
29
+ def all
30
+ instances.values
31
+ end
32
+
33
+ def find(id)
34
+ find_by_id(id) || raise(Errors::EnumNotFoundError.new)
35
+ end
36
+
37
+ def find_by_id(id)
38
+ instances[id]
39
+ end
40
+
41
+ def find_by(**args)
42
+ instances.values.find do |instance|
43
+ args.all? { |attr, value| instance.send(attr) == value }
44
+ end
45
+ end
46
+
47
+ def model_name
48
+ @model_name ||= ActiveModel::Name.new(self.class, nil, name.to_s)
49
+ end
50
+
51
+ def i18n_scope
52
+ :enum
53
+ end
54
+
55
+ private
56
+
57
+ def instances
58
+ @instances ||= {}
59
+ end
60
+
61
+ end
62
+
63
+ end
64
+ end
@@ -0,0 +1,8 @@
1
+ module Enumy
2
+ module Errors
3
+
4
+ class EnumNotFoundError < StandardError; end
5
+ class InvalidEnumClassError < NameError; end
6
+
7
+ end
8
+ end
@@ -0,0 +1,25 @@
1
+ require_relative 'base'
2
+ require_relative 'errors'
3
+
4
+ module Enumy
5
+ module Model
6
+ def belongs_to_enum(name, class_name: name, default: nil)
7
+ enum_class = class_name.to_s.classify.safe_constantize
8
+ raise Errors::InvalidEnumClassError if enum_class.nil? || !enum_class.ancestors.include?(Enumy::Base)
9
+
10
+ define_method "#{name}=" do |enum|
11
+ return nil unless self.has_attribute?("#{name}_id")
12
+ instance_variable_set("@#{name}", self.send("#{name}_id=", enum.id))
13
+ end
14
+
15
+ define_method "#{name}" do
16
+ enum = instance_variable_get("@#{name}")
17
+ return enum if enum
18
+ return nil unless self.has_attribute?("#{name}_id") && self.send("#{name}_id")
19
+ instance_variable_set("@#{name}", enum_class.find(self.send("#{name}_id")))
20
+ end
21
+
22
+ after_initialize -> { self.send("#{name}=", default) if self.send("#{name}").nil? && default.present? }
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Enumy
4
+ VERSION = "0.1.0"
5
+ end
data/lib/enumy.rb ADDED
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'enumy/base'
4
+ require 'enumy/model'
5
+ require "generators/enumy/install/install_generator"
@@ -0,0 +1,20 @@
1
+ module Enumy
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ source_root File.expand_path("templates", __dir__)
5
+
6
+ def copy_application_enum
7
+ template "app/enums/application_enum.rb", "app/enums/application_enum.rb"
8
+ end
9
+
10
+ def add_application_record_concern
11
+ inject_into_file "app/models/application_record.rb", after: /^.*primary_abstract_class.*$/ do
12
+ <<~CODE
13
+
14
+ \textend Enumy::Model\n
15
+ CODE
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,10 @@
1
+ class ApplicationEnum < Enumy::Base
2
+ include ActiveModel::Attributes
3
+
4
+ attribute :id, :integer
5
+ attribute :name, :symbol
6
+
7
+ def initialize(id, name, **attrs)
8
+ super(id: id, name: name, **attrs)
9
+ end
10
+ end
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: enumy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Bevan Holborn
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 2025-01-14 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rake
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :development
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: rspec
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '3.0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '3.0'
40
+ description: Use Enumeration objects as ActiveRecord like associations
41
+ executables: []
42
+ extensions: []
43
+ extra_rdoc_files: []
44
+ files:
45
+ - lib/enumy.rb
46
+ - lib/enumy/base.rb
47
+ - lib/enumy/errors.rb
48
+ - lib/enumy/model.rb
49
+ - lib/enumy/version.rb
50
+ - lib/generators/enumy/install/install_generator.rb
51
+ - lib/generators/enumy/install/templates/app/enums/application_enum.rb
52
+ licenses:
53
+ - MIT
54
+ metadata:
55
+ source_code_uri: https://gitlab.com/BevanHolborn/enumy
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: 2.7.0
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ requirements: []
70
+ rubygems_version: 3.6.2
71
+ specification_version: 4
72
+ summary: ActiveRecord like enum associations
73
+ test_files: []