activesupport 5.2.4.4 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activesupport might be problematic. Click here for more details.

Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +327 -408
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +3 -2
  5. data/lib/active_support.rb +2 -1
  6. data/lib/active_support/actionable_error.rb +48 -0
  7. data/lib/active_support/backtrace_cleaner.rb +28 -1
  8. data/lib/active_support/cache.rb +45 -23
  9. data/lib/active_support/cache/file_store.rb +22 -22
  10. data/lib/active_support/cache/mem_cache_store.rb +17 -2
  11. data/lib/active_support/cache/memory_store.rb +7 -2
  12. data/lib/active_support/cache/null_store.rb +5 -0
  13. data/lib/active_support/cache/redis_cache_store.rb +47 -25
  14. data/lib/active_support/callbacks.rb +16 -5
  15. data/lib/active_support/concern.rb +24 -1
  16. data/lib/active_support/configurable.rb +7 -11
  17. data/lib/active_support/core_ext/array.rb +1 -1
  18. data/lib/active_support/core_ext/array/access.rb +18 -6
  19. data/lib/active_support/core_ext/array/extract.rb +21 -0
  20. data/lib/active_support/core_ext/array/prepend_and_append.rb +2 -6
  21. data/lib/active_support/core_ext/class/attribute.rb +11 -16
  22. data/lib/active_support/core_ext/class/subclasses.rb +1 -1
  23. data/lib/active_support/core_ext/date/calculations.rb +6 -5
  24. data/lib/active_support/core_ext/date_and_time/calculations.rb +24 -47
  25. data/lib/active_support/core_ext/date_time/calculations.rb +1 -1
  26. data/lib/active_support/core_ext/enumerable.rb +97 -73
  27. data/lib/active_support/core_ext/hash.rb +1 -2
  28. data/lib/active_support/core_ext/hash/compact.rb +2 -26
  29. data/lib/active_support/core_ext/hash/deep_transform_values.rb +46 -0
  30. data/lib/active_support/core_ext/hash/except.rb +1 -1
  31. data/lib/active_support/core_ext/hash/keys.rb +0 -29
  32. data/lib/active_support/core_ext/hash/slice.rb +3 -25
  33. data/lib/active_support/core_ext/hash/transform_values.rb +2 -29
  34. data/lib/active_support/core_ext/integer/multiple.rb +1 -1
  35. data/lib/active_support/core_ext/kernel.rb +0 -1
  36. data/lib/active_support/core_ext/load_error.rb +1 -1
  37. data/lib/active_support/core_ext/module.rb +0 -1
  38. data/lib/active_support/core_ext/module/attribute_accessors.rb +7 -10
  39. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +13 -19
  40. data/lib/active_support/core_ext/module/delegation.rb +33 -7
  41. data/lib/active_support/core_ext/module/introspection.rb +37 -13
  42. data/lib/active_support/core_ext/module/reachable.rb +1 -6
  43. data/lib/active_support/core_ext/module/redefine_method.rb +8 -17
  44. data/lib/active_support/core_ext/numeric.rb +0 -1
  45. data/lib/active_support/core_ext/numeric/conversions.rb +124 -128
  46. data/lib/active_support/core_ext/numeric/inquiry.rb +2 -25
  47. data/lib/active_support/core_ext/object/blank.rb +1 -2
  48. data/lib/active_support/core_ext/object/duplicable.rb +7 -114
  49. data/lib/active_support/core_ext/object/json.rb +1 -0
  50. data/lib/active_support/core_ext/object/try.rb +15 -7
  51. data/lib/active_support/core_ext/object/with_options.rb +1 -1
  52. data/lib/active_support/core_ext/range/compare_range.rb +22 -13
  53. data/lib/active_support/core_ext/range/conversions.rb +31 -29
  54. data/lib/active_support/core_ext/range/include_range.rb +6 -0
  55. data/lib/active_support/core_ext/regexp.rb +0 -4
  56. data/lib/active_support/core_ext/securerandom.rb +23 -3
  57. data/lib/active_support/core_ext/string/access.rb +8 -0
  58. data/lib/active_support/core_ext/string/filters.rb +42 -1
  59. data/lib/active_support/core_ext/string/inflections.rb +7 -2
  60. data/lib/active_support/core_ext/string/multibyte.rb +4 -3
  61. data/lib/active_support/core_ext/string/output_safety.rb +61 -5
  62. data/lib/active_support/core_ext/string/strip.rb +3 -1
  63. data/lib/active_support/core_ext/time/calculations.rb +31 -2
  64. data/lib/active_support/core_ext/uri.rb +1 -0
  65. data/lib/active_support/current_attributes.rb +8 -0
  66. data/lib/active_support/dependencies.rb +69 -16
  67. data/lib/active_support/dependencies/zeitwerk_integration.rb +110 -0
  68. data/lib/active_support/deprecation.rb +1 -1
  69. data/lib/active_support/deprecation/behaviors.rb +1 -1
  70. data/lib/active_support/deprecation/method_wrappers.rb +8 -20
  71. data/lib/active_support/deprecation/proxy_wrappers.rb +24 -5
  72. data/lib/active_support/descendants_tracker.rb +56 -9
  73. data/lib/active_support/duration.rb +4 -3
  74. data/lib/active_support/duration/iso8601_parser.rb +2 -3
  75. data/lib/active_support/duration/iso8601_serializer.rb +3 -4
  76. data/lib/active_support/encrypted_configuration.rb +0 -4
  77. data/lib/active_support/encrypted_file.rb +2 -1
  78. data/lib/active_support/evented_file_update_checker.rb +39 -9
  79. data/lib/active_support/execution_wrapper.rb +1 -0
  80. data/lib/active_support/gem_version.rb +4 -4
  81. data/lib/active_support/hash_with_indifferent_access.rb +22 -18
  82. data/lib/active_support/i18n.rb +1 -0
  83. data/lib/active_support/i18n_railtie.rb +9 -1
  84. data/lib/active_support/inflector/inflections.rb +1 -4
  85. data/lib/active_support/inflector/methods.rb +15 -27
  86. data/lib/active_support/inflector/transliterate.rb +47 -18
  87. data/lib/active_support/json/decoding.rb +23 -23
  88. data/lib/active_support/json/encoding.rb +6 -2
  89. data/lib/active_support/key_generator.rb +0 -32
  90. data/lib/active_support/lazy_load_hooks.rb +5 -1
  91. data/lib/active_support/locale/en.rb +31 -0
  92. data/lib/active_support/log_subscriber.rb +31 -8
  93. data/lib/active_support/logger.rb +0 -15
  94. data/lib/active_support/logger_silence.rb +28 -12
  95. data/lib/active_support/logger_thread_safe_level.rb +26 -4
  96. data/lib/active_support/message_encryptor.rb +3 -5
  97. data/lib/active_support/message_verifier.rb +3 -3
  98. data/lib/active_support/multibyte/chars.rb +29 -48
  99. data/lib/active_support/multibyte/unicode.rb +44 -281
  100. data/lib/active_support/notifications.rb +41 -4
  101. data/lib/active_support/notifications/fanout.rb +98 -13
  102. data/lib/active_support/notifications/instrumenter.rb +79 -8
  103. data/lib/active_support/number_helper.rb +7 -0
  104. data/lib/active_support/number_helper/number_to_currency_converter.rb +2 -2
  105. data/lib/active_support/number_helper/number_to_delimited_converter.rb +3 -1
  106. data/lib/active_support/number_helper/number_to_human_converter.rb +3 -1
  107. data/lib/active_support/number_helper/number_to_human_size_converter.rb +3 -1
  108. data/lib/active_support/number_helper/number_to_percentage_converter.rb +3 -1
  109. data/lib/active_support/number_helper/number_to_phone_converter.rb +2 -0
  110. data/lib/active_support/number_helper/number_to_rounded_converter.rb +5 -3
  111. data/lib/active_support/ordered_options.rb +1 -1
  112. data/lib/active_support/parameter_filter.rb +129 -0
  113. data/lib/active_support/rails.rb +0 -6
  114. data/lib/active_support/reloader.rb +4 -5
  115. data/lib/active_support/security_utils.rb +1 -1
  116. data/lib/active_support/subscriber.rb +65 -26
  117. data/lib/active_support/tagged_logging.rb +13 -4
  118. data/lib/active_support/test_case.rb +91 -0
  119. data/lib/active_support/testing/assertions.rb +15 -1
  120. data/lib/active_support/testing/deprecation.rb +0 -1
  121. data/lib/active_support/testing/file_fixtures.rb +2 -0
  122. data/lib/active_support/testing/isolation.rb +2 -2
  123. data/lib/active_support/testing/method_call_assertions.rb +28 -1
  124. data/lib/active_support/testing/parallelization.rb +128 -0
  125. data/lib/active_support/testing/stream.rb +1 -1
  126. data/lib/active_support/testing/time_helpers.rb +7 -7
  127. data/lib/active_support/time_with_zone.rb +15 -5
  128. data/lib/active_support/values/time_zone.rb +12 -7
  129. data/lib/active_support/xml_mini.rb +2 -9
  130. data/lib/active_support/xml_mini/jdom.rb +2 -2
  131. data/lib/active_support/xml_mini/libxml.rb +2 -2
  132. data/lib/active_support/xml_mini/libxmlsax.rb +4 -4
  133. data/lib/active_support/xml_mini/nokogiri.rb +2 -2
  134. data/lib/active_support/xml_mini/nokogirisax.rb +3 -3
  135. data/lib/active_support/xml_mini/rexml.rb +2 -2
  136. metadata +34 -9
  137. data/lib/active_support/core_ext/kernel/agnostics.rb +0 -13
  138. data/lib/active_support/values/unicode_tables.dat +0 -0
