enum_ext 0.8.1 → 1.0.0.rc
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/CHANGELOG.md +9 -0
- data/Gemfile_rails_6.lock +2 -1
- data/README.md +14 -1
- data/lib/enum_ext/basic_helpers.rb +6 -6
- data/lib/enum_ext/config.rb +20 -0
- data/lib/enum_ext/enum_wrapper.rb +18 -2
- data/lib/enum_ext/superset_helpers.rb +5 -2
- data/lib/enum_ext/version.rb +1 -1
- data/lib/enum_ext.rb +13 -25
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13e0504e5a07f15d1d1308cce427cc3521520d76f8e61298c8c46568e1d3c9d4
|
4
|
+
data.tar.gz: 869bab9d23901292cb977f62cc79e0ab9e760851cb05c8b9596a334457e99977
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27c879c403dcd5d2328bca485426e58063c9ca3a396b6255cd5d3c2bddb96edbb2522f37499084152a6dcea23915c45b64633e78d2284ac769e14a1c5b9cdb00
|
7
|
+
data.tar.gz: 1dcc91a044f65445593cf8be10c29e49e06a99d756233f50d2b41c7c737100eea10061a08ff28915e8564e881f047afc6e3709b7e7d4a49b3fd2d3ccc65d3a6c
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
# 1.0.0.rc
|
2
|
+
* global configuration added
|
3
|
+
|
4
|
+
# 0.9.1
|
5
|
+
* fix https://github.com/alekseyl/enum_ext/issues/53
|
6
|
+
|
7
|
+
# 0.9
|
8
|
+
* supersets works fine and same way with prefixes and suffixes as usual enum does
|
9
|
+
|
1
10
|
# 0.8.1
|
2
11
|
* Fixes issue https://github.com/alekseyl/enum_ext/issues/50
|
3
12
|
* Better describe for supersets.
|
data/Gemfile_rails_6.lock
CHANGED
data/README.md
CHANGED
@@ -320,6 +320,20 @@ And per extension methods (describe_enum_i, e.t.c)
|
|
320
320
|
```
|
321
321
|

|
322
322
|
|
323
|
+
## Configuration
|
324
|
+
```ruby
|
325
|
+
EnumExt.configure do |config|
|
326
|
+
# the name of class which will have EnumExt extended globally
|
327
|
+
# default: nil
|
328
|
+
config.application_record_class = ApplicationRecord
|
329
|
+
# default helpers, will be added to every enum ext definitions
|
330
|
+
# default value: [:multi_enum_scopes, :mass_assign_enum]
|
331
|
+
config.default_helpers = [:multi_enum_scopes, :mass_assign_enum]
|
332
|
+
end
|
333
|
+
|
334
|
+
```
|
335
|
+
|
336
|
+
|
323
337
|
## Tests
|
324
338
|
Starting version 0.6 added support for rails 7+ enum definitions, that's making testing a little bit not that easy as running `rake test`.
|
325
339
|
Now testings are done via `docker-compose up`. Look closer to Dockerfiles and `docker-compose.yml`
|
@@ -334,7 +348,6 @@ rake test TEST=test/test_enum_ext.rb TESTOPTS="--name=/bb/"
|
|
334
348
|
## Development
|
335
349
|
|
336
350
|
## TODO
|
337
|
-
[] better support for suffix/prefix as enum does
|
338
351
|
[] add global config and allow global extension
|
339
352
|
|
340
353
|
## Contributing
|
@@ -8,7 +8,7 @@ module EnumExt::BasicHelpers
|
|
8
8
|
#
|
9
9
|
# Rem. Will not define helper when enum values are strings, and will print warning
|
10
10
|
def enum_i( enum_name )
|
11
|
-
return puts(<<~NOTINTEGER) if columns_hash[enum_name.to_s].type != :integer
|
11
|
+
return puts(<<~NOTINTEGER) if table_exists? && columns_hash[enum_name.to_s].type != :integer
|
12
12
|
---------------------NOTINTEGER WARNING!---------------------------
|
13
13
|
#{enum_name} is not an integer column, so enum_i helper useless and method will not be defined
|
14
14
|
NOTINTEGER
|
@@ -73,11 +73,11 @@ module EnumExt::BasicHelpers
|
|
73
73
|
|
74
74
|
def mass_assign_enum( *enums_names )
|
75
75
|
enums_names.each do |enum_name|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
define_singleton_method( "#{
|
80
|
-
self.update_all( {enum_name =>
|
76
|
+
enum_plural = enum_name.to_s.pluralize
|
77
|
+
self.send(enum_plural).keys.each do |label|
|
78
|
+
method_name = self.send(enum_plural).transform_enum_label(label)
|
79
|
+
define_singleton_method( "#{method_name}!" ) do
|
80
|
+
self.update_all( {enum_name => self.send(enum_plural)[label]}.merge( self.column_names.include?('updated_at') ? {updated_at: Time.now} : {} ))
|
81
81
|
end
|
82
82
|
end
|
83
83
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module EnumExt
|
2
|
+
class EnumExtConfig
|
3
|
+
attr_accessor :default_helpers, :application_record_class
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
self.default_helpers = [:multi_enum_scopes, :mass_assign_enum]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def configure
|
12
|
+
yield(config)
|
13
|
+
config.application_record_class&.extend( EnumExt ) if config.application_record_class.is_a?(Class)
|
14
|
+
end
|
15
|
+
|
16
|
+
def config
|
17
|
+
@config ||= EnumExtConfig.new
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -5,12 +5,12 @@ class EnumExt::EnumWrapper
|
|
5
5
|
include EnumExt::Annotated
|
6
6
|
|
7
7
|
# supersets is storing exact definitions, if you need a raw mapping use class.statuses.superset_statuses
|
8
|
-
attr_reader :enum_values, :supersets, :supersets_raw, :t_options_raw, :localizations, :base_class, :enum_name
|
8
|
+
attr_reader :enum_values, :supersets, :supersets_raw, :t_options_raw, :localizations, :base_class, :enum_name, :suffix, :prefix
|
9
9
|
|
10
10
|
delegate_missing_to :enum_values
|
11
11
|
delegate :inspect, to: :enum_values
|
12
12
|
|
13
|
-
def initialize(enum_values, base_class, enum_name)
|
13
|
+
def initialize(enum_values, base_class, enum_name, **options)
|
14
14
|
@enum_values = enum_values
|
15
15
|
@supersets = ActiveSupport::HashWithIndifferentAccess.new
|
16
16
|
@supersets_raw = ActiveSupport::HashWithIndifferentAccess.new
|
@@ -20,6 +20,8 @@ class EnumExt::EnumWrapper
|
|
20
20
|
|
21
21
|
@base_class = base_class
|
22
22
|
@enum_name = enum_name
|
23
|
+
@suffix = options[:suffix] || options[:_suffix]
|
24
|
+
@prefix = options[:prefix] || options[:_prefix]
|
23
25
|
end
|
24
26
|
|
25
27
|
# ext_sets_to_kinds( :ready_for_shipment, :delivery_set ) -->
|
@@ -51,6 +53,18 @@ class EnumExt::EnumWrapper
|
|
51
53
|
|
52
54
|
alias_method :t, :localizations
|
53
55
|
|
56
|
+
def transform_enum_label(label)
|
57
|
+
_prefix = if prefix
|
58
|
+
prefix == true ? "#{enum_name}_" : "#{prefix}_"
|
59
|
+
end
|
60
|
+
|
61
|
+
_suffix = if suffix
|
62
|
+
suffix == true ? "_#{enum_name}" : "_#{suffix}"
|
63
|
+
end
|
64
|
+
|
65
|
+
"#{_prefix}#{label}#{_suffix}"
|
66
|
+
end
|
67
|
+
|
54
68
|
private
|
55
69
|
|
56
70
|
def evaluate_localizations(t_enum_set)
|
@@ -75,4 +89,6 @@ class EnumExt::EnumWrapper
|
|
75
89
|
end
|
76
90
|
end
|
77
91
|
|
92
|
+
|
93
|
+
|
78
94
|
end
|
@@ -54,6 +54,8 @@ module EnumExt::SupersetHelpers
|
|
54
54
|
enum_plural = enum_name.to_s.pluralize
|
55
55
|
|
56
56
|
self.instance_eval do
|
57
|
+
suffix = send(enum_plural).suffix
|
58
|
+
prefix = send(enum_plural).prefix
|
57
59
|
send(enum_plural).supersets.merge!( options.transform_values{ _1.try(:map, &:to_s) || _1.to_s } )
|
58
60
|
|
59
61
|
options.each do |superset_name, enum_vals|
|
@@ -64,11 +66,12 @@ module EnumExt::SupersetHelpers
|
|
64
66
|
# class.enum_wrapper.superset
|
65
67
|
send(enum_plural).define_singleton_method(superset_name) { base_class.send(enum_plural).superset_to_enum(*enum_vals) }
|
66
68
|
|
69
|
+
superset_method_name = send(enum_plural).transform_enum_label(superset_name)
|
67
70
|
# superset_name scope
|
68
|
-
scope
|
71
|
+
scope superset_method_name, -> { where( enum_name => send(enum_plural).send(superset_name) ) } if respond_to?(:scope)
|
69
72
|
|
70
73
|
# instance.superset_name?
|
71
|
-
define_method "#{
|
74
|
+
define_method "#{superset_method_name}?" do
|
72
75
|
send(enum_name) && self.class.send(enum_plural).send(superset_name).include?( send(enum_name) )
|
73
76
|
end
|
74
77
|
|
data/lib/enum_ext/version.rb
CHANGED
data/lib/enum_ext.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "enum_ext/version"
|
2
|
+
require "enum_ext/config"
|
2
3
|
require "enum_ext/annotated"
|
3
4
|
require "enum_ext/enum_wrapper"
|
4
5
|
require "enum_ext/humanize_helpers"
|
@@ -16,24 +17,6 @@ require "enum_ext/superset_helpers"
|
|
16
17
|
# has_many :requests
|
17
18
|
# end
|
18
19
|
|
19
|
-
puts <<~DEPRECATION
|
20
|
-
---------------------DEPRECATION WARNING---------------------------
|
21
|
-
There are TWO MAJOR breaking changes coming into the next major version :
|
22
|
-
First deprecation: all major DSL moving class methods to
|
23
|
-
enum, just for the sake of clarity:
|
24
|
-
|
25
|
-
Ex for enum named kinds it could look like this:
|
26
|
-
|
27
|
-
Class.ext_sets_to_kinds --> Class.kinds.superset_to_basic
|
28
|
-
Class.ext_kinds --> Class.kinds.supersets
|
29
|
-
Class.all_kinds_defs --> Class.kinds.all
|
30
|
-
|
31
|
-
Class.t_kinds --> Class.kinds.t
|
32
|
-
Class.t_kinds_options --> Class.kinds.t_options
|
33
|
-
Class.t_named_set_kinds_options --> Class.kinds.t_named_set_options
|
34
|
-
|
35
|
-
DEPRECATION
|
36
|
-
|
37
20
|
module EnumExt
|
38
21
|
include HumanizeHelpers # translate and humanize
|
39
22
|
include SupersetHelpers # enum_supersets
|
@@ -48,34 +31,39 @@ module EnumExt
|
|
48
31
|
# so calling super should be different based on ActiveRecord major version
|
49
32
|
def enum(name = nil, values = nil, **options)
|
50
33
|
single_enum_definition = name.present?
|
51
|
-
extensions = options.delete(:ext)
|
34
|
+
extensions = [*EnumExt.config.default_helpers, *options.delete(:ext)]
|
35
|
+
options_dup = options.dup
|
52
36
|
|
53
37
|
(ActiveRecord::VERSION::MAJOR >= 7 ? super : super(options)).tap do |multiple_enum_definitions|
|
54
38
|
if single_enum_definition
|
55
|
-
|
39
|
+
replace_enum_with_wrapper(name, options_dup)
|
40
|
+
enum_ext(name, [*extensions])
|
56
41
|
else
|
57
|
-
multiple_enum_definitions.each { |enum_name,|
|
42
|
+
multiple_enum_definitions.each { |enum_name,|
|
43
|
+
replace_enum_with_wrapper(enum_name, options_dup)
|
44
|
+
enum_ext(enum_name, [*extensions])
|
45
|
+
}
|
58
46
|
end
|
59
47
|
end
|
60
48
|
end
|
61
49
|
|
62
50
|
# its an extension helper, on the opposite to basic enum method could be called multiple times
|
63
51
|
def enum_ext(enum_name, extensions)
|
64
|
-
|
65
|
-
# [:enum_i, :enum_multi_scopes, enum_supersets: { valid: [:fresh, :cool], invalid: [:stale] }]
|
52
|
+
# [:enum_i, :enum_multi_scopes, enum_supersets: { valid: [:fresh, :cool], invalid: [:stale] }]
|
66
53
|
# --> [:enum_i, :enum_multi_scopes, [:enum_supersets, { valid: [:fresh, :cool], invalid: [:stale] }]
|
67
54
|
[*extensions].map { _1.try(:to_a)&.flatten || _1 }
|
68
55
|
.each { |(ext_method, params)| send(*[ext_method, enum_name, params].compact) }
|
69
56
|
end
|
70
57
|
|
71
58
|
private
|
72
|
-
|
59
|
+
|
60
|
+
def replace_enum_with_wrapper(enum_name, options_dup)
|
73
61
|
enum_name_plural = enum_name.to_s.pluralize
|
74
62
|
return if send(enum_name_plural).is_a?(EnumWrapper)
|
75
63
|
|
76
64
|
# enum will freeze values so there is no other way to move extended functionality,
|
77
65
|
# than to use wrapper and delegate everything to enum_values
|
78
|
-
enum_wrapper = EnumWrapper.new(send(enum_name_plural), self, enum_name)
|
66
|
+
enum_wrapper = EnumWrapper.new(send(enum_name_plural), self, enum_name, **options_dup)
|
79
67
|
# "self" here is a base enum class, so we are replacing original enum definition, with a wrapper
|
80
68
|
define_singleton_method(enum_name_plural) { enum_wrapper }
|
81
69
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enum_ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.rc
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- alekseyl
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-11-
|
11
|
+
date: 2023-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -181,6 +181,7 @@ files:
|
|
181
181
|
- lib/enum_ext.rb
|
182
182
|
- lib/enum_ext/annotated.rb
|
183
183
|
- lib/enum_ext/basic_helpers.rb
|
184
|
+
- lib/enum_ext/config.rb
|
184
185
|
- lib/enum_ext/enum_wrapper.rb
|
185
186
|
- lib/enum_ext/humanize_helpers.rb
|
186
187
|
- lib/enum_ext/superset_helpers.rb
|
@@ -200,9 +201,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
200
201
|
version: '0'
|
201
202
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
202
203
|
requirements:
|
203
|
-
- - "
|
204
|
+
- - ">"
|
204
205
|
- !ruby/object:Gem::Version
|
205
|
-
version:
|
206
|
+
version: 1.3.1
|
206
207
|
requirements: []
|
207
208
|
rubygems_version: 3.2.15
|
208
209
|
signing_key:
|