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,140 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support"
4
+ require "active_support/core_ext/array/wrap"
5
+ require "rails/railtie"
6
+
7
+ # :enddoc:
8
+
9
+ module I18n
10
+ class Railtie < Rails::Railtie
11
+ config.i18n = ActiveSupport::OrderedOptions.new
12
+ config.i18n.railties_load_path = []
13
+ config.i18n.load_path = []
14
+ config.i18n.fallbacks = ActiveSupport::OrderedOptions.new
15
+
16
+ config.eager_load_namespaces << I18n
17
+
18
+ # Make sure i18n is ready before eager loading, in case any eager loaded
19
+ # code needs it.
20
+ config.before_eager_load do |app|
21
+ I18n::Railtie.initialize_i18n(app)
22
+ end
23
+
24
+ # i18n initialization needs to run after application initialization, since
25
+ # initializers may configure i18n.
26
+ #
27
+ # If the application eager loaded, this was done on before_eager_load. The
28
+ # hook is still OK, though, because initialize_i18n is idempotent.
29
+ config.after_initialize do |app|
30
+ I18n::Railtie.initialize_i18n(app)
31
+ end
32
+
33
+ @i18n_inited = false
34
+
35
+ # Setup i18n configuration.
36
+ def self.initialize_i18n(app)
37
+ return if @i18n_inited
38
+
39
+ fallbacks = app.config.i18n.delete(:fallbacks)
40
+
41
+ # Avoid issues with setting the default_locale by disabling available locales
42
+ # check while configuring.
43
+ enforce_available_locales = app.config.i18n.delete(:enforce_available_locales)
44
+ enforce_available_locales = I18n.enforce_available_locales if enforce_available_locales.nil?
45
+ I18n.enforce_available_locales = false
46
+
47
+ reloadable_paths = []
48
+ app.config.i18n.each do |setting, value|
49
+ case setting
50
+ when :railties_load_path
51
+ reloadable_paths = value
52
+ app.config.i18n.load_path.unshift(*value.flat_map(&:existent))
53
+ when :load_path
54
+ I18n.load_path += value
55
+ when :raise_on_missing_translations
56
+ strict = value == :strict
57
+ setup_raise_on_missing_translations_config(app, strict)
58
+ else
59
+ I18n.public_send("#{setting}=", value)
60
+ end
61
+ end
62
+
63
+ init_fallbacks(fallbacks) if fallbacks && validate_fallbacks(fallbacks)
64
+
65
+ # Restore available locales check so it will take place from now on.
66
+ I18n.enforce_available_locales = enforce_available_locales
67
+
68
+ if app.config.reloading_enabled?
69
+ directories = watched_dirs_with_extensions(reloadable_paths)
70
+ reloader = app.config.file_watcher.new(I18n.load_path, directories) do
71
+ I18n.load_path.delete_if { |path| path.to_s.start_with?(Rails.root.to_s) && !File.exist?(path) }
72
+ I18n.load_path |= reloadable_paths.flat_map(&:existent)
73
+ end
74
+
75
+ app.reloaders << reloader
76
+ app.reloader.to_run do
77
+ reloader.execute_if_updated { require_unload_lock! }
78
+ end
79
+ end
80
+
81
+ @i18n_inited = true
82
+ end
83
+
84
+ def self.setup_raise_on_missing_translations_config(app, strict)
85
+ ActiveSupport.on_load(:action_view) do
86
+ ActionView::Helpers::TranslationHelper.raise_on_missing_translations = app.config.i18n.raise_on_missing_translations
87
+ end
88
+
89
+ ActiveSupport.on_load(:active_model_translation) do
90
+ ActiveModel::Translation.raise_on_missing_translations = app.config.i18n.raise_on_missing_translations if strict
91
+ end
92
+
93
+ if app.config.i18n.raise_on_missing_translations &&
94
+ I18n.exception_handler.is_a?(I18n::ExceptionHandler) # Only override the i18n gem's default exception handler.
95
+
96
+ I18n.exception_handler = ->(exception, *) {
97
+ exception = exception.to_exception if exception.is_a?(I18n::MissingTranslation)
98
+ raise exception
99
+ }
100
+ end
101
+ end
102
+
103
+ def self.include_fallbacks_module
104
+ I18n.backend.class.include(I18n::Backend::Fallbacks)
105
+ end
106
+
107
+ def self.init_fallbacks(fallbacks)
108
+ include_fallbacks_module
109
+
110
+ args = \
111
+ case fallbacks
112
+ when ActiveSupport::OrderedOptions
113
+ [*(fallbacks[:defaults] || []) << fallbacks[:map]].compact
114
+ when Hash, Array
115
+ Array.wrap(fallbacks)
116
+ else # TrueClass
117
+ [I18n.default_locale]
118
+ end
119
+
120
+ I18n.fallbacks = I18n::Locale::Fallbacks.new(*args)
121
+ end
122
+
123
+ def self.validate_fallbacks(fallbacks)
124
+ case fallbacks
125
+ when ActiveSupport::OrderedOptions
126
+ !fallbacks.empty?
127
+ when TrueClass, Array, Hash
128
+ true
129
+ else
130
+ raise "Unexpected fallback type #{fallbacks.inspect}"
131
+ end
132
+ end
133
+
134
+ def self.watched_dirs_with_extensions(paths)
135
+ paths.each_with_object({}) do |path, result|
136
+ result[path.absolute_current] = path.extensions
137
+ end
138
+ end
139
+ end
140
+ end
@@ -1,53 +1,72 @@
1
- Inflector.inflections do |inflect|
2
- inflect.plural /$/, 's'
3
- inflect.plural /s$/i, 's'
4
- inflect.plural /(ax|test)is$/i, '\1es'
5
- inflect.plural /(octop|vir)us$/i, '\1i'
6
- inflect.plural /(alias|status)$/i, '\1es'
7
- inflect.plural /(bu)s$/i, '\1ses'
8
- inflect.plural /(buffal|tomat)o$/i, '\1oes'
9
- inflect.plural /([ti])um$/i, '\1a'
10
- inflect.plural /sis$/i, 'ses'
11
- inflect.plural /(?:([^f])fe|([lr])f)$/i, '\1\2ves'
12
- inflect.plural /(hive)$/i, '\1s'
13
- inflect.plural /([^aeiouy]|qu)y$/i, '\1ies'
14
- inflect.plural /([^aeiouy]|qu)ies$/i, '\1y'
15
- inflect.plural /(x|ch|ss|sh)$/i, '\1es'
16
- inflect.plural /(matr|vert|ind)ix|ex$/i, '\1ices'
17
- inflect.plural /([m|l])ouse$/i, '\1ice'
18
- inflect.plural /^(ox)$/i, '\1en'
19
- inflect.plural /(quiz)$/i, '\1zes'
1
+ # frozen_string_literal: true
20
2
 