@@ -5,8 +5,8 @@ require "active_support/inflector"
5
5
  class Module
6
6
  # Returns the name of the module containing this one.
7
7
  #
8
- # M::N.parent_name # => "M"
9
- def parent_name
8
+ # M::N.module_parent_name # => "M"
9
+ def module_parent_name
10
10
  if defined?(@parent_name)
11
11
  @parent_name
12
12
  else
@@ -16,6 +16,14 @@ class Module
16
16
  end
17
17
  end
18
18
 
19
+ def parent_name
20
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
21
+ `Module#parent_name` has been renamed to `module_parent_name`.
22
+ `parent_name` is deprecated and will be removed in Rails 6.1.
23
+ MSG
24
+ module_parent_name
25
+ end
26
+
19
27
  # Returns the module which contains this one according to its name.
20
28
  #
21
29
  # module M
@@ -24,15 +32,23 @@ class Module
24
32
  # end
25
33
  # X = M::N
26
34
  #
27
- # M::N.parent # => M
28
- # X.parent # => M
35
+ # M::N.module_parent # => M
36
+ # X.module_parent # => M
29
37
  #
30
38
  # The parent of top-level and anonymous modules is Object.
31
39
  #
32
- # M.parent # => Object
33
- # Module.new.parent # => Object
40
+ # M.module_parent # => Object
41
+ # Module.new.module_parent # => Object
42
+ def module_parent
43
+ module_parent_name ? ActiveSupport::Inflector.constantize(module_parent_name) : Object
44
+ end
45
+
34
46
  def parent
35
- parent_name ? ActiveSupport::Inflector.constantize(parent_name) : Object
47
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
48
+ `Module#parent` has been renamed to `module_parent`.
49
+ `parent` is deprecated and will be removed in Rails 6.1.
50
+ MSG
51
+ module_parent
36
52
  end
37
53
 
38
54
  # Returns all the parents of this module according to its name, ordered from
@@ -44,13 +60,13 @@ class Module
44
60
  # end
45
61
  # X = M::N
46
62
  #
47
- # M.parents # => [Object]
48
- # M::N.parents # => [M, Object]
49
- # X.parents # => [M, Object]
50
- def parents
63
+ # M.module_parents # => [Object]
64
+ # M::N.module_parents # => [M, Object]
65
+ # X.module_parents # => [M, Object]
66
+ def module_parents
51
67
  parents = []
52
- if parent_name
53
- parts = parent_name.split("::")
68
+ if module_parent_name
69
+ parts = module_parent_name.split("::")
54
70
  until parts.empty?
55
71
  parents << ActiveSupport::Inflector.constantize(parts * "::")
56
72
  parts.pop
@@ -59,4 +75,12 @@ class Module
59
75
  parents << Object unless parents.include? Object
60
76
  parents
61
77
  end
78
+
79
+ def parents
80
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
81
+ `Module#parents` has been renamed to `module_parents`.
82
+ `parents` is deprecated and will be removed in Rails 6.1.
83
+ MSG
84
+ module_parents
85
+ end
62
86
  end
@@ -3,9 +3,4 @@
3
3
  require "active_support/core_ext/module/anonymous"
4
4
  require "active_support/core_ext/string/inflections"
5
5
 
6
- class Module
7
- def reachable? #:nodoc:
8
- !anonymous? && name.safe_constantize.equal?(self)
9
- end
10
- deprecate :reachable?
11
- end
6
+ ActiveSupport::Deprecation.warn("reachable is deprecated and will be removed from the framework.")
@@ -1,23 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Module
4
- if RUBY_VERSION >= "2.3"
5
- # Marks the named method as intended to be redefined, if it exists.
6
- # Suppresses the Ruby method redefinition warning. Prefer
7
- # #redefine_method where possible.
8
- def silence_redefinition_of_method(method)
9
- if method_defined?(method) || private_method_defined?(method)
10
- # This suppresses the "method redefined" warning; the self-alias
11
- # looks odd, but means we don't need to generate a unique name
12
- alias_method method, method
13
- end
14
- end
15
- else
16
- def silence_redefinition_of_method(method)
17
- if method_defined?(method) || private_method_defined?(method)
18
- alias_method :__rails_redefine, method
19
- remove_method :__rails_redefine
20
- end
4
+ # Marks the named method as intended to be redefined, if it exists.
5
+ # Suppresses the Ruby method redefinition warning. Prefer
6
+ # #redefine_method where possible.
7
+ def silence_redefinition_of_method(method)
8
+ if method_defined?(method) || private_method_defined?(method)
9
+ # This suppresses the "method redefined" warning; the self-alias
10
+ # looks odd, but means we don't need to generate a unique name
11
+ alias_method method, method
21
12
  end
22
13
  end
23
14
 
@@ -2,5 +2,4 @@
2
2
 
3
3
  require "active_support/core_ext/numeric/bytes"
4
4
  require "active_support/core_ext/numeric/time"
5
- require "active_support/core_ext/numeric/inquiry"
6
5
  require "active_support/core_ext/numeric/conversions"
@@ -4,137 +4,133 @@ require "active_support/core_ext/big_decimal/conversions"
4
4
  require "active_support/number_helper"
5
5
  require "active_support/core_ext/module/deprecation"
6
6
 
7
- module ActiveSupport::NumericWithFormat
8
- # Provides options for converting numbers into formatted strings.
9
- # Options are provided for phone numbers, currency, percentage,
10
- # precision, positional notation, file size and pretty printing.
11
- #
12
- # ==== Options
13
- #
14
- # For details on which formats use which options, see ActiveSupport::NumberHelper
15
- #
16
- # ==== Examples
17
- #
18
- # Phone Numbers:
19
- # 5551234.to_s(:phone) # => "555-1234"
20
- # 1235551234.to_s(:phone) # => "123-555-1234"
21
- # 1235551234.to_s(:phone, area_code: true) # => "(123) 555-1234"
22
- # 1235551234.to_s(:phone, delimiter: ' ') # => "123 555 1234"
23
- # 1235551234.to_s(:phone, area_code: true, extension: 555) # => "(123) 555-1234 x 555"
24
- # 1235551234.to_s(:phone, country_code: 1) # => "+1-123-555-1234"
25
- # 1235551234.to_s(:phone, country_code: 1, extension: 1343, delimiter: '.')
26
- # # => "+1.123.555.1234 x 1343"
27
- #
28
- # Currency:
29
- # 1234567890.50.to_s(:currency) # => "$1,234,567,890.50"
30
- # 1234567890.506.to_s(:currency) # => "$1,234,567,890.51"
31
- # 1234567890.506.to_s(:currency, precision: 3) # => "$1,234,567,890.506"
32
- # 1234567890.506.to_s(:currency, locale: :fr) # => "1 234 567 890,51 €"
33
- # -1234567890.50.to_s(:currency, negative_format: '(%u%n)')
34
- # # => "($1,234,567,890.50)"
35
- # 1234567890.50.to_s(:currency, unit: '&pound;', separator: ',', delimiter: '')
36
- # # => "&pound;1234567890,50"
37
- # 1234567890.50.to_s(:currency, unit: '&pound;', separator: ',', delimiter: '', format: '%n %u')
38
- # # => "1234567890,50 &pound;"
39
- #
40
- # Percentage:
41
- # 100.to_s(:percentage) # => "100.000%"
42
- # 100.to_s(:percentage, precision: 0) # => "100%"
43
- # 1000.to_s(:percentage, delimiter: '.', separator: ',') # => "1.000,000%"
44
- # 302.24398923423.to_s(:percentage, precision: 5) # => "302.24399%"
45
- # 1000.to_s(:percentage, locale: :fr) # => "1 000,000%"
46
- # 100.to_s(:percentage, format: '%n %') # => "100.000 %"
47
- #
48
- # Delimited:
49
- # 12345678.to_s(:delimited) # => "12,345,678"
50
- # 12345678.05.to_s(:delimited) # => "12,345,678.05"
51
- # 12345678.to_s(:delimited, delimiter: '.') # => "12.345.678"
52
- # 12345678.to_s(:delimited, delimiter: ',') # => "12,345,678"
53
- # 12345678.05.to_s(:delimited, separator: ' ') # => "12,345,678 05"
54
- # 12345678.05.to_s(:delimited, locale: :fr) # => "12 345 678,05"
55
- # 98765432.98.to_s(:delimited, delimiter: ' ', separator: ',')
56
- # # => "98 765 432,98"
57
- #
58
- # Rounded:
59
- # 111.2345.to_s(:rounded) # => "111.235"
60
- # 111.2345.to_s(:rounded, precision: 2) # => "111.23"
61
- # 13.to_s(:rounded, precision: 5) # => "13.00000"
62
- # 389.32314.to_s(:rounded, precision: 0) # => "389"
63
- # 111.2345.to_s(:rounded, significant: true) # => "111"
64
- # 111.2345.to_s(:rounded, precision: 1, significant: true) # => "100"
65
- # 13.to_s(:rounded, precision: 5, significant: true) # => "13.000"
66
- # 111.234.to_s(:rounded, locale: :fr) # => "111,234"
67
- # 13.to_s(:rounded, precision: 5, significant: true, strip_insignificant_zeros: true)
68
- # # => "13"
69
- # 389.32314.to_s(:rounded, precision: 4, significant: true) # => "389.3"
70
- # 1111.2345.to_s(:rounded, precision: 2, separator: ',', delimiter: '.')
71
- # # => "1.111,23"
72
- #
73
- # Human-friendly size in Bytes:
74
- # 123.to_s(:human_size) # => "123 Bytes"
75
- # 1234.to_s(:human_size) # => "1.21 KB"
76
- # 12345.to_s(:human_size) # => "12.1 KB"
77
- # 1234567.to_s(:human_size) # => "1.18 MB"
78
- # 1234567890.to_s(:human_size) # => "1.15 GB"
79
- # 1234567890123.to_s(:human_size) # => "1.12 TB"
80
- # 1234567890123456.to_s(:human_size) # => "1.1 PB"
81
- # 1234567890123456789.to_s(:human_size) # => "1.07 EB"
82
- # 1234567.to_s(:human_size, precision: 2) # => "1.2 MB"
83
- # 483989.to_s(:human_size, precision: 2) # => "470 KB"
84
- # 1234567.to_s(:human_size, precision: 2, separator: ',') # => "1,2 MB"
85
- # 1234567890123.to_s(:human_size, precision: 5) # => "1.1228 TB"
86
- # 524288000.to_s(:human_size, precision: 5) # => "500 MB"
87
- #
88
- # Human-friendly format:
89
- # 123.to_s(:human) # => "123"
90
- # 1234.to_s(:human) # => "1.23 Thousand"
91
- # 12345.to_s(:human) # => "12.3 Thousand"
92
- # 1234567.to_s(:human) # => "1.23 Million"
93
- # 1234567890.to_s(:human) # => "1.23 Billion"
94
- # 1234567890123.to_s(:human) # => "1.23 Trillion"
95
- # 1234567890123456.to_s(:human) # => "1.23 Quadrillion"
96
- # 1234567890123456789.to_s(:human) # => "1230 Quadrillion"
97
- # 489939.to_s(:human, precision: 2) # => "490 Thousand"
98
- # 489939.to_s(:human, precision: 4) # => "489.9 Thousand"
99
- # 1234567.to_s(:human, precision: 4,
100
- # significant: false) # => "1.2346 Million"
101
- # 1234567.to_s(:human, precision: 1,
102
- # separator: ',',
103
- # significant: false) # => "1,2 Million"
104
- def to_s(format = nil, options = nil)
105
- case format
106
- when nil
107
- super()
108
- when Integer, String
109
- super(format)
110
- when :phone
111
- ActiveSupport::NumberHelper.number_to_phone(self, options || {})
112
- when :currency
113
- ActiveSupport::NumberHelper.number_to_currency(self, options || {})
114
- when :percentage
115
- ActiveSupport::NumberHelper.number_to_percentage(self, options || {})
116
- when :delimited
117
- ActiveSupport::NumberHelper.number_to_delimited(self, options || {})
118
- when :rounded
119
- ActiveSupport::NumberHelper.number_to_rounded(self, options || {})
120
- when :human
121
- ActiveSupport::NumberHelper.number_to_human(self, options || {})
122
- when :human_size
123
- ActiveSupport::NumberHelper.number_to_human_size(self, options || {})
124
- when Symbol
125
- super()
126
- else
127
- super(format)
7
+ module ActiveSupport
8
+ module NumericWithFormat
9
+ # Provides options for converting numbers into formatted strings.
10
+ # Options are provided for phone numbers, currency, percentage,
11
+ # precision, positional notation, file size and pretty printing.
12
+ #
13
+ # ==== Options
14
+ #
15
+ # For details on which formats use which options, see ActiveSupport::NumberHelper
16
+ #
17
+ # ==== Examples
18
+ #
19
+ # Phone Numbers:
20
+ # 5551234.to_s(:phone) # => "555-1234"
21
+ # 1235551234.to_s(:phone) # => "123-555-1234"
22
+ # 1235551234.to_s(:phone, area_code: true) # => "(123) 555-1234"
23
+ # 1235551234.to_s(:phone, delimiter: ' ') # => "123 555 1234"
24
+ # 1235551234.to_s(:phone, area_code: true, extension: 555) # => "(123) 555-1234 x 555"
25
+ # 1235551234.to_s(:phone, country_code: 1) # => "+1-123-555-1234"
26
+ # 1235551234.to_s(:phone, country_code: 1, extension: 1343, delimiter: '.')
27
+ # # => "+1.123.555.1234 x 1343"
28
+ #
29
+ # Currency:
30
+ # 1234567890.50.to_s(:currency) # => "$1,234,567,890.50"
31
+ # 1234567890.506.to_s(:currency) # => "$1,234,567,890.51"
32
+ # 1234567890.506.to_s(:currency, precision: 3) # => "$1,234,567,890.506"
33
+ # 1234567890.506.to_s(:currency, locale: :fr) # => "1 234 567 890,51 €"
34
+ # -1234567890.50.to_s(:currency, negative_format: '(%u%n)')
35
+ # # => "($1,234,567,890.50)"
36
+ # 1234567890.50.to_s(:currency, unit: '&pound;', separator: ',', delimiter: '')
37
+ # # => "&pound;1234567890,50"
38
+ # 1234567890.50.to_s(:currency, unit: '&pound;', separator: ',', delimiter: '', format: '%n %u')
39
+ # # => "1234567890,50 &pound;"
40
+ #
41
+ # Percentage:
42
+ # 100.to_s(:percentage) # => "100.000%"
43
+ # 100.to_s(:percentage, precision: 0) # => "100%"
44
+ # 1000.to_s(:percentage, delimiter: '.', separator: ',') # => "1.000,000%"
45
+ # 302.24398923423.to_s(:percentage, precision: 5) # => "302.24399%"
46
+ # 1000.to_s(:percentage, locale: :fr) # => "1 000,000%"
47
+ # 100.to_s(:percentage, format: '%n %') # => "100.000 %"
48
+ #
49
+ # Delimited:
50
+ # 12345678.to_s(:delimited) # => "12,345,678"
51
+ # 12345678.05.to_s(:delimited) # => "12,345,678.05"
52
+ # 12345678.to_s(:delimited, delimiter: '.') # => "12.345.678"
53
+ # 12345678.to_s(:delimited, delimiter: ',') # => "12,345,678"
54
+ # 12345678.05.to_s(:delimited, separator: ' ') # => "12,345,678 05"
55
+ # 12345678.05.to_s(:delimited, locale: :fr) # => "12 345 678,05"
56
+ # 98765432.98.to_s(:delimited, delimiter: ' ', separator: ',')
57
+ # # => "98 765 432,98"
58
+ #
59
+ # Rounded:
60
+ # 111.2345.to_s(:rounded) # => "111.235"
61
+ # 111.2345.to_s(:rounded, precision: 2) # => "111.23"
62
+ # 13.to_s(:rounded, precision: 5) # => "13.00000"
63
+ # 389.32314.to_s(:rounded, precision: 0) # => "389"
64
+ # 111.2345.to_s(:rounded, significant: true) # => "111"
65
+ # 111.2345.to_s(:rounded, precision: 1, significant: true) # => "100"
66
+ # 13.to_s(:rounded, precision: 5, significant: true) # => "13.000"
67
+ # 111.234.to_s(:rounded, locale: :fr) # => "111,234"
68
+ # 13.to_s(:rounded, precision: 5, significant: true, strip_insignificant_zeros: true)
69
+ # # => "13"
70
+ # 389.32314.to_s(:rounded, precision: 4, significant: true) # => "389.3"
71
+ # 1111.2345.to_s(:rounded, precision: 2, separator: ',', delimiter: '.')
72
+ # # => "1.111,23"
73
+ #
74
+ # Human-friendly size in Bytes:
75
+ # 123.to_s(:human_size) # => "123 Bytes"
76
+ # 1234.to_s(:human_size) # => "1.21 KB"
77
+ # 12345.to_s(:human_size) # => "12.1 KB"
78
+ # 1234567.to_s(:human_size) # => "1.18 MB"
79
+ # 1234567890.to_s(:human_size) # => "1.15 GB"
80
+ # 1234567890123.to_s(:human_size) # => "1.12 TB"
81
+ # 1234567890123456.to_s(:human_size) # => "1.1 PB"
82
+ # 1234567890123456789.to_s(:human_size) # => "1.07 EB"
83
+ # 1234567.to_s(:human_size, precision: 2) # => "1.2 MB"
84
+ # 483989.to_s(:human_size, precision: 2) # => "470 KB"
85
+ # 1234567.to_s(:human_size, precision: 2, separator: ',') # => "1,2 MB"
86
+ # 1234567890123.to_s(:human_size, precision: 5) # => "1.1228 TB"
87
+ # 524288000.to_s(:human_size, precision: 5) # => "500 MB"
88
+ #
89
+ # Human-friendly format:
90
+ # 123.to_s(:human) # => "123"
91
+ # 1234.to_s(:human) # => "1.23 Thousand"
92
+ # 12345.to_s(:human) # => "12.3 Thousand"
93
+ # 1234567.to_s(:human) # => "1.23 Million"
94
+ # 1234567890.to_s(:human) # => "1.23 Billion"
95
+ # 1234567890123.to_s(:human) # => "1.23 Trillion"
96
+ # 1234567890123456.to_s(:human) # => "1.23 Quadrillion"
97
+ # 1234567890123456789.to_s(:human) # => "1230 Quadrillion"
98
+ # 489939.to_s(:human, precision: 2) # => "490 Thousand"
99
+ # 489939.to_s(:human, precision: 4) # => "489.9 Thousand"
100
+ # 1234567.to_s(:human, precision: 4,
101
+ # significant: false) # => "1.2346 Million"
102
+ # 1234567.to_s(:human, precision: 1,
103
+ # separator: ',',
104
+ # significant: false) # => "1,2 Million"
105
+ def to_s(format = nil, options = nil)
106
+ case format
107
+ when nil
108
+ super()
109
+ when Integer, String
110
+ super(format)
111
+ when :phone
112
+ ActiveSupport::NumberHelper.number_to_phone(self, options || {})
113
+ when :currency
114
+ ActiveSupport::NumberHelper.number_to_currency(self, options || {})
115
+ when :percentage
116
+ ActiveSupport::NumberHelper.number_to_percentage(self, options || {})
117
+ when :delimited
118
+ ActiveSupport::NumberHelper.number_to_delimited(self, options || {})
119
+ when :rounded
120
+ ActiveSupport::NumberHelper.number_to_rounded(self, options || {})
121
+ when :human
122
+ ActiveSupport::NumberHelper.number_to_human(self, options || {})
123
+ when :human_size
124
+ ActiveSupport::NumberHelper.number_to_human_size(self, options || {})
125
+ when Symbol
126
+ super()
127
+ else
128
+ super(format)
129
+ end
128
130
  end
129
131
  end
130
132
  end
131
133
 
132
- # Ruby 2.4+ unifies Fixnum & Bignum into Integer.
133
- if 0.class == Integer
134
- Integer.prepend ActiveSupport::NumericWithFormat
135
- else
136
- Fixnum.prepend ActiveSupport::NumericWithFormat
137
- Bignum.prepend ActiveSupport::NumericWithFormat
138
- end
134
+ Integer.prepend ActiveSupport::NumericWithFormat
139
135
  Float.prepend ActiveSupport::NumericWithFormat
140
136
  BigDecimal.prepend ActiveSupport::NumericWithFormat
@@ -1,28 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- unless 1.respond_to?(:positive?) # TODO: Remove this file when we drop support to ruby < 2.3
4
- class Numeric
5
- # Returns true if the number is positive.
6
- #
7
- # 1.positive? # => true
8
- # 0.positive? # => false
9
- # -1.positive? # => false
10
- def positive?
11
- self > 0
12
- end
3
+ require "active_support/deprecation"
13
4
 
14
- # Returns true if the number is negative.
15
- #
16
- # -1.negative? # => true
17
- # 0.negative? # => false
18
- # 1.negative? # => false
19
- def negative?
20
- self < 0
21
- end
22
- end
23
-
24
- class Complex
25
- undef :positive?
26
- undef :negative?
27
- end
28
- end
5
+ ActiveSupport::Deprecation.warn "Ruby 2.5+ (required by Rails 6) provides Numeric#positive? and Numeric#negative? natively, so requiring active_support/core_ext/numeric/inquiry is no longer necessary. Requiring it will raise LoadError in Rails 6.1."
@@ -1,11 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_support/core_ext/regexp"
4
3
  require "concurrent/map"
5
4
 
6
5
  class Object
7
6
  # An object is blank if it's false, empty, or a whitespace string.
8
- # For example, +false+, '', ' ', +nil+, [], and {} are all blank.
7
+ # For example, +nil+, '', ' ', [], {}, and +false+ are all blank.
9
8
  #
10
9
  # This simplifies
11
10
  #
@@ -28,93 +28,6 @@ class Object
28
28
  end
29
29
  end
30
30
 
31
- class NilClass
32
- begin
33
- nil.dup
34
- rescue TypeError
35
-
36
- # +nil+ is not duplicable:
37
- #
38
- # nil.duplicable? # => false
39
- # nil.dup # => TypeError: can't dup NilClass
40
- def duplicable?
41
- false
42
- end
43
- end
44
- end
45
-
46
- class FalseClass
47
- begin
48
- false.dup
49
- rescue TypeError
50
-
51
- # +false+ is not duplicable:
52
- #
53
- # false.duplicable? # => false
54
- # false.dup # => TypeError: can't dup FalseClass
55
- def duplicable?
56
- false
57
- end
58
- end
59
- end
60
-
61
- class TrueClass
62
- begin
63
- true.dup
64
- rescue TypeError
65
-
66
- # +true+ is not duplicable:
67
- #
68
- # true.duplicable? # => false
69
- # true.dup # => TypeError: can't dup TrueClass
70
- def duplicable?
71
- false
72
- end
73
- end
74
- end
75
-
76
- class Symbol
77
- begin
78
- :symbol.dup # Ruby 2.4.x.
79
- "symbol_from_string".to_sym.dup # Some symbols can't `dup` in Ruby 2.4.0.
80
- rescue TypeError
81
-
82
- # Symbols are not duplicable:
83
- #
84
- # :my_symbol.duplicable? # => false
85
- # :my_symbol.dup # => TypeError: can't dup Symbol
86
- def duplicable?
87
- false
88
- end
89
- end
90
- end
91
-
92
- class Numeric
93
- begin
94
- 1.dup
95
- rescue TypeError
96
-
97
- # Numbers are not duplicable:
98
- #
99
- # 3.duplicable? # => false
100
- # 3.dup # => TypeError: can't dup Integer
101
- def duplicable?
102
- false
103
- end
104
- end
105
- end
106
-
107
- require "bigdecimal"
108
- class BigDecimal
109
- # BigDecimals are duplicable:
110
- #
111
- # BigDecimal("1.2").duplicable? # => true
112
- # BigDecimal("1.2").dup # => #<BigDecimal:...,'0.12E1',18(18)>
113
- def duplicable?
114
- true
115
- end
116
- end
117
-
118
31
  class Method
119
32
  # Methods are not duplicable:
120
33
  #
@@ -125,32 +38,12 @@ class Method
125
38
  end
126
39
  end
127
40
 
128
- class Complex
129
- begin
130
- Complex(1).dup
131
- rescue TypeError
132
-
133
- # Complexes are not duplicable:
134
- #
135
- # Complex(1).duplicable? # => false
136
- # Complex(1).dup # => TypeError: can't copy Complex
137
- def duplicable?
138
- false
139
- end
140
- end
141
- end
142
-
143
- class Rational
144
- begin
145
- Rational(1).dup
146
- rescue TypeError
147
-
148
- # Rationals are not duplicable:
149
- #
150
- # Rational(1).duplicable? # => false
151
- # Rational(1).dup # => TypeError: can't copy Rational
152
- def duplicable?
153
- false
154
- end
41
+ class UnboundMethod
42
+ # Unbound methods are not duplicable:
43
+ #
44
+ # method(:puts).unbind.duplicable? # => false
45
+ # method(:puts).unbind.dup # => TypeError: allocator undefined for UnboundMethod
46
+ def duplicable?
47
+ false
155
48
  end
156
49
  end