activesupport 1.2.4 → 8.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +505 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +40 -0
  5. data/lib/active_support/actionable_error.rb +50 -0
  6. data/lib/active_support/all.rb +5 -0
  7. data/lib/active_support/array_inquirer.rb +50 -0
  8. data/lib/active_support/backtrace_cleaner.rb +234 -0
  9. data/lib/active_support/benchmark.rb +21 -0
  10. data/lib/active_support/benchmarkable.rb +53 -0
  11. data/lib/active_support/broadcast_logger.rb +238 -0
  12. data/lib/active_support/builder.rb +8 -0
  13. data/lib/active_support/cache/coder.rb +153 -0
  14. data/lib/active_support/cache/entry.rb +134 -0
  15. data/lib/active_support/cache/file_store.rb +244 -0
  16. data/lib/active_support/cache/mem_cache_store.rb +288 -0
  17. data/lib/active_support/cache/memory_store.rb +264 -0
  18. data/lib/active_support/cache/null_store.rb +62 -0
  19. data/lib/active_support/cache/redis_cache_store.rb +498 -0
  20. data/lib/active_support/cache/serializer_with_fallback.rb +152 -0
  21. data/lib/active_support/cache/strategy/local_cache.rb +246 -0
  22. data/lib/active_support/cache/strategy/local_cache_middleware.rb +45 -0
  23. data/lib/active_support/cache.rb +1170 -0
  24. data/lib/active_support/callbacks.rb +960 -0
  25. data/lib/active_support/class_attribute.rb +33 -0
  26. data/lib/active_support/code_generator.rb +79 -0
  27. data/lib/active_support/concern.rb +217 -0
  28. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +18 -0
  29. data/lib/active_support/concurrency/null_lock.rb +13 -0
  30. data/lib/active_support/concurrency/share_lock.rb +225 -0
  31. data/lib/active_support/concurrency/thread_monitor.rb +55 -0
  32. data/lib/active_support/configurable.rb +193 -0
  33. data/lib/active_support/configuration_file.rb +60 -0
  34. data/lib/active_support/continuous_integration.rb +145 -0
  35. data/lib/active_support/core_ext/array/access.rb +100 -0
  36. data/lib/active_support/core_ext/array/conversions.rb +209 -26
  37. data/lib/active_support/core_ext/array/extract.rb +21 -0
  38. data/lib/active_support/core_ext/array/extract_options.rb +31 -0
  39. data/lib/active_support/core_ext/array/grouping.rb +109 -0
  40. data/lib/active_support/core_ext/array/inquiry.rb +19 -0
  41. data/lib/active_support/core_ext/array/wrap.rb +48 -0
  42. data/lib/active_support/core_ext/array.rb +8 -4
  43. data/lib/active_support/core_ext/benchmark.rb +6 -0
  44. data/lib/active_support/core_ext/big_decimal/conversions.rb +14 -0
  45. data/lib/active_support/core_ext/big_decimal.rb +3 -0
  46. data/lib/active_support/core_ext/class/attribute.rb +137 -0
  47. data/lib/active_support/core_ext/class/attribute_accessors.rb +6 -0
  48. data/lib/active_support/core_ext/class/subclasses.rb +24 -0
  49. data/lib/active_support/core_ext/class.rb +4 -0
  50. data/lib/active_support/core_ext/date/acts_like.rb +10 -0
  51. data/lib/active_support/core_ext/date/blank.rb +18 -0
  52. data/lib/active_support/core_ext/date/calculations.rb +161 -0
  53. data/lib/active_support/core_ext/date/conversions.rb +95 -28
  54. data/lib/active_support/core_ext/date/zones.rb +8 -0
  55. data/lib/active_support/core_ext/date.rb +6 -5
  56. data/lib/active_support/core_ext/date_and_time/calculations.rb +374 -0
  57. data/lib/active_support/core_ext/date_and_time/compatibility.rb +23 -0
  58. data/lib/active_support/core_ext/date_and_time/zones.rb +40 -0
  59. data/lib/active_support/core_ext/date_time/acts_like.rb +16 -0
  60. data/lib/active_support/core_ext/date_time/blank.rb +18 -0
  61. data/lib/active_support/core_ext/date_time/calculations.rb +215 -0
  62. data/lib/active_support/core_ext/date_time/compatibility.rb +16 -0
  63. data/lib/active_support/core_ext/date_time/conversions.rb +108 -0
  64. data/lib/active_support/core_ext/date_time.rb +7 -0
  65. data/lib/active_support/core_ext/digest/uuid.rb +76 -0
  66. data/lib/active_support/core_ext/digest.rb +3 -0
  67. data/lib/active_support/core_ext/enumerable.rb +277 -7
  68. data/lib/active_support/core_ext/erb/util.rb +201 -0
  69. data/lib/active_support/core_ext/file/atomic.rb +72 -0
  70. data/lib/active_support/core_ext/file.rb +3 -0
  71. data/lib/active_support/core_ext/hash/conversions.rb +262 -0
  72. data/lib/active_support/core_ext/hash/deep_merge.rb +43 -0
  73. data/lib/active_support/core_ext/hash/deep_transform_values.rb +46 -0
  74. data/lib/active_support/core_ext/hash/except.rb +12 -0
  75. data/lib/active_support/core_ext/hash/indifferent_access.rb +19 -55
  76. data/lib/active_support/core_ext/hash/keys.rb +134 -44
  77. data/lib/active_support/core_ext/hash/reverse_merge.rb +22 -22
  78. data/lib/active_support/core_ext/hash/slice.rb +27 -0
  79. data/lib/active_support/core_ext/hash.rb +9 -8
  80. data/lib/active_support/core_ext/integer/inflections.rb +29 -13
  81. data/lib/active_support/core_ext/integer/multiple.rb +12 -0
  82. data/lib/active_support/core_ext/integer/time.rb +22 -0
  83. data/lib/active_support/core_ext/integer.rb +4 -6
  84. data/lib/active_support/core_ext/kernel/concern.rb +14 -0
  85. data/lib/active_support/core_ext/kernel/reporting.rb +45 -0
  86. data/lib/active_support/core_ext/kernel/singleton_class.rb +8 -0
  87. data/lib/active_support/core_ext/kernel.rb +4 -78
  88. data/lib/active_support/core_ext/load_error.rb +6 -35
  89. data/lib/active_support/core_ext/module/aliasing.rb +31 -0
  90. data/lib/active_support/core_ext/module/anonymous.rb +30 -0
  91. data/lib/active_support/core_ext/module/attr_internal.rb +48 -0
  92. data/lib/active_support/core_ext/module/attribute_accessors.rb +214 -0
  93. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +175 -0
  94. data/lib/active_support/core_ext/module/concerning.rb +140 -0
  95. data/lib/active_support/core_ext/module/delegation.rb +225 -0
  96. data/lib/active_support/core_ext/module/deprecation.rb +25 -0
  97. data/lib/active_support/core_ext/module/introspection.rb +65 -0
  98. data/lib/active_support/core_ext/module/redefine_method.rb +40 -0
  99. data/lib/active_support/core_ext/module/remove_method.rb +17 -0
  100. data/lib/active_support/core_ext/module.rb +13 -0
  101. data/lib/active_support/core_ext/name_error.rb +59 -0
  102. data/lib/active_support/core_ext/numeric/bytes.rb +73 -42
  103. data/lib/active_support/core_ext/numeric/conversions.rb +145 -0
  104. data/lib/active_support/core_ext/numeric/time.rb +64 -57
  105. data/lib/active_support/core_ext/numeric.rb +4 -6
  106. data/lib/active_support/core_ext/object/acts_like.rb +45 -0
  107. data/lib/active_support/core_ext/object/blank.rb +199 -0
  108. data/lib/active_support/core_ext/object/conversions.rb +6 -0
  109. data/lib/active_support/core_ext/object/deep_dup.rb +71 -0
  110. data/lib/active_support/core_ext/object/duplicable.rb +69 -0
  111. data/lib/active_support/core_ext/object/inclusion.rb +37 -0
  112. data/lib/active_support/core_ext/object/instance_variables.rb +32 -0
  113. data/lib/active_support/core_ext/object/json.rb +267 -0
  114. data/lib/active_support/core_ext/object/to_param.rb +3 -0
  115. data/lib/active_support/core_ext/object/to_query.rb +93 -0
  116. data/lib/active_support/core_ext/object/try.rb +158 -0
  117. data/lib/active_support/core_ext/object/with.rb +46 -0
  118. data/lib/active_support/core_ext/object/with_options.rb +101 -0
  119. data/lib/active_support/core_ext/object.rb +17 -0
  120. data/lib/active_support/core_ext/pathname/blank.rb +20 -0
  121. data/lib/active_support/core_ext/pathname/existence.rb +23 -0
  122. data/lib/active_support/core_ext/pathname.rb +4 -0
  123. data/lib/active_support/core_ext/range/compare_range.rb +57 -0
  124. data/lib/active_support/core_ext/range/conversions.rb +58 -17
  125. data/lib/active_support/core_ext/range/overlap.rb +40 -0
  126. data/lib/active_support/core_ext/range/sole.rb +17 -0
  127. data/lib/active_support/core_ext/range.rb +5 -4
  128. data/lib/active_support/core_ext/regexp.rb +14 -0
  129. data/lib/active_support/core_ext/securerandom.rb +57 -0
  130. data/lib/active_support/core_ext/string/access.rb +93 -56
  131. data/lib/active_support/core_ext/string/behavior.rb +8 -0
  132. data/lib/active_support/core_ext/string/conversions.rb +57 -16
  133. data/lib/active_support/core_ext/string/exclude.rb +13 -0
  134. data/lib/active_support/core_ext/string/filters.rb +151 -0
  135. data/lib/active_support/core_ext/string/indent.rb +45 -0
  136. data/lib/active_support/core_ext/string/inflections.rb +297 -54
  137. data/lib/active_support/core_ext/string/inquiry.rb +16 -0
  138. data/lib/active_support/core_ext/string/multibyte.rb +67 -0
  139. data/lib/active_support/core_ext/string/output_safety.rb +235 -0
  140. data/lib/active_support/core_ext/string/starts_ends_with.rb +4 -18
  141. data/lib/active_support/core_ext/string/strip.rb +27 -0
  142. data/lib/active_support/core_ext/string/zones.rb +16 -0
  143. data/lib/active_support/core_ext/string.rb +14 -10
  144. data/lib/active_support/core_ext/symbol/starts_ends_with.rb +6 -0
  145. data/lib/active_support/core_ext/symbol.rb +3 -0
  146. data/lib/active_support/core_ext/thread/backtrace/location.rb +7 -0
  147. data/lib/active_support/core_ext/time/acts_like.rb +10 -0
  148. data/lib/active_support/core_ext/time/calculations.rb +358 -153
  149. data/lib/active_support/core_ext/time/compatibility.rb +15 -0
  150. data/lib/active_support/core_ext/time/conversions.rb +69 -30
  151. data/lib/active_support/core_ext/time/zones.rb +97 -0
  152. data/lib/active_support/core_ext/time.rb +6 -6
  153. data/lib/active_support/core_ext.rb +5 -1
  154. data/lib/active_support/current_attributes/test_helper.rb +13 -0
  155. data/lib/active_support/current_attributes.rb +243 -0
  156. data/lib/active_support/deep_mergeable.rb +53 -0
  157. data/lib/active_support/delegation.rb +183 -0
  158. data/lib/active_support/dependencies/autoload.rb +72 -0
  159. data/lib/active_support/dependencies/interlock.rb +55 -0
  160. data/lib/active_support/dependencies/require_dependency.rb +28 -0
  161. data/lib/active_support/dependencies.rb +84 -222
  162. data/lib/active_support/deprecation/behaviors.rb +148 -0
  163. data/lib/active_support/deprecation/constant_accessor.rb +74 -0
  164. data/lib/active_support/deprecation/deprecators.rb +104 -0
  165. data/lib/active_support/deprecation/disallowed.rb +54 -0
  166. data/lib/active_support/deprecation/method_wrappers.rb +68 -0
  167. data/lib/active_support/deprecation/proxy_wrappers.rb +189 -0
  168. data/lib/active_support/deprecation/reporting.rb +162 -0
  169. data/lib/active_support/deprecation.rb +81 -0
  170. data/lib/active_support/deprecator.rb +7 -0
  171. data/lib/active_support/descendants_tracker.rb +112 -0
  172. data/lib/active_support/digest.rb +22 -0
  173. data/lib/active_support/duration/iso8601_parser.rb +123 -0
  174. data/lib/active_support/duration/iso8601_serializer.rb +64 -0
  175. data/lib/active_support/duration.rb +524 -0
  176. data/lib/active_support/editor.rb +70 -0
  177. data/lib/active_support/encrypted_configuration.rb +126 -0
  178. data/lib/active_support/encrypted_file.rb +133 -0
  179. data/lib/active_support/environment_inquirer.rb +40 -0
  180. data/lib/active_support/error_reporter/test_helper.rb +15 -0
  181. data/lib/active_support/error_reporter.rb +318 -0
  182. data/lib/active_support/event_reporter/test_helper.rb +32 -0
  183. data/lib/active_support/event_reporter.rb +592 -0
  184. data/lib/active_support/evented_file_update_checker.rb +185 -0
  185. data/lib/active_support/execution_context/test_helper.rb +13 -0
  186. data/lib/active_support/execution_context.rb +110 -0
  187. data/lib/active_support/execution_wrapper.rb +150 -0
  188. data/lib/active_support/executor/test_helper.rb +7 -0
  189. data/lib/active_support/executor.rb +8 -0
  190. data/lib/active_support/file_update_checker.rb +166 -0
  191. data/lib/active_support/fork_tracker.rb +43 -0
  192. data/lib/active_support/gem_version.rb +17 -0
  193. data/lib/active_support/gzip.rb +41 -0
  194. data/lib/active_support/hash_with_indifferent_access.rb +464 -0
  195. data/lib/active_support/html_safe_translation.rb +56 -0
  196. data/lib/active_support/i18n.rb +17 -0
  197. data/lib/active_support/i18n_railtie.rb +140 -0
  198. data/lib/active_support/inflections.rb +68 -49
  199. data/lib/active_support/inflector/inflections.rb +290 -0
  200. data/lib/active_support/inflector/methods.rb +387 -0
  201. data/lib/active_support/inflector/transliterate.rb +147 -0
  202. data/lib/active_support/inflector.rb +7 -164
  203. data/lib/active_support/isolated_execution_state.rb +76 -0
  204. data/lib/active_support/json/decoding.rb +78 -0
  205. data/lib/active_support/json/encoding.rb +256 -0
  206. data/lib/active_support/json.rb +4 -0
  207. data/lib/active_support/key_generator.rb +66 -0
  208. data/lib/active_support/lazy_load_hooks.rb +107 -0
  209. data/lib/active_support/locale/en.rb +33 -0
  210. data/lib/active_support/locale/en.yml +141 -0
  211. data/lib/active_support/log_subscriber/test_helper.rb +106 -0
  212. data/lib/active_support/log_subscriber.rb +188 -0
  213. data/lib/active_support/logger.rb +55 -0
  214. data/lib/active_support/logger_silence.rb +21 -0
  215. data/lib/active_support/logger_thread_safe_level.rb +50 -0
  216. data/lib/active_support/message_encryptor.rb +374 -0
  217. data/lib/active_support/message_encryptors.rb +193 -0
  218. data/lib/active_support/message_pack/cache_serializer.rb +23 -0
  219. data/lib/active_support/message_pack/extensions.rb +310 -0
  220. data/lib/active_support/message_pack/serializer.rb +63 -0
  221. data/lib/active_support/message_pack.rb +50 -0
  222. data/lib/active_support/message_verifier.rb +377 -0
  223. data/lib/active_support/message_verifiers.rb +189 -0
  224. data/lib/active_support/messages/codec.rb +65 -0
  225. data/lib/active_support/messages/metadata.rb +146 -0
  226. data/lib/active_support/messages/rotation_configuration.rb +23 -0
  227. data/lib/active_support/messages/rotation_coordinator.rb +102 -0
  228. data/lib/active_support/messages/rotator.rb +69 -0
  229. data/lib/active_support/messages/serializer_with_fallback.rb +158 -0
  230. data/lib/active_support/multibyte/chars.rb +188 -0
  231. data/lib/active_support/multibyte/unicode.rb +42 -0
  232. data/lib/active_support/multibyte.rb +27 -0
  233. data/lib/active_support/notifications/fanout.rb +467 -0
  234. data/lib/active_support/notifications/instrumenter.rb +240 -0
  235. data/lib/active_support/notifications.rb +281 -0
  236. data/lib/active_support/number_helper/number_converter.rb +190 -0
  237. data/lib/active_support/number_helper/number_to_currency_converter.rb +46 -0
  238. data/lib/active_support/number_helper/number_to_delimited_converter.rb +30 -0
  239. data/lib/active_support/number_helper/number_to_human_converter.rb +69 -0
  240. data/lib/active_support/number_helper/number_to_human_size_converter.rb +60 -0
  241. data/lib/active_support/number_helper/number_to_percentage_converter.rb +16 -0
  242. data/lib/active_support/number_helper/number_to_phone_converter.rb +60 -0
  243. data/lib/active_support/number_helper/number_to_rounded_converter.rb +59 -0
  244. data/lib/active_support/number_helper/rounding_helper.rb +46 -0
  245. data/lib/active_support/number_helper.rb +479 -0
  246. data/lib/active_support/option_merger.rb +38 -0
  247. data/lib/active_support/ordered_hash.rb +50 -0
  248. data/lib/active_support/ordered_options.rb +141 -25
  249. data/lib/active_support/parameter_filter.rb +157 -0
  250. data/lib/active_support/rails.rb +26 -0
  251. data/lib/active_support/railtie.rb +180 -0
  252. data/lib/active_support/reloader.rb +138 -0
  253. data/lib/active_support/rescuable.rb +176 -0
  254. data/lib/active_support/secure_compare_rotator.rb +58 -0
  255. data/lib/active_support/security_utils.rb +38 -0
  256. data/lib/active_support/string_inquirer.rb +35 -0
  257. data/lib/active_support/structured_event_subscriber.rb +99 -0
  258. data/lib/active_support/subscriber.rb +141 -0
  259. data/lib/active_support/syntax_error_proxy.rb +67 -0
  260. data/lib/active_support/tagged_logging.rb +157 -0
  261. data/lib/active_support/test_case.rb +365 -0
  262. data/lib/active_support/testing/assertions.rb +369 -0
  263. data/lib/active_support/testing/autorun.rb +10 -0
  264. data/lib/active_support/testing/constant_lookup.rb +51 -0
  265. data/lib/active_support/testing/constant_stubbing.rb +54 -0
  266. data/lib/active_support/testing/declarative.rb +28 -0
  267. data/lib/active_support/testing/deprecation.rb +82 -0
  268. data/lib/active_support/testing/error_reporter_assertions.rb +124 -0
  269. data/lib/active_support/testing/event_reporter_assertions.rb +227 -0
  270. data/lib/active_support/testing/file_fixtures.rb +38 -0
  271. data/lib/active_support/testing/isolation.rb +121 -0
  272. data/lib/active_support/testing/method_call_assertions.rb +69 -0
  273. data/lib/active_support/testing/notification_assertions.rb +92 -0
  274. data/lib/active_support/testing/parallelization/server.rb +98 -0
  275. data/lib/active_support/testing/parallelization/worker.rb +107 -0
  276. data/lib/active_support/testing/parallelization.rb +79 -0
  277. data/lib/active_support/testing/parallelize_executor.rb +81 -0
  278. data/lib/active_support/testing/setup_and_teardown.rb +57 -0
  279. data/lib/active_support/testing/stream.rb +41 -0
  280. data/lib/active_support/testing/tagged_logging.rb +27 -0
  281. data/lib/active_support/testing/tests_without_assertions.rb +19 -0
  282. data/lib/active_support/testing/time_helpers.rb +273 -0
  283. data/lib/active_support/time.rb +20 -0
  284. data/lib/active_support/time_with_zone.rb +613 -0
  285. data/lib/active_support/values/time_zone.rb +599 -158
  286. data/lib/active_support/version.rb +7 -6
  287. data/lib/active_support/xml_mini/jdom.rb +175 -0
  288. data/lib/active_support/xml_mini/libxml.rb +80 -0
  289. data/lib/active_support/xml_mini/libxmlsax.rb +83 -0
  290. data/lib/active_support/xml_mini/nokogiri.rb +83 -0
  291. data/lib/active_support/xml_mini/nokogirisax.rb +86 -0
  292. data/lib/active_support/xml_mini/rexml.rb +137 -0
  293. data/lib/active_support/xml_mini.rb +212 -0
  294. data/lib/active_support.rb +122 -10
  295. metadata +524 -93
  296. data/CHANGELOG +0 -283
  297. data/lib/active_support/binding_of_caller.rb +0 -84
  298. data/lib/active_support/breakpoint.rb +0 -523
  299. data/lib/active_support/class_attribute_accessors.rb +0 -57
  300. data/lib/active_support/class_inheritable_attributes.rb +0 -117
  301. data/lib/active_support/clean_logger.rb +0 -36
  302. data/lib/active_support/core_ext/blank.rb +0 -38
  303. data/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +0 -14
  304. data/lib/active_support/core_ext/cgi.rb +0 -5
  305. data/lib/active_support/core_ext/exception.rb +0 -29
  306. data/lib/active_support/core_ext/integer/even_odd.rb +0 -24
  307. data/lib/active_support/core_ext/object_and_class.rb +0 -44
  308. data/lib/active_support/module_attribute_accessors.rb +0 -57
  309. data/lib/active_support/whiny_nil.rb +0 -38
@@ -1,53 +1,143 @@
1
- module ActiveSupport #:nodoc:
2
- module CoreExtensions #:nodoc:
3
- module Hash #:nodoc:
4
- module Keys
5
- # Return a new hash with all keys converted to strings.
6
- def stringify_keys
7
- inject({}) do |options, (key, value)|
8
- options[key.to_s] = value
9
- options
10
- end
11
- end
1
+ # frozen_string_literal: true
12
2
 
13
- # Destructively convert all keys to strings.
14
- def stringify_keys!
15
- keys.each do |key|
16
- unless key.class.to_s == "String" # weird hack to make the tests run when string_ext_test.rb is also running
17
- self[key.to_s] = self[key]
18
- delete(key)
19
- end
20
- end
21
- self
22
- end
3
+ class Hash
4
+ # Returns a new hash with all keys converted to strings.
5
+ #
6
+ # hash = { name: 'Rob', age: '28' }
7
+ #
8
+ # hash.stringify_keys
9
+ # # => {"name"=>"Rob", "age"=>"28"}
10
+ def stringify_keys
11
+ transform_keys { |k| Symbol === k ? k.name : k.to_s }
12
+ end
23
13
 
24
- # Return a new hash with all keys converted to symbols.
25
- def symbolize_keys
26
- inject({}) do |options, (key, value)|
27
- options[key.to_sym] = value
28
- options
29
- end
30
- end
14
+ # Destructively converts all keys to strings. Same as
15
+ # +stringify_keys+, but modifies +self+.
16
+ def stringify_keys!
17
+ transform_keys! { |k| Symbol === k ? k.name : k.to_s }
18
+ end
31
19
 
