enumbler 0.6.5 → 0.6.10
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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +18 -0
- data/lib/enumbler.rb +9 -8
- data/lib/enumbler/core_ext/symbol/case_equality_operator.rb +22 -0
- data/lib/enumbler/enabler.rb +20 -1
- data/lib/enumbler/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f5c38e7d7fa5b50711b36695b14990509fcee834dfbf91025bf9c23b68f0164
|
4
|
+
data.tar.gz: 2a03beaa5e2a8ae713af29b9a39358122b586cfa9b7fa75583e15655806aeb80
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 428b407fdec8f44eec45e14503acbdfa98356a6b8b4d4b08ece07a355b4e6ae2de147c3807e0f3d7aeccb3fd2c81681f718bd8ada45e7d4c57103b7e53a1c30b
|
7
|
+
data.tar.gz: 2a3d3b91abe35d68dfb97b76bbddec356debe6f02ba9687f89c3b6f6c34d5f217365a61f846df5cafaa6630d045e9517d5d47b2e288d865475f4df010abe170b
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -61,6 +61,9 @@ Color.black.black? # => true
|
|
61
61
|
Color.black.is_black # => true
|
62
62
|
Color.white.not_black? # => true
|
63
63
|
|
64
|
+
Color.all.any_black? # => true
|
65
|
+
Color.where.not(id: Color::BLACK).any_black? # => false
|
66
|
+
|
64
67
|
# Get attributes without hitting the database
|
65
68
|
Color.black(:id) # => 1
|
66
69
|
Color.black(:enum) # => :black
|
@@ -73,6 +76,9 @@ Color.find_enumbles(:black, 'does-not-exist') # => [Enumbler::Enumble<:black>, n
|
|
73
76
|
|
74
77
|
Color.find_enumble(:black) # => Enumbler::Enumble<:black>
|
75
78
|
|
79
|
+
# Is pretty flexible with findidng things from strings
|
80
|
+
Color.find_enumble('Dark_Brown') # => Enumbler::Enumble<:dark-brown>
|
81
|
+
|
76
82
|
# raises errors if none found
|
77
83
|
Color.find_enumbles!!(:black, 'does-no-exist') # => raises Enumbler::Error
|
78
84
|
Color.find_enumble!(:does_not_exist) # => raises Enumbler::Error
|
@@ -123,6 +129,18 @@ class Feeling < ApplicationRecord
|
|
123
129
|
end
|
124
130
|
```
|
125
131
|
|
132
|
+
## Core ext
|
133
|
+
|
134
|
+
Adds case equality power to the `Symbol` class allowing you to use case methods directly against an enabled instance:
|
135
|
+
|
136
|
+
```ruby
|
137
|
+
case Color.black
|
138
|
+
when :black
|
139
|
+
'not surprised'
|
140
|
+
when :blue, :purple
|
141
|
+
'very surprised'
|
142
|
+
end
|
143
|
+
|
126
144
|
## Development
|
127
145
|
|
128
146
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/enumbler.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'enumbler/core_ext/symbol/case_equality_operator'
|
4
|
+
|
3
5
|
require 'enumbler/collection'
|
4
6
|
require 'enumbler/enumble'
|
5
7
|
require 'enumbler/enabler'
|
@@ -55,7 +57,7 @@ module Enumbler
|
|
55
57
|
# example: `where_by` will make it `House.where_by_color(:black)`
|
56
58
|
# @param **options [Hash] additional options passed to `belongs_to`
|
57
59
|
def enumbled_to(name, scope = nil, prefix: false, scope_prefix: nil, **options)
|
58
|
-
class_name = name.to_s.classify
|
60
|
+
class_name = options.fetch(:class_name, name.to_s.classify)
|
59
61
|
enumbled_model = class_name.constantize
|
60
62
|
|
61
63
|
unless enumbled_model.respond_to?(:enumbles)
|
@@ -66,7 +68,7 @@ module Enumbler
|
|
66
68
|
belongs_to(name, scope, **options)
|
67
69
|
|
68
70
|
define_helper_attributes(name)
|
69
|
-
define_dynamic_methods_for_enumbled_to_models(enumbled_model, prefix: prefix, scope_prefix: scope_prefix)
|
71
|
+
define_dynamic_methods_for_enumbled_to_models(name, enumbled_model, prefix: prefix, scope_prefix: scope_prefix)
|
70
72
|
rescue NameError
|
71
73
|
raise Error, "The model #{class_name} cannot be found. Uninitialized constant."
|
72
74
|
end
|
@@ -78,11 +80,10 @@ module Enumbler
|
|
78
80
|
# @todo - we should check for naming conflicts!
|
79
81
|
# dangerous_attribute_method?(method_name)
|
80
82
|
# method_defined_within?(method_name, self, Module)
|
81
|
-
def define_dynamic_methods_for_enumbled_to_models(enumbled_model, prefix: false, scope_prefix: nil)
|
82
|
-
|
83
|
-
column_name = "#{model_name}_id"
|
83
|
+
def define_dynamic_methods_for_enumbled_to_models(name, enumbled_model, prefix: false, scope_prefix: nil)
|
84
|
+
column_name = "#{name}_id"
|
84
85
|
|
85
|
-
cmethod = scope_prefix.blank? ?
|
86
|
+
cmethod = scope_prefix.blank? ? name : "#{scope_prefix}_#{name}"
|
86
87
|
define_singleton_method(cmethod) do |*args|
|
87
88
|
where(column_name => enumbled_model.ids_from_enumbler(args))
|
88
89
|
end
|
@@ -92,8 +93,8 @@ module Enumbler
|
|
92
93
|
end
|
93
94
|
|
94
95
|
enumbled_model.enumbles.each do |enumble|
|
95
|
-
method_name = prefix ? "#{
|
96
|
-
not_method_name = prefix ? "#{
|
96
|
+
method_name = prefix ? "#{name}_#{enumble.enum}?" : "#{enumble.enum}?"
|
97
|
+
not_method_name = prefix ? "#{name}_not_#{enumble.enum}?" : "not_#{enumble.enum}?"
|
97
98
|
define_method(method_name) { self[column_name] == enumble.id }
|
98
99
|
define_method(not_method_name) { self[column_name] != enumble.id }
|
99
100
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Use case equality operator with an enabled class.
|
4
|
+
#
|
5
|
+
# case House.black
|
6
|
+
# when :black
|
7
|
+
# 'this is true'
|
8
|
+
# when :blue, :purple
|
9
|
+
# 'this is not'
|
10
|
+
# end
|
11
|
+
class Symbol
|
12
|
+
def ===(other)
|
13
|
+
super ||
|
14
|
+
other.class.included_modules.include?(Enumbler::Enabler) &&
|
15
|
+
other.enumble.enum == self
|
16
|
+
|
17
|
+
# Calling #enumble on a new instance that has not been defined raises an
|
18
|
+
# error, so catching that edge case here
|
19
|
+
rescue Enumbler::Error
|
20
|
+
false
|
21
|
+
end
|
22
|
+
end
|
data/lib/enumbler/enabler.rb
CHANGED
@@ -26,6 +26,15 @@ module Enumbler
|
|
26
26
|
super
|
27
27
|
end
|
28
28
|
|
29
|
+
# The enumble symbol if it exists.
|
30
|
+
# @return [Symbol]
|
31
|
+
def to_sym
|
32
|
+
enumble = self.class.find_enumble(id)
|
33
|
+
return enumble.enum if enumble.present?
|
34
|
+
|
35
|
+
super
|
36
|
+
end
|
37
|
+
|
29
38
|
# These ClassMethods can be included in any model that you wish to
|
30
39
|
# _Enumble_!
|
31
40
|
#
|
@@ -168,7 +177,11 @@ module Enumbler
|
|
168
177
|
@enumbled_model.enumbles.find { |e| e.enum == arg }
|
169
178
|
elsif arg.is_a?(String)
|
170
179
|
@enumbled_model.enumbles.find do |e|
|
171
|
-
case_sensitive
|
180
|
+
if case_sensitive
|
181
|
+
[e.label, e.enum.to_s].include?(arg)
|
182
|
+
else
|
183
|
+
arg.casecmp?(e.label) || arg.casecmp?(e.enum.to_s)
|
184
|
+
end
|
172
185
|
end
|
173
186
|
elsif arg.instance_of?(@enumbled_model)
|
174
187
|
arg.enumble
|
@@ -322,6 +335,12 @@ module Enumbler
|
|
322
335
|
rescue NoMethodError
|
323
336
|
raise Enumbler::Error, "The attribute #{attr} is not supported on this Enumble."
|
324
337
|
end
|
338
|
+
|
339
|
+
define_singleton_method("any_#{enumble.enum}?") do
|
340
|
+
where(id: enumble.id).exists?
|
341
|
+
rescue NoMethodError
|
342
|
+
raise Enumbler::Error, "The attribute #{attr} is not supported on this Enumble."
|
343
|
+
end
|
325
344
|
end
|
326
345
|
|
327
346
|
# I accidentally forgot to provide an id one time and it was confusing as
|
data/lib/enumbler/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enumbler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Damon Timm
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-09-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -157,6 +157,7 @@ files:
|
|
157
157
|
- enumbler.gemspec
|
158
158
|
- lib/enumbler.rb
|
159
159
|
- lib/enumbler/collection.rb
|
160
|
+
- lib/enumbler/core_ext/symbol/case_equality_operator.rb
|
160
161
|
- lib/enumbler/enabler.rb
|
161
162
|
- lib/enumbler/enumble.rb
|
162
163
|
- lib/enumbler/version.rb
|