activesupport 5.1.1 → 6.1.1

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 (262) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +360 -442
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +5 -4
  5. data/lib/active_support/actionable_error.rb +48 -0
  6. data/lib/active_support/all.rb +2 -0
  7. data/lib/active_support/array_inquirer.rb +6 -2
  8. data/lib/active_support/backtrace_cleaner.rb +31 -3
  9. data/lib/active_support/benchmarkable.rb +3 -1
  10. data/lib/active_support/builder.rb +2 -0
  11. data/lib/active_support/cache/file_store.rb +37 -36
  12. data/lib/active_support/cache/mem_cache_store.rb +65 -53
  13. data/lib/active_support/cache/memory_store.rb +61 -33
  14. data/lib/active_support/cache/null_store.rb +10 -3
  15. data/lib/active_support/cache/redis_cache_store.rb +493 -0
  16. data/lib/active_support/cache/strategy/local_cache.rb +68 -22
  17. data/lib/active_support/cache/strategy/local_cache_middleware.rb +2 -0
  18. data/lib/active_support/cache.rb +305 -127
  19. data/lib/active_support/callbacks.rb +106 -98
  20. data/lib/active_support/concern.rb +79 -6
  21. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +35 -0
  22. data/lib/active_support/concurrency/share_lock.rb +2 -1
  23. data/lib/active_support/configurable.rb +12 -14
  24. data/lib/active_support/configuration_file.rb +46 -0
  25. data/lib/active_support/core_ext/array/access.rb +21 -7
  26. data/lib/active_support/core_ext/array/conversions.rb +7 -5
  27. data/lib/active_support/core_ext/array/extract.rb +21 -0
  28. data/lib/active_support/core_ext/array/extract_options.rb +2 -0
  29. data/lib/active_support/core_ext/array/grouping.rb +2 -0
  30. data/lib/active_support/core_ext/array/inquiry.rb +2 -0
  31. data/lib/active_support/core_ext/array/wrap.rb +2 -0
  32. data/lib/active_support/core_ext/array.rb +3 -1
  33. data/lib/active_support/core_ext/benchmark.rb +4 -2
  34. data/lib/active_support/core_ext/big_decimal/conversions.rb +2 -0
  35. data/lib/active_support/core_ext/big_decimal.rb +2 -0
  36. data/lib/active_support/core_ext/class/attribute.rb +50 -47
  37. data/lib/active_support/core_ext/class/attribute_accessors.rb +2 -0
  38. data/lib/active_support/core_ext/class/subclasses.rb +18 -40
  39. data/lib/active_support/core_ext/class.rb +2 -0
  40. data/lib/active_support/core_ext/date/acts_like.rb +2 -0
  41. data/lib/active_support/core_ext/date/blank.rb +2 -0
  42. data/lib/active_support/core_ext/date/calculations.rb +8 -5
  43. data/lib/active_support/core_ext/date/conversions.rb +12 -10
  44. data/lib/active_support/core_ext/date/zones.rb +2 -0
  45. data/lib/active_support/core_ext/date.rb +2 -0
  46. data/lib/active_support/core_ext/date_and_time/calculations.rb +61 -37
  47. data/lib/active_support/core_ext/date_and_time/compatibility.rb +18 -1
  48. data/lib/active_support/core_ext/date_and_time/zones.rb +2 -1
  49. data/lib/active_support/core_ext/date_time/acts_like.rb +2 -0
  50. data/lib/active_support/core_ext/date_time/blank.rb +2 -0
  51. data/lib/active_support/core_ext/date_time/calculations.rb +3 -1
  52. data/lib/active_support/core_ext/date_time/compatibility.rb +7 -5
  53. data/lib/active_support/core_ext/date_time/conversions.rb +2 -1
  54. data/lib/active_support/core_ext/date_time.rb +2 -0
  55. data/lib/active_support/core_ext/digest/uuid.rb +3 -1
  56. data/lib/active_support/core_ext/digest.rb +3 -0
  57. data/lib/active_support/core_ext/enumerable.rb +174 -71
  58. data/lib/active_support/core_ext/file/atomic.rb +3 -1
  59. data/lib/active_support/core_ext/file.rb +2 -0
  60. data/lib/active_support/core_ext/hash/conversions.rb +7 -5
  61. data/lib/active_support/core_ext/hash/deep_merge.rb +8 -12
  62. data/lib/active_support/core_ext/hash/deep_transform_values.rb +46 -0
  63. data/lib/active_support/core_ext/hash/except.rb +4 -2
  64. data/lib/active_support/core_ext/hash/indifferent_access.rb +2 -0
  65. data/lib/active_support/core_ext/hash/keys.rb +3 -30
  66. data/lib/active_support/core_ext/hash/reverse_merge.rb +5 -2
  67. data/lib/active_support/core_ext/hash/slice.rb +8 -29
  68. data/lib/active_support/core_ext/hash.rb +3 -2
  69. data/lib/active_support/core_ext/integer/inflections.rb +2 -0
  70. data/lib/active_support/core_ext/integer/multiple.rb +3 -1
  71. data/lib/active_support/core_ext/integer/time.rb +7 -14
  72. data/lib/active_support/core_ext/integer.rb +2 -0
  73. data/lib/active_support/core_ext/kernel/concern.rb +2 -0
  74. data/lib/active_support/core_ext/kernel/reporting.rb +2 -0
  75. data/lib/active_support/core_ext/kernel/singleton_class.rb +2 -0
  76. data/lib/active_support/core_ext/kernel.rb +2 -1
  77. data/lib/active_support/core_ext/load_error.rb +3 -8
  78. data/lib/active_support/core_ext/marshal.rb +4 -0
  79. data/lib/active_support/core_ext/module/aliasing.rb +2 -0
  80. data/lib/active_support/core_ext/module/anonymous.rb +2 -0
  81. data/lib/active_support/core_ext/module/attr_internal.rb +4 -2
  82. data/lib/active_support/core_ext/module/attribute_accessors.rb +44 -56
  83. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +18 -18
  84. data/lib/active_support/core_ext/module/concerning.rb +15 -10
  85. data/lib/active_support/core_ext/module/delegation.rb +103 -58
  86. data/lib/active_support/core_ext/module/deprecation.rb +2 -0
  87. data/lib/active_support/core_ext/module/introspection.rb +18 -15
  88. data/lib/active_support/core_ext/module/redefine_method.rb +40 -0
  89. data/lib/active_support/core_ext/module/remove_method.rb +5 -23
  90. data/lib/active_support/core_ext/module.rb +3 -1
  91. data/lib/active_support/core_ext/name_error.rb +36 -2
  92. data/lib/active_support/core_ext/numeric/bytes.rb +2 -0
  93. data/lib/active_support/core_ext/numeric/conversions.rb +131 -129
  94. data/lib/active_support/core_ext/numeric/time.rb +7 -15
  95. data/lib/active_support/core_ext/numeric.rb +2 -1
  96. data/lib/active_support/core_ext/object/acts_like.rb +12 -1
  97. data/lib/active_support/core_ext/object/blank.rb +13 -3
  98. data/lib/active_support/core_ext/object/conversions.rb +2 -0
  99. data/lib/active_support/core_ext/object/deep_dup.rb +3 -1
  100. data/lib/active_support/core_ext/object/duplicable.rb +6 -101
  101. data/lib/active_support/core_ext/object/inclusion.rb +2 -0
  102. data/lib/active_support/core_ext/object/instance_variables.rb +2 -0
  103. data/lib/active_support/core_ext/object/json.rb +22 -2
  104. data/lib/active_support/core_ext/object/to_param.rb +2 -0
  105. data/lib/active_support/core_ext/object/to_query.rb +7 -2
  106. data/lib/active_support/core_ext/object/try.rb +19 -7
  107. data/lib/active_support/core_ext/object/with_options.rb +4 -2
  108. data/lib/active_support/core_ext/object.rb +2 -0
  109. data/lib/active_support/core_ext/range/compare_range.rb +82 -0
  110. data/lib/active_support/core_ext/range/conversions.rb +35 -25
  111. data/lib/active_support/core_ext/range/each.rb +5 -2
  112. data/lib/active_support/core_ext/range/include_time_with_zone.rb +28 -0
  113. data/lib/active_support/core_ext/range/overlaps.rb +2 -0
  114. data/lib/active_support/core_ext/range.rb +4 -1
  115. data/lib/active_support/core_ext/regexp.rb +10 -5
  116. data/lib/active_support/core_ext/securerandom.rb +25 -3
  117. data/lib/active_support/core_ext/string/access.rb +7 -16
  118. data/lib/active_support/core_ext/string/behavior.rb +2 -0
  119. data/lib/active_support/core_ext/string/conversions.rb +3 -0
  120. data/lib/active_support/core_ext/string/exclude.rb +2 -0
  121. data/lib/active_support/core_ext/string/filters.rb +44 -1
  122. data/lib/active_support/core_ext/string/indent.rb +2 -0
  123. data/lib/active_support/core_ext/string/inflections.rb +69 -16
  124. data/lib/active_support/core_ext/string/inquiry.rb +3 -0
  125. data/lib/active_support/core_ext/string/multibyte.rb +9 -4
  126. data/lib/active_support/core_ext/string/output_safety.rb +76 -20
  127. data/lib/active_support/core_ext/string/starts_ends_with.rb +4 -2
  128. data/lib/active_support/core_ext/string/strip.rb +5 -1
  129. data/lib/active_support/core_ext/string/zones.rb +2 -0
  130. data/lib/active_support/core_ext/string.rb +2 -0
  131. data/lib/active_support/core_ext/symbol/starts_ends_with.rb +14 -0
  132. data/lib/active_support/core_ext/symbol.rb +3 -0
  133. data/lib/active_support/core_ext/time/acts_like.rb +2 -0
  134. data/lib/active_support/core_ext/time/calculations.rb +73 -18
  135. data/lib/active_support/core_ext/time/compatibility.rb +4 -2
  136. data/lib/active_support/core_ext/time/conversions.rb +4 -0
  137. data/lib/active_support/core_ext/time/zones.rb +6 -4
  138. data/lib/active_support/core_ext/time.rb +2 -0
  139. data/lib/active_support/core_ext/uri.rb +11 -6
  140. data/lib/active_support/core_ext.rb +3 -1
  141. data/lib/active_support/current_attributes/test_helper.rb +13 -0
  142. data/lib/active_support/current_attributes.rb +208 -0
  143. data/lib/active_support/dependencies/autoload.rb +2 -0
  144. data/lib/active_support/dependencies/interlock.rb +2 -0
  145. data/lib/active_support/dependencies/zeitwerk_integration.rb +117 -0
  146. data/lib/active_support/dependencies.rb +135 -60
  147. data/lib/active_support/deprecation/behaviors.rb +43 -11
  148. data/lib/active_support/deprecation/constant_accessor.rb +4 -2
  149. data/lib/active_support/deprecation/disallowed.rb +56 -0
  150. data/lib/active_support/deprecation/instance_delegator.rb +2 -1
  151. data/lib/active_support/deprecation/method_wrappers.rb +30 -15
  152. data/lib/active_support/deprecation/proxy_wrappers.rb +32 -6
  153. data/lib/active_support/deprecation/reporting.rb +54 -9
  154. data/lib/active_support/deprecation.rb +9 -2
  155. data/lib/active_support/descendants_tracker.rb +61 -9
  156. data/lib/active_support/digest.rb +20 -0
  157. data/lib/active_support/duration/iso8601_parser.rb +6 -6
  158. data/lib/active_support/duration/iso8601_serializer.rb +20 -14
  159. data/lib/active_support/duration.rb +179 -41
  160. data/lib/active_support/encrypted_configuration.rb +45 -0
  161. data/lib/active_support/encrypted_file.rb +117 -0
  162. data/lib/active_support/environment_inquirer.rb +20 -0
  163. data/lib/active_support/evented_file_update_checker.rb +84 -117
  164. data/lib/active_support/execution_wrapper.rb +3 -0
  165. data/lib/active_support/executor.rb +2 -0
  166. data/lib/active_support/file_update_checker.rb +2 -1
  167. data/lib/active_support/fork_tracker.rb +62 -0
  168. data/lib/active_support/gem_version.rb +3 -1
  169. data/lib/active_support/gzip.rb +2 -0
  170. data/lib/active_support/hash_with_indifferent_access.rb +134 -37
  171. data/lib/active_support/i18n.rb +4 -1
  172. data/lib/active_support/i18n_railtie.rb +20 -11
  173. data/lib/active_support/inflections.rb +2 -0
  174. data/lib/active_support/inflector/inflections.rb +19 -8
  175. data/lib/active_support/inflector/methods.rb +87 -77
  176. data/lib/active_support/inflector/transliterate.rb +56 -18
  177. data/lib/active_support/inflector.rb +2 -0
  178. data/lib/active_support/json/decoding.rb +27 -26
  179. data/lib/active_support/json/encoding.rb +13 -3
  180. data/lib/active_support/json.rb +2 -0
  181. data/lib/active_support/key_generator.rb +3 -33
  182. data/lib/active_support/lazy_load_hooks.rb +33 -10
  183. data/lib/active_support/locale/en.rb +33 -0
  184. data/lib/active_support/locale/en.yml +7 -3
  185. data/lib/active_support/log_subscriber/test_helper.rb +2 -0
  186. data/lib/active_support/log_subscriber.rb +46 -13
  187. data/lib/active_support/logger.rb +4 -17
  188. data/lib/active_support/logger_silence.rb +13 -20
  189. data/lib/active_support/logger_thread_safe_level.rb +54 -7
  190. data/lib/active_support/message_encryptor.rb +101 -33
  191. data/lib/active_support/message_verifier.rb +85 -14
  192. data/lib/active_support/messages/metadata.rb +80 -0
  193. data/lib/active_support/messages/rotation_configuration.rb +23 -0
  194. data/lib/active_support/messages/rotator.rb +57 -0
  195. data/lib/active_support/multibyte/chars.rb +12 -68
  196. data/lib/active_support/multibyte/unicode.rb +17 -327
  197. data/lib/active_support/multibyte.rb +2 -0
  198. data/lib/active_support/notifications/fanout.rb +118 -16
  199. data/lib/active_support/notifications/instrumenter.rb +73 -9
  200. data/lib/active_support/notifications.rb +74 -8
  201. data/lib/active_support/number_helper/number_converter.rb +7 -6
  202. data/lib/active_support/number_helper/number_to_currency_converter.rb +6 -9
  203. data/lib/active_support/number_helper/number_to_delimited_converter.rb +5 -2
  204. data/lib/active_support/number_helper/number_to_human_converter.rb +8 -7
  205. data/lib/active_support/number_helper/number_to_human_size_converter.rb +6 -3
  206. data/lib/active_support/number_helper/number_to_percentage_converter.rb +5 -1
  207. data/lib/active_support/number_helper/number_to_phone_converter.rb +5 -2
  208. data/lib/active_support/number_helper/number_to_rounded_converter.rb +16 -53
  209. data/lib/active_support/number_helper/rounding_helper.rb +50 -0
  210. data/lib/active_support/number_helper.rb +41 -12
  211. data/lib/active_support/option_merger.rb +24 -3
  212. data/lib/active_support/ordered_hash.rb +3 -1
  213. data/lib/active_support/ordered_options.rb +17 -5
  214. data/lib/active_support/parameter_filter.rb +133 -0
  215. data/lib/active_support/per_thread_registry.rb +3 -1
  216. data/lib/active_support/proxy_object.rb +2 -0
  217. data/lib/active_support/rails.rb +3 -10
  218. data/lib/active_support/railtie.rb +60 -9
  219. data/lib/active_support/reloader.rb +11 -10
  220. data/lib/active_support/rescuable.rb +7 -6
  221. data/lib/active_support/secure_compare_rotator.rb +51 -0
  222. data/lib/active_support/security_utils.rb +26 -15
  223. data/lib/active_support/string_inquirer.rb +6 -3
  224. data/lib/active_support/subscriber.rb +74 -24
  225. data/lib/active_support/tagged_logging.rb +44 -8
  226. data/lib/active_support/test_case.rb +94 -2
  227. data/lib/active_support/testing/assertions.rb +58 -20
  228. data/lib/active_support/testing/autorun.rb +2 -4
  229. data/lib/active_support/testing/constant_lookup.rb +2 -0
  230. data/lib/active_support/testing/declarative.rb +2 -0
  231. data/lib/active_support/testing/deprecation.rb +2 -1
  232. data/lib/active_support/testing/file_fixtures.rb +4 -0
  233. data/lib/active_support/testing/isolation.rb +8 -4
  234. data/lib/active_support/testing/method_call_assertions.rb +30 -1
  235. data/lib/active_support/testing/parallelization/server.rb +78 -0
  236. data/lib/active_support/testing/parallelization/worker.rb +100 -0
  237. data/lib/active_support/testing/parallelization.rb +51 -0
  238. data/lib/active_support/testing/setup_and_teardown.rb +12 -7
  239. data/lib/active_support/testing/stream.rb +3 -2
  240. data/lib/active_support/testing/tagged_logging.rb +2 -0
  241. data/lib/active_support/testing/time_helpers.rb +78 -13
  242. data/lib/active_support/time.rb +2 -0
  243. data/lib/active_support/time_with_zone.rb +113 -41
  244. data/lib/active_support/values/time_zone.rb +55 -25
  245. data/lib/active_support/version.rb +2 -0
  246. data/lib/active_support/xml_mini/jdom.rb +5 -4
  247. data/lib/active_support/xml_mini/libxml.rb +4 -2
  248. data/lib/active_support/xml_mini/libxmlsax.rb +6 -4
  249. data/lib/active_support/xml_mini/nokogiri.rb +4 -2
  250. data/lib/active_support/xml_mini/nokogirisax.rb +5 -3
  251. data/lib/active_support/xml_mini/rexml.rb +12 -3
  252. data/lib/active_support/xml_mini.rb +5 -11
  253. data/lib/active_support.rb +18 -13
  254. metadata +81 -35
  255. data/lib/active_support/core_ext/array/prepend_and_append.rb +0 -7
  256. data/lib/active_support/core_ext/hash/compact.rb +0 -27
  257. data/lib/active_support/core_ext/hash/transform_values.rb +0 -30
  258. data/lib/active_support/core_ext/kernel/agnostics.rb +0 -11
  259. data/lib/active_support/core_ext/module/reachable.rb +0 -8
  260. data/lib/active_support/core_ext/numeric/inquiry.rb +0 -26
  261. data/lib/active_support/core_ext/range/include_range.rb +0 -23
  262. data/lib/active_support/values/unicode_tables.dat +0 -0
@@ -1,138 +1,140 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "active_support/core_ext/big_decimal/conversions"
2
4
  require "active_support/number_helper"
3
- require "active_support/core_ext/module/deprecation"
4
5
 
5
- module ActiveSupport::NumericWithFormat
6
- # Provides options for converting numbers into formatted strings.
7
- # Options are provided for phone numbers, currency, percentage,
8
- # precision, positional notation, file size and pretty printing.
9
- #
10
- # ==== Options
11
- #
12
- # For details on which formats use which options, see ActiveSupport::NumberHelper
13
- #
14
- # ==== Examples
15
- #
16
- # Phone Numbers:
17
- # 5551234.to_s(:phone) # => "555-1234"
18
- # 1235551234.to_s(:phone) # => "123-555-1234"
19
- # 1235551234.to_s(:phone, area_code: true) # => "(123) 555-1234"
20
- # 1235551234.to_s(:phone, delimiter: ' ') # => "123 555 1234"
21
- # 1235551234.to_s(:phone, area_code: true, extension: 555) # => "(123) 555-1234 x 555"
22
- # 1235551234.to_s(:phone, country_code: 1) # => "+1-123-555-1234"
23
- # 1235551234.to_s(:phone, country_code: 1, extension: 1343, delimiter: '.')
24
- # # => "+1.123.555.1234 x 1343"
25
- #
26
- # Currency:
27
- # 1234567890.50.to_s(:currency) # => "$1,234,567,890.50"
28
- # 1234567890.506.to_s(:currency) # => "$1,234,567,890.51"
29
- # 1234567890.506.to_s(:currency, precision: 3) # => "$1,234,567,890.506"
30
- # 1234567890.506.to_s(:currency, locale: :fr) # => "1 234 567 890,51 €"
31
- # -1234567890.50.to_s(:currency, negative_format: '(%u%n)')
32
- # # => "($1,234,567,890.50)"
33
- # 1234567890.50.to_s(:currency, unit: '£', separator: ',', delimiter: '')
34
- # # => "£1234567890,50"
35
- # 1234567890.50.to_s(:currency, unit: '£', separator: ',', delimiter: '', format: '%n %u')
36
- # # => "1234567890,50 £"
37
- #
38
- # Percentage:
39
- # 100.to_s(:percentage) # => "100.000%"
40
- # 100.to_s(:percentage, precision: 0) # => "100%"
41
- # 1000.to_s(:percentage, delimiter: '.', separator: ',') # => "1.000,000%"
42
- # 302.24398923423.to_s(:percentage, precision: 5) # => "302.24399%"
43
- # 1000.to_s(:percentage, locale: :fr) # => "1 000,000%"
44
- # 100.to_s(:percentage, format: '%n %') # => "100.000 %"
45
- #
46
- # Delimited:
47
- # 12345678.to_s(:delimited) # => "12,345,678"
48
- # 12345678.05.to_s(:delimited) # => "12,345,678.05"
49
- # 12345678.to_s(:delimited, delimiter: '.') # => "12.345.678"
50
- # 12345678.to_s(:delimited, delimiter: ',') # => "12,345,678"
51
- # 12345678.05.to_s(:delimited, separator: ' ') # => "12,345,678 05"
52
- # 12345678.05.to_s(:delimited, locale: :fr) # => "12 345 678,05"
53
- # 98765432.98.to_s(:delimited, delimiter: ' ', separator: ',')
54
- # # => "98 765 432,98"
55
- #
56
- # Rounded:
57
- # 111.2345.to_s(:rounded) # => "111.235"
58
- # 111.2345.to_s(:rounded, precision: 2) # => "111.23"
59
- # 13.to_s(:rounded, precision: 5) # => "13.00000"
60
- # 389.32314.to_s(:rounded, precision: 0) # => "389"
61
- # 111.2345.to_s(:rounded, significant: true) # => "111"
62
- # 111.2345.to_s(:rounded, precision: 1, significant: true) # => "100"
63
- # 13.to_s(:rounded, precision: 5, significant: true) # => "13.000"
64
- # 111.234.to_s(:rounded, locale: :fr) # => "111,234"
65
- # 13.to_s(:rounded, precision: 5, significant: true, strip_insignificant_zeros: true)
66
- # # => "13"
67
- # 389.32314.to_s(:rounded, precision: 4, significant: true) # => "389.3"
68
- # 1111.2345.to_s(:rounded, precision: 2, separator: ',', delimiter: '.')
69
- # # => "1.111,23"
70
- #
71
- # Human-friendly size in Bytes:
72
- # 123.to_s(:human_size) # => "123 Bytes"
73
- # 1234.to_s(:human_size) # => "1.21 KB"
74
- # 12345.to_s(:human_size) # => "12.1 KB"
75
- # 1234567.to_s(:human_size) # => "1.18 MB"
76
- # 1234567890.to_s(:human_size) # => "1.15 GB"
77
- # 1234567890123.to_s(:human_size) # => "1.12 TB"
78
- # 1234567890123456.to_s(:human_size) # => "1.1 PB"
79
- # 1234567890123456789.to_s(:human_size) # => "1.07 EB"
80
- # 1234567.to_s(:human_size, precision: 2) # => "1.2 MB"
81
- # 483989.to_s(:human_size, precision: 2) # => "470 KB"
82
- # 1234567.to_s(:human_size, precision: 2, separator: ',') # => "1,2 MB"
83
- # 1234567890123.to_s(:human_size, precision: 5) # => "1.1228 TB"
84
- # 524288000.to_s(:human_size, precision: 5) # => "500 MB"
85
- #
86
- # Human-friendly format:
87
- # 123.to_s(:human) # => "123"
88
- # 1234.to_s(:human) # => "1.23 Thousand"
89
- # 12345.to_s(:human) # => "12.3 Thousand"
90
- # 1234567.to_s(:human) # => "1.23 Million"
91
- # 1234567890.to_s(:human) # => "1.23 Billion"
92
- # 1234567890123.to_s(:human) # => "1.23 Trillion"
93
- # 1234567890123456.to_s(:human) # => "1.23 Quadrillion"
94
- # 1234567890123456789.to_s(:human) # => "1230 Quadrillion"
95
- # 489939.to_s(:human, precision: 2) # => "490 Thousand"
96
- # 489939.to_s(:human, precision: 4) # => "489.9 Thousand"
97
- # 1234567.to_s(:human, precision: 4,
98
- # significant: false) # => "1.2346 Million"
99
- # 1234567.to_s(:human, precision: 1,
100
- # separator: ',',
101
- # significant: false) # => "1,2 Million"
102
- def to_s(format = nil, options = nil)
103
- case format
104
- when nil
105
- super()
106
- when Integer, String
107
- super(format)
108
- when :phone
109
- return ActiveSupport::NumberHelper.number_to_phone(self, options || {})
110
- when :currency
111
- return ActiveSupport::NumberHelper.number_to_currency(self, options || {})
112
- when :percentage
113
- return ActiveSupport::NumberHelper.number_to_percentage(self, options || {})
114
- when :delimited
115
- return ActiveSupport::NumberHelper.number_to_delimited(self, options || {})
116
- when :rounded
117
- return ActiveSupport::NumberHelper.number_to_rounded(self, options || {})
118
- when :human
119
- return ActiveSupport::NumberHelper.number_to_human(self, options || {})
120
- when :human_size
121
- return ActiveSupport::NumberHelper.number_to_human_size(self, options || {})
122
- when Symbol
123
- super()
124
- else
125
- super(format)
6
+ module ActiveSupport
7
+ module 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, round_mode: :down) # => "$1,234,567,890.50"
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: '£', separator: ',', delimiter: '')
37
+ # # => "£1234567890,50"
38
+ # 1234567890.50.to_s(:currency, unit: '£', separator: ',', delimiter: '', format: '%n %u')
39
+ # # => "1234567890,50 £"
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
+ # 302.24398923423.to_s(:percentage, round_mode: :down) # => "302.243%"
47
+ # 1000.to_s(:percentage, locale: :fr) # => "1 000,000%"
48
+ # 100.to_s(:percentage, format: '%n %') # => "100.000 %"
49
+ #
50
+ # Delimited:
51
+ # 12345678.to_s(:delimited) # => "12,345,678"
52
+ # 12345678.05.to_s(:delimited) # => "12,345,678.05"
53
+ # 12345678.to_s(:delimited, delimiter: '.') # => "12.345.678"
54
+ # 12345678.to_s(:delimited, delimiter: ',') # => "12,345,678"
55
+ # 12345678.05.to_s(:delimited, separator: ' ') # => "12,345,678 05"
56
+ # 12345678.05.to_s(:delimited, locale: :fr) # => "12 345 678,05"
57
+ # 98765432.98.to_s(:delimited, delimiter: ' ', separator: ',')
58
+ # # => "98 765 432,98"
59
+ #
60
+ # Rounded:
61
+ # 111.2345.to_s(:rounded) # => "111.235"
62
+ # 111.2345.to_s(:rounded, precision: 2) # => "111.23"
63
+ # 111.2345.to_s(:rounded, precision: 2, round_mode: :up) # => "111.24"
64
+ # 13.to_s(:rounded, precision: 5) # => "13.00000"
65
+ # 389.32314.to_s(:rounded, precision: 0) # => "389"
66
+ # 111.2345.to_s(:rounded, significant: true) # => "111"
67
+ # 111.2345.to_s(:rounded, precision: 1, significant: true) # => "100"
68
+ # 13.to_s(:rounded, precision: 5, significant: true) # => "13.000"
69
+ # 111.234.to_s(:rounded, locale: :fr) # => "111,234"
70
+ # 13.to_s(:rounded, precision: 5, significant: true, strip_insignificant_zeros: true)
71
+ # # => "13"
72
+ # 389.32314.to_s(:rounded, precision: 4, significant: true) # => "389.3"
73
+ # 1111.2345.to_s(:rounded, precision: 2, separator: ',', delimiter: '.')
74
+ # # => "1.111,23"
75
+ #
76
+ # Human-friendly size in Bytes:
77
+ # 123.to_s(:human_size) # => "123 Bytes"
78
+ # 1234.to_s(:human_size) # => "1.21 KB"
79
+ # 12345.to_s(:human_size) # => "12.1 KB"
80
+ # 1234567.to_s(:human_size) # => "1.18 MB"
81
+ # 1234567890.to_s(:human_size) # => "1.15 GB"
82
+ # 1234567890123.to_s(:human_size) # => "1.12 TB"
83
+ # 1234567890123456.to_s(:human_size) # => "1.1 PB"
84
+ # 1234567890123456789.to_s(:human_size) # => "1.07 EB"
85
+ # 1234567.to_s(:human_size, precision: 2) # => "1.2 MB"
86
+ # 1234567.to_s(:human_size, precision: 2, round_mode: :up) # => "1.3 MB"
87
+ # 483989.to_s(:human_size, precision: 2) # => "470 KB"
88
+ # 1234567.to_s(:human_size, precision: 2, separator: ',') # => "1,2 MB"
89
+ # 1234567890123.to_s(:human_size, precision: 5) # => "1.1228 TB"
90
+ # 524288000.to_s(:human_size, precision: 5) # => "500 MB"
91
+ #
92
+ # Human-friendly format:
93
+ # 123.to_s(:human) # => "123"
94
+ # 1234.to_s(:human) # => "1.23 Thousand"
95
+ # 12345.to_s(:human) # => "12.3 Thousand"
96
+ # 1234567.to_s(:human) # => "1.23 Million"
97
+ # 1234567890.to_s(:human) # => "1.23 Billion"
98
+ # 1234567890123.to_s(:human) # => "1.23 Trillion"
99
+ # 1234567890123456.to_s(:human) # => "1.23 Quadrillion"
100
+ # 1234567890123456789.to_s(:human) # => "1230 Quadrillion"
101
+ # 489939.to_s(:human, precision: 2) # => "490 Thousand"
102
+ # 489939.to_s(:human, precision: 2, round_mode: :down) # => "480 Thousand"
103
+ # 489939.to_s(:human, precision: 4) # => "489.9 Thousand"
104
+ # 1234567.to_s(:human, precision: 4,
105
+ # significant: false) # => "1.2346 Million"
106
+ # 1234567.to_s(:human, precision: 1,
107
+ # separator: ',',
108
+ # significant: false) # => "1,2 Million"
109
+ def to_s(format = nil, options = nil)
110
+ case format
111
+ when nil
112
+ super()
113
+ when Integer, String
114
+ super(format)
115
+ when :phone
116
+ ActiveSupport::NumberHelper.number_to_phone(self, options || {})
117
+ when :currency
118
+ ActiveSupport::NumberHelper.number_to_currency(self, options || {})
119
+ when :percentage
120
+ ActiveSupport::NumberHelper.number_to_percentage(self, options || {})
121
+ when :delimited
122
+ ActiveSupport::NumberHelper.number_to_delimited(self, options || {})
123
+ when :rounded
124
+ ActiveSupport::NumberHelper.number_to_rounded(self, options || {})
125
+ when :human
126
+ ActiveSupport::NumberHelper.number_to_human(self, options || {})
127
+ when :human_size
128
+ ActiveSupport::NumberHelper.number_to_human_size(self, options || {})
129
+ when Symbol
130
+ super()
131
+ else
132
+ super(format)
133
+ end
126
134
  end
127
135
  end
128
136
  end
129
137
 
130
- # Ruby 2.4+ unifies Fixnum & Bignum into Integer.
131
- if 0.class == Integer
132
- Integer.prepend ActiveSupport::NumericWithFormat
133
- else
134
- Fixnum.prepend ActiveSupport::NumericWithFormat
135
- Bignum.prepend ActiveSupport::NumericWithFormat
136
- end
138
+ Integer.prepend ActiveSupport::NumericWithFormat
137
139
  Float.prepend ActiveSupport::NumericWithFormat
138
140
  BigDecimal.prepend ActiveSupport::NumericWithFormat
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "active_support/duration"
2
4
  require "active_support/core_ext/time/calculations"
3
5
  require "active_support/core_ext/time/acts_like"
@@ -5,19 +7,9 @@ require "active_support/core_ext/date/calculations"
5
7
  require "active_support/core_ext/date/acts_like"
6
8
 
7
9
  class Numeric
8
- # Enables the use of time calculations and declarations, like 45.minutes + 2.hours + 4.years.
9
- #
10
- # These methods use Time#advance for precise date calculations when using from_now, ago, etc.
11
- # as well as adding or subtracting their results from a Time object. For example:
12
- #
13
- # # equivalent to Time.current.advance(months: 1)
14
- # 1.month.from_now
15
- #
16
- # # equivalent to Time.current.advance(years: 2)
17
- # 2.years.from_now
10
+ # Returns a Duration instance matching the number of seconds provided.
18
11
  #
