enum_ext 0.8.1 → 1.0.0.rc

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2c17ae56d510836b3106e8b1ca84b83f69a6854a0988192e71d7a7a62910dde0
4
- data.tar.gz: 870773a5d09b15840695a8ff0ee57823b4bcc4c89753a88840b3daca7a69ae28
3
+ metadata.gz: 13e0504e5a07f15d1d1308cce427cc3521520d76f8e61298c8c46568e1d3c9d4
4
+ data.tar.gz: 869bab9d23901292cb977f62cc79e0ab9e760851cb05c8b9596a334457e99977
5
5
  SHA512:
6
- metadata.gz: dd80dfc1f862eb03fbd9065af6f1eee36a95254ce4dd7e708073683ca4d5483163457cb5a8b96da851943d93246436a0897965d11b0f5478d966a4a590c82276
7
- data.tar.gz: f07fd0d4869deba68067d29a0e6ac6a8003ae4df28dea658decd66455f12a5cbcdd622e816042f93de452c7186bb7af885b9b0d549b2fe3c40edfccd6b3fadf1
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
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- enum_ext (0.8.0)
4
+ enum_ext (0.9.0)
5
5
  activerecord (>= 5.2.4.3)
6
6
 
7
7
  GEM
@@ -82,6 +82,7 @@ PLATFORMS
82
82
  ruby
83
83
 
84
84
  DEPENDENCIES
85
+ activerecord (< 7)
85
86
  amazing_print
86
87
  bundler (>= 1.11)
87
88
  byebug
data/README.md CHANGED
@@ -320,6 +320,20 @@ And per extension methods (describe_enum_i, e.t.c)
320
320
  ```
321
321
  ![img_3.png](img_3.png)
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
- enum_vals = self.send( enum_name.to_s.pluralize )
77
-
78
- enum_vals.keys.each do |enum_el|
79
- define_singleton_method( "#{enum_el}!" ) do
80
- self.update_all( {enum_name => enum_vals[enum_el]}.merge( self.column_names.include?('updated_at') ? {updated_at: Time.now} : {} ))
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 superset_name, -> { where( enum_name => send(enum_plural).send(superset_name) ) } if respond_to?(: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 "#{superset_name}?" do
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
 
@@ -1,3 +1,3 @@
1
1
  module EnumExt
2
- VERSION = "0.8.1"
2
+ VERSION = "1.0.0.rc"
3
3
  end
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
- enum_ext(name, extensions)
39
+ replace_enum_with_wrapper(name, options_dup)
40
+ enum_ext(name, [*extensions])
56
41
  else
57
- multiple_enum_definitions.each { |enum_name,| enum_ext(enum_name, extensions) }
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
- replace_enum_with_wrapper(enum_name)
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
- def replace_enum_with_wrapper(enum_name)
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.8.1
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-06 00:00:00.000000000 Z
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: '0'
206
+ version: 1.3.1
206
207
  requirements: []
207
208
  rubygems_version: 3.2.15
208
209
  signing_key: