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 +7 -0
- data/lib/enumy/base.rb +64 -0
- data/lib/enumy/errors.rb +8 -0
- data/lib/enumy/model.rb +25 -0
- data/lib/enumy/version.rb +5 -0
- data/lib/enumy.rb +5 -0
- data/lib/generators/enumy/install/install_generator.rb +20 -0
- data/lib/generators/enumy/install/templates/app/enums/application_enum.rb +10 -0
- metadata +73 -0
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
|
data/lib/enumy/errors.rb
ADDED
data/lib/enumy/model.rb
ADDED
@@ -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
|
data/lib/enumy.rb
ADDED
@@ -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
|
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: []
|