19
- # # equivalent to Time.current.advance(months: 4, years: 5)
20
- # (4.months + 5.years).from_now
12
+ # 2.seconds # => 2 seconds
21
13
  def seconds
22
14
  ActiveSupport::Duration.seconds(self)
23
15
  end
@@ -64,10 +56,10 @@ class Numeric
64
56
  alias :fortnight :fortnights
65
57
 
66
58
  # Returns the number of milliseconds equivalent to the seconds provided.
67
- # Used with the standard time durations, like 1.hour.in_milliseconds --
68
- # so we can feed them to JavaScript functions like getTime().
59
+ # Used with the standard time durations.
69
60
  #
70
- # 2.in_milliseconds # => 2_000
61
+ # 2.in_milliseconds # => 2000
62
+ # 1.hour.in_milliseconds # => 3600000
71
63
  def in_milliseconds
72
64
  self * 1000
73
65
  end
@@ -1,4 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "active_support/core_ext/numeric/bytes"
2
4
  require "active_support/core_ext/numeric/time"
3
- require "active_support/core_ext/numeric/inquiry"
4
5
  require "active_support/core_ext/numeric/conversions"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Object
2
4
  # A duck-type assistant method. For example, Active Support extends Date
3
5
  # to define an <tt>acts_like_date?</tt> method, and extends Time to define
