activesupport 5.2.7 → 6.0.0.beta1

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 (127) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +182 -566
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +1 -1
  5. data/lib/active_support/backtrace_cleaner.rb +23 -0
  6. data/lib/active_support/cache/file_store.rb +19 -12
  7. data/lib/active_support/cache/mem_cache_store.rb +16 -2
  8. data/lib/active_support/cache/memory_store.rb +5 -0
  9. data/lib/active_support/cache/null_store.rb +5 -0
  10. data/lib/active_support/cache/redis_cache_store.rb +39 -20
  11. data/lib/active_support/cache.rb +40 -18
  12. data/lib/active_support/callbacks.rb +16 -5
  13. data/lib/active_support/configurable.rb +4 -8
  14. data/lib/active_support/core_ext/array/extract.rb +21 -0
  15. data/lib/active_support/core_ext/array/prepend_and_append.rb +2 -6
  16. data/lib/active_support/core_ext/array.rb +1 -1
  17. data/lib/active_support/core_ext/class/attribute.rb +1 -1
  18. data/lib/active_support/core_ext/class/subclasses.rb +1 -1
  19. data/lib/active_support/core_ext/date/calculations.rb +6 -5
  20. data/lib/active_support/core_ext/date_and_time/calculations.rb +24 -17
  21. data/lib/active_support/core_ext/date_time/calculations.rb +1 -1
  22. data/lib/active_support/core_ext/enumerable.rb +71 -67
  23. data/lib/active_support/core_ext/hash/compact.rb +2 -26
  24. data/lib/active_support/core_ext/hash/keys.rb +0 -29
  25. data/lib/active_support/core_ext/hash/slice.rb +3 -25
  26. data/lib/active_support/core_ext/hash/transform_values.rb +2 -29
  27. data/lib/active_support/core_ext/hash.rb +0 -2
  28. data/lib/active_support/core_ext/integer/multiple.rb +1 -1
  29. data/lib/active_support/core_ext/load_error.rb +1 -1
  30. data/lib/active_support/core_ext/module/attribute_accessors.rb +2 -5
  31. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +8 -14
  32. data/lib/active_support/core_ext/module/delegation.rb +27 -7
  33. data/lib/active_support/core_ext/module/introspection.rb +37 -13
  34. data/lib/active_support/core_ext/module/reachable.rb +1 -6
  35. data/lib/active_support/core_ext/module/redefine_method.rb +8 -17
  36. data/lib/active_support/core_ext/module.rb +0 -1
  37. data/lib/active_support/core_ext/numeric/conversions.rb +124 -128
  38. data/lib/active_support/core_ext/numeric/inquiry.rb +2 -25
  39. data/lib/active_support/core_ext/numeric.rb +0 -1
  40. data/lib/active_support/core_ext/object/blank.rb +1 -2
  41. data/lib/active_support/core_ext/object/duplicable.rb +5 -2
  42. data/lib/active_support/core_ext/object/json.rb +1 -0
  43. data/lib/active_support/core_ext/object/try.rb +15 -7
  44. data/lib/active_support/core_ext/object/with_options.rb +1 -1
  45. data/lib/active_support/core_ext/range/compare_range.rb +1 -1
  46. data/lib/active_support/core_ext/range/conversions.rb +31 -29
  47. data/lib/active_support/core_ext/range/include_range.rb +6 -0
  48. data/lib/active_support/core_ext/regexp.rb +0 -4
  49. data/lib/active_support/core_ext/securerandom.rb +23 -3
  50. data/lib/active_support/core_ext/string/access.rb +8 -0
  51. data/lib/active_support/core_ext/string/filters.rb +41 -0
  52. data/lib/active_support/core_ext/string/multibyte.rb +4 -3
  53. data/lib/active_support/core_ext/string/output_safety.rb +16 -5
  54. data/lib/active_support/core_ext/string/strip.rb +3 -1
  55. data/lib/active_support/core_ext/uri.rb +1 -0
  56. data/lib/active_support/current_attributes.rb +2 -0
  57. data/lib/active_support/dependencies.rb +28 -11
  58. data/lib/active_support/deprecation/behaviors.rb +1 -1
  59. data/lib/active_support/deprecation/method_wrappers.rb +4 -5
  60. data/lib/active_support/deprecation/proxy_wrappers.rb +0 -2
  61. data/lib/active_support/deprecation.rb +1 -1
  62. data/lib/active_support/descendants_tracker.rb +6 -5
  63. data/lib/active_support/duration/iso8601_parser.rb +2 -3
  64. data/lib/active_support/duration/iso8601_serializer.rb +3 -4
  65. data/lib/active_support/duration.rb +12 -14
  66. data/lib/active_support/encrypted_configuration.rb +0 -4
  67. data/lib/active_support/evented_file_update_checker.rb +25 -7
  68. data/lib/active_support/execution_wrapper.rb +14 -16
  69. data/lib/active_support/gem_version.rb +4 -4
  70. data/lib/active_support/hash_with_indifferent_access.rb +16 -28
  71. data/lib/active_support/i18n.rb +1 -0
  72. data/lib/active_support/i18n_railtie.rb +8 -1
  73. data/lib/active_support/inflector/inflections.rb +1 -4
  74. data/lib/active_support/inflector/methods.rb +15 -27
  75. data/lib/active_support/inflector/transliterate.rb +6 -6
  76. data/lib/active_support/json/decoding.rb +23 -23
  77. data/lib/active_support/json/encoding.rb +6 -2
  78. data/lib/active_support/key_generator.rb +0 -32
  79. data/lib/active_support/lazy_load_hooks.rb +5 -1
  80. data/lib/active_support/locale/en.rb +31 -0
  81. data/lib/active_support/log_subscriber.rb +31 -8
  82. data/lib/active_support/logger.rb +0 -15
  83. data/lib/active_support/logger_silence.rb +28 -12
  84. data/lib/active_support/logger_thread_safe_level.rb +27 -6
  85. data/lib/active_support/message_encryptor.rb +2 -4
  86. data/lib/active_support/message_verifier.rb +2 -2
  87. data/lib/active_support/multibyte/chars.rb +29 -48
  88. data/lib/active_support/multibyte/unicode.rb +44 -281
  89. data/lib/active_support/notifications/fanout.rb +42 -4
  90. data/lib/active_support/notifications/instrumenter.rb +73 -2
  91. data/lib/active_support/notifications.rb +32 -4
  92. data/lib/active_support/number_helper/number_to_currency_converter.rb +2 -2
  93. data/lib/active_support/number_helper/number_to_delimited_converter.rb +3 -1
  94. data/lib/active_support/number_helper/number_to_human_converter.rb +3 -1
  95. data/lib/active_support/number_helper/number_to_human_size_converter.rb +3 -1
  96. data/lib/active_support/number_helper/number_to_percentage_converter.rb +3 -1
  97. data/lib/active_support/number_helper/number_to_phone_converter.rb +2 -0
  98. data/lib/active_support/number_helper/number_to_rounded_converter.rb +5 -3
  99. data/lib/active_support/number_helper.rb +7 -0
  100. data/lib/active_support/ordered_options.rb +1 -1
  101. data/lib/active_support/parameter_filter.rb +124 -0
  102. data/lib/active_support/rails.rb +0 -6
  103. data/lib/active_support/reloader.rb +5 -6
  104. data/lib/active_support/subscriber.rb +16 -26
  105. data/lib/active_support/tagged_logging.rb +13 -4
  106. data/lib/active_support/test_case.rb +91 -0
  107. data/lib/active_support/testing/assertions.rb +15 -1
  108. data/lib/active_support/testing/deprecation.rb +0 -1
  109. data/lib/active_support/testing/file_fixtures.rb +2 -0
  110. data/lib/active_support/testing/isolation.rb +2 -2
  111. data/lib/active_support/testing/method_call_assertions.rb +28 -1
  112. data/lib/active_support/testing/parallelization.rb +109 -0
  113. data/lib/active_support/testing/stream.rb +1 -1
  114. data/lib/active_support/testing/time_helpers.rb +7 -7
  115. data/lib/active_support/time_with_zone.rb +15 -5
  116. data/lib/active_support/values/time_zone.rb +12 -7
  117. data/lib/active_support/xml_mini/jdom.rb +2 -2
  118. data/lib/active_support/xml_mini/libxml.rb +2 -2
  119. data/lib/active_support/xml_mini/libxmlsax.rb +4 -4
  120. data/lib/active_support/xml_mini/nokogiri.rb +2 -2
  121. data/lib/active_support/xml_mini/nokogirisax.rb +3 -3
  122. data/lib/active_support/xml_mini/rexml.rb +2 -2
  123. data/lib/active_support/xml_mini.rb +2 -9
  124. data/lib/active_support.rb +1 -1
  125. metadata +12 -10
  126. data/lib/active_support/core_ext/digest.rb +0 -3
  127. 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
 
@@ -3,7 +3,6 @@
3
3
  require "active_support/core_ext/module/aliasing"
4
4
  require "active_support/core_ext/module/introspection"
5
5
  require "active_support/core_ext/module/anonymous"
6
- require "active_support/core_ext/module/reachable"
7
6
  require "active_support/core_ext/module/attribute_accessors"
8
7
  require "active_support/core_ext/module/attribute_accessors_per_thread"
9
8
  require "active_support/core_ext/module/attr_internal"
@@ -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."
@@ -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"
@@ -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
  #
@@ -75,8 +75,11 @@ end
75
75
 
76
76
  class Symbol
77
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.
78
+ :symbol.dup
79
+
80
+ # Some symbols couldn't be duped in Ruby 2.4.0 only, due to a bug.
81
+ # This feature check catches any regression.
82
+ "symbol_from_string".to_sym.dup
80
83
  rescue TypeError
81
84
 
82
85
  # Symbols are not duplicable:
@@ -14,6 +14,7 @@ require "active_support/core_ext/time/conversions"
14
14
  require "active_support/core_ext/date_time/conversions"
15
15
  require "active_support/core_ext/date/conversions"
16
16
 
17
+ #--
17
18
  # The JSON gem adds a few modules to Ruby core classes containing :to_json definition, overwriting
18
19
  # their default behavior. That said, we need to define the basic to_json method in all of them,
19
20
  # otherwise they will always use to_json gem implementation, which is backwards incompatible in
@@ -4,19 +4,27 @@ require "delegate"
4
4
 
5
5
  module ActiveSupport
6
6
  module Tryable #:nodoc:
7
- def try(*a, &b)
8
- try!(*a, &b) if a.empty? || respond_to?(a.first)
7
+ def try(method_name = nil, *args, &b)
8
+ if method_name.nil? && block_given?
9
+ if b.arity == 0
10
+ instance_eval(&b)
11
+ else
12
+ yield self
13
+ end
14
+ elsif respond_to?(method_name)
15
+ public_send(method_name, *args, &b)
16
+ end
9
17
  end
10
18
 
11
- def try!(*a, &b)
12
- if a.empty? && block_given?
19
+ def try!(method_name = nil, *args, &b)
20
+ if method_name.nil? && block_given?
13
21
  if b.arity == 0
14
22
  instance_eval(&b)
15
23
  else
16
24
  yield self
17
25
  end
18
26
  else
19
- public_send(*a, &b)
27
+ public_send(method_name, *args, &b)
20
28
  end
21
29
  end
22
30
  end
@@ -135,14 +143,14 @@ class NilClass
135
143
  #
136
144
  # With +try+
137
145
  # @person.try(:children).try(:first).try(:name)
138
- def try(*args)
146
+ def try(method_name = nil, *args)
139
147
  nil
140
148
  end
141
149
 