32
- # Destructively convert all keys to symbols.
33
- def symbolize_keys!
34
- keys.each do |key|
35
- unless key.is_a?(Symbol)
36
- self[key.to_sym] = self[key]
37
- delete(key)
38
- end
39
- end
40
- self
41
- end
20
+ # Returns a new hash with all keys converted to symbols, as long as
21
+ # they respond to +to_sym+.
22
+ #
23
+ # hash = { 'name' => 'Rob', 'age' => '28' }
24
+ #
25
+ # hash.symbolize_keys
26
+ # # => {:name=>"Rob", :age=>"28"}
27
+ def symbolize_keys
28
+ transform_keys { |key| key.to_sym rescue key }
29
+ end
30
+ alias_method :to_options, :symbolize_keys
42
31
 
43
- alias_method :to_options, :symbolize_keys
44
- alias_method :to_options!, :symbolize_keys!
32
+ # Destructively converts all keys to symbols, as long as they respond
33
+ # to +to_sym+. Same as +symbolize_keys+, but modifies +self+.
34
+ def symbolize_keys!
35
+ transform_keys! { |key| key.to_sym rescue key }
36
+ end
37
+ alias_method :to_options!, :symbolize_keys!
45
38
 
46
- def assert_valid_keys(*valid_keys)
47
- unknown_keys = keys - [valid_keys].flatten
48
- raise(ArgumentError, "Unknown key(s): #{unknown_keys.join(", ")}") unless unknown_keys.empty?
49
- end
39
+ # Validates all keys in a hash match <tt>*valid_keys</tt>, raising
40
+ # +ArgumentError+ on a mismatch.
41
+ #
42
+ # Note that keys are treated differently than HashWithIndifferentAccess,
43
+ # meaning that string and symbol keys will not match.
44
+ #
45
+ # { name: 'Rob', years: '28' }.assert_valid_keys(:name, :age) # => raises "ArgumentError: Unknown key: :years. Valid keys are: :name, :age"
46
+ # { name: 'Rob', age: '28' }.assert_valid_keys('name', 'age') # => raises "ArgumentError: Unknown key: :name. Valid keys are: 'name', 'age'"
47
+ # { name: 'Rob', age: '28' }.assert_valid_keys(:name, :age) # => passes, raises nothing
48
+ def assert_valid_keys(*valid_keys)
49
+ valid_keys.flatten!
50
+ each_key do |k|
51
+ unless valid_keys.include?(k)
52
+ raise ArgumentError.new("Unknown key: #{k.inspect}. Valid keys are: #{valid_keys.map(&:inspect).join(', ')}")
50
53
  end
51
54
  end
52
55
  end
56
+
57
+ # Returns a new hash with all keys converted by the block operation.
58
+ # This includes the keys from the root hash and from all
59
+ # nested hashes and arrays.
60
+ #
61
+ # hash = { person: { name: 'Rob', age: '28' } }
62
+ #
63
+ # hash.deep_transform_keys{ |key| key.to_s.upcase }
64
+ # # => {"PERSON"=>{"NAME"=>"Rob", "AGE"=>"28"}}
65
+ def deep_transform_keys(&block)
66
+ _deep_transform_keys_in_object(self, &block)
67
+ end
68
+
69
+ # Destructively converts all keys by using the block operation.
70
+ # This includes the keys from the root hash and from all
71
+ # nested hashes and arrays.
72
+ def deep_transform_keys!(&block)
73
+ _deep_transform_keys_in_object!(self, &block)
74
+ end
75
+
76
+ # Returns a new hash with all keys converted to strings.
77
+ # This includes the keys from the root hash and from all
78
+ # nested hashes and arrays.
79
+ #
80
+ # hash = { person: { name: 'Rob', age: '28' } }
81
+ #
82
+ # hash.deep_stringify_keys
83
+ # # => {"person"=>{"name"=>"Rob", "age"=>"28"}}
84
+ def deep_stringify_keys
85
+ deep_transform_keys { |k| Symbol === k ? k.name : k.to_s }
86
+ end
87
+
88
+ # Destructively converts all keys to strings.
89
+ # This includes the keys from the root hash and from all
90
+ # nested hashes and arrays.
91
+ def deep_stringify_keys!
92
+ deep_transform_keys! { |k| Symbol === k ? k.name : k.to_s }
93
+ end
94
+
95
+ # Returns a new hash with all keys converted to symbols, as long as
96
+ # they respond to +to_sym+. This includes the keys from the root hash
97
+ # and from all nested hashes and arrays.
98
+ #
99
+ # hash = { 'person' => { 'name' => 'Rob', 'age' => '28' } }
100
+ #
101
+ # hash.deep_symbolize_keys
102
+ # # => {:person=>{:name=>"Rob", :age=>"28"}}
103
+ def deep_symbolize_keys
104
+ deep_transform_keys { |key| key.to_sym rescue key }
105
+ end
106
+
107
+ # Destructively converts all keys to symbols, as long as they respond
108
+ # to +to_sym+. This includes the keys from the root hash and from all
109
+ # nested hashes and arrays.
110
+ def deep_symbolize_keys!
111
+ deep_transform_keys! { |key| key.to_sym rescue key }
112
+ end
113
+
114
+ private
115
+ # Support methods for deep transforming nested hashes and arrays.
116
+ def _deep_transform_keys_in_object(object, &block)
117
+ case object
118
+ when Hash
119
+ object.each_with_object(self.class.new) do |(key, value), result|
120
+ result[yield(key)] = _deep_transform_keys_in_object(value, &block)
121
+ end
122
+ when Array
123
+ object.map { |e| _deep_transform_keys_in_object(e, &block) }
124
+ else
125
+ object
126
+ end
127
+ end
128
+
129
+ def _deep_transform_keys_in_object!(object, &block)
130
+ case object
131
+ when Hash
132
+ object.keys.each do |key|
133
+ value = object.delete(key)
134
+ object[yield(key)] = _deep_transform_keys_in_object!(value, &block)
135
+ end
136
+ object
137
+ when Array
138
+ object.map! { |e| _deep_transform_keys_in_object!(e, &block) }
139
+ else
140
+ object
141
+ end
142
+ end
53
143
  end
@@ -1,25 +1,25 @@
1
- module ActiveSupport #:nodoc:
2
- module CoreExtensions #:nodoc:
3
- module Hash #:nodoc:
4
- # Allows for reverse merging where its the keys in the calling hash that wins over those in the <tt>other_hash</tt>.
5
- # This is particularly useful for initializing an incoming option hash with default values:
6
- #
7
- # def setup(options = {})
8
- # options.reverse_merge! :size => 25, :velocity => 10
9
- # end
10
- #
11
- # The default :size and :velocity is only set if the +options+ passed in doesn't already have those keys set.
12
- module ReverseMerge
13
- def reverse_merge(other_hash)
14
- other_hash.merge(self)
15
- end
1
+ # frozen_string_literal: true
16
2
 
17
- def reverse_merge!(other_hash)
18
- replace(reverse_merge(other_hash))
19
- end
3
+ class Hash
4
+ # Merges the caller into +other_hash+. For example,
5
+ #
6
+ # options = options.reverse_merge(size: 25, velocity: 10)
7
+ #
8
+ # is equivalent to
9
+ #
10
+ # options = { size: 25, velocity: 10 }.merge(options)
11
+ #
12
+ # This is particularly useful for initializing an options hash
13
+ # with default values.
14
+ def reverse_merge(other_hash)
15
+ other_hash.merge(self)
16
+ end
17
+ alias_method :with_defaults, :reverse_merge
20
18
 
21
- alias_method :reverse_update, :reverse_merge
22
- end
23
- end
19
+ # Destructive +reverse_merge+.
20
+ def reverse_merge!(other_hash)
21
+ replace(reverse_merge(other_hash))
24
22
  end
25
- end
23
+ alias_method :reverse_update, :reverse_merge!
24
+ alias_method :with_defaults!, :reverse_merge!
25
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Hash
4
+ # Replaces the hash with only the given keys.
5
+ # Returns a hash containing the removed key/value pairs.
6
+ #
7
+ # hash = { a: 1, b: 2, c: 3, d: 4 }
8
+ # hash.slice!(:a, :b) # => {:c=>3, :d=>4}
9
+ # hash # => {:a=>1, :b=>2}
10
+ def slice!(*keys)
11
+ omit = slice(*self.keys - keys)
12
+ hash = slice(*keys)
13
+ hash.default = default
14
+ hash.default_proc = default_proc if default_proc
15
+ replace(hash)
16
+ omit
17
+ end
18
+
19
+ # Removes and returns the key/value pairs matching the given keys.
20
+ #
21
+ # hash = { a: 1, b: 2, c: 3, d: 4 }
22
+ # hash.extract!(:a, :b) # => {:a=>1, :b=>2}
23
+ # hash # => {:c=>3, :d=>4}
24
+ def extract!(*keys)
25
+ keys.each_with_object(self.class.new) { |key, result| result[key] = delete(key) if has_key?(key) }
26
+ end
27
+ end
@@ -1,9 +1,10 @@
1
- require File.dirname(__FILE__) + '/hash/keys'
2
- require File.dirname(__FILE__) + '/hash/indifferent_access'
3
- require File.dirname(__FILE__) + '/hash/reverse_merge'
1
+ # frozen_string_literal: true
4
2
 
5
- class Hash #:nodoc:
6
- include ActiveSupport::CoreExtensions::Hash::Keys
7
- include ActiveSupport::CoreExtensions::Hash::IndifferentAccess
8
- include ActiveSupport::CoreExtensions::Hash::ReverseMerge
9
- end
3
+ require_relative "hash/conversions"
4
+ require_relative "hash/deep_merge"
5
+ require_relative "hash/deep_transform_values"
6
+ require_relative "hash/except"
7
+ require_relative "hash/indifferent_access"
8
+ require_relative "hash/keys"
9
+ require_relative "hash/reverse_merge"
10
+ require_relative "hash/slice"
@@ -1,15 +1,31 @@
1
- require File.dirname(__FILE__) + '/../../inflector'
2
- module ActiveSupport #:nodoc:
3
- module CoreExtensions #:nodoc:
4
- module Integer #:nodoc:
5
- module Inflections
6
- # 1.ordinalize # => "1st"
7
- # 3.ordinalize # => "3rd"
8
- # 10.ordinalize # => "10th"
9
- def ordinalize
10
- Inflector.ordinalize(self)
11
- end
12
- end
13
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/inflector"
4
+
5
+ class Integer
6
+ # Ordinalize turns a number into an ordinal string used to denote the
7
+ # position in an ordered sequence such as 1st, 2nd, 3rd, 4th.
8
+ #
9
+ # 1.ordinalize # => "1st"
10
+ # 2.ordinalize # => "2nd"
11
+ # 1002.ordinalize # => "1002nd"
12
+ # 1003.ordinalize # => "1003rd"
13
+ # -11.ordinalize # => "-11th"
14
+ # -1001.ordinalize # => "-1001st"
15
+ def ordinalize
16
+ ActiveSupport::Inflector.ordinalize(self)
17
+ end
18
+
19
+ # Ordinal returns the suffix used to denote the position
20
+ # in an ordered sequence such as 1st, 2nd, 3rd, 4th.
21
+ #
22
+ # 1.ordinal # => "st"
23
+ # 2.ordinal # => "nd"
24
+ # 1002.ordinal # => "nd"
25
+ # 1003.ordinal # => "rd"
26
+ # -11.ordinal # => "th"
27
+ # -1001.ordinal # => "st"
28
+ def ordinal
29
+ ActiveSupport::Inflector.ordinal(self)
14
30
  end
15
31
  end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Integer
4
+ # Check whether the integer is evenly divisible by the argument.
5
+ #
6
+ # 0.multiple_of?(0) # => true
7
+ # 6.multiple_of?(5) # => false
8
+ # 10.multiple_of?(2) # => true
9
+ def multiple_of?(number)
10
+ number == 0 ? self == 0 : self % number == 0
11
+ end
12
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/duration"
4
+ require "active_support/core_ext/numeric/time"
5
+
6
+ class Integer
7
+ # Returns a Duration instance matching the number of months provided.
8
+ #
9
+ # 2.months # => 2 months
10
+ def months
11
+ ActiveSupport::Duration.months(self)
12
+ end
13
+ alias :month :months
14
+
15
+ # Returns a Duration instance matching the number of years provided.
16
+ #
17
+ # 2.years # => 2 years
18
+ def years
19
+ ActiveSupport::Duration.years(self)
20
+ end
21
+ alias :year :years
22
+ end
@@ -1,7 +1,5 @@
1
- require File.dirname(__FILE__) + '/integer/even_odd'
2
- require File.dirname(__FILE__) + '/integer/inflections'
1
+ # frozen_string_literal: true
3
2
 
4
- class Integer #:nodoc:
5
- include ActiveSupport::CoreExtensions::Integer::EvenOdd
6
- include ActiveSupport::CoreExtensions::Integer::Inflections
7
- end
3
+ require_relative "integer/multiple"
4
+ require_relative "integer/inflections"
5
+ require_relative "integer/time"
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/module/concerning"
4
+
5
+ module Kernel
6
+ module_function
7
+
8
+ # A shortcut to define a toplevel concern, not within a module.
9
+ #
10
+ # See Module::Concerning for more.
11
+ def concern(topic, &module_definition)
12
+ Object.concern topic, &module_definition
13
+ end
14
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kernel
4
+ module_function
5
+
6
+ # Sets $VERBOSE to +nil+ for the duration of the block and back to its original
7
+ # value afterwards.
8
+ #
9
+ # silence_warnings do
10
+ # value = noisy_call # no warning voiced
11
+ # end
12
+ #
13
+ # noisy_call # warning voiced
14
+ def silence_warnings(&block)
15
+ with_warnings(nil, &block)
16
+ end
17
+
18
+ # Sets $VERBOSE to +true+ for the duration of the block and back to its
19
+ # original value afterwards.
20
+ def enable_warnings(&block)
21
+ with_warnings(true, &block)
22
+ end
23
+
24
+ # Sets $VERBOSE for the duration of the block and back to its original
25
+ # value afterwards.
26
+ def with_warnings(flag)
27
+ old_verbose, $VERBOSE = $VERBOSE, flag
28
+ yield
29
+ ensure
30
+ $VERBOSE = old_verbose
31
+ end
32
+
33
+ # Blocks and ignores any exception passed as argument if raised within the block.
34
+ #
35
+ # suppress(ZeroDivisionError) do
36
+ # 1/0
37
+ # puts 'This code is NOT reached'
38
+ # end
39
+ #
40
+ # puts 'This code gets executed and nothing related to ZeroDivisionError was seen'
41
+ def suppress(*exception_classes)
42
+ yield
43
+ rescue *exception_classes
44
+ end
45
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kernel
4
+ # class_eval on an object acts like +singleton_class.class_eval+.
5
+ def class_eval(*args, &block)
6
+ singleton_class.class_eval(*args, &block)
7
+ end
8
+ end
@@ -1,79 +1,5 @@
1
- class Object
2
- # A Ruby-ized realization of the K combinator, courtesy of Mikael Brockman.
3
- #
4
- # def foo
5
- # returning values = [] do
6
- # values << 'bar'
7
- # values << 'baz'
8
- # end
9
- # end
10
- #
11
- # foo # => ['bar', 'baz']
12
- #
13
- def returning(value)
14
- yield
15
- value
16
- end
17
-
18
- # Sets $VERBOSE to nil for the duration of the block and back to its original value afterwards.
19
- #
20
- # silence_warnings do
21
- # value = noisy_call # no warning voiced
22
- # end
23
- #
24
- # noisy_call # warning voiced
25
- def silence_warnings
26
- old_verbose, $VERBOSE = $VERBOSE, nil
27
- yield
28
- ensure
29
- $VERBOSE = old_verbose
30
- end
1
+ # frozen_string_literal: true
31
2
 
32
- # Silences stderr for the duration of the block.
33
- #
34
- # silence_stderr do
35
- # $stderr.puts 'This will never be seen'
36
- # end
37
- #
38
- # $stderr.puts 'But this will'
39
- def silence_stderr
40
- old_stderr = STDERR.dup
41
- STDERR.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
42
- STDERR.sync = true
43
- yield
44
- ensure
45
- STDERR.reopen(old_stderr)
46
- end
47
-
48
- # Makes backticks behave (somewhat more) similarly on all platforms.
49
- # On win32 `nonexistent_command` raises Errno::ENOENT; on Unix, the
50
- # spawned shell prints a message to stderr and sets $?. We emulate
51
- # Unix on the former but not the latter.
52
- def `(command) #:nodoc:
53
- super
54
- rescue Errno::ENOENT => e
55
- STDERR.puts "#$0: #{e}"
56
- end
57
-
58
- # Method that requires a library, ensuring that rubygems is loaded
59
- def require_library_or_gem(library_name)
60
- begin
61
- require library_name
62
- rescue LoadError => cannot_require
63
- # 1. Requiring the module is unsuccessful, maybe it's a gem and nobody required rubygems yet. Try.
64
- begin
65
- require 'rubygems'
66
- rescue LoadError => rubygems_not_installed
67
- raise cannot_require
68
- end
69
- # 2. Rubygems is installed and loaded. Try to load the library again
70
- begin
71
- require library_name
72
- rescue LoadError => gem_not_installed
73
- raise cannot_require
74
- end
75
- end
76
- end
77
-
78
-
79
- end
3
+ require_relative "kernel/concern"
4
+ require_relative "kernel/reporting"
5
+ require_relative "kernel/singleton_class"
@@ -1,38 +1,9 @@
1
- class MissingSourceFile < LoadError #:nodoc:
2
- attr_reader :path
3
- def initialize(message, path)
4
- super(message)
5
- @path = path
6
- end
7
-
8
- def is_missing?(path)
9
- path.gsub(/\.rb$/, '') == self.path.gsub(/\.rb$/, '')
10
- end
11
-
12
- def self.from_message(message)
13
- REGEXPS.each do |regexp, capture|
14
- match = regexp.match(message)
15
- return MissingSourceFile.new(message, match[capture]) unless match.nil?
16
- end
17
- nil
18
- end
19
-
20
- REGEXPS = [
21
- [/^no such file to load -- (.+)$/i, 1],
22
- [/^Missing \w+ (file\s*)?([^\s]+.rb)$/i, 2],
23
- [/^Missing API definition file in (.+)$/i, 1]
24
- ]
25
- end
1
+ # frozen_string_literal: true
26
2
 
27
- module ActiveSupport #:nodoc:
28
- module CoreExtensions #:nodoc:
29
- module LoadErrorExtensions #:nodoc:
30
- module LoadErrorClassMethods #:nodoc:
31
- def new(*args)
32
- (self == LoadError && MissingSourceFile.from_message(args.first)) || super
33
- end
34
- end
35
- ::LoadError.extend(LoadErrorClassMethods)
36
- end
3
+ class LoadError
4
+ # Returns true if the given path name (except perhaps for the ".rb"
5
+ # extension) is the missing file which caused the exception to be raised.
6
+ def is_missing?(location)
7
+ location.delete_suffix(".rb") == path.to_s.delete_suffix(".rb")
37
8
  end
38
9
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Module
4
+ # Allows you to make aliases for attributes, which includes
5
+ # getter, setter, and a predicate.
6
+ #
7
+ # class Content < ActiveRecord::Base
8
+ # # has a title attribute
9
+ # end
10
+ #
11
+ # class Email < Content
12
+ # alias_attribute :subject, :title
13
+ # end
14
+ #
15
+ # e = Email.find(1)
16
+ # e.title # => "Superstars"
17
+ # e.subject # => "Superstars"
18
+ # e.subject? # => true
19
+ # e.subject = "Megastars"
20
+ # e.title # => "Megastars"
21
+ def alias_attribute(new_name, old_name)
22
+ # The following reader methods use an explicit `self` receiver in order to
23
+ # support aliases that start with an uppercase letter. Otherwise, they would
24
+ # be resolved as constants instead.
25
+ module_eval <<-STR, __FILE__, __LINE__ + 1
26
+ def #{new_name}; self.#{old_name}; end # def subject; self.title; end
27
+ def #{new_name}?; self.#{old_name}?; end # def subject?; self.title?; end
28
+ def #{new_name}=(v); self.#{old_name} = v; end # def subject=(v); self.title = v; end
29
+ STR
30
+ end
31
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Module
4
+ # A module may or may not have a name.
5
+ #
6
+ # module M; end
7
+ # M.name # => "M"
8
+ #
9
+ # m = Module.new
10
+ # m.name # => nil
11
+ #
12
+ # +anonymous?+ method returns true if module does not have a name, false otherwise:
13
+ #
14
+ # Module.new.anonymous? # => true
15
+ #
16
+ # module M; end
17
+ # M.anonymous? # => false
18
+ #
19
+ # A module gets a name when it is first assigned to a constant. Either
20
+ # via the +module+ or +class+ keyword or by an explicit assignment:
21
+ #
22
+ # m = Module.new # creates an anonymous module
23
+ # m.anonymous? # => true
24
+ # M = m # m gets a name here as a side-effect
25
+ # m.name # => "M"
26
+ # m.anonymous? # => false
27
+ def anonymous?
28
+ name.nil?
29
+ end
30
+ end