@@ -5,6 +7,15 @@ class Object
5
7
  # <tt>x.acts_like?(:date)</tt> to do duck-type-safe comparisons, since classes that
6
8
  # we want to act like Time simply need to define an <tt>acts_like_time?</tt> method.
7
9
  def acts_like?(duck)
8
- respond_to? :"acts_like_#{duck}?"
10
+ case duck
11
+ when :time
12
+ respond_to? :acts_like_time?
13
+ when :date
14
+ respond_to? :acts_like_date?
15
+ when :string
16
+ respond_to? :acts_like_string?
17
+ else
18
+ respond_to? :"acts_like_#{duck}?"
19
+ end
9
20
  end
10
21
  end
@@ -1,8 +1,10 @@
1
- require "active_support/core_ext/regexp"
1
+ # frozen_string_literal: true
2
+
3
+ require "concurrent/map"
2
4
 
3
5
  class Object
4
6
  # An object is blank if it's false, empty, or a whitespace string.
5
- # For example, +false+, '', ' ', +nil+, [], and {} are all blank.
7
+ # For example, +nil+, '', ' ', [], {}, and +false+ are all blank.
6
8
  #
7
9
  # This simplifies
8
10
  #
@@ -100,6 +102,9 @@ end
100
102
 
101
103
  class String
