safe-enum 0.1.0 → 0.3.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 +5 -5
- data/.gitignore +1 -0
- data/README.md +62 -8
- data/lib/enum/base.rb +30 -4
- data/lib/enum/predicates.rb +18 -0
- data/lib/enum/version.rb +1 -1
- data/lib/enum.rb +9 -0
- data/lib/safe-enum.rb +1 -0
- metadata +8 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 670e321a5a7e1961b6c4c940f720887a7b6dca7725f890cc27777aff7f0f2e17
|
|
4
|
+
data.tar.gz: 739fc2f8c14ccf50bb0265f6c748be615971ddb3e20128886e7c5562c31bd4b3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cebfd3861390ba72e8740dc40b300a8b93920f3258832d08ba1c54074caa1ea93c9f4a3b68fada7a427cec76290e37212971483765a920b8ebe0f22f458997e6
|
|
7
|
+
data.tar.gz: 1938ac3742948d2936e951c8a66191ba06406e83ce2e351ac0c8cf29a6c08303f088f94103d77625c520249b80005b9eaf7b4d8f8049949e03cd560754127d36
|
data/.gitignore
CHANGED
data/README.md
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-

|
|
2
1
|
# Enum
|
|
3
2
|
|
|
4
3
|
This is a very basic implementation of enums in Ruby. The cornerstone of the library is **safety**.
|
|
@@ -8,7 +7,7 @@ This is a very basic implementation of enums in Ruby. The cornerstone of the lib
|
|
|
8
7
|
Add this line to your application's Gemfile:
|
|
9
8
|
|
|
10
9
|
```ruby
|
|
11
|
-
gem 'enum'
|
|
10
|
+
gem 'safe-enum'
|
|
12
11
|
```
|
|
13
12
|
|
|
14
13
|
And then execute:
|
|
@@ -17,7 +16,7 @@ And then execute:
|
|
|
17
16
|
|
|
18
17
|
Or install it yourself as:
|
|
19
18
|
|
|
20
|
-
$ gem install enum
|
|
19
|
+
$ gem install safe-enum
|
|
21
20
|
|
|
22
21
|
## Usage
|
|
23
22
|
|
|
@@ -28,13 +27,27 @@ class Side < Enum::Base
|
|
|
28
27
|
end
|
|
29
28
|
```
|
|
30
29
|
|
|
31
|
-
Now `
|
|
30
|
+
Now get a value with the `enum` method safely defined values by argument with its `Symbol` or `String` type. If there is no defined such value `Enum::TokenNotFoundError` exception will be raised. And this is the **safety** - you will be noticed about the problem and fix it by introducing a new value or fixing a source of the invalid value. While others implementations of enums in Ruby (that I know) just silently ignore invalid values returning `nil` this one will raise the exception **always**. Example of usage:
|
|
32
31
|
|
|
33
32
|
```ruby
|
|
34
|
-
Side.
|
|
35
|
-
Side.
|
|
36
|
-
Side.
|
|
37
|
-
Side.
|
|
33
|
+
Side.enum(:left) # => "left"
|
|
34
|
+
Side.enum('left') # => "left"
|
|
35
|
+
Side.enum(:invalid) # => Enum::TokenNotFoundError: token 'invalid'' not found in the enum Side
|
|
36
|
+
Side.enum('invalid') # => Enum::TokenNotFoundError: token 'invalid'' not found in the enum Side
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Get all defined enum values with the `all` method:
|
|
40
|
+
|
|
41
|
+
```ruby
|
|
42
|
+
Side.all # => ['left', 'rigth', 'whole']
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
> Order or the returned values in the same as their definition. It's guaranteed.
|
|
46
|
+
|
|
47
|
+
In order to get array of defined enums safely use `enums` method:
|
|
48
|
+
|
|
49
|
+
```ruby
|
|
50
|
+
Side.enums(:left, :right) # => ['left', 'right']
|
|
38
51
|
```
|
|
39
52
|
|
|
40
53
|
If you have installed `I18n` in your application feel free to use `name` method to retreive the values' translations. For the given example the possible translation structure in `yml` format is the following:
|
|
@@ -59,6 +72,47 @@ Side.name(:invalid) # => Enum::TokenNotFoundError: token 'invalid'' not found in
|
|
|
59
72
|
|
|
60
73
|
> If you don't have installed `I18n` in your project `NameError` exception will be raised on the `name` method call.
|
|
61
74
|
|
|
75
|
+
Consider the case when we have an object with a field with only enum values. Extend the class of this object by `Enum::Predicates` and use `enumerize` method to generate predicates. This is a more convenient way matching current value of the field with an enum value. Usage the predicate methods is **safe** also. It means that you can't pass to the method invalid enum value neither can have an invalid value in the field:
|
|
76
|
+
|
|
77
|
+
```ruby
|
|
78
|
+
class Table
|
|
79
|
+
extend Enum::Predicates
|
|
80
|
+
|
|
81
|
+
attr_accessor :side
|
|
82
|
+
|
|
83
|
+
enumerize :side, Side
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
@table = Table.new
|
|
87
|
+
@table.side_is?(:left) # => false
|
|
88
|
+
@table.side_is?(nil) # => false
|
|
89
|
+
|
|
90
|
+
@table.side = Side.enum(:left)
|
|
91
|
+
@table.side_is?(:left) # => true
|
|
92
|
+
@table.side_is?(:right) # => false
|
|
93
|
+
@table.side_is?(nil) # => false
|
|
94
|
+
@table.side_is?(:invalid) # => Enum::TokenNotFoundError: token 'invalid'' not found in the enum Side
|
|
95
|
+
|
|
96
|
+
@table.side = 'invalid'
|
|
97
|
+
@table.side_is?(nil) # => false
|
|
98
|
+
@table.side_is?(:left) # => Enum::TokenNotFoundError: token 'invalid'' not found in the enum Side
|
|
99
|
+
@table.side_any?(:left, :right) # => true
|
|
100
|
+
@table.side_any?(:right) # => false
|
|
101
|
+
@table.side_any?(:invalid, :left) # => Enum::TokenNotFoundError: token 'invalid'' not found in the enum Side
|
|
102
|
+
```
|
|
103
|
+
> If you pass to the predicate `nil` or have `nil` value in the field the result will be always `false`. If you want to check that the field is `nil` just use Ruby's standard method `nil?`.
|
|
104
|
+
|
|
105
|
+
It's possible to get index of an enum value with `index` method. It can be convenient in some circumstances:
|
|
106
|
+
|
|
107
|
+
```ruby
|
|
108
|
+
class WeekDay < Enum::Base
|
|
109
|
+
values :sunday, :monday, :tuesday, :wednesday, :thusday, :friday, :saturday
|
|
110
|
+
end
|
|
111
|
+
WeekDay.index(:sunday) == Date.new(2015, 9, 13).wday # => true
|
|
112
|
+
WeekDay.index(:monday) # => 1
|
|
113
|
+
WeekDay.indexes # => [0, 1, 2, 3, 4, 5, 6]
|
|
114
|
+
```
|
|
115
|
+
|
|
62
116
|
## Development
|
|
63
117
|
|
|
64
118
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/enum/base.rb
CHANGED
|
@@ -14,10 +14,22 @@ module Enum
|
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def all
|
|
17
|
-
|
|
17
|
+
history
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
def
|
|
20
|
+
def indexes
|
|
21
|
+
(0...store.size).to_a
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def include?(token)
|
|
25
|
+
store.include?(token.to_s)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def enums(*tokens)
|
|
29
|
+
tokens.map { |token| enum(token) }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def enum(t)
|
|
21
33
|
ts = t.to_s
|
|
22
34
|
unless store.include?(ts)
|
|
23
35
|
raise(TokenNotFoundError, "token '#{t}'' not found in the enum #{self}")
|
|
@@ -26,7 +38,11 @@ module Enum
|
|
|
26
38
|
end
|
|
27
39
|
|
|
28
40
|
def name(t)
|
|
29
|
-
translate(
|
|
41
|
+
translate(enum(t))
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def index(token)
|
|
45
|
+
history.index(enum(token))
|
|
30
46
|
end
|
|
31
47
|
|
|
32
48
|
protected
|
|
@@ -39,10 +55,18 @@ module Enum
|
|
|
39
55
|
@store = set
|
|
40
56
|
end
|
|
41
57
|
|
|
58
|
+
def history
|
|
59
|
+
@history ||= Array.new
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def history=(ary)
|
|
63
|
+
@history = ary
|
|
64
|
+
end
|
|
65
|
+
|
|
42
66
|
def translate(token, options = {})
|
|
43
67
|
I18n.t(token, scope: "enum.#{self}", exception_handler: proc do
|
|
44
68
|
if superclass == Enum::Base
|
|
45
|
-
I18n.t(token, options.merge(scope: "enum.#{self}"))
|
|
69
|
+
I18n.t(token, **options.merge(scope: "enum.#{self}"))
|
|
46
70
|
else
|
|
47
71
|
superclass.translate(token, exception_handler: proc do
|
|
48
72
|
I18n.t(token, scope: "enum.#{self}")
|
|
@@ -55,10 +79,12 @@ module Enum
|
|
|
55
79
|
|
|
56
80
|
def add_value(val)
|
|
57
81
|
store.add(val)
|
|
82
|
+
history.push(val)
|
|
58
83
|
end
|
|
59
84
|
|
|
60
85
|
def init_child_class(child)
|
|
61
86
|
child.store = self.store.clone
|
|
87
|
+
child.history = self.history.clone
|
|
62
88
|
end
|
|
63
89
|
|
|
64
90
|
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Enum
|
|
2
|
+
module Predicates
|
|
3
|
+
def enumerize(field, enum)
|
|
4
|
+
define_method("#{field}_is?") do |other|
|
|
5
|
+
if (field_value = public_send(field)) && other
|
|
6
|
+
enum.enum(field_value) == enum.enum(other)
|
|
7
|
+
else
|
|
8
|
+
false
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
define_method("#{field}_any?") do |*others|
|
|
13
|
+
others.each { |other| enum.enum(other) } # make sure that all others values are valid enums
|
|
14
|
+
others.any? { |other| public_send("#{field}_is?", other) }
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
data/lib/enum/version.rb
CHANGED
data/lib/enum.rb
CHANGED
data/lib/safe-enum.rb
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'enum'
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: safe-enum
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1
|
|
4
|
+
version: 0.3.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Andrey Koleshko
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-04-27 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -86,13 +86,15 @@ files:
|
|
|
86
86
|
- enum.gemspec
|
|
87
87
|
- lib/enum.rb
|
|
88
88
|
- lib/enum/base.rb
|
|
89
|
+
- lib/enum/predicates.rb
|
|
89
90
|
- lib/enum/token_not_found_error.rb
|
|
90
91
|
- lib/enum/version.rb
|
|
92
|
+
- lib/safe-enum.rb
|
|
91
93
|
homepage: https://github.com/mezuka/enum
|
|
92
94
|
licenses:
|
|
93
95
|
- MIT
|
|
94
96
|
metadata: {}
|
|
95
|
-
post_install_message:
|
|
97
|
+
post_install_message:
|
|
96
98
|
rdoc_options: []
|
|
97
99
|
require_paths:
|
|
98
100
|
- lib
|
|
@@ -107,9 +109,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
107
109
|
- !ruby/object:Gem::Version
|
|
108
110
|
version: '0'
|
|
109
111
|
requirements: []
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
signing_key:
|
|
112
|
+
rubygems_version: 3.1.2
|
|
113
|
+
signing_key:
|
|
113
114
|
specification_version: 4
|
|
114
115
|
summary: Enum implementation
|
|
115
116
|
test_files: []
|