humanize_enum 0.1.8 → 0.1.9

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: f58656198e18e6351df8adad2213dba5ea46c9cc6fde6ae3a0fdf2ea43584961
4
- data.tar.gz: d3d98c03cb1827c7e83ba3ea037eebe8db398ad88eee0c7184a15cd0e196c541
3
+ metadata.gz: 0d6163c9c0cc6895cda69e255abc7c953814c863e76300d70b2916c8e2b245eb
4
+ data.tar.gz: da44277aabc9a034de3090b5f202ff49339d68b71d0213714b7c7254e2f45208
5
5
  SHA512:
6
- metadata.gz: 43316746804a9f0c50a5615e7edb75b0b741e2d46853dc777c6da5cf07df0705cbf3d36a0063ad4d34126d946021f7160a58747ea2fd314527db158a187f1efe
7
- data.tar.gz: b6e9774193ace25f8421cafd9ce3faecd4a89e2ad180cb22fc35788b047ae166028be52ab16bff4477ccf80920ad5a4d4d81e2de16ef6ca033b7930657e0a60d
6
+ metadata.gz: dbc0ce238f10c8215b7555aa964d5f5611bfb8133eb521ebb98ed3c3c66641c402d25aa222877bfe85d4c94e79be272f06f19963cb4c9ce65ccfb56a0d6d8898
7
+ data.tar.gz: 6815ee75ea944d1c6df5cfde200d5c7190d852898eb2ea79e1b071b74069e88e62a37cd22db0d5e3439b9e0fcd85c400c08422def32c63d5a222c062c292dcd8
data/README.md CHANGED
@@ -62,7 +62,10 @@ payment.humanize_enums(:status)
62
62
 
63
63
  ```
64
64
 
65
- Or if the incoming data is a text label, get its enum_value:
65
+ ### Dehumanize Enum Values
66
+
67
+ The `dehumanize_enum` method lets you find an enum key based on its human-readable form:
68
+
66
69
  ```ruby
67
70
  str = 'Payment error'
68
71
  Payment.dehumanize_enum(:status, str) # => "error"
@@ -71,6 +74,83 @@ Payment.dehumanize_enum(:status, str) # => "error"
71
74
  Payment.dehumanize_enum(:status, 'blah') # => nil
72
75
  ```
73
76
 
77
+ ### Advanced Usage
78
+
79
+ #### Translating Enums and Polymorphic Associations
80
+
81
+ This gem isn't just for enums; you can also use it to translate polymorphic association types. Here's how you can do it:
82
+
83
+ Let's consider a model `Document` with an enum field `status` and a polymorphic association called `documentable`:
84
+
85
+ ```ruby
86
+ class Document < ApplicationRecord
87
+ enum status: { draft: 0, published: 1, archived: 2 }
88
+ belongs_to :documentable, polymorphic: true
89
+ end
90
+ ```
91
+
92
+ And we have various models that include a concern `Documentable`:
93
+
94
+ ```ruby
95
+
96
+ module Documentable
97
+ extend ActiveSupport::Concern
98
+ included do
99
+ has_many :documents, as: :documentable
100
+ end
101
+ end
102
+
103
+ class Article < ApplicationRecord
104
+ include Documentable
105
+ end
106
+
107
+ class Report < ApplicationRecord
108
+ include Documentable
109
+ end
110
+ ```
111
+
112
+ In your locale files, you can set translations for both the enum `status` and the polymorphic association type `documentable_type`:
113
+
114
+ ```yaml
115
+ en:
116
+ activerecord:
117
+ attributes:
118
+ document:
119
+ status: "Status"
120
+ status/draft: "Draft"
121
+ status/published: "Published"
122
+ status/archived: "Archived"
123
+ documentable_type: "Type"
124
+ documentable_type/article: "Article"
125
+ documentable_type/report: "Report"
126
+ ```
127
+
128
+ Now you can use `humanize_enum` to get these translations:
129
+
130
+ ```ruby
131
+ document = Document.last
132
+ document.status # => :published
133
+ document.humanize_enum(:status) # => 'Published'
134
+
135
+ document.documentable_type # => 'Article'
136
+ document.humanize_enum(:documentable_type) # => 'Article'
137
+ ```
138
+
139
+ And to query a translation for a specific value:
140
+
141
+ ```ruby
142
+ Document.humanize_enum(:status, :archived) # => 'Archived'
143
+ Document.humanize_enum(:documentable_type, :article) # => 'Article'
144
+ ```
145
+
146
+ To get the actual enum or polymorphic type from a human-readable string:
147
+
148
+ ```ruby
149
+ Document.dehumanize_enum(:status, 'Published') # => :published
150
+ Document.dehumanize_enum(:documentable_type, 'Article') # => :article
151
+ ```
152
+
153
+
74
154
  ## Inspired by
75
155
 
76
156
  - a post by [Juraj Kostolanský](https://www.kostolansky.sk/posts/localize-rails-enums/) and
@@ -83,10 +163,22 @@ Payment.dehumanize_enum(:status, 'blah') # => nil
83
163
  - [ar_enum_i18n](https://github.com/dalpo/ar_enum_i18n)
84
164
  - [translate_enum](https://github.com/shlima/translate_enum)
85
165
 
86
- ## TODO
87
- - [x] check input parameters for presence in enums
88
- - [x] add some specs?
89
- - [ ] maybe some justification on why on earth make yet another gem on enum i18n
166
+ ## Why Another Gem for Enum I18n?
167
+
168
+ You might be wondering, "Why create another gem for internationalizing enums when there are already alternatives?"
169
+
170
+ Here are some reasons why `humanize_enum` might be the right choice for you:
171
+
172
+ 1. **Not Just for Enums**: Yeah, it's called `humanize_enum`, but you can totally use it for polymorphic associations too. Neat, right?
173
+
174
+ 2. **Fast and Light**: We've trimmed the fat to make sure this gem runs smoothly, without slowing down your app.
175
+
176
+ 3. **No Rocket Science**: Simple to get, simple to use. You don't need a Ph.D. to figure it out.
177
+
178
+ 4. **Clean and Familiar Structure**: We keep your locale keys neat and tidy, like `status/paid`, and it's kinda similar to what you see in other gems like AASM. So, less headache for you.
179
+
180
+
181
+
90
182
 
91
183
  ## Development
92
184
 
@@ -0,0 +1,55 @@
1
+ module HumanizeEnum
2
+ module ClassMethods
3
+ # @param enum_name [String, Symbol]
4
+ # @param enum_value [String, Symbol]
5
+ # @return [String] translated value of an enum
6
+ # @raise [UnknownEnumKey] if enum_name is not a defined enum
7
+ # @example
8
+ # Payment.humanize_enum(:status, :pending) # => 'Pending'
9
+ def humanize_enum(enum_name, enum_value)
10
+ check_enum!(enum_name)
11
+ I18n.t("activerecord.attributes.#{model_name.i18n_key}.#{enum_name}/#{enum_value.to_s.underscore}")
12
+ end
13
+
14
+ # @return [Hash<String, String>] hash where key is enum name and value is its translation
15
+ # @example
16
+ # Payment.humanize_enums(:status)
17
+ # {
18
+ # "initial" => "Initial status",
19
+ # "paid" => "Payment processed",
20
+ # "error" => "Payment error"
21
+ # }
22
+ def humanize_enums(enum_name)
23
+ enum_options(enum_name).map do |enum|
24
+ [enum.value, enum.text]
25
+ end.to_h
26
+ end
27
+
28
+ # Get enum value from a translated enum text.
29
+ # Useful for parsing incoming i18n-ed text labels that were generated by +humanize_enum+
30
+ #
31
+ # @param enum_name [String, Symbol] enum name
32
+ # @param enum_text [String] text value of the enum
33
+ # @return [Integer, String, NilClass]
34
+ def dehumanize_enum(enum_name, enum_text)
35
+ humanize_enums(enum_name).key(enum_text)&.underscore
36
+ end
37
+
38
+ # @param enum_name [String, Symbol] enum key to be translated
39
+ # @return [Array<SelectOption>] array of structs with :id, :key, :text, :checked
40
+ # @raise [UnknownEnumKey] if enum_name is not a defined enum
41
+ def enum_options(enum_name)
42
+ check_enum!(enum_name)
43
+ enum_i18n_key = enum_name.to_s.pluralize
44
+ send(enum_i18n_key).map do |key, val|
45
+ SelectOption.new(val, key, humanize_enum(enum_name, key), nil)
46
+ end
47
+ end
48
+
49
+ # @param enum_name [String, Symbol]
50
+ # @raise [UnknownEnumKey] if enum_name is not a defined enum
51
+ def check_enum!(enum_name)
52
+ raise UnknownEnumKey unless defined_enums.has_key?(enum_name.to_s)
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,29 @@
1
+ module HumanizeEnum
2
+ module EnumTranslation
3
+
4
+ def self.included(base)
5
+ base.extend HumanizeEnum::ClassMethods
6
+ end
7
+
8
+ # @return [String] translated enum value of an instance
9
+ # @example
10
+ # payment = Payment.new
11
+ # payment.status = 'initial'
12
+ # payment.humanize_enum(:status) # => 'Initial'
13
+ def humanize_enum(enum_name)
14
+ self.class.check_enum!(enum_name)
15
+ I18n.t("activerecord.attributes.#{self.class.model_name.i18n_key}.#{enum_name}/#{send(enum_name).to_s.underscore}")
16
+ end
17
+
18
+ # @see .humanize_enums
19
+ def humanize_enums(enum_name)
20
+ self.class.humanize_enums(enum_name)
21
+ end
22
+
23
+ # @return [Array<SelectOption>]
24
+ # @see .enum_options
25
+ def enum_options(enum_name)
26
+ self.class.enum_options(enum_name)
27
+ end
28
+ end
29
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HumanizeEnum
4
- VERSION = '0.1.8'
4
+ VERSION = '0.1.9'
5
5
  end
data/lib/humanize_enum.rb CHANGED
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'humanize_enum/version'
4
- require_relative 'humanize_enum/helpers'
4
+ require_relative 'humanize_enum/enum_translation'
5
+ require_relative 'humanize_enum/class_methods'
5
6
  require 'active_support/lazy_load_hooks'
6
7
  require 'active_support/inflector'
7
8
 
@@ -10,9 +11,12 @@ module HumanizeEnum
10
11
  # Error for an unknown enum key
11
12
  UnknownEnumKey = Class.new(StandardError)
12
13
 
14
+ # Struct to be used in html selects and similar places
15
+ SelectOption = Struct.new(:id, :value, :text, :checked)
16
+
13
17
  if defined?(ActiveSupport.on_load)
14
18
  ActiveSupport.on_load(:active_record) do
15
- include HumanizeEnum::Helpers
19
+ include HumanizeEnum::EnumTranslation
16
20
  end
17
21
  end
18
22
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: humanize_enum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Max Buslaev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-07-31 00:00:00.000000000 Z
11
+ date: 2023-10-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -39,7 +39,8 @@ files:
39
39
  - README.md
40
40
  - Rakefile
41
41
  - lib/humanize_enum.rb
42
- - lib/humanize_enum/helpers.rb
42
+ - lib/humanize_enum/class_methods.rb
43
+ - lib/humanize_enum/enum_translation.rb
43
44
  - lib/humanize_enum/version.rb
44
45
  - sig/humanize_enum.rbs
45
46
  homepage: https://github.com/austerlitz/humanize_enum
@@ -1,85 +0,0 @@
1
- module HumanizeEnum
2
- module Helpers
3
- # Struct to be used in html selects and similar places
4
- SelectOption = Struct.new(:id, :value, :text, :checked)
5
-
6
- def self.included(base)
7
- base.extend ClassMethods
8
- end
9
-
10
- module ClassMethods
11
- # @param enum_name [String, Symbol]
12
- # @param enum_value [String, Symbol]
13
- # @return [String] translated value of an enum
14
- # @raise [UnknownEnumKey] if enum_name is not a defined enum
15
- # @example
16
- # Payment.humanize_enum(:status, :pending) # => 'Pending'
17
- def humanize_enum(enum_name, enum_value)
18
- check_enum!(enum_name)
19
- I18n.t("activerecord.attributes.#{model_name.i18n_key}.#{enum_name}/#{enum_value}")
20
- end
21
-
22
- # @return [Hash<String, String>] hash where key is enum name and value is its translation
23
- # @example
24
- # Payment.humanize_enums(:status)
25
- # {
26
- # "initial" => "Initial status",
27
- # "paid" => "Payment processed",
28
- # "error" => "Payment error"
29
- # }
30
- def humanize_enums(enum_name)
31
- enum_options(enum_name).map do |enum|
32
- [enum.value, enum.text]
33
- end.to_h
34
- end
35
-
36
- # Get enum value from a translated enum text.
37
- # Useful for parsing incoming i18n-ed text labels that were generated by +humanize_enum+
38
- #
39
- # @param enum_name [String, Symbol] enum name
40
- # @param enum_text [String] text value of the enum
41
- # @return [Integer, String, NilClass]
42
- def dehumanize_enum(enum_name, enum_text)
43
- humanize_enums(enum_name).invert[enum_text]
44
- end
45
-
46
- # @param enum_name [String, Symbol] enum key to be translated
47
- # @return [Array<SelectOption>] array of structs with :id, :key, :text, :checked
48
- # @raise [UnknownEnumKey] if enum_name is not a defined enum
49
- def enum_options(enum_name)
50
- check_enum!(enum_name)
51
- enum_i18n_key = enum_name.to_s.pluralize
52
- send(enum_i18n_key).map do |key, val|
53
- SelectOption.new(val, key, humanize_enum(enum_name, key), nil)
54
- end
55
- end
56
-
57
- # @param enum_name [String, Symbol]
58
- # @raise [UnknownEnumKey] if enum_name is not a defined enum
59
- def check_enum!(enum_name)
60
- raise UnknownEnumKey unless defined_enums.keys.include?(enum_name.to_s)
61
- end
62
- end
63
-
64
- # @return [String] translated enum value of an instance
65
- # @example
66
- # payment = Payment.new
67
- # payment.status = 'initial'
68
- # payment.humanize_enum(:status) # => 'Initial'
69
- def humanize_enum(enum_name)
70
- self.class.check_enum!(enum_name)
71
- I18n.t("activerecord.attributes.#{self.class.model_name.i18n_key}.#{enum_name}/#{send(enum_name)}")
72
- end
73
-
74
- # @see .humanize_enums
75
- def humanize_enums(enum_name)
76
- self.class.humanize_enums(enum_name)
77
- end
78
-
79
- # @return [Array<SelectOption>]
80
- # @see .enum_options
81
- def enum_options(enum_name)
82
- self.class.enum_options(enum_name)
83
- end
84
- end
85
- end