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
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveSupport
4
+ # = Lazy Load Hooks
5
+ #
6
+ # LazyLoadHooks allows \Rails to lazily load a lot of components and thus
7
+ # making the app boot faster. Because of this feature now there is no need to
8
+ # require +ActiveRecord::Base+ at boot time purely to apply
9
+ # configuration. Instead a hook is registered that applies configuration once
10
+ # +ActiveRecord::Base+ is loaded. Here +ActiveRecord::Base+ is
11
+ # used as example but this feature can be applied elsewhere too.
12
+ #
13
+ # Here is an example where on_load method is called to register a hook.
14
+ #
15
+ # initializer 'active_record.initialize_timezone' do
16
+ # ActiveSupport.on_load(:active_record) do
17
+ # self.time_zone_aware_attributes = true
18
+ # self.default_timezone = :utc
19
+ # end
20
+ # end
21
+ #
22
+ # When the entirety of +ActiveRecord::Base+ has been
23
+ # evaluated then run_load_hooks is invoked. The very last line of
24
+ # +ActiveRecord::Base+ is:
25
+ #
26
+ # ActiveSupport.run_load_hooks(:active_record, ActiveRecord::Base)
27
+ #
28
+ # run_load_hooks will then execute all the hooks that were registered
29
+ # with the on_load method. In the case of the above example, it will
30
+ # execute the block of code that is in the +initializer+.
31
+ #
32
+ # Registering a hook that has already run results in that hook executing
33
+ # immediately. This allows hooks to be nested for code that relies on
34
+ # multiple lazily loaded components:
35
+ #
36
+ # initializer "action_text.renderer" do
37
+ # ActiveSupport.on_load(:action_controller_base) do
38
+ # ActiveSupport.on_load(:action_text_content) do
39
+ # self.default_renderer = Class.new(ActionController::Base).renderer
40
+ # end
41
+ # end
42
+ # end
43
+ module LazyLoadHooks
44
+ def self.extended(base) # :nodoc:
45
+ base.class_eval do
46
+ @load_hooks = Hash.new { |h, k| h[k] = [] }
47
+ @loaded = Hash.new { |h, k| h[k] = [] }
48
+ @run_once = Hash.new { |h, k| h[k] = [] }
49
+ end
50
+ end
51
+
52
+ # Declares a block that will be executed when a \Rails component is fully
53
+ # loaded. If the component has already loaded, the block is executed
54
+ # immediately.
55
+ #
56
+ # ==== Options
57
+ #
58
+ # * <tt>:yield</tt> - Yields the object that run_load_hooks to +block+.
59
+ # * <tt>:run_once</tt> - Given +block+ will run only once.
60
+ def on_load(name, options = {}, &block)
61
+ @loaded[name].each do |base|
62
+ execute_hook(name, base, options, block)
63
+ end
64
+
65
+ @load_hooks[name] << [block, options]
66
+ end
67
+
68
+ # Executes all blocks registered to +name+ via on_load, using +base+ as the
69
+ # evaluation context.
70
+ #
71
+ # ActiveSupport.run_load_hooks(:active_record, ActiveRecord::Base)
72
+ #
73
+ # In the case of the above example, it will execute all hooks registered
74
+ # for +:active_record+ within the class +ActiveRecord::Base+.
75
+ def run_load_hooks(name, base = Object)
76
+ @loaded[name] << base
77
+ @load_hooks[name].each do |hook, options|
78
+ execute_hook(name, base, options, hook)
79
+ end
80
+ end
81
+
82
+ private
83
+ def with_execution_control(name, block, once)
84
+ unless @run_once[name].include?(block)
85
+ @run_once[name] << block if once
86
+
87
+ yield
88
+ end
89
+ end
90
+
91
+ def execute_hook(name, base, options, block)
92
+ with_execution_control(name, block, options[:run_once]) do
93
+ if options[:yield]
94
+ block.call(base)
95
+ else
96
+ if base.is_a?(Module)
97
+ base.class_eval(&block)
98
+ else
99
+ base.instance_eval(&block)
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+
106
+ extend LazyLoadHooks
107
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ {
4
+ en: {
5
+ number: {
6
+ nth: {
7
+ ordinals: lambda do |_key, options|
8
+ number = options[:number]
9
+ case number
10
+ when 1; "st"
11
+ when 2; "nd"
12
+ when 3; "rd"
13
+ when 4, 5, 6, 7, 8, 9, 10, 11, 12, 13; "th"
14
+ else
15
+ num_modulo = number.to_i.abs % 100
16
+ num_modulo %= 10 if num_modulo > 13
17
+ case num_modulo
18
+ when 1; "st"
19
+ when 2; "nd"
20
+ when 3; "rd"
21
+ else "th"
22
+ end
23
+ end
24
+ end,
25
+
26
+ ordinalized: lambda do |_key, options|
27
+ number = options[:number]
28
+ "#{number}#{ActiveSupport::Inflector.ordinal(number)}"
29
+ end
30
+ }
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,141 @@
1
+ en:
2
+ date:
3
+ formats:
4
+ # Use the strftime parameters for formats.
5
+ # When no format has been given, it uses default.
6
+ # You can provide other formats here if you like!
7
+ default: "%Y-%m-%d"
8
+ short: "%b %d"
9
+ long: "%B %d, %Y"
10
+
11
+ day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
12
+ abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat]
13
+
14
+ # Don't forget the nil at the beginning; there's no such thing as a 0th month
15
+ month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December]
16
+ abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
17
+ # Used in date_select and datetime_select.
18
+ order:
19
+ - year
20
+ - month
21
+ - day
22
+
23
+ time:
24
+ formats:
25
+ default: "%a, %d %b %Y %H:%M:%S %z"
26
+ short: "%d %b %H:%M"
27
+ long: "%B %d, %Y %H:%M"
28
+ am: "am"
29
+ pm: "pm"
30
+
31
+ # Used in array.to_sentence.
32
+ support:
33
+ array:
34
+ words_connector: ", "
35
+ two_words_connector: " and "
36
+ last_word_connector: ", and "
37
+ number:
38
+ # Used in NumberHelper.number_to_delimited()
39
+ # These are also the defaults for 'currency', 'percentage', 'precision', and 'human'
40
+ format:
41
+ # Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5)
42
+ separator: "."
43
+ # Delimits thousands (e.g. 1,000,000 is a million) (always in groups of three)
44
+ delimiter: ","
45
+ # Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00)
46
+ precision: 3
47
+ # Determine how rounding is performed (see BigDecimal::mode)
48
+ round_mode: default
49
+ # If set to true, precision will mean the number of significant digits instead
50
+ # of the number of decimal digits (1234 with precision 2 becomes 1200, 1.23543 becomes 1.2)
51
+ significant: false
52
+ # If set, the zeros after the decimal separator will always be stripped (e.g.: 1.200 will be 1.2)
53
+ strip_insignificant_zeros: false
54
+
55
+ # Used in NumberHelper.number_to_currency()
56
+ currency:
57
+ format:
58
+ # Where is the currency sign? %u is the currency unit, %n is the number (default: $5.00)
59
+ format: "%u%n"
60
+ negative_format: "-%u%n"
61
+ unit: "$"
62
+ # These six are to override number.format and are optional
63
+ separator: "."
64
+ delimiter: ","
65
+ precision: 2
66
+ # round_mode:
67
+ significant: false
68
+ strip_insignificant_zeros: false
69
+
70
+ # Used in NumberHelper.number_to_percentage()
71
+ percentage:
72
+ format:
73
+ # These five are to override number.format and are optional
74
+ # separator:
75
+ delimiter: ""
76
+ # precision:
77
+ # significant: false
78
+ # strip_insignificant_zeros: false
79
+ format: "%n%"
80
+
81
+ # Used in NumberHelper.number_to_rounded()
82
+ precision:
83
+ format:
84
+ # These five are to override number.format and are optional
85
+ # separator:
86
+ delimiter: ""
87
+ # precision:
88
+ # significant: false
89
+ # strip_insignificant_zeros: false
90
+
91
+ # Used in NumberHelper.number_to_human_size() and NumberHelper.number_to_human()
92
+ human:
93
+ format:
94
+ # These six are to override number.format and are optional
95
+ # separator:
96
+ delimiter: ""
97
+ precision: 3
98
+ # round_mode:
99
+ significant: true
100
+ strip_insignificant_zeros: true
101
+ # Used in number_to_human_size()
102
+ storage_units:
103
+ # Storage units output formatting.
104
+ # %u is the storage unit, %n is the number (default: 2 MB)
105
+ format: "%n %u"
106
+ units:
107
+ byte:
108
+ one: "Byte"
109
+ other: "Bytes"
110
+ kb: "KB"
111
+ mb: "MB"
112
+ gb: "GB"
113
+ tb: "TB"
114
+ pb: "PB"
115
+ eb: "EB"
116
+ zb: "ZB"
117
+ # Used in NumberHelper.number_to_human()
118
+ decimal_units:
119
+ format: "%n %u"
120
+ # Decimal units output formatting
121
+ # By default we will only quantify some of the exponents
122
+ # but the commented ones might be defined or overridden
123
+ # by the user.
124
+ units:
125
+ # femto: Quadrillionth
126
+ # pico: Trillionth
127
+ # nano: Billionth
128
+ # micro: Millionth
129
+ # mili: Thousandth
130
+ # centi: Hundredth
131
+ # deci: Tenth
132
+ unit: ""
133
+ # ten:
134
+ # one: Ten
135
+ # other: Tens
136
+ # hundred: Hundred
137
+ thousand: Thousand
138
+ million: Million
139
+ billion: Billion
140
+ trillion: Trillion
141
+ quadrillion: Quadrillion
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/log_subscriber"
4
+ require "active_support/logger"
5
+ require "active_support/notifications"
6
+
7
+ module ActiveSupport
8
+ class LogSubscriber
9
+ # Provides some helpers to deal with testing log subscribers by setting up
10
+ # notifications. Take for instance Active Record subscriber tests:
11
+ #
12
+ # class SyncLogSubscriberTest < ActiveSupport::TestCase
13
+ # include ActiveSupport::LogSubscriber::TestHelper
14
+ #
15
+ # setup do
16
+ # ActiveRecord::LogSubscriber.attach_to(:active_record)
17
+ # end
18
+ #
19
+ # def test_basic_query_logging
20
+ # Developer.all.to_a
21
+ # wait
22
+ # assert_equal 1, @logger.logged(:debug).size
23
+ # assert_match(/Developer Load/, @logger.logged(:debug).last)
24
+ # assert_match(/SELECT \* FROM "developers"/, @logger.logged(:debug).last)
25
+ # end
26
+ # end
27
+ #
28
+ # All you need to do is to ensure that your log subscriber is added to
29
+ # Rails::Subscriber, as in the second line of the code above. The test
30
+ # helpers are responsible for setting up the queue and subscriptions, and
31
+ # turning colors in logs off.
32
+ #
33
+ # The messages are available in the @logger instance, which is a logger with
34
+ # limited powers (it actually does not send anything to your output), and
35
+ # you can collect them doing @logger.logged(level), where level is the level
36
+ # used in logging, like info, debug, warn, and so on.
37
+ module TestHelper
38
+ def setup # :nodoc:
39
+ @logger = MockLogger.new
40
+ @notifier = ActiveSupport::Notifications::Fanout.new
41
+
42
+ ActiveSupport::LogSubscriber.colorize_logging = false
43
+
44
+ @old_notifier = ActiveSupport::Notifications.notifier
45
+ set_logger(@logger)
46
+ ActiveSupport::Notifications.notifier = @notifier
47
+ end
48
+
49
+ def teardown # :nodoc:
50
+ set_logger(nil)
51
+ ActiveSupport::Notifications.notifier = @old_notifier
52
+ end
53
+
54
+ class MockLogger
55
+ include ActiveSupport::Logger::Severity
56
+
57
+ attr_reader :flush_count
58
+ attr_accessor :level
59
+
60
+ def initialize(level = DEBUG)
61
+ @flush_count = 0
62
+ @level = level
63
+ @logged = Hash.new { |h, k| h[k] = [] }
64
+ end
65
+
66
+ def method_missing(level, message = nil)
67
+ if block_given?
68
+ @logged[level] << yield
69
+ else
70
+ @logged[level] << message
71
+ end
72
+ end
73
+
74
+ def logged(level)
75
+ @logged[level].compact.map { |l| l.to_s.strip }
76
+ end
77
+
78
+ def flush
79
+ @flush_count += 1
80
+ end
81
+
82
+ ActiveSupport::Logger::Severity.constants.each do |severity|
83
+ class_eval <<-EOT, __FILE__, __LINE__ + 1
84
+ def #{severity.downcase}?
85
+ #{severity} >= @level
86
+ end
87
+ EOT
88
+ end
89
+ end
90
+
91
+ # Wait notifications to be published.
92
+ def wait
93
+ @notifier.wait
94
+ end
95
+
96
+ # Overwrite if you use another logger in your log subscriber.
97
+ #
98
+ # def logger
99
+ # ActiveRecord::Base.logger = @logger
100
+ # end
101
+ def set_logger(logger)
102
+ ActiveSupport::LogSubscriber.logger = logger
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,188 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/module/attribute_accessors"
4
+ require "active_support/core_ext/class/attribute"
5
+ require "active_support/core_ext/enumerable"
6
+ require "active_support/subscriber"
7
+ require "active_support/deprecation/proxy_wrappers"
8
+
9
+ module ActiveSupport
10
+ # = Active Support Log \Subscriber
11
+ #
12
+ # +ActiveSupport::LogSubscriber+ is an object set to consume
13
+ # ActiveSupport::Notifications with the sole purpose of logging them.
14
+ # The log subscriber dispatches notifications to a registered object based
15
+ # on its given namespace.
16
+ #
17
+ # An example would be Active Record log subscriber responsible for logging
18
+ # queries:
19
+ #
20
+ # module ActiveRecord
21
+ # class LogSubscriber < ActiveSupport::LogSubscriber
22
+ # attach_to :active_record
23
+ #
24
+ # def sql(event)
25
+ # info "#{event.payload[:name]} (#{event.duration}) #{event.payload[:sql]}"
26
+ # end
27
+ # end
28
+ # end
29
+ #
30
+ # ActiveRecord::LogSubscriber.logger must be set as well, but it is assigned
31
+ # automatically in a \Rails environment.
32
+ #
33
+ # After configured, whenever a <tt>"sql.active_record"</tt> notification is
34
+ # published, it will properly dispatch the event
35
+ # (ActiveSupport::Notifications::Event) to the +sql+ method.
36
+ #
37
+ # Being an ActiveSupport::Notifications consumer,
38
+ # +ActiveSupport::LogSubscriber+ exposes a simple interface to check if
39
+ # instrumented code raises an exception. It is common to log a different
40
+ # message in case of an error, and this can be achieved by extending
41
+ # the previous example:
42
+ #
43
+ # module ActiveRecord
44
+ # class LogSubscriber < ActiveSupport::LogSubscriber
45
+ # def sql(event)
46
+ # exception = event.payload[:exception]
47
+ #
48
+ # if exception
49
+ # exception_object = event.payload[:exception_object]
50
+ #
51
+ # error "[ERROR] #{event.payload[:name]}: #{exception.join(', ')} " \
52
+ # "(#{exception_object.backtrace.first})"
53
+ # else
54
+ # # standard logger code
55
+ # end
56
+ # end
57
+ # end
58
+ # end
59
+ #
60
+ # +ActiveSupport::LogSubscriber+ also has some helpers to deal with
61
+ # logging. For example, ActiveSupport::LogSubscriber.flush_all! will ensure
62
+ # that all logs are flushed, and it is called in Rails::Rack::Logger after a
63
+ # request finishes.
64
+ class LogSubscriber < Subscriber
65
+ # ANSI sequence modes
66
+ MODES = {
67
+ clear: 0,
68
+ bold: 1,
69
+ italic: 3,
70
+ underline: 4,
71
+ }
72
+
73
+ # ANSI sequence colors
74
+ BLACK = "\e[30m"
75
+ RED = "\e[31m"
76
+ GREEN = "\e[32m"
77
+ YELLOW = "\e[33m"
78
+ BLUE = "\e[34m"
79
+ MAGENTA = "\e[35m"
80
+ CYAN = "\e[36m"
81
+ WHITE = "\e[37m"
82
+
83
+ mattr_accessor :colorize_logging, default: true
84
+ class_attribute :log_levels, instance_accessor: false, default: {} # :nodoc:
85
+
86
+ LEVEL_CHECKS = {
87
+ debug: -> (logger) { !logger.debug? },
88
+ info: -> (logger) { !logger.info? },
89
+ error: -> (logger) { !logger.error? },
90
+ }
91
+
92
+ class << self
93
+ def logger
94
+ @logger ||= if defined?(Rails) && Rails.respond_to?(:logger)
95
+ Rails.logger
96
+ end
97
+ end
98
+
99
+ def attach_to(...) # :nodoc:
100
+ result = super
101
+ set_event_levels
102
+ result
103
+ end
104
+
105
+ attr_writer :logger
106
+
107
+ def log_subscribers
108
+ subscribers
109
+ end
110
+
111
+ # Flush all log_subscribers' logger.
112
+ def flush_all!
113
+ logger.flush if logger.respond_to?(:flush)
114
+ end
115
+
116
+ private
117
+ def fetch_public_methods(subscriber, inherit_all)
118
+ subscriber.public_methods(inherit_all) - LogSubscriber.public_instance_methods(true)
119
+ end
120
+
121
+ def set_event_levels
122
+ if subscriber
123
+ subscriber.event_levels = log_levels.transform_keys { |k| "#{k}.#{namespace}" }
124
+ end
125
+ end
126
+
127
+ def subscribe_log_level(method, level)
128
+ self.log_levels = log_levels.merge(method => LEVEL_CHECKS.fetch(level))
129
+ set_event_levels
130
+ end
131
+ end
132
+
133
+ def initialize
134
+ super
135
+ @event_levels = {}
136
+ end
137
+
138
+ def logger
139
+ LogSubscriber.logger
140
+ end
141
+
142
+ def silenced?(event)
143
+ logger.nil? || @event_levels[event]&.call(logger)
144
+ end
145
+
146
+ def call(event)
147
+ super if logger
148
+ rescue => e
149
+ log_exception(event.name, e)
150
+ end
151
+
152
+ attr_writer :event_levels # :nodoc:
153
+
154
+ private
155
+ %w(info debug warn error fatal unknown).each do |level|
156
+ class_eval <<-METHOD, __FILE__, __LINE__ + 1
157
+ def #{level}(progname = nil, &block)
158
+ logger.#{level}(progname, &block) if logger
159
+ end
160
+ METHOD
161
+ end
162
+
163
+ # Set color by using a symbol or one of the defined constants. Set modes
164
+ # by specifying bold, italic, or underline options. Inspired by Highline,
165
+ # this method will automatically clear formatting at the end of the returned String.
166
+ def color(text, color, mode_options = {}) # :doc:
167
+ return text unless colorize_logging
168
+ color = self.class.const_get(color.upcase) if color.is_a?(Symbol)
169
+ mode = mode_from(mode_options)
170
+ clear = "\e[#{MODES[:clear]}m"
171
+ "#{mode}#{color}#{text}#{clear}"
172
+ end
173
+
174
+ def mode_from(options)
175
+ modes = MODES.values_at(*options.compact_blank.keys)
176
+
177
+ "\e[#{modes.join(";")}m" if modes.any?
178
+ end
179
+
180
+ def log_exception(name, e)
181
+ ActiveSupport.error_reporter.report(e, source: name)
182
+
183
+ if logger
184
+ logger.error "Could not log #{name.inspect} event. #{e.class}: #{e.message} #{e.backtrace}"
185
+ end
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/logger_silence"
4
+ require "active_support/logger_thread_safe_level"
5
+ require "logger"
6
+
7
+ module ActiveSupport
8
+ class Logger < ::Logger
9
+ include LoggerSilence
10
+
11
+ # Returns true if the logger destination matches one of the sources
12
+ #
13
+ # logger = Logger.new(STDOUT)
14
+ # ActiveSupport::Logger.logger_outputs_to?(logger, STDOUT)
15
+ # # => true
16
+ #
17
+ # logger = Logger.new('/var/log/rails.log')
18
+ # ActiveSupport::Logger.logger_outputs_to?(logger, '/var/log/rails.log')
19
+ # # => true
20
+ def self.logger_outputs_to?(logger, *sources)
21
+ loggers = if logger.is_a?(BroadcastLogger)
22
+ logger.broadcasts
23
+ else
24
+ [logger]
25
+ end
26
+
27
+ logdevs = loggers.map { |logger| logger.instance_variable_get(:@logdev) }
28
+ logger_sources = logdevs.filter_map { |logdev| logdev.try(:filename) || logdev.try(:dev) }
29
+
30
+ normalize_sources(sources).intersect?(normalize_sources(logger_sources))
31
+ end
32
+
33
+ def initialize(*args, **kwargs)
34
+ super
35
+ @formatter ||= SimpleFormatter.new
36
+ end
37
+
38
+ # Simple formatter which only displays the message.
39
+ class SimpleFormatter < ::Logger::Formatter
40
+ # This method is invoked when a log event occurs
41
+ def call(severity, timestamp, progname, msg)
42
+ "#{String === msg ? msg : msg.inspect}\n"
43
+ end
44
+ end
45
+
46
+ private
47
+ def self.normalize_sources(sources)
48
+ sources.map do |source|
49
+ source = source.path if source.respond_to?(:path)
50
+ source = File.realpath(source) if source.is_a?(String) && File.exist?(source)
51
+ source
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+ require "active_support/core_ext/module/attribute_accessors"
5
+ require "active_support/logger_thread_safe_level"
6
+
7
+ module ActiveSupport
8
+ module LoggerSilence
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ cattr_accessor :silencer, default: true
13
+ include ActiveSupport::LoggerThreadSafeLevel
14
+ end
15
+
16
+ # Silences the logger for the duration of the block.
17
+ def silence(severity = Logger::ERROR)
18
+ silencer ? log_at(severity) { yield self } : yield(self)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+ require "logger"
5
+
6
+ module ActiveSupport
7
+ module LoggerThreadSafeLevel # :nodoc:
8
+ extend ActiveSupport::Concern
9
+
10
+ def initialize(...)
11
+ super
12
+ @local_level_key = :"logger_thread_safe_level_#{object_id}"
13
+ end
14
+
15
+ def local_level
16
+ IsolatedExecutionState[local_level_key]
17
+ end
18
+
19
+ def local_level=(level)
20
+ case level
21
+ when Integer
22
+ when Symbol
23
+ level = Logger::Severity.const_get(level.to_s.upcase)
24
+ when nil
25
+ else
26
+ raise ArgumentError, "Invalid log level: #{level.inspect}"
27
+ end
28
+ if level.nil?
29
+ IsolatedExecutionState.delete(local_level_key)
30
+ else
31
+ IsolatedExecutionState[local_level_key] = level
32
+ end
33
+ end
34
+
35
+ def level
36
+ local_level || super
37
+ end
38
+
39
+ # Change the thread-local level for the duration of the given block.
40
+ def log_at(level)
41
+ old_local_level, self.local_level = local_level, level
42
+ yield
43
+ ensure
44
+ self.local_level = old_local_level
45
+ end
46
+
47
+ private
48
+ attr_reader :local_level_key
49
+ end
50
+ end