142
150
  # Calling +try!+ on +nil+ always returns +nil+.
143
151
  #
144
152
  # nil.try!(:name) # => nil
145
- def try!(*args)
153
+ def try!(method_name = nil, *args)
146
154
  nil
147
155
  end
148
156
  end
@@ -68,7 +68,7 @@ class Object
68
68
  # You can access these methods using the class name instead:
69
69
  #
70
70
  # class Phone < ActiveRecord::Base
71
- # enum phone_number_type: [home: 0, office: 1, mobile: 2]
71
+ # enum phone_number_type: { home: 0, office: 1, mobile: 2 }
72
72
  #
73
73
  # with_options presence: true do
74
74
  # validates :phone_number_type, inclusion: { in: Phone.phone_number_types.keys }
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveSupport
4
- module CompareWithRange #:nodoc:
4
+ module CompareWithRange
5
5
  # Extends the default Range#=== to support range comparisons.
6
6
  # (1..5) === (1..5) # => true
7
7
  # (1..5) === (2..3) # => true
@@ -1,39 +1,41 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ActiveSupport::RangeWithFormat
4
- RANGE_FORMATS = {
5
- db: -> (start, stop) do
6
- case start
7
- when String then "BETWEEN '#{start}' AND '#{stop}'"
3
+ module ActiveSupport
4
+ module RangeWithFormat
5
+ RANGE_FORMATS = {
6
+ db: -> (start, stop) do
7
+ case start
8
+ when String then "BETWEEN '#{start}' AND '#{stop}'"
9
+ else
10
+ "BETWEEN '#{start.to_s(:db)}' AND '#{stop.to_s(:db)}'"
11
+ end
12
+ end
13
+ }
14
+
15
+ # Convert range to a formatted string. See RANGE_FORMATS for predefined formats.
16
+ #
17
+ # range = (1..100) # => 1..100
18
+ #
19
+ # range.to_s # => "1..100"
20
+ # range.to_s(:db) # => "BETWEEN '1' AND '100'"
21
+ #
22
+ # == Adding your own range formats to to_s
23
+ # You can add your own formats to the Range::RANGE_FORMATS hash.
24
+ # Use the format name as the hash key and a Proc instance.
25
+ #
26
+ # # config/initializers/range_formats.rb
27
+ # Range::RANGE_FORMATS[:short] = ->(start, stop) { "Between #{start.to_s(:db)} and #{stop.to_s(:db)}" }
28
+ def to_s(format = :default)
29
+ if formatter = RANGE_FORMATS[format]
30
+ formatter.call(first, last)
8
31
  else
9
- "BETWEEN '#{start.to_s(:db)}' AND '#{stop.to_s(:db)}'"
32
+ super()
10
33
  end
11
34
  end
12
- }
13
35
 
14
- # Convert range to a formatted string. See RANGE_FORMATS for predefined formats.
15
- #
16
- # range = (1..100) # => 1..100
17
- #
18
- # range.to_s # => "1..100"
19
- # range.to_s(:db) # => "BETWEEN '1' AND '100'"
20
- #
21
- # == Adding your own range formats to to_s
22
- # You can add your own formats to the Range::RANGE_FORMATS hash.
23
- # Use the format name as the hash key and a Proc instance.
24
- #
25
- # # config/initializers/range_formats.rb
26
- # Range::RANGE_FORMATS[:short] = ->(start, stop) { "Between #{start.to_s(:db)} and #{stop.to_s(:db)}" }
27
- def to_s(format = :default)
28
- if formatter = RANGE_FORMATS[format]
29
- formatter.call(first, last)
30
- else
31
- super()
32
- end
36
+ alias_method :to_default_s, :to_s
37
+ alias_method :to_formatted_s, :to_s
33
38
  end
34
-
35
- alias_method :to_default_s, :to_s
36
- alias_method :to_formatted_s, :to_s
37
39
  end
38
40
 
39
41
  Range.prepend(ActiveSupport::RangeWithFormat)