galetahub-enum_field 0.5.0 → 0.5.1
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/README.md +38 -10
- data/lib/enum_field/builder.rb +26 -1
- data/lib/enum_field/define_enum.rb +3 -3
- data/lib/enum_field/version.rb +1 -1
- data/spec/enum_field/define_enum_spec.rb +53 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6aecc946fb32aa9197932e9ff1264bbf06cd19ef
|
4
|
+
data.tar.gz: 58f8f65ee968672a7b1678819b18612a7faec2ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a9241a8594e8f55df86dd494cf288075e2865cb47672f537f675bd0c3e982b38c764bfa9b916dd69a67bf530f43f62274c766a04d147f87abf762d5a8eb8616
|
7
|
+
data.tar.gz: 065c0d729c5ecd8ef57b5673eb7802a851ad96c1a6c89f4b130edf3f808fb1440e681b3694bf1b749fc150a202f3506073de43387c7e6272817379771726cd47
|
data/README.md
CHANGED
@@ -6,11 +6,11 @@
|
|
6
6
|
Enables Active Record attributes to point to enum like objects, by saving in your database
|
7
7
|
only an integer ID.
|
8
8
|
|
9
|
-
##
|
9
|
+
## Install
|
10
10
|
|
11
11
|
gem 'galetahub-enum_field', require: 'enum_field'
|
12
12
|
|
13
|
-
##
|
13
|
+
## Features
|
14
14
|
|
15
15
|
* Allows creation of Classes with enum like behaviour.
|
16
16
|
* Allows any number of members and methods in the enum classes.
|
@@ -20,7 +20,7 @@ only an integer ID.
|
|
20
20
|
* <code>if user.role.can_edit?</code>
|
21
21
|
* Saves in your +AR+ tables, only an integer id pointing to the enumeration member.
|
22
22
|
|
23
|
-
##
|
23
|
+
## Synopsis
|
24
24
|
|
25
25
|
When in an Active Record class, you have an attribute like role, state or country you have
|
26
26
|
several options.
|
@@ -31,7 +31,7 @@ several options.
|
|
31
31
|
|
32
32
|
If you are not comfortable with any of this options, maybe +enum_field+ is an answer for you.
|
33
33
|
|
34
|
-
##
|
34
|
+
## Basic usage
|
35
35
|
|
36
36
|
Define rules:
|
37
37
|
|
@@ -79,18 +79,21 @@ Your enum classes can have all the methods you need:
|
|
79
79
|
class PhoneType
|
80
80
|
include EnumField::DefineEnum
|
81
81
|
|
82
|
-
|
83
|
-
|
82
|
+
attr_reader :prefix
|
83
|
+
|
84
|
+
def initialize(prefix)
|
85
|
+
@prefix = prefix
|
84
86
|
end
|
85
87
|
|
86
88
|
define_enum do
|
87
|
-
member :home, object: new('
|
88
|
-
member :commercial, object: new('
|
89
|
-
member :mobile, object: new('
|
89
|
+
member :home, object: new('045')
|
90
|
+
member :commercial, object: new('044')
|
91
|
+
member :mobile, object: new('+380')
|
90
92
|
end
|
91
93
|
end
|
92
94
|
|
93
|
-
user.
|
95
|
+
user.phone_type.prefix # +380
|
96
|
+
user.phone_type.name # :mobile
|
94
97
|
```
|
95
98
|
|
96
99
|
You have some +AR+ like methods in enum classes
|
@@ -126,6 +129,31 @@ CommentType.audio.id # 102
|
|
126
129
|
CommentType.text.id # 103
|
127
130
|
```
|
128
131
|
|
132
|
+
### Check if id exists
|
133
|
+
|
134
|
+
``` ruby
|
135
|
+
CommentType.valid_id?(-1) # false
|
136
|
+
CommentType.valid_id?(0) # false
|
137
|
+
CommentType.valid_id?(nil) # false
|
138
|
+
CommentType.valid_id?(1) # false
|
139
|
+
CommentType.valid_id?('101') # false
|
140
|
+
CommentType.valid_id?(:text) # false
|
141
|
+
|
142
|
+
CommentType.valid_id?(101) # true
|
143
|
+
```
|
144
|
+
|
145
|
+
### Check if name exists
|
146
|
+
|
147
|
+
``` ruby
|
148
|
+
CommentType.valid_name?('video') # true
|
149
|
+
CommentType.valid_name?(:video) # true
|
150
|
+
|
151
|
+
CommentType.valid_name?(nil) # false
|
152
|
+
CommentType.valid_name?(1) # false
|
153
|
+
CommentType.valid_name?('wrong') # false
|
154
|
+
CommentType.valid_name?(:wrong) # false
|
155
|
+
```
|
156
|
+
|
129
157
|
## Tests
|
130
158
|
|
131
159
|
bundle install
|
data/lib/enum_field/builder.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module EnumField
|
4
4
|
class Builder
|
5
|
-
METHODS = %w[all names find_by_id find first last ids].freeze
|
5
|
+
METHODS = %w[all names find_by_id find first last ids valid_id? valid_name?].freeze
|
6
6
|
|
7
7
|
attr_reader :members
|
8
8
|
|
@@ -44,6 +44,14 @@ module EnumField
|
|
44
44
|
all.map(&:id)
|
45
45
|
end
|
46
46
|
|
47
|
+
def valid_id?(value)
|
48
|
+
!value.nil? && ids.include?(value)
|
49
|
+
end
|
50
|
+
|
51
|
+
def valid_name?(value)
|
52
|
+
!value.nil? && names.include?(normalize_name(value))
|
53
|
+
end
|
54
|
+
|
47
55
|
def find(id)
|
48
56
|
find_by_id(id) || raise(EnumField::ObjectNotFound)
|
49
57
|
end
|
@@ -57,6 +65,23 @@ module EnumField
|
|
57
65
|
end
|
58
66
|
end
|
59
67
|
|
68
|
+
def method_missing(method_name, *args, &block)
|
69
|
+
if @target.respond_to?(method_name)
|
70
|
+
@target.send(method_name, *args, &block)
|
71
|
+
else
|
72
|
+
super
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def respond_to_missing?(method_name, include_private = false)
|
77
|
+
@target.respond_to?(method_name) || super
|
78
|
+
end
|
79
|
+
|
80
|
+
def freeze!
|
81
|
+
@members.freeze
|
82
|
+
freeze
|
83
|
+
end
|
84
|
+
|
60
85
|
private
|
61
86
|
|
62
87
|
def create_new_object(name, options)
|
@@ -25,9 +25,9 @@ module EnumField
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
@enum_builder.
|
28
|
+
@enum_builder.names.each do |method|
|
29
29
|
define_singleton_method method do
|
30
|
-
@enum_builder
|
30
|
+
@enum_builder[method]
|
31
31
|
end
|
32
32
|
|
33
33
|
define_method "#{method}?" do
|
@@ -39,7 +39,7 @@ module EnumField
|
|
39
39
|
@enum_builder[value]
|
40
40
|
end
|
41
41
|
|
42
|
-
@enum_builder.
|
42
|
+
@enum_builder.freeze!
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
data/lib/enum_field/version.rb
CHANGED
@@ -124,5 +124,58 @@ describe EnumField::DefineEnum do
|
|
124
124
|
expect(comment_type.audio.id).to eq start_number + 2
|
125
125
|
expect(comment_type.text.id).to eq start_number + 3
|
126
126
|
end
|
127
|
+
|
128
|
+
it 'must check valid id' do
|
129
|
+
expect(comment_type.valid_id?(-1)).to eq false
|
130
|
+
expect(comment_type.valid_id?(0)).to eq false
|
131
|
+
expect(comment_type.valid_id?(nil)).to eq false
|
132
|
+
expect(comment_type.valid_id?(1)).to eq false
|
133
|
+
expect(comment_type.valid_id?('101')).to eq false
|
134
|
+
expect(comment_type.valid_id?(:text)).to eq false
|
135
|
+
|
136
|
+
expect(comment_type.valid_id?(101)).to eq true
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'must check valid name' do
|
140
|
+
expect(comment_type.valid_name?('video')).to eq true
|
141
|
+
expect(comment_type.valid_name?(:video)).to eq true
|
142
|
+
|
143
|
+
expect(comment_type.valid_name?(nil)).to eq false
|
144
|
+
expect(comment_type.valid_name?(0)).to eq false
|
145
|
+
expect(comment_type.valid_name?(101)).to eq false
|
146
|
+
expect(comment_type.valid_name?('wrong')).to eq false
|
147
|
+
expect(comment_type.valid_name?(:not_exist)).to eq false
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
context 'custom objects' do
|
152
|
+
let(:start_number) { 100 }
|
153
|
+
let(:figure_type) do
|
154
|
+
Class.new(Object) do
|
155
|
+
include EnumField::DefineEnum
|
156
|
+
|
157
|
+
attr_accessor :size
|
158
|
+
|
159
|
+
def initialize(size)
|
160
|
+
@size = size
|
161
|
+
end
|
162
|
+
|
163
|
+
define_enum do
|
164
|
+
member :straight, object: new(10)
|
165
|
+
member :pear, object: new(20)
|
166
|
+
member :spoon, object: new(30)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'must set size attribute' do
|
172
|
+
expect(figure_type.straight.size).to eq 10
|
173
|
+
expect(figure_type.straight.name).to eq :straight
|
174
|
+
expect(figure_type.straight.id).to eq 1
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'must freeze objects' do
|
178
|
+
expect { figure_type.pear.size = 100 }.to raise_error(RuntimeError)
|
179
|
+
end
|
127
180
|
end
|
128
181
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: galetahub-enum_field
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Igor Galeta
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-05-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -106,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
106
|
version: '0'
|
107
107
|
requirements: []
|
108
108
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.
|
109
|
+
rubygems_version: 2.6.12
|
110
110
|
signing_key:
|
111
111
|
specification_version: 4
|
112
112
|
summary: Enumerated attributes for any ruby class aka Active Record
|