102
104
  BLANK_RE = /\A[[:space:]]*\z/
105
+ ENCODED_BLANKS = Concurrent::Map.new do |h, enc|
106
+ h[enc] = Regexp.new(BLANK_RE.source.encode(enc), BLANK_RE.options | Regexp::FIXEDENCODING)
107
+ end
103
108
 
104
109
  # A string is blank if it's empty or contains whitespaces only:
105
110
  #
@@ -117,7 +122,12 @@ class String
117
122
  # The regexp that matches blank strings is expensive. For the case of empty
118
123
  # strings we can speed up this method (~3.5x) with an empty? call. The
119
124
  # penalty for the rest of strings is marginal.
120
- empty? || BLANK_RE.match?(self)
125
+ empty? ||
126
+ begin
127
+ BLANK_RE.match?(self)
128
+ rescue Encoding::CompatibilityError
129
+ ENCODED_BLANKS[self.encoding].match?(self)
130
+ end
121
131
  end
122
132
  end
123
133
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "active_support/core_ext/object/to_param"
2
4
  require "active_support/core_ext/object/to_query"
3
5
  require "active_support/core_ext/array/conversions"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "active_support/core_ext/object/duplicable"
2
4
 
3
5
  class Object
@@ -41,7 +43,7 @@ class Hash
41
43
  def deep_dup