21
- inflect.singular /s$/i, ''
22
- inflect.singular /(n)ews$/i, '\1ews'
23
- inflect.singular /([ti])a$/i, '\1um'
24
- inflect.singular /((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i, '\1\2sis'
25
- inflect.singular /(^analy)ses$/i, '\1sis'
26
- inflect.singular /([^f])ves$/i, '\1fe'
27
- inflect.singular /(hive)s$/i, '\1'
28
- inflect.singular /(tive)s$/i, '\1'
29
- inflect.singular /([lr])ves$/i, '\1f'
30
- inflect.singular /([^aeiouy]|qu)ies$/i, '\1y'
31
- inflect.singular /(s)eries$/i, '\1eries'
32
- inflect.singular /(m)ovies$/i, '\1ovie'
33
- inflect.singular /(x|ch|ss|sh)es$/i, '\1'
34
- inflect.singular /([m|l])ice$/i, '\1ouse'
35
- inflect.singular /(bus)es$/i, '\1'
36
- inflect.singular /(o)es$/i, '\1'
37
- inflect.singular /(shoe)s$/i, '\1'
38
- inflect.singular /(cris|ax|test)es$/i, '\1is'
39
- inflect.singular /([octop|vir])i$/i, '\1us'
40
- inflect.singular /(alias|status)es$/i, '\1'
41
- inflect.singular /^(ox)en/i, '\1'
42
- inflect.singular /(vert|ind)ices$/i, '\1ex'
43
- inflect.singular /(matr)ices$/i, '\1ix'
44
- inflect.singular /(quiz)zes$/i, '\1'
3
+ require "active_support/inflector/inflections"
45
4
 
46
- inflect.irregular 'person', 'people'
47
- inflect.irregular 'man', 'men'
48
- inflect.irregular 'child', 'children'
49
- inflect.irregular 'sex', 'sexes'
50
- inflect.irregular 'move', 'moves'
5
+ #--
6
+ # Defines the standard inflection rules. These are the starting point for
7
+ # new projects and are not considered complete. The current set of inflection
8
+ # rules is frozen. This means, we do not change them to become more complete.
9
+ # This is a safety measure to keep existing applications from breaking.
10
+ #++
11
+ module ActiveSupport
12
+ Inflector.inflections(:en) do |inflect|
13
+ inflect.plural(/$/, "s")
14
+ inflect.plural(/s$/i, "s")
15
+ inflect.plural(/^(ax|test)is$/i, '\1es')
16
+ inflect.plural(/(octop|vir)us$/i, '\1i')
17
+ inflect.plural(/(octop|vir)i$/i, '\1i')
18
+ inflect.plural(/(alias|status)$/i, '\1es')
19
+ inflect.plural(/(bu)s$/i, '\1ses')
20
+ inflect.plural(/(buffal|tomat)o$/i, '\1oes')
21
+ inflect.plural(/([ti])um$/i, '\1a')
22
+ inflect.plural(/([ti])a$/i, '\1a')
23
+ inflect.plural(/sis$/i, "ses")
24
+ inflect.plural(/(?:([^f])fe|([lr])f)$/i, '\1\2ves')
25
+ inflect.plural(/(hive)$/i, '\1s')
26
+ inflect.plural(/([^aeiouy]|qu)y$/i, '\1ies')
27
+ inflect.plural(/(x|ch|ss|sh)$/i, '\1es')
28
+ inflect.plural(/(matr|vert|ind)(?:ix|ex)$/i, '\1ices')
29
+ inflect.plural(/^(m|l)ouse$/i, '\1ice')
30
+ inflect.plural(/^(m|l)ice$/i, '\1ice')
31
+ inflect.plural(/^(ox)$/i, '\1en')
32
+ inflect.plural(/^(oxen)$/i, '\1')
33
+ inflect.plural(/(quiz)$/i, '\1zes')
51
34
 
52
- inflect.uncountable %w( equipment information rice money species series fish sheep )
35
+ inflect.singular(/s$/i, "")
36
+ inflect.singular(/(ss)$/i, '\1')
37
+ inflect.singular(/(n)ews$/i, '\1ews')
38
+ inflect.singular(/([ti])a$/i, '\1um')
39
+ inflect.singular(/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)$/i, '\1sis')
40
+ inflect.singular(/(^analy)(sis|ses)$/i, '\1sis')
41
+ inflect.singular(/([^f])ves$/i, '\1fe')
42
+ inflect.singular(/(hive)s$/i, '\1')
43
+ inflect.singular(/(tive)s$/i, '\1')
44
+ inflect.singular(/([lr])ves$/i, '\1f')
45
+ inflect.singular(/([^aeiouy]|qu)ies$/i, '\1y')
46
+ inflect.singular(/(s)eries$/i, '\1eries')
47
+ inflect.singular(/(m)ovies$/i, '\1ovie')
48
+ inflect.singular(/(x|ch|ss|sh)es$/i, '\1')
49
+ inflect.singular(/^(m|l)ice$/i, '\1ouse')
50
+ inflect.singular(/(bus)(es)?$/i, '\1')
51
+ inflect.singular(/(o)es$/i, '\1')
52
+ inflect.singular(/(shoe)s$/i, '\1')
53
+ inflect.singular(/(cris|test)(is|es)$/i, '\1is')
54
+ inflect.singular(/^(a)x[ie]s$/i, '\1xis')
55
+ inflect.singular(/(octop|vir)(us|i)$/i, '\1us')
56
+ inflect.singular(/(alias|status)(es)?$/i, '\1')
57
+ inflect.singular(/^(ox)en/i, '\1')
58
+ inflect.singular(/(vert|ind)ices$/i, '\1ex')
59
+ inflect.singular(/(matr)ices$/i, '\1ix')
60
+ inflect.singular(/(quiz)zes$/i, '\1')
61
+ inflect.singular(/(database)s$/i, '\1')
62
+
63
+ inflect.irregular("person", "people")
64
+ inflect.irregular("man", "men")
65
+ inflect.irregular("child", "children")
66
+ inflect.irregular("sex", "sexes")
67
+ inflect.irregular("move", "moves")
68
+ inflect.irregular("zombie", "zombies")
69
+
70
+ inflect.uncountable(%w(equipment information rice money species series fish sheep jeans police))
71
+ end
53
72
  end
@@ -0,0 +1,290 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "concurrent/map"
4
+ require "active_support/core_ext/module/delegation"
5
+ require "active_support/i18n"
6
+
7
+ module ActiveSupport
8
+ module Inflector
9
+ extend self
10
+
11
+ # = Active Support \Inflections
12
+ #
13
+ # A singleton instance of this class is yielded by Inflector.inflections,
14
+ # which can then be used to specify additional inflection rules. If passed
15
+ # an optional locale, rules for other languages can be specified. The
16
+ # default locale is <tt>:en</tt>. Only rules for English are provided.
17
+ #
18
+ # ActiveSupport::Inflector.inflections(:en) do |inflect|
19
+ # inflect.plural /^(ox)$/i, '\1\2en'
20
+ # inflect.singular /^(ox)en/i, '\1'
21
+ #
22
+ # inflect.irregular 'cactus', 'cacti'
23
+ #
24
+ # inflect.uncountable 'equipment'
25
+ # end
26
+ #
27
+ # New rules are added at the top. So in the example above, the irregular
28
+ # rule for cactus will now be the first of the pluralization and
29
+ # singularization rules that is runs. This guarantees that your rules run
30
+ # before any of the rules that may already have been loaded.
31
+ class Inflections
32
+ @__instance__ = Concurrent::Map.new
33
+ @__en_instance__ = nil
34
+
35
+ class Uncountables # :nodoc:
36
+ include Enumerable
37
+
38
+ delegate :each, :pop, :empty?, :to_s, :==, :to_a, :to_ary, to: :@members
39
+
40
+ def initialize
41
+ @members = []
42
+ @pattern = nil
43
+ end
44
+
45
+ def delete(entry)
46
+ @members.delete(entry)
47
+ @pattern = nil
48
+ end
49
+
50
+ def <<(word)
51
+ word = word.downcase
52
+ @members << word
53
+ @pattern = nil
54
+ self
55
+ end
56
+
57
+ def flatten
58
+ @members.dup
59
+ end
60
+
61
+ def add(words)
62
+ words = words.flatten.map(&:downcase)
63
+ @members.concat(words)
64
+ @pattern = nil
65
+ self
66
+ end
67
+
68
+ def uncountable?(str)
69
+ if @pattern.nil?
70
+ members_pattern = Regexp.union(@members.map { |w| /#{Regexp.escape(w)}/i })
71
+ @pattern = /\b#{members_pattern}\Z/i
72
+ end
73
+ @pattern.match?(str)
74
+ end
75
+ end
76
+
77
+ def self.instance(locale = :en)
78
+ return @__en_instance__ ||= new if locale == :en
79
+
80
+ @__instance__[locale] ||= new
81
+ end
82
+
83
+ def self.instance_or_fallback(locale)
84
+ return @__en_instance__ ||= new if locale == :en
85
+
86
+ I18n.fallbacks[locale].each do |k|
87
+ return @__en_instance__ if k == :en && @__en_instance__
88
+ return @__instance__[k] if @__instance__.key?(k)
89
+ end
90
+ instance(locale)
91
+ end
92
+
93
+ attr_reader :plurals, :singulars, :uncountables, :humans, :acronyms
94
+
95
+ attr_reader :acronyms_camelize_regex, :acronyms_underscore_regex # :nodoc:
96
+
97
+ def initialize
98
+ @plurals, @singulars, @uncountables, @humans, @acronyms = [], [], Uncountables.new, [], {}
99
+ define_acronym_regex_patterns
100
+ end
101
+
102
+ # Private, for the test suite.
103
+ def initialize_dup(orig) # :nodoc:
104
+ %w(plurals singulars uncountables humans acronyms).each do |scope|
105
+ instance_variable_set("@#{scope}", orig.public_send(scope).dup)
106
+ end
107
+ define_acronym_regex_patterns
108
+ end
109
+
110
+ # Specifies a new acronym. An acronym must be specified as it will appear
111
+ # in a camelized string. An underscore string that contains the acronym
112
+ # will retain the acronym when passed to +camelize+, +humanize+, or
113
+ # +titleize+. A camelized string that contains the acronym will maintain
114
+ # the acronym when titleized or humanized, and will convert the acronym
115
+ # into a non-delimited single lowercase word when passed to +underscore+.
116
+ #
117
+ # acronym 'HTML'
118
+ # titleize 'html' # => 'HTML'
119
+ # camelize 'html' # => 'HTML'
120
+ # underscore 'MyHTML' # => 'my_html'
121
+ #
122
+ # The acronym, however, must occur as a delimited unit and not be part of
123
+ # another word for conversions to recognize it:
124
+ #
125
+ # acronym 'HTTP'
126
+ # camelize 'my_http_delimited' # => 'MyHTTPDelimited'
127
+ # camelize 'https' # => 'Https', not 'HTTPs'
128
+ # underscore 'HTTPS' # => 'http_s', not 'https'
129
+ #
130
+ # acronym 'HTTPS'
131
+ # camelize 'https' # => 'HTTPS'
132
+ # underscore 'HTTPS' # => 'https'
133
+ #
134
+ # Note: Acronyms that are passed to +pluralize+ will no longer be
135
+ # recognized, since the acronym will not occur as a delimited unit in the
136
+ # pluralized result. To work around this, you must specify the pluralized
137
+ # form as an acronym as well:
138
+ #
139
+ # acronym 'API'
140
+ # camelize(pluralize('api')) # => 'Apis'
141
+ #
142
+ # acronym 'APIs'
143
+ # camelize(pluralize('api')) # => 'APIs'
144
+ #
145
+ # +acronym+ may be used to specify any word that contains an acronym or
146
+ # otherwise needs to maintain a non-standard capitalization. The only
147
+ # restriction is that the word must begin with a capital letter.
148
+ #
149
+ # acronym 'RESTful'
150
+ # underscore 'RESTful' # => 'restful'
151
+ # underscore 'RESTfulController' # => 'restful_controller'
152
+ # titleize 'RESTfulController' # => 'RESTful Controller'
153
+ # camelize 'restful' # => 'RESTful'
154
+ # camelize 'restful_controller' # => 'RESTfulController'
155
+ #
156
+ # acronym 'McDonald'
157
+ # underscore 'McDonald' # => 'mcdonald'
158
+ # camelize 'mcdonald' # => 'McDonald'
159
+ def acronym(word)
160
+ @acronyms[word.downcase] = word
161
+ define_acronym_regex_patterns
162
+ end
163
+
164
+ # Specifies a new pluralization rule and its replacement. The rule can
165
+ # either be a string or a regular expression. The replacement should
166
+ # always be a string that may include references to the matched data from
167
+ # the rule.
168
+ def plural(rule, replacement)
169
+ @uncountables.delete(rule) if rule.is_a?(String)
170
+ @uncountables.delete(replacement)
171
+ @plurals.prepend([rule, replacement])
172
+ end
173
+
174
+ # Specifies a new singularization rule and its replacement. The rule can
175
+ # either be a string or a regular expression. The replacement should
176
+ # always be a string that may include references to the matched data from
177
+ # the rule.
178
+ def singular(rule, replacement)
179
+ @uncountables.delete(rule) if rule.is_a?(String)
180
+ @uncountables.delete(replacement)
181
+ @singulars.prepend([rule, replacement])
182
+ end
183
+
184
+ # Specifies a new irregular that applies to both pluralization and
185
+ # singularization at the same time. This can only be used for strings, not
186
+ # regular expressions. You simply pass the irregular in singular and
187
+ # plural form.
188
+ #
189
+ # irregular 'cactus', 'cacti'
190
+ # irregular 'person', 'people'
191
+ def irregular(singular, plural)
192
+ @uncountables.delete(singular)
193
+ @uncountables.delete(plural)
194
+
195
+ s0 = singular[0]
196
+ srest = singular[1..-1]
197
+
198
+ p0 = plural[0]
199
+ prest = plural[1..-1]
200
+
201
+ if s0.upcase == p0.upcase
202
+ plural(/(#{s0})#{srest}$/i, '\1' + prest)
203
+ plural(/(#{p0})#{prest}$/i, '\1' + prest)
204
+
205
+ singular(/(#{s0})#{srest}$/i, '\1' + srest)
206
+ singular(/(#{p0})#{prest}$/i, '\1' + srest)
207
+ else
208
+ plural(/#{s0.upcase}(?i)#{srest}$/, p0.upcase + prest)
209
+ plural(/#{s0.downcase}(?i)#{srest}$/, p0.downcase + prest)
210
+ plural(/#{p0.upcase}(?i)#{prest}$/, p0.upcase + prest)
211
+ plural(/#{p0.downcase}(?i)#{prest}$/, p0.downcase + prest)
212
+
213
+ singular(/#{s0.upcase}(?i)#{srest}$/, s0.upcase + srest)
214
+ singular(/#{s0.downcase}(?i)#{srest}$/, s0.downcase + srest)
215
+ singular(/#{p0.upcase}(?i)#{prest}$/, s0.upcase + srest)
216
+ singular(/#{p0.downcase}(?i)#{prest}$/, s0.downcase + srest)
217
+ end
218
+ end
219
+
220
+ # Specifies words that are uncountable and should not be inflected.
221
+ #
222
+ # uncountable 'money'
223
+ # uncountable 'money', 'information'
224
+ # uncountable %w( money information rice )
225
+ def uncountable(*words)
226
+ @uncountables.add(words)
227
+ end
228
+
229
+ # Specifies a humanized form of a string by a regular expression rule or
230
+ # by a string mapping. When using a regular expression based replacement,
231
+ # the normal humanize formatting is called after the replacement. When a
232
+ # string is used, the human form should be specified as desired (example:
233
+ # 'The name', not 'the_name').
234
+ #
235
+ # human /_cnt$/i, '\1_count'
236
+ # human 'legacy_col_person_name', 'Name'
237
+ def human(rule, replacement)
238
+ @humans.prepend([rule, replacement])
239
+ end
240
+
241
+ # Clears the loaded inflections within a given scope (default is
242
+ # <tt>:all</tt>). Give the scope as a symbol of the inflection type, the
243
+ # options are: <tt>:plurals</tt>, <tt>:singulars</tt>, <tt>:uncountables</tt>,
244
+ # <tt>:humans</tt>, <tt>:acronyms</tt>.
245
+ #
246
+ # clear :all
247
+ # clear :plurals
248
+ def clear(scope = :all)
249
+ case scope
250
+ when :all
251
+ clear(:acronyms)
252
+ clear(:plurals)
253
+ clear(:singulars)
254
+ clear(:uncountables)
255
+ clear(:humans)
256
+ when :acronyms
257
+ @acronyms = {}
258
+ define_acronym_regex_patterns
259
+ when :uncountables
260
+ @uncountables = Uncountables.new
261
+ when :plurals, :singulars, :humans
262
+ instance_variable_set "@#{scope}", []
263
+ end
264
+ end
265
+
266
+ private
267
+ def define_acronym_regex_patterns
268
+ @acronym_regex = @acronyms.empty? ? /(?=a)b/ : /#{@acronyms.values.join("|")}/
269
+ @acronyms_camelize_regex = /^(?:#{@acronym_regex}(?=\b|[A-Z_])|\w)/
270
+ @acronyms_underscore_regex = /(?:(?<=([A-Za-z\d]))|\b)(#{@acronym_regex})(?=\b|[^a-z])/
271
+ end
272
+ end
273
+
274
+ # Yields a singleton instance of Inflector::Inflections so you can specify
275
+ # additional inflector rules. If passed an optional locale, rules for other
276
+ # languages can be specified. If not specified, defaults to <tt>:en</tt>.
277
+ # Only rules for English are provided.
278
+ #
279
+ # ActiveSupport::Inflector.inflections(:en) do |inflect|
280
+ # inflect.uncountable 'rails'
281
+ # end
282
+ def inflections(locale = :en)
283
+ if block_given?
284
+ yield Inflections.instance(locale)
285
+ else
286
+ Inflections.instance_or_fallback(locale)
287
+ end
288
+ end
289
+ end
290
+ end