human_attributes 0.6.0 → 0.7.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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +104 -0
  3. data/.circleci/setup-rubygems.sh +3 -0
  4. data/.rubocop.yml +65 -594
  5. data/.ruby-version +1 -1
  6. data/CHANGELOG.md +11 -0
  7. data/Gemfile.lock +219 -147
  8. data/Guardfile +4 -4
  9. data/README.md +127 -26
  10. data/Rakefile +1 -1
  11. data/human_attributes.gemspec +11 -7
  12. data/lib/human_attributes/config.rb +50 -68
  13. data/lib/human_attributes/engine.rb +1 -0
  14. data/lib/human_attributes/errors.rb +6 -0
  15. data/lib/human_attributes/extension.rb +21 -26
  16. data/lib/human_attributes/formatters/base.rb +1 -0
  17. data/lib/human_attributes/formatters/enum.rb +25 -0
  18. data/lib/human_attributes/formatters/enumerize.rb +1 -0
  19. data/lib/human_attributes/formatters_builder.rb +1 -0
  20. data/lib/human_attributes/version.rb +1 -1
  21. data/spec/dummy/Rakefile +1 -1
  22. data/spec/dummy/app/assets/config/manifest.js +3 -0
  23. data/spec/dummy/app/assets/stylesheets/application.css +3 -3
  24. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  25. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  26. data/spec/dummy/app/controllers/application_controller.rb +0 -3
  27. data/spec/dummy/app/{assets/javascripts → javascript/packs}/application.js +3 -1
  28. data/spec/dummy/app/jobs/application_job.rb +7 -0
  29. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  30. data/spec/dummy/app/models/application_record.rb +3 -0
  31. data/spec/dummy/app/models/purchase.rb +20 -11
  32. data/spec/dummy/app/views/layouts/application.html.erb +10 -9
  33. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  34. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  35. data/spec/dummy/bin/rails +3 -3
  36. data/spec/dummy/bin/rake +2 -2
  37. data/spec/dummy/bin/setup +18 -14
  38. data/spec/dummy/config/application.rb +12 -22
  39. data/spec/dummy/config/boot.rb +3 -3
  40. data/spec/dummy/config/cable.yml +10 -0
  41. data/spec/dummy/config/database.yml +4 -18
  42. data/spec/dummy/config/environment.rb +1 -1
  43. data/spec/dummy/config/environments/development.rb +49 -14
  44. data/spec/dummy/config/environments/production.rb +63 -22
  45. data/spec/dummy/config/environments/test.rb +29 -12
  46. data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
  47. data/spec/dummy/config/initializers/assets.rb +4 -3
  48. data/spec/dummy/config/initializers/backtrace_silencers.rb +4 -3
  49. data/spec/dummy/config/initializers/content_security_policy.rb +28 -0
  50. data/spec/dummy/config/initializers/cookies_serializer.rb +2 -0
  51. data/spec/dummy/config/initializers/filter_parameter_logging.rb +3 -1
  52. data/spec/dummy/config/initializers/permissions_policy.rb +11 -0
  53. data/spec/dummy/config/initializers/wrap_parameters.rb +2 -2
  54. data/spec/dummy/config/locales/en.yml +26 -1
  55. data/spec/dummy/config/puma.rb +43 -0
  56. data/spec/dummy/config/routes.rb +1 -54
  57. data/spec/dummy/config/storage.yml +34 -0
  58. data/spec/dummy/config.ru +3 -1
  59. data/spec/dummy/db/migrate/20161113032308_create_purchases.rb +1 -1
  60. data/spec/dummy/db/migrate/20211006145358_add_payment_method_to_purchase.rb +5 -0
  61. data/spec/dummy/db/migrate/20211103114451_add_shipping_to_purchase.rb +5 -0
  62. data/spec/dummy/db/migrate/20211103114830_add_store_to_purchase.rb +5 -0
  63. data/spec/dummy/db/schema.rb +17 -17
  64. data/spec/dummy/public/404.html +6 -6
  65. data/spec/dummy/public/422.html +6 -6
  66. data/spec/dummy/public/500.html +6 -6
  67. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  68. data/spec/dummy/public/apple-touch-icon.png +0 -0
  69. data/spec/dummy/spec/factories/purchases.rb +9 -22
  70. data/spec/dummy/spec/lib/active_record_extension_spec.rb +81 -33
  71. metadata +104 -38
  72. data/.hound.yml +0 -4
  73. data/.travis.yml +0 -15
  74. data/spec/dummy/README.rdoc +0 -28
  75. data/spec/dummy/bin/bundle +0 -3
  76. data/spec/dummy/config/initializers/session_store.rb +0 -3
  77. data/spec/dummy/config/secrets.yml +0 -22