42
44
  hash = dup
43
45
  each_pair do |key, value|
44
- if key.frozen? && ::String === key
46
+ if (::String === key && key.frozen?) || ::Symbol === key
45
47
  hash[key] = value.deep_dup
46
48
  else
47
49
  hash.delete(key)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #--
2
4
  # Most objects are cloneable, but not all. For example you can't dup methods:
3
5
  #
@@ -26,93 +28,6 @@ class Object
26
28
  end
27
29
  end
28
30
 
29
- class NilClass
30
- begin
31
- nil.dup
32
- rescue TypeError
33
-
34
- # +nil+ is not duplicable:
35
- #
36
- # nil.duplicable? # => false
37
- # nil.dup # => TypeError: can't dup NilClass
38
- def duplicable?
39
- false
40
- end
41
- end
42
- end
43
-
44
- class FalseClass
45
- begin
46
- false.dup
47
- rescue TypeError
48
-
49
- # +false+ is not duplicable:
50
- #
51
- # false.duplicable? # => false
52
- # false.dup # => TypeError: can't dup FalseClass
53
- def duplicable?
54
- false
55
- end
56
- end
57
- end
58
-
59
- class TrueClass
60
- begin
61
- true.dup
62
- rescue TypeError
63
-
64
- # +true+ is not duplicable:
65
- #
66
- # true.duplicable? # => false
67
- # true.dup # => TypeError: can't dup TrueClass
68
- def duplicable?
69
- false
70
- end
71
- end
72
- end
73
-
74
- class Symbol
75
- begin
76
- :symbol.dup # Ruby 2.4.x.
77
- "symbol_from_string".to_sym.dup # Some symbols can't `dup` in Ruby 2.4.0.
78
- rescue TypeError
79
-
80
- # Symbols are not duplicable:
81
- #
82
- # :my_symbol.duplicable? # => false
83
- # :my_symbol.dup # => TypeError: can't dup Symbol
84
- def duplicable?
85
- false
86
- end
87
- end
88
- end
89
-
90
- class Numeric
91
- begin
92
- 1.dup
93
- rescue TypeError
94
-
95
- # Numbers are not duplicable:
96
- #
97
- # 3.duplicable? # => false
98
- # 3.dup # => TypeError: can't dup Integer
99
- def duplicable?
100
- false
101
- end
102
- end
103
- end
104
-
105
- require "bigdecimal"
106
- class BigDecimal
107
- # BigDecimals are duplicable:
108
- #
109
- # BigDecimal.new("1.2").duplicable? # => true
110
- # BigDecimal.new("1.2").dup # => #<BigDecimal:...,'0.12E1',18(18)>
111
- def duplicable?
112
- true
113
- end
114
- end
115
-
116
31
  class Method
