activesupport 4.2.11.1 → 5.2.4.3

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 (256) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +403 -433
  3. data/MIT-LICENSE +2 -2
  4. data/README.rdoc +4 -5
  5. data/lib/active_support/all.rb +5 -3
  6. data/lib/active_support/array_inquirer.rb +48 -0
  7. data/lib/active_support/backtrace_cleaner.rb +7 -5
  8. data/lib/active_support/benchmarkable.rb +6 -4
  9. data/lib/active_support/builder.rb +3 -1
  10. data/lib/active_support/cache/file_store.rb +41 -35
  11. data/lib/active_support/cache/mem_cache_store.rb +90 -91
  12. data/lib/active_support/cache/memory_store.rb +27 -30
  13. data/lib/active_support/cache/null_store.rb +7 -8
  14. data/lib/active_support/cache/redis_cache_store.rb +466 -0
  15. data/lib/active_support/cache/strategy/local_cache.rb +67 -34
  16. data/lib/active_support/cache/strategy/local_cache_middleware.rb +10 -9
  17. data/lib/active_support/cache.rb +287 -196
  18. data/lib/active_support/callbacks.rb +640 -590
  19. data/lib/active_support/concern.rb +11 -5
  20. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +17 -0
  21. data/lib/active_support/concurrency/share_lock.rb +227 -0
  22. data/lib/active_support/configurable.rb +8 -5
  23. data/lib/active_support/core_ext/array/access.rb +29 -1
  24. data/lib/active_support/core_ext/array/conversions.rb +22 -18
  25. data/lib/active_support/core_ext/array/extract_options.rb +2 -0
  26. data/lib/active_support/core_ext/array/grouping.rb +11 -18
  27. data/lib/active_support/core_ext/array/inquiry.rb +19 -0
  28. data/lib/active_support/core_ext/array/prepend_and_append.rb +5 -3
  29. data/lib/active_support/core_ext/array/wrap.rb +7 -4
  30. data/lib/active_support/core_ext/array.rb +9 -6
  31. data/lib/active_support/core_ext/benchmark.rb +3 -1
  32. data/lib/active_support/core_ext/big_decimal/conversions.rb +10 -12
  33. data/lib/active_support/core_ext/big_decimal.rb +3 -1
  34. data/lib/active_support/core_ext/class/attribute.rb +41 -22
  35. data/lib/active_support/core_ext/class/attribute_accessors.rb +3 -1
  36. data/lib/active_support/core_ext/class/subclasses.rb +20 -6
  37. data/lib/active_support/core_ext/class.rb +4 -3
  38. data/lib/active_support/core_ext/date/acts_like.rb +3 -1
  39. data/lib/active_support/core_ext/date/blank.rb +14 -0
  40. data/lib/active_support/core_ext/date/calculations.rb +11 -9
  41. data/lib/active_support/core_ext/date/conversions.rb +25 -23
  42. data/lib/active_support/core_ext/date/zones.rb +4 -2
  43. data/lib/active_support/core_ext/date.rb +6 -4
  44. data/lib/active_support/core_ext/date_and_time/calculations.rb +170 -58
  45. data/lib/active_support/core_ext/date_and_time/compatibility.rb +4 -3
  46. data/lib/active_support/core_ext/date_and_time/zones.rb +12 -12
  47. data/lib/active_support/core_ext/date_time/acts_like.rb +4 -2
  48. data/lib/active_support/core_ext/date_time/blank.rb +14 -0
  49. data/lib/active_support/core_ext/date_time/calculations.rb +36 -18
  50. data/lib/active_support/core_ext/date_time/compatibility.rb +8 -6
  51. data/lib/active_support/core_ext/date_time/conversions.rb +16 -12
  52. data/lib/active_support/core_ext/date_time.rb +7 -5
  53. data/lib/active_support/core_ext/digest/uuid.rb +7 -5
  54. data/lib/active_support/core_ext/digest.rb +3 -0
  55. data/lib/active_support/core_ext/enumerable.rb +101 -33
  56. data/lib/active_support/core_ext/file/atomic.rb +38 -31
  57. data/lib/active_support/core_ext/file.rb +3 -1
  58. data/lib/active_support/core_ext/hash/compact.rb +14 -9
  59. data/lib/active_support/core_ext/hash/conversions.rb +62 -41
  60. data/lib/active_support/core_ext/hash/deep_merge.rb +9 -13
  61. data/lib/active_support/core_ext/hash/except.rb +11 -8
  62. data/lib/active_support/core_ext/hash/indifferent_access.rb +4 -3
  63. data/lib/active_support/core_ext/hash/keys.rb +33 -27
  64. data/lib/active_support/core_ext/hash/reverse_merge.rb +5 -2
  65. data/lib/active_support/core_ext/hash/slice.rb +8 -8
  66. data/lib/active_support/core_ext/hash/transform_values.rb +14 -5
  67. data/lib/active_support/core_ext/hash.rb +11 -9
  68. data/lib/active_support/core_ext/integer/inflections.rb +3 -1
  69. data/lib/active_support/core_ext/integer/multiple.rb +2 -0
  70. data/lib/active_support/core_ext/integer/time.rb +11 -18
  71. data/lib/active_support/core_ext/integer.rb +5 -3
  72. data/lib/active_support/core_ext/kernel/agnostics.rb +2 -0
  73. data/lib/active_support/core_ext/kernel/concern.rb +5 -1
  74. data/lib/active_support/core_ext/kernel/reporting.rb +4 -84
  75. data/lib/active_support/core_ext/kernel/singleton_class.rb +2 -0
  76. data/lib/active_support/core_ext/kernel.rb +6 -5
  77. data/lib/active_support/core_ext/load_error.rb +3 -22
  78. data/lib/active_support/core_ext/marshal.rb +8 -8
  79. data/lib/active_support/core_ext/module/aliasing.rb +6 -44
  80. data/lib/active_support/core_ext/module/anonymous.rb +12 -1
  81. data/lib/active_support/core_ext/module/attr_internal.rb +8 -9
  82. data/lib/active_support/core_ext/module/attribute_accessors.rb +43 -40
  83. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +150 -0
  84. data/lib/active_support/core_ext/module/concerning.rb +11 -12
  85. data/lib/active_support/core_ext/module/delegation.rb +99 -29
  86. data/lib/active_support/core_ext/module/deprecation.rb +4 -2
  87. data/lib/active_support/core_ext/module/introspection.rb +9 -9
  88. data/lib/active_support/core_ext/module/reachable.rb +5 -2
  89. data/lib/active_support/core_ext/module/redefine_method.rb +49 -0
  90. data/lib/active_support/core_ext/module/remove_method.rb +8 -3
  91. data/lib/active_support/core_ext/module.rb +14 -11
  92. data/lib/active_support/core_ext/name_error.rb +22 -2
  93. data/lib/active_support/core_ext/numeric/bytes.rb +22 -0
  94. data/lib/active_support/core_ext/numeric/conversions.rb +78 -81
  95. data/lib/active_support/core_ext/numeric/inquiry.rb +28 -0
  96. data/lib/active_support/core_ext/numeric/time.rb +35 -23
  97. data/lib/active_support/core_ext/numeric.rb +6 -3
  98. data/lib/active_support/core_ext/object/acts_like.rb +12 -1
  99. data/lib/active_support/core_ext/object/blank.rb +27 -2
  100. data/lib/active_support/core_ext/object/conversions.rb +6 -4
  101. data/lib/active_support/core_ext/object/deep_dup.rb +13 -4
  102. data/lib/active_support/core_ext/object/duplicable.rb +41 -14
  103. data/lib/active_support/core_ext/object/inclusion.rb +5 -3
  104. data/lib/active_support/core_ext/object/instance_variables.rb +3 -1
  105. data/lib/active_support/core_ext/object/json.rb +49 -19
  106. data/lib/active_support/core_ext/object/to_param.rb +3 -1
  107. data/lib/active_support/core_ext/object/to_query.rb +10 -5
  108. data/lib/active_support/core_ext/object/try.rb +69 -21
  109. data/lib/active_support/core_ext/object/with_options.rb +16 -3
  110. data/lib/active_support/core_ext/object.rb +14 -13
  111. data/lib/active_support/core_ext/range/compare_range.rb +61 -0
  112. data/lib/active_support/core_ext/range/conversions.rb +27 -7
  113. data/lib/active_support/core_ext/range/each.rb +19 -17
  114. data/lib/active_support/core_ext/range/include_range.rb +2 -22
  115. data/lib/active_support/core_ext/range/include_time_with_zone.rb +23 -0
  116. data/lib/active_support/core_ext/range/overlaps.rb +2 -0
  117. data/lib/active_support/core_ext/range.rb +7 -4
  118. data/lib/active_support/core_ext/regexp.rb +6 -0
  119. data/lib/active_support/core_ext/securerandom.rb +25 -0
  120. data/lib/active_support/core_ext/string/access.rb +8 -6
  121. data/lib/active_support/core_ext/string/behavior.rb +3 -1
  122. data/lib/active_support/core_ext/string/conversions.rb +7 -4
  123. data/lib/active_support/core_ext/string/exclude.rb +2 -0
  124. data/lib/active_support/core_ext/string/filters.rb +6 -5
  125. data/lib/active_support/core_ext/string/indent.rb +6 -4
  126. data/lib/active_support/core_ext/string/inflections.rb +61 -24
  127. data/lib/active_support/core_ext/string/inquiry.rb +3 -1
  128. data/lib/active_support/core_ext/string/multibyte.rb +15 -7
  129. data/lib/active_support/core_ext/string/output_safety.rb +34 -38
  130. data/lib/active_support/core_ext/string/starts_ends_with.rb +2 -0
  131. data/lib/active_support/core_ext/string/strip.rb +4 -5
  132. data/lib/active_support/core_ext/string/zones.rb +4 -2
  133. data/lib/active_support/core_ext/string.rb +15 -13
  134. data/lib/active_support/core_ext/time/acts_like.rb +3 -1
  135. data/lib/active_support/core_ext/time/calculations.rb +85 -51
  136. data/lib/active_support/core_ext/time/compatibility.rb +4 -2
  137. data/lib/active_support/core_ext/time/conversions.rb +20 -13
  138. data/lib/active_support/core_ext/time/zones.rb +41 -7
  139. data/lib/active_support/core_ext/time.rb +7 -6
  140. data/lib/active_support/core_ext/uri.rb +6 -8
  141. data/lib/active_support/core_ext.rb +3 -1
  142. data/lib/active_support/current_attributes.rb +195 -0
  143. data/lib/active_support/dependencies/autoload.rb +2 -0
  144. data/lib/active_support/dependencies/interlock.rb +57 -0
  145. data/lib/active_support/dependencies.rb +152 -161
  146. data/lib/active_support/deprecation/behaviors.rb +44 -11
  147. data/lib/active_support/deprecation/constant_accessor.rb +52 -0
  148. data/lib/active_support/deprecation/instance_delegator.rb +17 -2
  149. data/lib/active_support/deprecation/method_wrappers.rb +66 -20
  150. data/lib/active_support/deprecation/proxy_wrappers.rb +56 -28
  151. data/lib/active_support/deprecation/reporting.rb +32 -12
  152. data/lib/active_support/deprecation.rb +12 -9
  153. data/lib/active_support/descendants_tracker.rb +2 -0
  154. data/lib/active_support/digest.rb +20 -0
  155. data/lib/active_support/duration/iso8601_parser.rb +125 -0
  156. data/lib/active_support/duration/iso8601_serializer.rb +55 -0
  157. data/lib/active_support/duration.rb +307 -35
  158. data/lib/active_support/encrypted_configuration.rb +49 -0
  159. data/lib/active_support/encrypted_file.rb +99 -0
  160. data/lib/active_support/evented_file_update_checker.rb +205 -0
  161. data/lib/active_support/execution_wrapper.rb +128 -0
  162. data/lib/active_support/executor.rb +8 -0
  163. data/lib/active_support/file_update_checker.rb +63 -37
  164. data/lib/active_support/gem_version.rb +6 -4
  165. data/lib/active_support/gzip.rb +7 -5
  166. data/lib/active_support/hash_with_indifferent_access.rb +123 -28
  167. data/lib/active_support/i18n.rb +8 -6
  168. data/lib/active_support/i18n_railtie.rb +37 -13
  169. data/lib/active_support/inflections.rb +13 -11
  170. data/lib/active_support/inflector/inflections.rb +61 -12
  171. data/lib/active_support/inflector/methods.rb +163 -136
  172. data/lib/active_support/inflector/transliterate.rb +48 -27
  173. data/lib/active_support/inflector.rb +7 -5
  174. data/lib/active_support/json/decoding.rb +16 -13
  175. data/lib/active_support/json/encoding.rb +11 -58
  176. data/lib/active_support/json.rb +4 -2
  177. data/lib/active_support/key_generator.rb +25 -25
  178. data/lib/active_support/lazy_load_hooks.rb +50 -20
  179. data/lib/active_support/locale/en.yml +2 -0
  180. data/lib/active_support/log_subscriber/test_helper.rb +14 -12
  181. data/lib/active_support/log_subscriber.rb +13 -10
  182. data/lib/active_support/logger.rb +8 -7
  183. data/lib/active_support/logger_silence.rb +6 -4
  184. data/lib/active_support/logger_thread_safe_level.rb +7 -5
  185. data/lib/active_support/message_encryptor.rb +168 -53
  186. data/lib/active_support/message_verifier.rb +150 -17
  187. data/lib/active_support/messages/metadata.rb +71 -0
  188. data/lib/active_support/messages/rotation_configuration.rb +22 -0
  189. data/lib/active_support/messages/rotator.rb +56 -0
  190. data/lib/active_support/multibyte/chars.rb +36 -23
  191. data/lib/active_support/multibyte/unicode.rb +100 -96
  192. data/lib/active_support/multibyte.rb +4 -2
  193. data/lib/active_support/notifications/fanout.rb +11 -9
  194. data/lib/active_support/notifications/instrumenter.rb +27 -7
  195. data/lib/active_support/notifications.rb +11 -7
  196. data/lib/active_support/number_helper/number_converter.rb +13 -11
  197. data/lib/active_support/number_helper/number_to_currency_converter.rb +9 -9
  198. data/lib/active_support/number_helper/number_to_delimited_converter.rb +9 -3
  199. data/lib/active_support/number_helper/number_to_human_converter.rb +11 -9
  200. data/lib/active_support/number_helper/number_to_human_size_converter.rb +9 -8
  201. data/lib/active_support/number_helper/number_to_percentage_converter.rb +3 -1
  202. data/lib/active_support/number_helper/number_to_phone_converter.rb +13 -4
  203. data/lib/active_support/number_helper/number_to_rounded_converter.rb +23 -56
  204. data/lib/active_support/number_helper/rounding_helper.rb +66 -0
  205. data/lib/active_support/number_helper.rb +94 -68
  206. data/lib/active_support/option_merger.rb +3 -1
  207. data/lib/active_support/ordered_hash.rb +6 -4
  208. data/lib/active_support/ordered_options.rb +23 -5
  209. data/lib/active_support/per_thread_registry.rb +9 -4
  210. data/lib/active_support/proxy_object.rb +2 -0
  211. data/lib/active_support/rails.rb +16 -8
  212. data/lib/active_support/railtie.rb +43 -9
  213. data/lib/active_support/reloader.rb +131 -0
  214. data/lib/active_support/rescuable.rb +108 -53
  215. data/lib/active_support/security_utils.rb +15 -11
  216. data/lib/active_support/string_inquirer.rb +11 -3
  217. data/lib/active_support/subscriber.rb +21 -16
  218. data/lib/active_support/tagged_logging.rb +14 -11
  219. data/lib/active_support/test_case.rb +19 -47
  220. data/lib/active_support/testing/assertions.rb +137 -20
  221. data/lib/active_support/testing/autorun.rb +4 -2
  222. data/lib/active_support/testing/constant_lookup.rb +2 -1
  223. data/lib/active_support/testing/declarative.rb +3 -1
  224. data/lib/active_support/testing/deprecation.rb +14 -10
  225. data/lib/active_support/testing/file_fixtures.rb +36 -0
  226. data/lib/active_support/testing/isolation.rb +34 -25
  227. data/lib/active_support/testing/method_call_assertions.rb +43 -0
  228. data/lib/active_support/testing/setup_and_teardown.rb +13 -8
  229. data/lib/active_support/testing/stream.rb +44 -0
  230. data/lib/active_support/testing/tagged_logging.rb +3 -1
  231. data/lib/active_support/testing/time_helpers.rb +81 -15
  232. data/lib/active_support/time.rb +14 -12
  233. data/lib/active_support/time_with_zone.rb +169 -39
  234. data/lib/active_support/values/time_zone.rb +196 -61
  235. data/lib/active_support/values/unicode_tables.dat +0 -0
  236. data/lib/active_support/version.rb +3 -1
  237. data/lib/active_support/xml_mini/jdom.rb +116 -114
  238. data/lib/active_support/xml_mini/libxml.rb +16 -13
  239. data/lib/active_support/xml_mini/libxmlsax.rb +15 -14
  240. data/lib/active_support/xml_mini/nokogiri.rb +14 -12
  241. data/lib/active_support/xml_mini/nokogirisax.rb +14 -13
  242. data/lib/active_support/xml_mini/rexml.rb +11 -9
  243. data/lib/active_support/xml_mini.rb +37 -37
  244. data/lib/active_support.rb +12 -11
  245. metadata +54 -24
  246. data/lib/active_support/concurrency/latch.rb +0 -27
  247. data/lib/active_support/core_ext/big_decimal/yaml_conversions.rb +0 -16
  248. data/lib/active_support/core_ext/class/delegating_attributes.rb +0 -45
  249. data/lib/active_support/core_ext/date_time/zones.rb +0 -6
  250. data/lib/active_support/core_ext/kernel/debugger.rb +0 -10
  251. data/lib/active_support/core_ext/module/method_transplanting.rb +0 -13
  252. data/lib/active_support/core_ext/module/qualified_const.rb +0 -52
  253. data/lib/active_support/core_ext/object/itself.rb +0 -15
  254. data/lib/active_support/core_ext/struct.rb +0 -6
  255. data/lib/active_support/core_ext/thread.rb +0 -86
  256. data/lib/active_support/core_ext/time/marshal.rb +0 -30
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Module
2
4
  # deprecate :foo
3
5
  # deprecate bar: 'message'
@@ -13,8 +15,8 @@ class Module
13
15
  #
14
16
  # class MyLib::Deprecator
15
17
  # def deprecation_warning(deprecated_method_name, message, caller_backtrace = nil)
16
- # message = "#{deprecated_method_name} is deprecated and will be removed from MyLibrary | #{message}"
17
- # Kernel.warn message
18
+ # message = "#{deprecated_method_name} is deprecated and will be removed from MyLibrary | #{message}"
19
+ # Kernel.warn message
18
20
  # end
19
21
  # end
20
22
  def deprecate(*method_names)
@@ -1,14 +1,18 @@
1
- require 'active_support/inflector'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/inflector"
2
4
 
3
5
  class Module
4
6
  # Returns the name of the module containing this one.
5
7
  #
6
8
  # M::N.parent_name # => "M"
7
9
  def parent_name
8
- if defined? @parent_name
10
+ if defined?(@parent_name)
9
11
  @parent_name
10
12
  else
11
- @parent_name = name =~ /::[^:]+\Z/ ? $`.freeze : nil
13
+ parent_name = name =~ /::[^:]+\Z/ ? $`.freeze : nil
14
+ @parent_name = parent_name unless frozen?
15
+ parent_name
12
16
  end
13
17
  end
14
18
 
@@ -46,17 +50,13 @@ class Module
46
50
  def parents
47
51
  parents = []
48
52
  if parent_name
49
- parts = parent_name.split('::')
53
+ parts = parent_name.split("::")
50
54
  until parts.empty?
51
- parents << ActiveSupport::Inflector.constantize(parts * '::')
55
+ parents << ActiveSupport::Inflector.constantize(parts * "::")
52
56
  parts.pop
53
57
  end
54
58
  end
55
59
  parents << Object unless parents.include? Object
56
60
  parents
57
61
  end
58
-
59
- def local_constants #:nodoc:
60
- constants(false)
61
- end
62
62
  end
@@ -1,8 +1,11 @@
1
- require 'active_support/core_ext/module/anonymous'
2
- require 'active_support/core_ext/string/inflections'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/module/anonymous"
4
+ require "active_support/core_ext/string/inflections"
3
5
 
4
6
  class Module
5
7
  def reachable? #:nodoc:
6
8
  !anonymous? && name.safe_constantize.equal?(self)
7
9
  end
10
+ deprecate :reachable?
8
11
  end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
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
21
+ end
22
+ end
23
+
24
+ # Replaces the existing method definition, if there is one, with the passed
25
+ # block as its body.
26
+ def redefine_method(method, &block)
27
+ visibility = method_visibility(method)
28
+ silence_redefinition_of_method(method)
29
+ define_method(method, &block)
30
+ send(visibility, method)
31
+ end
32
+
33
+ # Replaces the existing singleton method definition, if there is one, with
34
+ # the passed block as its body.
35
+ def redefine_singleton_method(method, &block)
36
+ singleton_class.redefine_method(method, &block)
37
+ end
38
+
39
+ def method_visibility(method) # :nodoc:
40
+ case
41
+ when private_method_defined?(method)
42
+ :private
43
+ when protected_method_defined?(method)
44
+ :protected
45
+ else
46
+ :public
47
+ end
48
+ end
49
+ end
@@ -1,12 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/module/redefine_method"
4
+
1
5
  class Module
6
+ # Removes the named method, if it exists.
2
7
  def remove_possible_method(method)
3
8
  if method_defined?(method) || private_method_defined?(method)
4
9
  undef_method(method)
5
10
  end
6
11
  end
7
12
 
8
- def redefine_method(method, &block)
9
- remove_possible_method(method)
10
- define_method(method, &block)
13
+ # Removes the named singleton method, if it exists.
14
+ def remove_possible_singleton_method(method)
15
+ singleton_class.remove_possible_method(method)
11
16
  end
12
17
  end
@@ -1,11 +1,14 @@
1
- require 'active_support/core_ext/module/aliasing'
2
- require 'active_support/core_ext/module/introspection'
3
- require 'active_support/core_ext/module/anonymous'
4
- require 'active_support/core_ext/module/reachable'
5
- require 'active_support/core_ext/module/attribute_accessors'
6
- require 'active_support/core_ext/module/attr_internal'
7
- require 'active_support/core_ext/module/concerning'
8
- require 'active_support/core_ext/module/delegation'
9
- require 'active_support/core_ext/module/deprecation'
10
- require 'active_support/core_ext/module/remove_method'
11
- require 'active_support/core_ext/module/qualified_const'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/module/aliasing"
4
+ require "active_support/core_ext/module/introspection"
5
+ require "active_support/core_ext/module/anonymous"
6
+ require "active_support/core_ext/module/reachable"
7
+ require "active_support/core_ext/module/attribute_accessors"
8
+ require "active_support/core_ext/module/attribute_accessors_per_thread"
9
+ require "active_support/core_ext/module/attr_internal"
10
+ require "active_support/core_ext/module/concerning"
11
+ require "active_support/core_ext/module/delegation"
12
+ require "active_support/core_ext/module/deprecation"
13
+ require "active_support/core_ext/module/redefine_method"
14
+ require "active_support/core_ext/module/remove_method"
@@ -1,16 +1,36 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class NameError
2
4
  # Extract the name of the missing constant from the exception message.
5
+ #
6
+ # begin
7
+ # HelloWorld
8
+ # rescue NameError => e
9
+ # e.missing_name
10
+ # end
11
+ # # => "HelloWorld"
3
12
  def missing_name
13
+ # Since ruby v2.3.0 `did_you_mean` gem is loaded by default.
14
+ # It extends NameError#message with spell corrections which are SLOW.
15
+ # We should use original_message message instead.
16
+ message = respond_to?(:original_message) ? original_message : self.message
17
+
4
18
  if /undefined local variable or method/ !~ message
5
19
  $1 if /((::)?([A-Z]\w*)(::[A-Z]\w*)*)$/ =~ message
6
20
  end
7
21
  end
8
22
 
9
23
  # Was this exception raised because the given name was missing?
24
+ #
25
+ # begin
26
+ # HelloWorld
27
+ # rescue NameError => e
28
+ # e.missing_name?("HelloWorld")
29
+ # end
30
+ # # => true
10
31
  def missing_name?(name)
11
32
  if name.is_a? Symbol
12
- last_name = (missing_name || '').split('::').last
13
- last_name == name.to_s
33
+ self.name == name
14
34
  else
15
35
  missing_name == name.to_s
16
36
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Numeric
2
4
  KILOBYTE = 1024
3
5
  MEGABYTE = KILOBYTE * 1024
@@ -7,36 +9,56 @@ class Numeric
7
9
  EXABYTE = PETABYTE * 1024
8
10
 
9
11
  # Enables the use of byte calculations and declarations, like 45.bytes + 2.6.megabytes
12
+ #
13
+ # 2.bytes # => 2
10
14
  def bytes
11
15
  self
12
16
  end
13
17
  alias :byte :bytes
14
18
 
19
+ # Returns the number of bytes equivalent to the kilobytes provided.
20
+ #
21
+ # 2.kilobytes # => 2048
15
22
  def kilobytes
16
23
  self * KILOBYTE
17
24
  end
18
25
  alias :kilobyte :kilobytes
19
26
 
27
+ # Returns the number of bytes equivalent to the megabytes provided.
28
+ #
29
+ # 2.megabytes # => 2_097_152
20
30
  def megabytes
21
31
  self * MEGABYTE
22
32
  end
23
33
  alias :megabyte :megabytes
24
34
 
35
+ # Returns the number of bytes equivalent to the gigabytes provided.
36
+ #
37
+ # 2.gigabytes # => 2_147_483_648
25
38
  def gigabytes
26
39
  self * GIGABYTE
27
40
  end
28
41
  alias :gigabyte :gigabytes
29
42
 
43
+ # Returns the number of bytes equivalent to the terabytes provided.
44
+ #
45
+ # 2.terabytes # => 2_199_023_255_552
30
46
  def terabytes
31
47
  self * TERABYTE
32
48
  end
33
49
  alias :terabyte :terabytes
34
50
 
51
+ # Returns the number of bytes equivalent to the petabytes provided.
52
+ #
53
+ # 2.petabytes # => 2_251_799_813_685_248
35
54
  def petabytes
36
55
  self * PETABYTE
37
56
  end
38
57
  alias :petabyte :petabytes
39
58
 
59
+ # Returns the number of bytes equivalent to the exabytes provided.
60
+ #
61
+ # 2.exabytes # => 2_305_843_009_213_693_952
40
62
  def exabytes
41
63
  self * EXABYTE
42
64
  end
@@ -1,8 +1,10 @@
1
- require 'active_support/core_ext/big_decimal/conversions'
2
- require 'active_support/number_helper'
1
+ # frozen_string_literal: true
3
2
 
4
- class Numeric
3
+ require "active_support/core_ext/big_decimal/conversions"
4
+ require "active_support/number_helper"
5
+ require "active_support/core_ext/module/deprecation"
5
6
 
7
+ module ActiveSupport::NumericWithFormat
6
8
  # Provides options for converting numbers into formatted strings.
7
9
  # Options are provided for phone numbers, currency, percentage,
8
10
  # precision, positional notation, file size and pretty printing.
@@ -14,70 +16,72 @@ class Numeric
14
16
  # ==== Examples
15
17
  #
16
18
  # 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
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"
23
25
  # 1235551234.to_s(:phone, country_code: 1, extension: 1343, delimiter: '.')
24
- # # => +1.123.555.1234 x 1343
26
+ # # => "+1.123.555.1234 x 1343"
25
27
  #
26
28
  # 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 €
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 €"
31
33
  # -1234567890.50.to_s(:currency, negative_format: '(%u%n)')
32
- # # => ($1,234,567,890.50)
34
+ # # => "($1,234,567,890.50)"
33
35
  # 1234567890.50.to_s(:currency, unit: '&pound;', separator: ',', delimiter: '')
34
- # # => &pound;1234567890,50
36
+ # # => "&pound;1234567890,50"
35
37
  # 1234567890.50.to_s(:currency, unit: '&pound;', separator: ',', delimiter: '', format: '%n %u')
36
- # # => 1234567890,50 &pound;
38
+ # # => "1234567890,50 &pound;"
37
39
  #
38
40
  # 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 %
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 %"
45
47
  #
46
48
  # 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
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"
53
55
  # 98765432.98.to_s(:delimited, delimiter: ' ', separator: ',')
54
- # # => 98 765 432,98
56
+ # # => "98 765 432,98"
55
57
  #
56
58
  # 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
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"
65
67
  # 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
+ # # => "13"
69
+ # 389.32314.to_s(:rounded, precision: 4, significant: true) # => "389.3"
68
70
  # 1111.2345.to_s(:rounded, precision: 2, separator: ',', delimiter: '.')
69
- # # => 1.111,23
71
+ # # => "1.111,23"
70
72
  #
71
73
  # 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
- # 1234567.to_s(:human_size, precision: 2) # => 1.2 MB
79
- # 483989.to_s(:human_size, precision: 2) # => 470 KB
80
- # 1234567.to_s(:human_size, precision: 2, separator: ',') # => 1,2 MB
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"
81
85
  # 1234567890123.to_s(:human_size, precision: 5) # => "1.1228 TB"
82
86
  # 524288000.to_s(:human_size, precision: 5) # => "500 MB"
83
87
  #
@@ -97,47 +101,40 @@ class Numeric
97
101
  # 1234567.to_s(:human, precision: 1,
98
102
  # separator: ',',
99
103
  # significant: false) # => "1,2 Million"
100
- def to_formatted_s(format = :default, options = {})
104
+ def to_s(format = nil, options = nil)
101
105
  case format
106
+ when nil
107
+ super()
108
+ when Integer, String
109
+ super(format)
102
110
  when :phone
103
- return ActiveSupport::NumberHelper.number_to_phone(self, options)
111
+ ActiveSupport::NumberHelper.number_to_phone(self, options || {})
104
112
  when :currency
105
- return ActiveSupport::NumberHelper.number_to_currency(self, options)
113
+ ActiveSupport::NumberHelper.number_to_currency(self, options || {})
106
114
  when :percentage
107
- return ActiveSupport::NumberHelper.number_to_percentage(self, options)
115
+ ActiveSupport::NumberHelper.number_to_percentage(self, options || {})
108
116
  when :delimited
109
- return ActiveSupport::NumberHelper.number_to_delimited(self, options)
117
+ ActiveSupport::NumberHelper.number_to_delimited(self, options || {})
110
118
  when :rounded
111
- return ActiveSupport::NumberHelper.number_to_rounded(self, options)
119
+ ActiveSupport::NumberHelper.number_to_rounded(self, options || {})
112
120
  when :human
113
- return ActiveSupport::NumberHelper.number_to_human(self, options)
121
+ ActiveSupport::NumberHelper.number_to_human(self, options || {})
114
122
  when :human_size
115
- return ActiveSupport::NumberHelper.number_to_human_size(self, options)
123
+ ActiveSupport::NumberHelper.number_to_human_size(self, options || {})
124
+ when Symbol
125
+ super()
116
126
  else
117
- self.to_default_s
127
+ super(format)
118
128
  end
119
129
  end
130
+ end
120
131
 
121
- klasses = [Float, BigDecimal]
122
- # Ruby 2.4+ unifies Fixnum & Bignum into Integer.
123
- if 0.class == Integer
124
- klasses << Integer
125
- else
126
- klasses << Fixnum << Bignum
127
- end
128
-
129
- klasses.each do |klass|
130
- klass.send(:alias_method, :to_default_s, :to_s)
131
-
132
- klass.send(:define_method, :to_s) do |*args|
133
- if args[0].is_a?(Symbol)
134
- format = args[0]
135
- options = args[1] || {}
136
-
137
- self.to_formatted_s(format, options)
138
- else
139
- to_default_s(*args)
140
- end
141
- end
142
- end
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
143
138
  end
139
+ Float.prepend ActiveSupport::NumericWithFormat
140
+ BigDecimal.prepend ActiveSupport::NumericWithFormat
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
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
13
+
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
@@ -1,53 +1,65 @@
1
- require 'active_support/duration'
2
- require 'active_support/core_ext/time/calculations'
3
- require 'active_support/core_ext/time/acts_like'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/duration"
4
+ require "active_support/core_ext/time/calculations"
5
+ require "active_support/core_ext/time/acts_like"
6
+ require "active_support/core_ext/date/calculations"
7
+ require "active_support/core_ext/date/acts_like"
4
8
 
5
9
  class Numeric
6
- # Enables the use of time calculations and declarations, like 45.minutes + 2.hours + 4.years.
7
- #
8
- # These methods use Time#advance for precise date calculations when using from_now, ago, etc.
9
- # as well as adding or subtracting their results from a Time object. For example:
10
- #
11
- # # equivalent to Time.current.advance(months: 1)
12
- # 1.month.from_now
10
+ # Returns a Duration instance matching the number of seconds provided.
13
11
  #
14
- # # equivalent to Time.current.advance(years: 2)
15
- # 2.years.from_now
16
- #
17
- # # equivalent to Time.current.advance(months: 4, years: 5)
18
- # (4.months + 5.years).from_now
12
+ # 2.seconds # => 2 seconds
19
13
  def seconds
20
- ActiveSupport::Duration.new(self, [[:seconds, self]])
14
+ ActiveSupport::Duration.seconds(self)
21
15
  end
22
16
  alias :second :seconds
23
17
 
18
+ # Returns a Duration instance matching the number of minutes provided.
19
+ #
20
+ # 2.minutes # => 2 minutes
24
21
  def minutes
25
- ActiveSupport::Duration.new(self * 60, [[:seconds, self * 60]])
22
+ ActiveSupport::Duration.minutes(self)
26
23
  end
27
24
  alias :minute :minutes
28
25
 
26
+ # Returns a Duration instance matching the number of hours provided.
27
+ #
28
+ # 2.hours # => 2 hours
29
29
  def hours
30
- ActiveSupport::Duration.new(self * 3600, [[:seconds, self * 3600]])
30
+ ActiveSupport::Duration.hours(self)
31
31
  end
32
32
  alias :hour :hours
33
33
 
34
+ # Returns a Duration instance matching the number of days provided.
35
+ #
36
+ # 2.days # => 2 days
34
37
  def days
35
- ActiveSupport::Duration.new(self * 24.hours, [[:days, self]])
38
+ ActiveSupport::Duration.days(self)
36
39
  end
37
40
  alias :day :days
38
41
 
42
+ # Returns a Duration instance matching the number of weeks provided.
43
+ #
44
+ # 2.weeks # => 2 weeks
39
45
  def weeks
40
- ActiveSupport::Duration.new(self * 7.days, [[:days, self * 7]])
46
+ ActiveSupport::Duration.weeks(self)
41
47
  end
42
48
  alias :week :weeks
43
49
 
50
+ # Returns a Duration instance matching the number of fortnights provided.
51
+ #
52
+ # 2.fortnights # => 4 weeks
44
53
  def fortnights
45
- ActiveSupport::Duration.new(self * 2.weeks, [[:days, self * 14]])
54
+ ActiveSupport::Duration.weeks(self * 2)
46
55
  end
47
56
  alias :fortnight :fortnights
48
57
 
49
- # Used with the standard time durations, like 1.hour.in_milliseconds --
50
- # so we can feed them to JavaScript functions like getTime().
58
+ # Returns the number of milliseconds equivalent to the seconds provided.
59
+ # Used with the standard time durations.
60
+ #
61
+ # 2.in_milliseconds # => 2000
62
+ # 1.hour.in_milliseconds # => 3600000
51
63
  def in_milliseconds
52
64
  self * 1000
53
65
  end
@@ -1,3 +1,6 @@
1
- require 'active_support/core_ext/numeric/bytes'
2
- require 'active_support/core_ext/numeric/time'
3
- require 'active_support/core_ext/numeric/conversions'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/numeric/bytes"
4
+ require "active_support/core_ext/numeric/time"
5
+ require "active_support/core_ext/numeric/inquiry"
6
+ 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