data/README.md CHANGED
@@ -1,23 +1,33 @@
1
- # Human Attributes [![Gem Version](https://badge.fury.io/rb/human_attributes.svg)](https://badge.fury.io/rb/human_attributes) [![Build Status](https://travis-ci.org/platanus/human_attributes.svg?branch=master)](https://travis-ci.org/platanus/human_attributes) [![Coverage Status](https://coveralls.io/repos/github/platanus/human_attributes/badge.svg)](https://coveralls.io/github/platanus/human_attributes)
1
+ # Human Attributes
2
+ [![Gem Version](https://badge.fury.io/rb/human_attributes.svg)](https://badge.fury.io/rb/human_attributes)
3
+ [![CircleCI](https://circleci.com/gh/platanus/human_attributes.svg?style=shield)](https://app.circleci.com/pipelines/github/platanus/human_attributes)
4
+ [![Coverage Status](https://coveralls.io/repos/github/platanus/human_attributes/badge.svg)](https://coveralls.io/github/platanus/human_attributes)
2
5
 
3
6
  It's a Gem to convert ActiveRecord models' attributes and methods to human readable representations of these.
4
7
 
5
- - [Installation](#installation)
6
- - [Usage](#usage)
7
- - [Formatters](#formatters)
8
- - [Numeric](#numeric)
9
- - [Date](#date)
10
- - [DateTime](#datetime)
11
- - [Boolean](#boolean)
12
- - [Enumerize](#enumerize)
13
- - [Custom Formatter](#custom-formatter)
14
- - [Common Options](#common-options)
15
- - [Default](#default)
16
- - [Suffix](#suffix)
17
- - [Multiple Formatters](#multiple-formatters)
18
- - [Humanize Active Record Attributes](#humanize-active-record-attributes)
19
- - [Integration with Draper Gem](#integration-with-draper-gem)
20
- - [Rake Task](#rake-task)
8
+ - [Human Attributes](#human-attributes)
9
+ - [Installation](#installation)
10
+ - [Usage](#usage)
11
+ - [Formatters](#formatters)
12
+ - [Numeric](#numeric)
13
+ - [Date](#date)
14
+ - [DateTime](#datetime)
15
+ - [Boolean](#boolean)
16
+ - [Enumerize](#enumerize)
17
+ - [Enum](#enum)
18
+ - [Custom Formatter](#custom-formatter)
19
+ - [Common Options](#common-options)
20
+ - [Default](#default)
21
+ - [Suffix](#suffix)
22
+ - [Multiple Formatters](#multiple-formatters)
23
+ - [Humanize Active Record Attributes](#humanize-active-record-attributes)
24
+ - [Integration with Draper Gem](#integration-with-draper-gem)
25
+ - [Rake Task](#rake-task)
26
+ - [Testing](#testing)
27
+ - [Publishing](#publishing)
28
+ - [Contributing](#contributing)
29
+ - [Credits](#credits)
30
+ - [License](#license)
21
31
 
22
32
  ## Installation
23
33
 
@@ -74,7 +84,7 @@ Executing the `humanize` method, inside the class definition, will allow you to
74
84
  With...
75
85
 
76
86
  ```ruby
77
- pruchase = Purchase.new
87
+ purchase = Purchase.new
78
88
  purchase.quantity = 20
79
89
  purchase.commission = 5.3
80
90
  ```
@@ -105,7 +115,7 @@ And the options to use with numeric types, are the same as in [NumberHelper](htt
105
115
  With...
106
116
 
107
117
  ```ruby
108
- pruchase = Purchase.new
118
+ purchase = Purchase.new
109
119
  purchase.expired_at = "04/06/1984 09:20:00"
110
120
  purchase.created_at = "04/06/1984 09:20:00"
111
121
  purchase.updated_at = "04/06/1984 09:20:00"
@@ -144,7 +154,7 @@ purchase.human_updated_at #=> "1984"
144
154
  With...
145
155
 
146
156
  ```ruby
147
- pruchase = Purchase.new
157
+ purchase = Purchase.new
148
158
  purchase.expired_at = "04/06/1984 09:20:00"
149
159
  purchase.created_at = "04/06/1984 09:20:00"
150
160
  purchase.updated_at = "04/06/1984 09:20:00"
@@ -183,7 +193,7 @@ purchase.human_updated_at #=> "1984"
183
193
  With...
184
194
 
185
195
  ```ruby
186
- pruchase = Purchase.new
196
+ purchase = Purchase.new
187
197
  purchase.paid = true
188
198
  ```
189
199
 
@@ -217,7 +227,7 @@ purchase.human_paid #=> "No"
217
227
  Installing [Enumerize](https://github.com/brainspec/enumerize) gem with...
218
228
 
219
229
  ```ruby
220
- pruchase = Purchase.new
230
+ purchase = Purchase.new
221
231
  purchase.state = :finished
222
232
  ```
223
233
 
@@ -248,12 +258,92 @@ purchase.state = :finished
248
258
  purchase.human_state #=> "F."
249
259
  ```
250
260
 
261
+ #### Enum
262
+
263
+ Having...
264
+
265
+ ```ruby
266
+ class Purchase < ActiveRecord::Base
267
+ enum payment_method: [:credit, :debit, :cash, :bitcoin]
268
+ end
269
+ ```
270
+
271
+ You can add
272
+ ```ruby
273
+ class Purchase < ActiveRecord::Base
274
+ enum payment_method: [:credit, :debit, :cash, :bitcoin]
275
+ humanize :payment_method, enum: true
276
+ end
277
+ ```
278
+
279
+ And `/your_app/config/locales/en.yml`
280
+
281
+ ```yaml
282
+ en:
283
+ activerecord:
284
+ attributes:
285
+ purchase:
286
+ payment_methods:
287
+ credit: "Credit Card"
288
+ debit: "Debit Card"
289
+ cash: "Cash"
290
+ bitcoin: "Bitcoin"
291
+ ```
292
+
293
+
294
+ And then you can do...
295
+
296
+ ```ruby
297
+ purchase = Purchase.new
298
+ purchase.payment_method = :debit
299
+ purchase.human_payment_method #=> "Debit Card"
300
+ ```
301
+
302
+ If you want to use the same enum translations for multiple models, use this locales structure:
303
+
304
+ `/your_app/config/locales/en.yml`
305
+
306
+ ```yaml
307
+ en:
308
+ enum:
309
+ default:
310
+ payment_methods:
311
+ credit: "Credit Card"
312
+ debit: "Debit Card"
313
+ cash: "Cash"
314
+ bitcoin: "Bitcoin"
315
+ ```
316
+
317
+ and then in other models will also work:
318
+
319
+ ```ruby
320
+ class Debt < ActiveRecord::Base
321
+ enum payment_method: [:credit, :debit, :cash, :bitcoin]
322
+ humanize :payment_method, enum: true
323
+ end
324
+ ```
325
+
326
+ ```ruby
327
+ purchase = Purchase.new
328
+ purchase.payment_method = :debit
329
+
330
+ debt = Debt.new
331
+ debt.payment_method = :bitcoin
332
+
333
+ purchase.human_payment_method #=> "Debit Card"
334
+ debt.human_payment_method #=> "Bitcoin"
335
+ ```
336
+
337
+
338
+
339
+
340
+
251
341
  #### Custom Formatter
252
342
 
253
343
  With...
254
344
 
255
345
  ```ruby
256
- pruchase = Purchase.create!
346
+ purchase = Purchase.create!
257
347
  ```
258
348
 
259
349
  And having...
@@ -279,7 +369,7 @@ The following options are available to use with all the formatters presented bef
279
369
  With...
280
370
 
281
371
  ```ruby
282
- pruchase = Purchase.new
372
+ purchase = Purchase.new
283
373
  purchase.amount = nil
284
374
  ```
285
375
 
@@ -304,7 +394,7 @@ Useful when you want to define multiple formatters for the same attribute.
304
394
  With...
305
395
 
306
396
  ```ruby
307
- pruchase = Purchase.new
397
+ purchase = Purchase.new
308
398
  purchase.paid = true
309
399
  purchase.amount = 20
310
400
  ```
@@ -330,7 +420,7 @@ purchase.amount_to_currency #=> "$20" # default suffix
330
420
  With...
331
421
 
332
422
  ```ruby
333
- pruchase = Purchase.new
423
+ purchase = Purchase.new
334
424
  purchase.amount = 20
335
425
  ```
336
426
 
@@ -501,6 +591,17 @@ bundle exec guard
501
591
 
502
592
  You need to put **all your tests** in the `/human_attributes/spec/dummy/spec/` directory.
503
593
 
594
+ ## Publishing
595
+
596
+ On master/main branch...
597
+
598
+ 1. Change `VERSION` in `lib/gemaker/version.rb`.
599
+ 2. Change `Unreleased` title to current version in `CHANGELOG.md`.
600
+ 3. Run `bundle install`.
601
+ 4. Commit new release. For example: `Releasing v0.1.0`.
602
+ 5. Create tag. For example: `git tag v0.1.0`.
603
+ 6. Push tag. For example: `git push origin v0.1.0`.
604
+
504
605
  ## Contributing
505
606
 
506
607
  1. Fork it
data/Rakefile CHANGED
@@ -4,7 +4,7 @@ rescue LoadError
4
4
  puts "You must `gem install bundler` and `bundle install` to run rake tasks"
5
5
  end
6
6
 
7
- APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
7
+ APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
8
8
  load "rails/tasks/engine.rake"
9
9
  load "rails/tasks/statistics.rake"
10
10
  Bundler::GemHelper.install_tasks
@@ -1,4 +1,4 @@
1
- $:.push File.expand_path("../lib", __FILE__)
1
+ $:.push File.expand_path("lib", __dir__)
2
2
 
3
3
  # Maintain your gem"s version:
4
4
  require "human_attributes/version"
@@ -19,14 +19,18 @@ Gem::Specification.new do |s|
19
19
  s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  s.test_files = Dir["spec/**/*"]
21
21
 
22
- s.add_dependency "rails", ">= 4.2.0"
23
22
  s.add_dependency "factory_bot"
24
- s.add_development_dependency "enumerize", "~> 1", ">= 1.1.1"
25
- s.add_development_dependency "draper", "~> 2.1.0"
23
+ s.add_dependency "rails", ">= 4.2.0"
24
+
25
+ s.add_development_dependency "coveralls"
26
+ s.add_development_dependency "draper"
27
+ s.add_development_dependency "enumerize", "~> 2.1"
28
+ s.add_development_dependency "guard-rspec", "~> 4.7"
26
29
  s.add_development_dependency "pry"
27
30
  s.add_development_dependency "pry-rails"
31
+ s.add_development_dependency "rspec_junit_formatter"
32
+ s.add_development_dependency "rspec-rails"
33
+ s.add_development_dependency "rubocop", "~> 1.9"
34
+ s.add_development_dependency "rubocop-rails"
28
35
  s.add_development_dependency "sqlite3"
29
- s.add_development_dependency "rspec-rails", "~> 3.4"
30
- s.add_development_dependency "guard-rspec", "~> 4.7"
31
- s.add_development_dependency "coveralls"
32
36
  end
@@ -1,74 +1,56 @@
1
1
  module HumanAttributes
2
2
  module Config
3
- TYPES = [
4
- {
5
- name: :currency,
6
- category: :numeric,
7
- formatter: :number_to_currency,
8
- suffix: :to_currency
9
- },
10
- {
11
- name: :number,
12
- category: :numeric,
13
- formatter: :number_to_human,
14
- suffix: :to_human
15
- },
16
- {
17
- name: :size,
18
- category: :numeric,
19
- formatter: :number_to_human_size,
20
- suffix: :to_human_size
21
- },
22
- {
23
- name: :percentage,
24
- category: :numeric,
25
- formatter: :number_to_percentage,
26
- suffix: :to_percentage
27
- },
28
- {
29
- name: :phone,
30
- category: :numeric,
31
- formatter: :number_to_phone,
32
- suffix: :to_phone
33
- },
34
- {
35
- name: :delimiter,
36
- category: :numeric,
37
- formatter: :number_with_delimiter,
38
- suffix: :with_delimiter
39
- },
40
- {
41
- name: :precision,
42
- category: :numeric,
43
- formatter: :number_with_precision,
44
- suffix: :with_precision
45
- },
46
- {
47
- name: :date,
48
- category: :date,
49
- suffix: :to_human_date
50
- },
51
- {
52
- name: :datetime,
53
- category: :datetime,
54
- suffix: :to_human_datetime
55
- },
56
- {
57
- name: :boolean,
58
- category: :boolean,
59
- suffix: :to_human_boolean
60
- },
61
- {
62
- name: :enumerize,
63
- category: :enumerize,
64
- suffix: :to_human_enum
65
- },
66
- {
67
- name: :custom,
68
- category: :custom,
69
- suffix: :to_custom_value
3
+ def self.build_type(name, category, suffix, formatter = nil)
4
+ config_type = {
5
+ name: name,
6
+ category: category,
7
+ suffix: suffix
70
8
  }
71
- ]
9
+ if formatter
10
+ config_type[:formatter] = formatter
11
+ end
12
+ config_type
13
+ end
14
+
15
+ TYPES = [
16
+ [:currency, :numeric, :to_currency, :number_to_currency],
17
+ [:number, :numeric, :to_human, :number_to_human],
18
+ [:size, :numeric, :to_human_size, :number_to_human_size],
19
+ [:percentage, :numeric, :to_percentage, :number_to_percentage],
20
+ [:phone, :numeric, :to_phone, :number_to_phone],
21
+ [:delimiter, :numeric, :with_delimiter, :number_with_delimiter],
22
+ [:precision, :numeric, :with_precision, :number_with_precision],
23
+ [:date, :date, :to_human_date],
24
+ [:datetime, :datetime, :to_human_datetime],
25
+ [:boolean, :boolean, :to_human_boolean],
26
+ [:enumerize, :enumerize, :to_human_enum],
27
+ [:enum, :enum, :to_human_enum],
28
+ [:custom, :custom, :to_custom_value]
29
+ ].map { |config_type| build_type(*config_type) }
30
+
31
+ OPTIONS = {
32
+ boolean: [
33
+ { boolean: true }
34
+ ],
35
+ date: [
36
+ { date: true },
37
+ { date: { format: :short, suffix: "to_short_date" } },
38
+ { date: { format: :short, suffix: "to_long_date" } },
39
+ { datetime: true },
40
+ { datetime: { format: :short, suffix: "to_short_datetime" } },
41
+ { datetime: { format: :short, suffix: "to_long_datetime" } }
42
+ ],
43
+ datetime: [
44
+ { datetime: true },
45
+ { datetime: { format: :short, suffix: "to_short_datetime" } },
46
+ { datetime: { format: :short, suffix: "to_long_datetime" } }
47
+ ],
48
+ decimal: [{ delimiter: true }],
49
+ enum: [{ enum: true }],
50
+ float: [{ delimiter: true }],
51
+ id: [{ custom: { formatter: ->(_o, value) { "#{_o.model_name.human}: ##{value}" } } }],
52
+ integer: [{ delimiter: true }]
53
+ }
72
54
 
73
55
  def category_by_type(type)
74
56
  type_config(type)[:category]
@@ -17,6 +17,7 @@ module HumanAttributes
17
17
  require_relative "./formatters/datetime"
18
18
  require_relative "./formatters/boolean"
19
19
  require_relative "./formatters/enumerize"
20
+ require_relative "./formatters/enum"
20
21
  require_relative "./formatters/custom"
21
22
  require_relative "./method_builder"
22
23
  require_relative "./extension"
@@ -18,6 +18,12 @@ module HumanAttributes
18
18
  end
19
19
  end
20
20
 
21
+ class NotEnumAttribute < RuntimeError
22
+ def initialize
23
+ super("needs to be a Rails Enum")
24
+ end
25
+ end
26
+
21
27
  class MissingFormatterOption < RuntimeError
22
28
  def initialize
23
29
  super("custom type needs formatter option with a proc")
@@ -7,7 +7,9 @@ module HumanAttributes
7
7
  formatters = HumanAttributes::FormattersBuilder.new(attrs, options).build
8
8
  @builder ||= HumanAttributes::MethodBuilder.new(self)
9
9
  @humanizers ||= []
10
- formatters.each { |formatter| @humanizers << @builder.build(formatter) }
10
+ formatters.each do |formatter|
11
+ @humanizers << @builder.build(formatter)
12
+ end
11
13
  end
12
14
 
13
15
  def humanize_attributes(options = {})
@@ -16,54 +18,47 @@ module HumanAttributes
16
18
  columns.each do |col|
17
19
  next if col.name.ends_with?("_id")
18
20
  next if included_attrs && !included_attrs.include?(col.name.to_sym)
19
- next if excluded_attrs && excluded_attrs.include?(col.name.to_sym)
21
+ next if excluded_attrs&.include?(col.name.to_sym)
22
+
20
23
  humanize_from_type(col)
21
24
  end
22
25
  end
23
26
 
24
27
  def humanizers
25
28
  return [] unless @humanizers
29
+
26
30
  @humanizers.uniq!
27
- @humanizers.reject! { |method| !method_defined?(method) }
31
+ @humanizers.select! { |method| method_defined?(method) }
28
32
  @humanizers
29
33
  end
30
34
 
31
35
  private
32
36
 
33
37
  def humanize_from_type(col)
34
- if col.name == "id"
35
- humanize(:id, custom: { formatter: ->(_o, value) { "#{model_name.human}: ##{value}" } })
36
- elsif col.type == :date
37
- humanize_date(col.name)
38
- elsif col.type == :datetime
39
- humanize_date(col.name)
40
- humanize_datetime(col.name)
41
- elsif [:decimal, :float, :integer].include?(col.type)
42
- humanize(col.name, delimiter: true)
43
- elsif col.type == :boolean
44
- humanize(col.name, boolean: true)
38
+ if HumanAttributes::Config::OPTIONS.has_key? humanizer_type(col)
39
+ HumanAttributes::Config::OPTIONS[humanizer_type(col)].each do |options|
40
+ humanize(col.name, options)
41
+ end
45
42
  end
46
43
  end
47
44
 
48
- def humanize_date(attr_name)
49
- humanize(attr_name, date: true)
50
- humanize(attr_name, date: { format: :short, suffix: "to_short_date" })
51
- humanize(attr_name, date: { format: :short, suffix: "to_long_date" })
52
- end
53
-
54
- def humanize_datetime(attr_name)
55
- humanize(attr_name, datetime: true)
56
- humanize(attr_name, datetime: { format: :short, suffix: "to_short_datetime" })
57
- humanize(attr_name, datetime: { format: :short, suffix: "to_long_datetime" })
45
+ def humanizer_type(col)
46
+ type = col.type
47
+ if col.name == 'id'
48
+ type = 'id'
49
+ elsif defined_enums.has_key?(col.name)
50
+ type = 'enum'
51
+ end
52
+ type.to_sym
58
53
  end
59
54
  end
60
55
  end
61
56
  end
62
57
 
63
- ActiveRecord::Base.send(:include, HumanAttributes::Extension)
58
+ ActiveRecord::Base.include(HumanAttributes::Extension)
64
59
 
65
60
  begin
66
- Draper::Decorator.send(:include, HumanAttributes::Extension)
61
+ Draper::Decorator.include(HumanAttributes::Extension)
67
62
  rescue NameError
68
63
  nil
69
64
  end
@@ -16,6 +16,7 @@ module HumanAttributes
16
16
  def method_name
17
17
  return "human_#{attribute}" if suffix.blank?
18
18
  return "#{attribute}_#{suffix_by_type(type)}" if suffix == true
19
+
19
20
  "#{attribute}_#{suffix}"
20
21
  end
21
22
 
@@ -0,0 +1,25 @@
1
+ module HumanAttributes
2
+ module Formatters
3
+ class Enum < Base
4
+ def apply(_instance, value)
5
+ return unless value
6
+
7
+ is_enum_defined = _instance.class.defined_enums.has_key?(attribute.to_s)
8
+ raise_error('NotEnumAttribute') unless is_enum_defined
9
+ class_name = _instance.class.name.underscore
10
+ pluralized_attribute = attribute.to_s.pluralize
11
+ attr_key = "activerecord.attributes.#{class_name}.#{pluralized_attribute}.#{value}"
12
+ enum_key = "enum.defaults.#{pluralized_attribute}.#{value}"
13
+ translate(attr_key, translate(enum_key, value))
14
+ end
15
+
16
+ def translate(key, default)
17
+ I18n.t(key, { default: default })
18
+ end
19
+
20
+ def enum_defined?(_instance)
21
+ _instance.class.defined_enums.has_key?(attribute.to_s)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -3,6 +3,7 @@ module HumanAttributes
3
3
  class Enumerize < Base
4
4
  def apply(_instance, value)
5
5
  return unless value
6
+
6
7
  raise_error('NotEnumerizeAttribute') unless value.class.to_s == "Enumerize::Value"
7
8
  value.text
8
9
  end
@@ -37,6 +37,7 @@ module HumanAttributes
37
37
 
38
38
  def get_options(options)
39
39
  return {} if options == true
40
+
40
41
  raise_error('InvalidAttributeOptions') unless options.is_a?(Hash)
41
42
  options
42
43
  end
@@ -1,3 +1,3 @@
1
1
  module HumanAttributes
2
- VERSION = "0.6.0"
2
+ VERSION = "0.7.1"
3
3
  end
data/spec/dummy/Rakefile CHANGED
@@ -1,6 +1,6 @@
1
1
  # Add your own tasks in files placed in lib/tasks ending in .rake,
2
2
  # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
3
 
4
- require File.expand_path('../config/application', __FILE__)
4
+ require_relative "config/application"
5
5
 
6
6
  Rails.application.load_tasks
@@ -0,0 +1,3 @@
1
+ //= link_tree ../images
2
+ //= link_directory ../stylesheets .css
3
+ //= link human_attributes_manifest.js
@@ -6,9 +6,9 @@
6
6
  * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
7
  *
8
8
  * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
- * compiled file so the styles you add here take precedence over styles defined in any styles
10
- * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
- * file per style scope.
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
12
  *
13
13
  *= require_tree .
14
14
  *= require_self
@@ -0,0 +1,4 @@
1
+ module ApplicationCable
2
+ class Channel < ActionCable::Channel::Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module ApplicationCable
2
+ class Connection < ActionCable::Connection::Base
3
+ end
4
+ end
@@ -1,5 +1,2 @@
1
1
  class ApplicationController < ActionController::Base
2
- # Prevent CSRF attacks by raising an exception.
3
- # For APIs, you may want to use :null_session instead.
4
- protect_from_forgery with: :exception
5
2
  end
@@ -5,9 +5,11 @@
5
5
  // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
6
  //
7
7
  // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
- // compiled file.
8
+ // compiled file. JavaScript code in this file should be added after the last require_* statement.
9
9
  //
10
10
  // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
11
  // about supported directives.
12
12
  //
13
+ //= require rails-ujs
14
+ //= require activestorage
13
15
  //= require_tree .
@@ -0,0 +1,7 @@
1
+ class ApplicationJob < ActiveJob::Base
2
+ # Automatically retry jobs that encountered a deadlock
3
+ # retry_on ActiveRecord::Deadlocked
4
+
5
+ # Most jobs are safe to ignore if the underlying records are no longer available
6
+ # discard_on ActiveJob::DeserializationError
7
+ end
@@ -0,0 +1,4 @@
1
+ class ApplicationMailer < ActionMailer::Base
2
+ default from: 'from@example.com'
3
+ layout 'mailer'
4
+ end
@@ -0,0 +1,3 @@
1
+ class ApplicationRecord < ActiveRecord::Base
2
+ self.abstract_class = true
3
+ end