activesupport 4.2.11.3 → 5.2.8.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 (256) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +435 -403
  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 +91 -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 +35 -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 +98 -36
  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 +62 -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 +314 -38
  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 +131 -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 +57 -27
  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,11 +1,23 @@
1
- require 'active_support/core_ext/kernel/singleton_class'
2
- require 'active_support/core_ext/module/remove_method'
3
- require 'active_support/core_ext/array/extract_options'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/kernel/singleton_class"
4
+ require "active_support/core_ext/module/redefine_method"
5
+ require "active_support/core_ext/array/extract_options"
4
6
 
5
7
  class Class
6
8
  # Declare a class-level attribute whose value is inheritable by subclasses.
7
9
  # Subclasses can change their own value and it will not impact parent class.
8
10
  #
11
+ # ==== Options
12
+ #
13
+ # * <tt>:instance_reader</tt> - Sets the instance reader method (defaults to true).
14
+ # * <tt>:instance_writer</tt> - Sets the instance writer method (defaults to true).
15
+ # * <tt>:instance_accessor</tt> - Sets both instance methods (defaults to true).
16
+ # * <tt>:instance_predicate</tt> - Sets a predicate method (defaults to true).
17
+ # * <tt>:default</tt> - Sets a default value for the attribute (defaults to nil).
18
+ #
19
+ # ==== Examples
20
+ #
9
21
  # class Base
10
22
  # class_attribute :setting
11
23
  # end
@@ -20,14 +32,14 @@ class Class
20
32
  # Base.setting # => true
21
33
  #
22
34
  # In the above case as long as Subclass does not assign a value to setting
23
- # by performing <tt>Subclass.setting = _something_ </tt>, <tt>Subclass.setting</tt>
35
+ # by performing <tt>Subclass.setting = _something_</tt>, <tt>Subclass.setting</tt>
24
36
  # would read value assigned to parent class. Once Subclass assigns a value then
25
37
  # the value assigned by Subclass would be returned.
26
38
  #
27
39
  # This matches normal Ruby method inheritance: think of writing an attribute
28
40
  # on a subclass as overriding the reader method. However, you need to be aware
29
41
  # when using +class_attribute+ with mutable structures as +Array+ or +Hash+.
30
- # In such cases, you don't want to do changes in places but use setters:
42
+ # In such cases, you don't want to do changes in place. Instead use setters:
31
43
  #
32
44
  # Base.setting = []
33
45
  # Base.setting # => []
@@ -68,28 +80,35 @@ class Class
68
80
  # object.setting = false # => NoMethodError
69
81
  #
70
82
  # To opt out of both instance methods, pass <tt>instance_accessor: false</tt>.
83
+ #
84
+ # To set a default value for the attribute, pass <tt>default:</tt>, like so:
85
+ #
86
+ # class_attribute :settings, default: {}
71
87
  def class_attribute(*attrs)
72
88
  options = attrs.extract_options!
73
- instance_reader = options.fetch(:instance_accessor, true) && options.fetch(:instance_reader, true)
74
- instance_writer = options.fetch(:instance_accessor, true) && options.fetch(:instance_writer, true)
89
+ instance_reader = options.fetch(:instance_accessor, true) && options.fetch(:instance_reader, true)
90
+ instance_writer = options.fetch(:instance_accessor, true) && options.fetch(:instance_writer, true)
75
91
  instance_predicate = options.fetch(:instance_predicate, true)
92
+ default_value = options.fetch(:default, nil)
76
93
 
77
94
  attrs.each do |name|
95
+ singleton_class.silence_redefinition_of_method(name)
78
96
  define_singleton_method(name) { nil }
97
+
98
+ singleton_class.silence_redefinition_of_method("#{name}?")
79
99
  define_singleton_method("#{name}?") { !!public_send(name) } if instance_predicate
80
100
 
81
101
  ivar = "@#{name}"
82
102
 
103
+ singleton_class.silence_redefinition_of_method("#{name}=")
83
104
  define_singleton_method("#{name}=") do |val|
84
105
  singleton_class.class_eval do
85
- remove_possible_method(name)
86
- define_method(name) { val }
106
+ redefine_method(name) { val }
87
107
  end
88
108
 
89
109
  if singleton_class?
90
110
  class_eval do
91
- remove_possible_method(name)
92
- define_method(name) do
111
+ redefine_method(name) do
93
112
  if instance_variable_defined? ivar
94
113
  instance_variable_get ivar
95
114
  else
@@ -102,26 +121,26 @@ class Class
102
121
  end
103
122
 
104
123
  if instance_reader
105
- remove_possible_method name
106
- define_method(name) do
124
+ redefine_method(name) do
107
125
  if instance_variable_defined?(ivar)
108
126
  instance_variable_get ivar
109
127
  else
110
128
  self.class.public_send name
111
129
  end
112
130
  end
113
- define_method("#{name}?") { !!public_send(name) } if instance_predicate
114
- end
115
131
 
116
- attr_writer name if instance_writer
117
- end
118
- end
132
+ redefine_method("#{name}?") { !!public_send(name) } if instance_predicate
133
+ end
119
134
 
120
- private
135
+ if instance_writer
136
+ redefine_method("#{name}=") do |val|
137
+ instance_variable_set ivar, val
138
+ end
139
+ end
121
140
 
122
- unless respond_to?(:singleton_class?)
123
- def singleton_class?
124
- ancestors.first != self
141
+ unless default_value.nil?
142
+ self.send("#{name}=", default_value)
125
143
  end
126
144
  end
145
+ end
127
146
  end
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # cattr_* became mattr_* aliases in 7dfbd91b0780fbd6a1dd9bfbc176e10894871d2d,
2
4
  # but we keep this around for libraries that directly require it knowing they
3
5
  # want cattr_*. No need to deprecate.
4
- require 'active_support/core_ext/module/attribute_accessors'
6
+ require "active_support/core_ext/module/attribute_accessors"
@@ -1,19 +1,33 @@
1
- require 'active_support/core_ext/module/anonymous'
2
- require 'active_support/core_ext/module/reachable'
1
+ # frozen_string_literal: true
3
2
 
4
3
  class Class
5
4
  begin
6
- ObjectSpace.each_object(Class.new) {}
5
+ # Test if this Ruby supports each_object against singleton_class
6
+ ObjectSpace.each_object(Numeric.singleton_class) {}
7
7
 
8
- def descendants # :nodoc:
8
+ # Returns an array with all classes that are < than its receiver.
9
+ #
10
+ # class C; end
11
+ # C.descendants # => []
12
+ #
13
+ # class B < C; end
14
+ # C.descendants # => [B]
15
+ #
16
+ # class A < B; end
17
+ # C.descendants # => [B, A]
18
+ #
19
+ # class D < C; end
20
+ # C.descendants # => [B, A, D]
21
+ def descendants
9
22
  descendants = []
10
23
  ObjectSpace.each_object(singleton_class) do |k|
24
+ next if k.singleton_class?
11
25
  descendants.unshift k unless k == self
12
26
  end
13
27
  descendants
14
28
  end
15
- rescue StandardError # JRuby
16
- def descendants # :nodoc:
29
+ rescue StandardError # JRuby 9.0.4.0 and earlier
30
+ def descendants
17
31
  descendants = []
18
32
  ObjectSpace.each_object(Class) do |k|
19
33
  descendants.unshift k if k < self
@@ -1,3 +1,4 @@
1
- require 'active_support/core_ext/class/attribute'
2
- require 'active_support/core_ext/class/delegating_attributes'
3
- require 'active_support/core_ext/class/subclasses'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/class/attribute"
4
+ require "active_support/core_ext/class/subclasses"
@@ -1,4 +1,6 @@
1
- require 'active_support/core_ext/object/acts_like'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/object/acts_like"
2
4
 
3
5
  class Date
4
6
  # Duck-types as a Date-like class. See Object#acts_like?.
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "date"
4
+
5
+ class Date #:nodoc:
6
+ # No Date is blank:
7
+ #
8
+ # Date.today.blank? # => false
9
+ #
10
+ # @return [false]
11
+ def blank?
12
+ false
13
+ end
14
+ end
@@ -1,9 +1,11 @@
1
- require 'date'
2
- require 'active_support/duration'
3
- require 'active_support/core_ext/object/acts_like'
4
- require 'active_support/core_ext/date/zones'
5
- require 'active_support/core_ext/time/zones'
6
- require 'active_support/core_ext/date_and_time/calculations'
1
+ # frozen_string_literal: true
2
+
3
+ require "date"
4
+ require "active_support/duration"
5
+ require "active_support/core_ext/object/acts_like"
6
+ require "active_support/core_ext/date/zones"
7
+ require "active_support/core_ext/time/zones"
8
+ require "active_support/core_ext/date_and_time/calculations"
7
9
 
8
10
  class Date
9
11
  include DateAndTime::Calculations
@@ -26,7 +28,7 @@ class Date
26
28
  Thread.current[:beginning_of_week] = find_beginning_of_week!(week_start)
27
29
  end
28
30
 
29
- # Returns week start day symbol (e.g. :monday), or raises an ArgumentError for invalid day symbol.
31
+ # Returns week start day symbol (e.g. :monday), or raises an +ArgumentError+ for invalid day symbol.
30
32
  def find_beginning_of_week!(week_start)
31
33
  raise ArgumentError, "Invalid beginning of week: #{week_start}" unless ::Date::DAYS_INTO_WEEK.key?(week_start)
32
34
  week_start
@@ -129,11 +131,11 @@ class Date
129
131
  options.fetch(:day, day)
130
132
  )
131
133
  end
132
-
134
+
133
135
  # Allow Date to be compared with Time by converting to DateTime and relying on the <=> from there.
134
136
  def compare_with_coercion(other)
135
137
  if other.is_a?(Time)
136
- self.to_datetime <=> other
138
+ to_datetime <=> other
137
139
  else
138
140
  compare_without_coercion(other)
139
141
  end
@@ -1,30 +1,24 @@
1
- require 'date'
2
- require 'active_support/inflector/methods'
3
- require 'active_support/core_ext/date/zones'
4
- require 'active_support/core_ext/module/remove_method'
1
+ # frozen_string_literal: true
2
+
3
+ require "date"
4
+ require "active_support/inflector/methods"
5
+ require "active_support/core_ext/date/zones"
6
+ require "active_support/core_ext/module/redefine_method"
5
7
 
6
8
  class Date
7
9
  DATE_FORMATS = {
8
- :short => '%e %b',
9
- :long => '%B %e, %Y',
10
- :db => '%Y-%m-%d',
11
- :number => '%Y%m%d',
12
- :long_ordinal => lambda { |date|
10
+ short: "%d %b",
11
+ long: "%B %d, %Y",
12
+ db: "%Y-%m-%d",
13
+ number: "%Y%m%d",
14
+ long_ordinal: lambda { |date|
13
15
  day_format = ActiveSupport::Inflector.ordinalize(date.day)
14
16
  date.strftime("%B #{day_format}, %Y") # => "April 25th, 2007"
15
17
  },
16
- :rfc822 => '%e %b %Y',
17
- :iso8601 => lambda { |date| date.iso8601 }
18
+ rfc822: "%d %b %Y",
19
+ iso8601: lambda { |date| date.iso8601 }
18
20
  }
19
21
 
20
- # Ruby 1.9 has Date#to_time which converts to localtime only.
21
- remove_method :to_time
22
-
23
- # Ruby 1.9 has Date#xmlschema which converts to a string without the time
24
- # component. This removal may generate an issue on FreeBSD, that's why we
25
- # need to use remove_possible_method here
26
- remove_possible_method :xmlschema
27
-
28
22
  # Convert to a formatted string. See DATE_FORMATS for predefined formats.
29
23
  #
30
24
  # This method is aliased to <tt>to_s</tt>.
@@ -65,24 +59,32 @@ class Date
65
59
 
66
60
  # Overrides the default inspect method with a human readable one, e.g., "Mon, 21 Feb 2005"
67
61
  def readable_inspect
68
- strftime('%a, %d %b %Y')
62
+ strftime("%a, %d %b %Y")
69
63
  end
70
64
  alias_method :default_inspect, :inspect
71
65
  alias_method :inspect, :readable_inspect
72
66
 
67
+ silence_redefinition_of_method :to_time
68
+
73
69
  # Converts a Date instance to a Time, where the time is set to the beginning of the day.
74
70
  # The timezone can be either :local or :utc (default :local).
75
71
  #
76
72
  # date = Date.new(2007, 11, 10) # => Sat, 10 Nov 2007
77
73
  #
78
- # date.to_time # => Sat Nov 10 00:00:00 0800 2007
79
- # date.to_time(:local) # => Sat Nov 10 00:00:00 0800 2007
74
+ # date.to_time # => 2007-11-10 00:00:00 0800
75
+ # date.to_time(:local) # => 2007-11-10 00:00:00 0800
76
+ #
77
+ # date.to_time(:utc) # => 2007-11-10 00:00:00 UTC
80
78
  #
81
- # date.to_time(:utc) # => Sat Nov 10 00:00:00 UTC 2007
79
+ # NOTE: The :local timezone is Ruby's *process* timezone, i.e. ENV['TZ'].
80
+ # If the *application's* timezone is needed, then use +in_time_zone+ instead.
82
81
  def to_time(form = :local)
82
+ raise ArgumentError, "Expected :local or :utc, got #{form.inspect}." unless [:local, :utc].include?(form)
83
83
  ::Time.send(form, year, month, day)
84
84
  end
85
85
 
86
+ silence_redefinition_of_method :xmlschema
87
+
86
88
  # Returns a string which represents the time in used time zone as DateTime
87
89
  # defined by XML Schema:
88
90
  #
@@ -1,5 +1,7 @@
1
- require 'date'
2
- require 'active_support/core_ext/date_and_time/zones'
1
+ # frozen_string_literal: true
2
+
3
+ require "date"
4
+ require "active_support/core_ext/date_and_time/zones"
3
5
 
4
6
  class Date
5
7
  include DateAndTime::Zones
@@ -1,5 +1,7 @@
1
- require 'active_support/core_ext/date/acts_like'
2
- require 'active_support/core_ext/date/calculations'
3
- require 'active_support/core_ext/date/conversions'
4
- require 'active_support/core_ext/date/zones'
1
+ # frozen_string_literal: true
5
2
 
3
+ require "active_support/core_ext/date/acts_like"
4
+ require "active_support/core_ext/date/blank"
5
+ require "active_support/core_ext/date/calculations"
6
+ require "active_support/core_ext/date/conversions"
7
+ require "active_support/core_ext/date/zones"