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 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: