enumbler 0.3.1 → 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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +33 -15
- data/lib/enumbler/enabler.rb +27 -2
- data/lib/enumbler/enumble.rb +4 -3
- data/lib/enumbler/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c41d00aedb09317c1c7d21627484d57e9d1d8f4f60e51370d56af7481e806fde
|
4
|
+
data.tar.gz: 5187426aefcb06364f1941bbf62932817800de1748646fb658c901afa58d1d6a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64131fd59a8bd70b1897e554b266af9308378036e4d93817b50b95b0cb76bcc0d59c29153a7ccc42d5df1d556c4b3f4538a7499bb81b73c9f45e26823d1e5a30
|
7
|
+
data.tar.gz: 36789800d5e024417b10c872aadae7facaeb03691b289de8da0b5439ecc4c57153db5b4625255e855d39d402e0a086ac3b5d8585134d675684c768a697a93e16
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -2,15 +2,30 @@
|
|
2
2
|
|
3
3
|
`Enums` are terrific, but they lack integrity. Enumbler! The _enum enabler_! The goal is to allow one to maintain a true foreign_key database driven relationship that also behaves a little bit like an `enum`. Best of both worlds? We hope so.
|
4
4
|
|
5
|
+
## Installation
|
5
6
|
|
6
|
-
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'enumbler'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle install
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install enumbler
|
20
|
+
|
21
|
+
## Usage
|
7
22
|
|
8
23
|
Suppose you have a `House` and you want to add some `colors` to the house. You are tempted to use an `enum` but the `Enumbler` is calling!
|
9
24
|
|
10
25
|
```ruby
|
11
26
|
ActiveRecord::Schema.define do
|
12
27
|
create_table :colors|t|
|
13
|
-
t.string :label, null: false
|
28
|
+
t.string :label, null: false, index: { unique: true }
|
14
29
|
end
|
15
30
|
|
16
31
|
create_table :houses|t|
|
@@ -52,25 +67,28 @@ house.not_black?
|
|
52
67
|
House.color(:black) # => [house]
|
53
68
|
```
|
54
69
|
|
55
|
-
|
70
|
+
### Use a column other than `label`
|
56
71
|
|
57
|
-
|
72
|
+
By default, the Enumbler expects a table in the database with a column `label`. However, you can change this to another underlying column name. Note that the enumbler still treats it as a `label` column; however it will be saved to the correct place in the database.
|
58
73
|
|
59
74
|
```ruby
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
$ bundle install
|
66
|
-
|
67
|
-
Or install it yourself as:
|
75
|
+
ActiveRecord::Schema.define do
|
76
|
+
create_table :feelings, force: true do |t|
|
77
|
+
t.string :emotion, null: false, index: { unique: true }
|
78
|
+
end
|
79
|
+
end
|
68
80
|
|
69
|
-
|
81
|
+
class Feeling < ApplicationRecord
|
82
|
+
# @!parse extend Enumbler::Enabler::ClassMethods
|
83
|
+
include Enumbler::Enabler
|
70
84
|
|
71
|
-
|
85
|
+
enumbler_label_column_name :emotion
|
72
86
|
|
73
|
-
|
87
|
+
enumble :sad, 1
|
88
|
+
enumble :happy, 2
|
89
|
+
enumble :verklempt, 3, label: 'overcome with emotion'
|
90
|
+
end
|
91
|
+
```
|
74
92
|
|
75
93
|
## Development
|
76
94
|
|
data/lib/enumbler/enabler.rb
CHANGED
@@ -34,7 +34,7 @@ module Enumbler
|
|
34
34
|
#
|
35
35
|
# # in your migration
|
36
36
|
# create_table :colors, force: true do |t|
|
37
|
-
# t.string :label, null: false
|
37
|
+
# t.string :label, null: false, index: { unique: true }
|
38
38
|
# end
|
39
39
|
#
|
40
40
|
# class Color < ApplicationRecord
|
@@ -60,8 +60,9 @@ module Enumbler
|
|
60
60
|
def enumble(enum, id, label: nil, **options)
|
61
61
|
@enumbles ||= []
|
62
62
|
@enumbled_model = self
|
63
|
+
@enumbler_label_column_name ||= :label
|
63
64
|
|
64
|
-
enumble = Enumble.new(enum, id, label: label, **options)
|
65
|
+
enumble = Enumble.new(enum, id, label: label, label_column_name: @enumbler_label_column_name, **options)
|
65
66
|
|
66
67
|
if @enumbles.include?(enumble)
|
67
68
|
raise Error, "You cannot add the same Enumble twice! Attempted to add: #{enum}, #{id}."
|
@@ -72,6 +73,30 @@ module Enumbler
|
|
72
73
|
@enumbles << enumble
|
73
74
|
end
|
74
75
|
|
76
|
+
# By default, the Enumbler is expecting a table with an underlying column
|
77
|
+
# named `label` that represents the enum in the database. You can change
|
78
|
+
# this by calling `enumber_label_column_name` before you `enumble`!
|
79
|
+
#
|
80
|
+
# ActiveRecord::Schema.define do
|
81
|
+
# create_table :feelings, force: true do |t|
|
82
|
+
# t.string :emotion, null: false, index: { unique: true }
|
83
|
+
# end
|
84
|
+
# end
|
85
|
+
#
|
86
|
+
# class Feeling < ApplicationRecord
|
87
|
+
# # @!parse extend Enumbler::Enabler::ClassMethods
|
88
|
+
# include Enumbler::Enabler
|
89
|
+
#
|
90
|
+
# enumbler_label_column_name :emotion
|
91
|
+
#
|
92
|
+
# enumble :sad, 1
|
93
|
+
# enumble :happy, 2
|
94
|
+
# enumble :verklempt, 3, label: 'overcome with emotion'
|
95
|
+
# end
|
96
|
+
def enumbler_label_column_name(label_column_name)
|
97
|
+
@enumbler_label_column_name = label_column_name
|
98
|
+
end
|
99
|
+
|
75
100
|
# Return the record id for a given argument. Can accept an Integer, a
|
76
101
|
# Symbol, or an instance of Enumbled model. This lookup is a database-free
|
77
102
|
# lookup.
|
data/lib/enumbler/enumble.rb
CHANGED
@@ -3,12 +3,13 @@
|
|
3
3
|
module Enumbler
|
4
4
|
# Class that holds each row of Enumble data.
|
5
5
|
class Enumble
|
6
|
-
attr_reader :id, :enum, :label, :options
|
6
|
+
attr_reader :id, :enum, :label, :label_column_name, :options
|
7
7
|
|
8
|
-
def initialize(enum, id, label: nil, **options)
|
8
|
+
def initialize(enum, id, label: nil, label_column_name: :label, **options)
|
9
9
|
@id = id
|
10
10
|
@enum = enum
|
11
11
|
@label = label || enum.to_s.dasherize
|
12
|
+
@label_column_name = label_column_name
|
12
13
|
@options = options
|
13
14
|
end
|
14
15
|
|
@@ -20,7 +21,7 @@ module Enumbler
|
|
20
21
|
def attributes
|
21
22
|
{
|
22
23
|
id: id,
|
23
|
-
|
24
|
+
label_column_name => label,
|
24
25
|
}
|
25
26
|
end
|
26
27
|
|
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.
|
4
|
+
version: 0.4.0
|
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-05-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|