117
32
  # Methods are not duplicable:
118
33
  #
@@ -123,21 +38,11 @@ class Method
123
38
  end
124
39
  end
125
40
 
126
- class Complex
127
- # Complexes are not duplicable:
128
- #
129
- # Complex(1).duplicable? # => false
130
- # Complex(1).dup # => TypeError: can't copy Complex
131
- def duplicable?
132
- false
133
- end
134
- end
135
-
136
- class Rational
137
- # Rationals are not duplicable:
41
+ class UnboundMethod
42
+ # Unbound methods are not duplicable:
138
43
  #
139
- # Rational(1).duplicable? # => false
140
- # Rational(1).dup # => TypeError: can't copy Rational
44
+ # method(:puts).unbind.duplicable? # => false
45
+ # method(:puts).unbind.dup # => TypeError: allocator undefined for UnboundMethod
141
46
  def duplicable?
142
47
  false
143
48
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Object
2
4
  # Returns true if this object is included in the argument. Argument must be
3
5
  # any object which responds to +#include?+. Usage:
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Object
2
4
  # Returns a hash with string keys that maps instance variable names without "@" to their
3
5
  # corresponding values.
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Hack to load json gem first so we can overwrite its to_json.
2
4
  require "json"
3
5
  require "bigdecimal"
6
+ require "ipaddr"
4
7
  require "uri/generic"
5
8
  require "pathname"
6
9
  require "active_support/core_ext/big_decimal/conversions" # for #to_s
@@ -12,6 +15,7 @@ require "active_support/core_ext/time/conversions"
12
15
  require "active_support/core_ext/date_time/conversions"
13
16
  require "active_support/core_ext/date/conversions"
14
17
 
18
+ #--
15
19
  # The JSON gem adds a few modules to Ruby core classes containing :to_json definition, overwriting
16
20
  # their default behavior. That said, we need to define the basic to_json method in all of them,
17
21
  # otherwise they will always use to_json gem implementation, which is backwards incompatible in
@@ -42,7 +46,7 @@ module ActiveSupport
42
46
  end
43
47
  end
44
48
 
45
- [Object, Array, FalseClass, Float, Hash, Integer, NilClass, String, TrueClass, Enumerable].reverse_each do |klass|
49
+ [Enumerable, Object, Array, FalseClass, Float, Hash, Integer, NilClass, String, TrueClass].reverse_each do |klass|
46
50
  klass.prepend(ActiveSupport::ToJsonWithActiveSupportEncoder)
47
51
  end
48
52
 
@@ -133,6 +137,12 @@ module Enumerable
133
137
  end
134
138
  end
135
139
 
140
+ class IO
141
+ def as_json(options = nil) #:nodoc:
142
+ to_s
143
+ end
144
+ end
145
+
136
146
  class Range
137
147
  def as_json(options = nil) #:nodoc:
138
148
  to_s
@@ -160,7 +170,11 @@ class Hash
160
170
  self
161
171
  end
162
172
 
163
- Hash[subset.map { |k, v| [k.to_s, options ? v.as_json(options.dup) : v.as_json] }]
173
+ result = {}
174
+ subset.each do |k, v|
175
+ result[k.to_s] = options ? v.as_json(options.dup) : v.as_json
176
+ end
177
+ result
164
178
  end
165
179
  end
166
180
 
@@ -206,6 +220,12 @@ class Pathname #:nodoc:
206
220
  end
207
221
  end
208
222
 
223
+ class IPAddr # :nodoc:
224
+ def as_json(options = nil)
225
+ to_s
226
+ end
227
+ end
228
+
209
229
  class Process::Status #:nodoc:
210
230
  def as_json(options = nil)
211
231
  { exitstatus: exitstatus, pid: pid }
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "active_support/core_ext/object/to_query"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cgi"
2
4
 
3
5
  class Object
@@ -73,11 +75,14 @@ class Hash
73
75
  #
74
76
  # This method is also aliased as +to_param+.
75
77
  def to_query(namespace = nil)
76
- collect do |key, value|
78
+ query = collect do |key, value|
77
79
  unless (value.is_a?(Hash) || value.is_a?(Array)) && value.empty?
78
80
  value.to_query(namespace ? "#{namespace}[#{key}]" : key)
79
81
  end
80
- end.compact.sort! * "&"
82
+ end.compact
83
+
84
+ query.sort! unless namespace.to_s.include?("[]")
85
+ query.join("&")
81
86
  end
82
87
 
83
88
  alias_method :to_param, :to_query