activesupport 2.3.18 → 3.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activesupport might be problematic. Click here for more details.

Files changed (403) hide show
  1. data/CHANGELOG +30 -53
  2. data/lib/active_support.rb +43 -31
  3. data/lib/active_support/all.rb +3 -7
  4. data/lib/active_support/backtrace_cleaner.rb +24 -8
  5. data/lib/active_support/base64.rb +9 -0
  6. data/lib/active_support/benchmarkable.rb +60 -0
  7. data/lib/active_support/buffered_logger.rb +12 -9
  8. data/lib/active_support/cache.rb +75 -55
  9. data/lib/active_support/cache/compressed_mem_cache_store.rb +2 -0
  10. data/lib/active_support/cache/file_store.rb +35 -17
  11. data/lib/active_support/cache/mem_cache_store.rb +29 -20
  12. data/lib/active_support/cache/memory_store.rb +18 -17
  13. data/lib/active_support/cache/strategy/local_cache.rb +9 -1
  14. data/lib/active_support/callbacks.rb +490 -169
  15. data/lib/active_support/concern.rb +29 -0
  16. data/lib/active_support/configurable.rb +35 -0
  17. data/lib/active_support/core_ext.rb +2 -7
  18. data/lib/active_support/core_ext/array.rb +2 -10
  19. data/lib/active_support/core_ext/array/access.rb +39 -46
  20. data/lib/active_support/core_ext/array/conversions.rb +146 -182
  21. data/lib/active_support/core_ext/array/extract_options.rb +12 -18
  22. data/lib/active_support/core_ext/array/grouping.rb +87 -93
  23. data/lib/active_support/core_ext/array/random_access.rb +4 -40
  24. data/lib/active_support/core_ext/array/uniq_by.rb +17 -0
  25. data/lib/active_support/core_ext/array/wrap.rb +22 -0
  26. data/lib/active_support/core_ext/big_decimal.rb +1 -0
  27. data/lib/active_support/core_ext/big_decimal/conversions.rb +27 -0
  28. data/lib/active_support/core_ext/cgi.rb +0 -4
  29. data/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +16 -20
  30. data/lib/active_support/core_ext/class.rb +0 -2
  31. data/lib/active_support/core_ext/class/attribute.rb +8 -39
  32. data/lib/active_support/core_ext/class/attribute_accessors.rb +31 -35
  33. data/lib/active_support/core_ext/class/delegating_attributes.rb +34 -40
  34. data/lib/active_support/core_ext/class/inheritable_attributes.rb +100 -16
  35. data/lib/active_support/core_ext/date/acts_like.rb +8 -0
  36. data/lib/active_support/core_ext/date/calculations.rb +218 -238
  37. data/lib/active_support/core_ext/date/conversions.rb +87 -96
  38. data/lib/active_support/core_ext/date/freeze.rb +31 -0
  39. data/lib/active_support/core_ext/date_time/acts_like.rb +13 -0
  40. data/lib/active_support/core_ext/date_time/calculations.rb +97 -110
  41. data/lib/active_support/core_ext/date_time/conversions.rb +83 -95
  42. data/lib/active_support/core_ext/date_time/zones.rb +17 -0
  43. data/lib/active_support/core_ext/enumerable.rb +14 -15
  44. data/lib/active_support/core_ext/exception.rb +1 -43
  45. data/lib/active_support/core_ext/file.rb +0 -4
  46. data/lib/active_support/core_ext/file/atomic.rb +34 -41
  47. data/lib/active_support/core_ext/float.rb +0 -6
  48. data/lib/active_support/core_ext/float/rounding.rb +15 -20
  49. data/lib/active_support/core_ext/hash.rb +8 -14
  50. data/lib/active_support/core_ext/hash/conversions.rb +236 -236
  51. data/lib/active_support/core_ext/hash/deep_merge.rb +12 -19
  52. data/lib/active_support/core_ext/hash/diff.rb +11 -17
  53. data/lib/active_support/core_ext/hash/except.rb +21 -22
  54. data/lib/active_support/core_ext/hash/indifferent_access.rb +8 -137
  55. data/lib/active_support/core_ext/hash/keys.rb +38 -45
  56. data/lib/active_support/core_ext/hash/reverse_merge.rb +25 -32
  57. data/lib/active_support/core_ext/hash/slice.rb +35 -37
  58. data/lib/active_support/core_ext/integer.rb +1 -7
  59. data/lib/active_support/core_ext/integer/inflections.rb +10 -16
  60. data/lib/active_support/core_ext/integer/multiple.rb +6 -0
  61. data/lib/active_support/core_ext/integer/time.rb +36 -42
  62. data/lib/active_support/core_ext/kernel/reporting.rb +9 -7
  63. data/lib/active_support/core_ext/kernel/requires.rb +3 -1
  64. data/lib/active_support/core_ext/load_error.rb +16 -33
  65. data/lib/active_support/core_ext/logger.rb +3 -2
  66. data/lib/active_support/core_ext/module.rb +3 -16
  67. data/lib/active_support/core_ext/module/aliasing.rb +64 -68
  68. data/lib/active_support/core_ext/module/attr_accessor_with_default.rb +1 -1
  69. data/lib/active_support/core_ext/module/attr_internal.rb +4 -4
  70. data/lib/active_support/core_ext/module/attribute_accessors.rb +36 -41
  71. data/lib/active_support/core_ext/module/delegation.rb +1 -1
  72. data/lib/active_support/core_ext/module/deprecation.rb +9 -0
  73. data/lib/active_support/core_ext/module/introspection.rb +77 -79
  74. data/lib/active_support/core_ext/module/loading.rb +2 -0
  75. data/lib/active_support/core_ext/module/synchronization.rb +4 -1
  76. data/lib/active_support/core_ext/name_error.rb +3 -4
  77. data/lib/active_support/core_ext/numeric.rb +1 -8
  78. data/lib/active_support/core_ext/numeric/bytes.rb +35 -41
  79. data/lib/active_support/core_ext/numeric/time.rb +70 -74
  80. data/lib/active_support/core_ext/object.rb +4 -2
  81. data/lib/active_support/core_ext/object/acts_like.rb +10 -0
  82. data/lib/active_support/core_ext/object/conversions.rb +4 -15
  83. data/lib/active_support/core_ext/object/duplicable.rb +65 -0
  84. data/lib/active_support/core_ext/object/instance_variables.rb +0 -7
  85. data/lib/active_support/core_ext/object/metaclass.rb +5 -6
  86. data/lib/active_support/core_ext/object/misc.rb +2 -93
  87. data/lib/active_support/core_ext/object/returning.rb +42 -0
  88. data/lib/active_support/core_ext/object/to_param.rb +49 -0
  89. data/lib/active_support/core_ext/object/to_query.rb +27 -0
  90. data/lib/active_support/core_ext/{try.rb → object/try.rb} +4 -4
  91. data/lib/active_support/core_ext/object/with_options.rb +24 -0
  92. data/lib/active_support/core_ext/proc.rb +6 -4
  93. data/lib/active_support/core_ext/process/daemon.rb +17 -19
  94. data/lib/active_support/core_ext/range.rb +2 -9
  95. data/lib/active_support/core_ext/range/blockless_step.rb +24 -27
  96. data/lib/active_support/core_ext/range/conversions.rb +17 -23
  97. data/lib/active_support/core_ext/range/include_range.rb +18 -27
  98. data/lib/active_support/core_ext/range/overlaps.rb +6 -13
  99. data/lib/active_support/core_ext/regexp.rb +5 -0
  100. data/lib/active_support/core_ext/rexml.rb +12 -7
  101. data/lib/active_support/core_ext/string.rb +6 -19
  102. data/lib/active_support/core_ext/string/access.rb +88 -95
  103. data/lib/active_support/core_ext/string/behavior.rb +6 -12
  104. data/lib/active_support/core_ext/string/conversions.rb +19 -21
  105. data/lib/active_support/core_ext/string/exclude.rb +6 -0
  106. data/lib/active_support/core_ext/string/filters.rb +17 -23
  107. data/lib/active_support/core_ext/string/inflections.rb +146 -153
  108. data/lib/active_support/{vendor/i18n-0.4.1/i18n/core_ext/string/interpolate.rb → core_ext/string/interpolation.rb} +8 -15
  109. data/lib/active_support/core_ext/string/multibyte.rb +68 -74
  110. data/lib/active_support/core_ext/string/output_safety.rb +21 -17
  111. data/lib/active_support/core_ext/string/starts_ends_with.rb +3 -32
  112. data/lib/active_support/core_ext/string/xchar.rb +10 -3
  113. data/lib/active_support/core_ext/time/acts_like.rb +8 -0
  114. data/lib/active_support/core_ext/time/calculations.rb +276 -308
  115. data/lib/active_support/core_ext/time/conversions.rb +78 -84
  116. data/lib/active_support/core_ext/time/marshal_with_utc_flag.rb +22 -0
  117. data/lib/active_support/core_ext/time/publicize_conversion_methods.rb +10 -0
  118. data/lib/active_support/core_ext/time/zones.rb +73 -81
  119. data/lib/active_support/core_ext/uri.rb +2 -1
  120. data/lib/active_support/dependencies.rb +38 -48
  121. data/lib/active_support/dependencies/autoload.rb +49 -0
  122. data/lib/active_support/deprecation.rb +9 -195
  123. data/lib/active_support/deprecation/behaviors.rb +38 -0
  124. data/lib/active_support/deprecation/method_wrappers.rb +29 -0
  125. data/lib/active_support/deprecation/proxy_wrappers.rb +74 -0
  126. data/lib/active_support/deprecation/reporting.rb +55 -0
  127. data/lib/active_support/duration.rb +6 -2
  128. data/lib/active_support/hash_with_indifferent_access.rb +137 -0
  129. data/lib/active_support/i18n.rb +2 -0
  130. data/lib/active_support/inflections.rb +1 -1
  131. data/lib/active_support/inflector.rb +4 -406
  132. data/lib/active_support/inflector/inflections.rb +211 -0
  133. data/lib/active_support/inflector/methods.rb +139 -0
  134. data/lib/active_support/inflector/transliterate.rb +61 -0
  135. data/lib/active_support/json/backends/jsongem.rb +16 -10
  136. data/lib/active_support/json/backends/yaml.rb +72 -2
  137. data/lib/active_support/json/decoding.rb +2 -16
  138. data/lib/active_support/json/encoding.rb +153 -33
  139. data/lib/active_support/json/variable.rb +4 -3
  140. data/lib/active_support/locale/en.yml +1 -4
  141. data/lib/active_support/memoizable.rb +7 -6
  142. data/lib/active_support/message_encryptor.rb +1 -0
  143. data/lib/active_support/message_verifier.rb +12 -29
  144. data/lib/active_support/multibyte.rb +9 -4
  145. data/lib/active_support/multibyte/chars.rb +25 -17
  146. data/lib/active_support/multibyte/unicode_database.rb +5 -5
  147. data/lib/active_support/multibyte/utils.rb +1 -1
  148. data/lib/active_support/notifications.rb +77 -0
  149. data/lib/active_support/notifications/fanout.rb +69 -0
  150. data/lib/active_support/notifications/instrumenter.rb +50 -0
  151. data/lib/active_support/option_merger.rb +2 -0
  152. data/lib/active_support/ordered_hash.rb +33 -37
  153. data/lib/active_support/ordered_options.rb +3 -1
  154. data/lib/active_support/railtie.rb +64 -0
  155. data/lib/active_support/rescuable.rb +11 -6
  156. data/lib/active_support/ruby/shim.rb +19 -0
  157. data/lib/active_support/test_case.rb +8 -1
  158. data/lib/active_support/testing/assertions.rb +2 -14
  159. data/lib/active_support/testing/declarative.rb +31 -12
  160. data/lib/active_support/testing/deprecation.rb +8 -10
  161. data/lib/active_support/testing/isolation.rb +153 -0
  162. data/lib/active_support/testing/pending.rb +48 -0
  163. data/lib/active_support/testing/performance.rb +342 -339
  164. data/lib/active_support/testing/setup_and_teardown.rb +48 -31
  165. data/lib/active_support/time.rb +34 -0
  166. data/lib/active_support/time/autoload.rb +5 -0
  167. data/lib/active_support/time_with_zone.rb +18 -12
  168. data/lib/active_support/values/time_zone.rb +97 -93
  169. data/lib/active_support/version.rb +3 -3
  170. data/lib/active_support/whiny_nil.rb +1 -4
  171. data/lib/active_support/xml_mini.rb +2 -0
  172. data/lib/active_support/xml_mini/jdom.rb +13 -7
  173. data/lib/active_support/xml_mini/libxml.rb +19 -12
  174. data/lib/active_support/xml_mini/libxmlsax.rb +19 -9
  175. data/lib/active_support/xml_mini/nokogiri.rb +18 -12
  176. data/lib/active_support/xml_mini/nokogirisax.rb +15 -6
  177. data/lib/active_support/xml_mini/rexml.rb +24 -9
  178. metadata +94 -244
  179. data/lib/active_support/cache/drb_store.rb +0 -14
  180. data/lib/active_support/core_ext/array/wrapper.rb +0 -24
  181. data/lib/active_support/core_ext/base64.rb +0 -4
  182. data/lib/active_support/core_ext/base64/encoding.rb +0 -16
  183. data/lib/active_support/core_ext/bigdecimal.rb +0 -6
  184. data/lib/active_support/core_ext/bigdecimal/conversions.rb +0 -37
  185. data/lib/active_support/core_ext/blank.rb +0 -2
  186. data/lib/active_support/core_ext/class/removal.rb +0 -50
  187. data/lib/active_support/core_ext/date.rb +0 -10
  188. data/lib/active_support/core_ext/date/behavior.rb +0 -42
  189. data/lib/active_support/core_ext/date_time.rb +0 -12
  190. data/lib/active_support/core_ext/duplicable.rb +0 -43
  191. data/lib/active_support/core_ext/float/time.rb +0 -27
  192. data/lib/active_support/core_ext/integer/even_odd.rb +0 -29
  193. data/lib/active_support/core_ext/kernel/singleton_class.rb +0 -13
  194. data/lib/active_support/core_ext/module/model_naming.rb +0 -25
  195. data/lib/active_support/core_ext/module/remove_method.rb +0 -6
  196. data/lib/active_support/core_ext/numeric/conversions.rb +0 -19
  197. data/lib/active_support/core_ext/object/extending.rb +0 -80
  198. data/lib/active_support/core_ext/object/singleton_class.rb +0 -13
  199. data/lib/active_support/core_ext/pathname.rb +0 -7
  200. data/lib/active_support/core_ext/pathname/clean_within.rb +0 -14
  201. data/lib/active_support/core_ext/string/bytesize.rb +0 -5
  202. data/lib/active_support/core_ext/string/iterators.rb +0 -23
  203. data/lib/active_support/core_ext/symbol.rb +0 -14
  204. data/lib/active_support/core_ext/time.rb +0 -46
  205. data/lib/active_support/core_ext/time/behavior.rb +0 -13
  206. data/lib/active_support/json/backends/okjson.rb +0 -644
  207. data/lib/active_support/json/backends/yajl.rb +0 -40
  208. data/lib/active_support/json/encoders/date.rb +0 -22
  209. data/lib/active_support/json/encoders/date_time.rb +0 -22
  210. data/lib/active_support/json/encoders/enumerable.rb +0 -17
  211. data/lib/active_support/json/encoders/false_class.rb +0 -7
  212. data/lib/active_support/json/encoders/hash.rb +0 -56
  213. data/lib/active_support/json/encoders/nil_class.rb +0 -7
  214. data/lib/active_support/json/encoders/numeric.rb +0 -21
  215. data/lib/active_support/json/encoders/object.rb +0 -10
  216. data/lib/active_support/json/encoders/regexp.rb +0 -9
  217. data/lib/active_support/json/encoders/string.rb +0 -9
  218. data/lib/active_support/json/encoders/symbol.rb +0 -5
  219. data/lib/active_support/json/encoders/time.rb +0 -22
  220. data/lib/active_support/json/encoders/true_class.rb +0 -7
  221. data/lib/active_support/vendor.rb +0 -36
  222. data/lib/active_support/vendor/builder-2.1.2/blankslate.rb +0 -113
  223. data/lib/active_support/vendor/builder-2.1.2/builder.rb +0 -13
  224. data/lib/active_support/vendor/builder-2.1.2/builder/blankslate.rb +0 -20
  225. data/lib/active_support/vendor/builder-2.1.2/builder/css.rb +0 -250
  226. data/lib/active_support/vendor/builder-2.1.2/builder/xchar.rb +0 -115
  227. data/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb +0 -139
  228. data/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb +0 -63
  229. data/lib/active_support/vendor/builder-2.1.2/builder/xmlmarkup.rb +0 -328
  230. data/lib/active_support/vendor/i18n-0.4.1/i18n.rb +0 -322
  231. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend.rb +0 -20
  232. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/active_record.rb +0 -61
  233. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/active_record/missing.rb +0 -65
  234. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/active_record/store_procs.rb +0 -38
  235. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/active_record/translation.rb +0 -93
  236. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/base.rb +0 -237
  237. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/cache.rb +0 -77
  238. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/cascade.rb +0 -57
  239. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/chain.rb +0 -77
  240. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/cldr.rb +0 -100
  241. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/fallbacks.rb +0 -69
  242. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/flatten.rb +0 -113
  243. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/gettext.rb +0 -75
  244. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/interpolation_compiler.rb +0 -123
  245. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/key_value.rb +0 -102
  246. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/memoize.rb +0 -48
  247. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/metadata.rb +0 -65
  248. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/pluralization.rb +0 -57
  249. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/simple.rb +0 -87
  250. data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/transliterator.rb +0 -98
  251. data/lib/active_support/vendor/i18n-0.4.1/i18n/config.rb +0 -84
  252. data/lib/active_support/vendor/i18n-0.4.1/i18n/core_ext/hash.rb +0 -29
  253. data/lib/active_support/vendor/i18n-0.4.1/i18n/exceptions.rb +0 -61
  254. data/lib/active_support/vendor/i18n-0.4.1/i18n/gettext.rb +0 -27
  255. data/lib/active_support/vendor/i18n-0.4.1/i18n/gettext/helpers.rb +0 -65
  256. data/lib/active_support/vendor/i18n-0.4.1/i18n/gettext/po_parser.rb +0 -329
  257. data/lib/active_support/vendor/i18n-0.4.1/i18n/locale.rb +0 -6
  258. data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/fallbacks.rb +0 -98
  259. data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/tag.rb +0 -28
  260. data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/tag/parents.rb +0 -24
  261. data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/tag/rfc4646.rb +0 -76
  262. data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/tag/simple.rb +0 -41
  263. data/lib/active_support/vendor/i18n-0.4.1/i18n/version.rb +0 -3
  264. data/lib/active_support/vendor/memcache-client-1.7.4/memcache.rb +0 -1107
  265. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo.rb +0 -33
  266. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone.rb +0 -47
  267. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone_info.rb +0 -228
  268. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Algiers.rb +0 -55
  269. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Cairo.rb +0 -219
  270. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Casablanca.rb +0 -40
  271. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Harare.rb +0 -18
  272. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Johannesburg.rb +0 -25
  273. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Monrovia.rb +0 -22
  274. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Nairobi.rb +0 -23
  275. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/Buenos_Aires.rb +0 -166
  276. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/San_Juan.rb +0 -86
  277. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Bogota.rb +0 -23
  278. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Caracas.rb +0 -23
  279. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chicago.rb +0 -283
  280. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chihuahua.rb +0 -136
  281. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Denver.rb +0 -204
  282. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Godthab.rb +0 -161
  283. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Guatemala.rb +0 -27
  284. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Halifax.rb +0 -274
  285. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Indiana/Indianapolis.rb +0 -149
  286. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Juneau.rb +0 -194
  287. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/La_Paz.rb +0 -22
  288. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Lima.rb +0 -35
  289. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Los_Angeles.rb +0 -232
  290. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mazatlan.rb +0 -139
  291. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mexico_City.rb +0 -144
  292. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Monterrey.rb +0 -131
  293. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/New_York.rb +0 -282
  294. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Phoenix.rb +0 -30
  295. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Regina.rb +0 -74
  296. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Santiago.rb +0 -205
  297. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Sao_Paulo.rb +0 -171
  298. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/St_Johns.rb +0 -288
  299. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Tijuana.rb +0 -196
  300. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Almaty.rb +0 -67
  301. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baghdad.rb +0 -73
  302. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baku.rb +0 -161
  303. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Bangkok.rb +0 -20
  304. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Chongqing.rb +0 -33
  305. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Colombo.rb +0 -30
  306. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Dhaka.rb +0 -27
  307. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Hong_Kong.rb +0 -87
  308. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Irkutsk.rb +0 -165
  309. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jakarta.rb +0 -30
  310. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jerusalem.rb +0 -163
  311. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kabul.rb +0 -20
  312. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kamchatka.rb +0 -163
  313. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Karachi.rb +0 -30
  314. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Katmandu.rb +0 -20
  315. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kolkata.rb +0 -25
  316. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Krasnoyarsk.rb +0 -163
  317. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuala_Lumpur.rb +0 -31
  318. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuwait.rb +0 -18
  319. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Magadan.rb +0 -163
  320. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Muscat.rb +0 -18
  321. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Novosibirsk.rb +0 -164
  322. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Rangoon.rb +0 -24
  323. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Riyadh.rb +0 -18
  324. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Seoul.rb +0 -34
  325. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Shanghai.rb +0 -35
  326. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Singapore.rb +0 -33
  327. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Taipei.rb +0 -59
  328. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tashkent.rb +0 -47
  329. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tbilisi.rb +0 -78
  330. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tehran.rb +0 -121
  331. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tokyo.rb +0 -30
  332. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Ulaanbaatar.rb +0 -65
  333. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Urumqi.rb +0 -33
  334. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Vladivostok.rb +0 -164
  335. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yakutsk.rb +0 -163
  336. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yekaterinburg.rb +0 -165
  337. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yerevan.rb +0 -165
  338. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Azores.rb +0 -270
  339. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Cape_Verde.rb +0 -23
  340. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/South_Georgia.rb +0 -18
  341. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Adelaide.rb +0 -187
  342. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Brisbane.rb +0 -35
  343. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Darwin.rb +0 -29
  344. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Hobart.rb +0 -193
  345. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Melbourne.rb +0 -185
  346. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Perth.rb +0 -37
  347. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Sydney.rb +0 -185
  348. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Etc/UTC.rb +0 -16
  349. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Amsterdam.rb +0 -228
  350. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Athens.rb +0 -185
  351. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Belgrade.rb +0 -163
  352. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Berlin.rb +0 -188
  353. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bratislava.rb +0 -13
  354. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Brussels.rb +0 -232
  355. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bucharest.rb +0 -181
  356. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Budapest.rb +0 -197
  357. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Copenhagen.rb +0 -179
  358. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Dublin.rb +0 -276
  359. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Helsinki.rb +0 -163
  360. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Istanbul.rb +0 -218
  361. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Kiev.rb +0 -168
  362. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Lisbon.rb +0 -268
  363. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Ljubljana.rb +0 -13
  364. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/London.rb +0 -288
  365. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Madrid.rb +0 -211
  366. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Minsk.rb +0 -170
  367. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Moscow.rb +0 -181
  368. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Paris.rb +0 -232
  369. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Prague.rb +0 -187
  370. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Riga.rb +0 -176
  371. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Rome.rb +0 -215
  372. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sarajevo.rb +0 -13
  373. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Skopje.rb +0 -13
  374. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sofia.rb +0 -173
  375. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Stockholm.rb +0 -165
  376. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Tallinn.rb +0 -172
  377. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vienna.rb +0 -183
  378. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vilnius.rb +0 -170
  379. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Warsaw.rb +0 -212
  380. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Zagreb.rb +0 -13
  381. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Auckland.rb +0 -202
  382. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Fiji.rb +0 -23
  383. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Guam.rb +0 -22
  384. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Honolulu.rb +0 -28
  385. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Majuro.rb +0 -20
  386. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Midway.rb +0 -25
  387. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Noumea.rb +0 -25
  388. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Pago_Pago.rb +0 -26
  389. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Port_Moresby.rb +0 -20
  390. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Tongatapu.rb +0 -27
  391. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/info_timezone.rb +0 -52
  392. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone.rb +0 -51
  393. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone_info.rb +0 -44
  394. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/offset_rationals.rb +0 -98
  395. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/ruby_core_support.rb +0 -56
  396. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/time_or_datetime.rb +0 -292
  397. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone.rb +0 -508
  398. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_definition.rb +0 -56
  399. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_info.rb +0 -40
  400. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_offset_info.rb +0 -94
  401. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_period.rb +0 -198
  402. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_transition_info.rb +0 -129
  403. data/lib/activesupport.rb +0 -2
@@ -1,20 +0,0 @@
1
- module I18n
2
- module Backend
3
- autoload :ActiveRecord, 'i18n/backend/active_record'
4
- autoload :Base, 'i18n/backend/base'
5
- autoload :InterpolationCompiler, 'i18n/backend/interpolation_compiler'
6
- autoload :Cache, 'i18n/backend/cache'
7
- autoload :Cascade, 'i18n/backend/cascade'
8
- autoload :Chain, 'i18n/backend/chain'
9
- autoload :Cldr, 'i18n/backend/cldr'
10
- autoload :Fallbacks, 'i18n/backend/fallbacks'
11
- autoload :Flatten, 'i18n/backend/flatten'
12
- autoload :Gettext, 'i18n/backend/gettext'
13
- autoload :KeyValue, 'i18n/backend/key_value'
14
- autoload :Memoize, 'i18n/backend/memoize'
15
- autoload :Metadata, 'i18n/backend/metadata'
16
- autoload :Pluralization, 'i18n/backend/pluralization'
17
- autoload :Simple, 'i18n/backend/simple'
18
- autoload :Transliterator, 'i18n/backend/transliterator'
19
- end
20
- end
@@ -1,61 +0,0 @@
1
- require 'i18n/backend/base'
2
- require 'i18n/backend/active_record/translation'
3
-
4
- module I18n
5
- module Backend
6
- class ActiveRecord
7
- autoload :Missing, 'i18n/backend/active_record/missing'
8
- autoload :StoreProcs, 'i18n/backend/active_record/store_procs'
9
- autoload :Translation, 'i18n/backend/active_record/translation'
10
-
11
- module Implementation
12
- include Base, Flatten
13
-
14
- def available_locales
15
- begin
16
- Translation.available_locales
17
- rescue ::ActiveRecord::StatementInvalid
18
- []
19
- end
20
- end
21
-
22
- def store_translations(locale, data, options = {})
23
- escape = options.fetch(:escape, true)
24
- flatten_translations(locale, data, escape, false).each do |key, value|
25
- Translation.locale(locale).lookup(expand_keys(key)).delete_all
26
- Translation.create(:locale => locale.to_s, :key => key.to_s, :value => value)
27
- end
28
- end
29
-
30
- protected
31
-
32
- def lookup(locale, key, scope = [], options = {})
33
- key = normalize_flat_keys(locale, key, scope, options[:separator])
34
- result = Translation.locale(locale).lookup(key).all
35
-
36
- if result.empty?
37
- nil
38
- elsif result.first.key == key
39
- result.first.value
40
- else
41
- chop_range = (key.size + FLATTEN_SEPARATOR.size)..-1
42
- result = result.inject({}) do |hash, r|
43
- hash[r.key.slice(chop_range)] = r.value
44
- hash
45
- end
46
- result.deep_symbolize_keys
47
- end
48
- end
49
-
50
- # For a key :'foo.bar.baz' return ['foo', 'foo.bar', 'foo.bar.baz']
51
- def expand_keys(key)
52
- key.to_s.split(FLATTEN_SEPARATOR).inject([]) do |keys, key|
53
- keys << [keys.last, key].compact.join(FLATTEN_SEPARATOR)
54
- end
55
- end
56
- end
57
-
58
- include Implementation
59
- end
60
- end
61
- end
@@ -1,65 +0,0 @@
1
- # This extension stores translation stub records for missing translations to
2
- # the database.
3
- #
4
- # This is useful if you have a web based translation tool. It will populate
5
- # the database with untranslated keys as the application is being used. A
6
- # translator can then go through these and add missing translations.
7
- #
8
- # Example usage:
9
- #
10
- # I18n::Backend::Chain.send(:include, I18n::Backend::ActiveRecord::Missing)
11
- # I18n.backend = I18nChainBackend.new(I18n::Backend::ActiveRecord.new, I18n::Backend::Simple.new)
12
- #
13
- # Stub records for pluralizations will also be created for each key defined
14
- # in i18n.plural.keys.
15
- #
16
- # For example:
17
- #
18
- # # en.yml
19
- # en:
20
- # i18n:
21
- # plural:
22
- # keys: [:zero, :one, :other]
23
- #
24
- # # pl.yml
25
- # pl:
26
- # i18n:
27
- # plural:
28
- # keys: [:zero, :one, :few, :other]
29
- #
30
- # It will also persist interpolation keys in Translation#interpolations so
31
- # translators will be able to review and use them.
32
- module I18n
33
- module Backend
34
- class ActiveRecord
35
- module Missing
36
- def store_default_translations(locale, key, options = {})
37
- count, scope, default, separator = options.values_at(:count, *Base::RESERVED_KEYS)
38
- separator ||= I18n.default_separator
39
-
40
- keys = I18n.normalize_keys(locale, key, scope, separator)[1..-1]
41
- key = keys.join(separator || I18n.default_separator)
42
-
43
- unless ActiveRecord::Translation.locale(locale).lookup(key).exists?
44
- interpolations = options.reject { |name, value| Base::RESERVED_KEYS.include?(name) }.keys
45
- keys = count ? I18n.t('i18n.plural.keys', :locale => locale).map { |k| [key, k].join(separator) } : [key]
46
- keys.each { |key| store_default_translation(locale, key, interpolations) }
47
- end
48
- end
49
-
50
- def store_default_translation(locale, key, interpolations)
51
- translation = ActiveRecord::Translation.new :locale => locale.to_s, :key => key
52
- translation.interpolations = interpolations
53
- translation.save
54
- end
55
-
56
- def translate(locale, key, options = {})
57
- super
58
- rescue I18n::MissingTranslationData => e
59
- self.store_default_translations(locale, key, options)
60
- raise e
61
- end
62
- end
63
- end
64
- end
65
- end
@@ -1,38 +0,0 @@
1
- # This module is intended to be mixed into the ActiveRecord backend to allow
2
- # storing Ruby Procs as translation values in the database.
3
- #
4
- # I18n.backend = I18n::Backend::ActiveRecord.new
5
- # I18n::Backend::ActiveRecord::Translation.send(:include, I18n::Backend::ActiveRecord::StoreProcs)
6
- #
7
- # The StoreProcs module requires the ParseTree and ruby2ruby gems and therefor
8
- # was extracted from the original backend.
9
- #
10
- # ParseTree is not compatible with Ruby 1.9.
11
-
12
- begin
13
- require 'ruby2ruby'
14
- require 'parse_tree'
15
- require 'parse_tree_extensions'
16
- rescue LoadError => e
17
- puts "can't use StoreProcs because: #{e.message}"
18
- end
19
-
20
- module I18n
21
- module Backend
22
- class ActiveRecord
23
- module StoreProcs
24
- def value=(v)
25
- case v
26
- when Proc
27
- write_attribute(:value, v.to_ruby)
28
- write_attribute(:is_proc, true)
29
- else
30
- write_attribute(:value, v)
31
- end
32
- end
33
-
34
- Translation.send(:include, self) if method(:to_s).respond_to?(:to_ruby)
35
- end
36
- end
37
- end
38
- end
@@ -1,93 +0,0 @@
1
- require 'active_record'
2
-
3
- module I18n
4
- module Backend
5
- # ActiveRecord model used to store actual translations to the database.
6
- #
7
- # This model expects a table like the following to be already set up in
8
- # your the database:
9
- #
10
- # create_table :translations do |t|
11
- # t.string :locale
12
- # t.string :key
13
- # t.text :value
14
- # t.text :interpolations
15
- # t.boolean :is_proc, :default => false
16
- # end
17
- #
18
- # This model supports to named scopes :locale and :lookup. The :locale
19
- # scope simply adds a condition for a given locale:
20
- #
21
- # I18n::Backend::ActiveRecord::Translation.locale(:en).all
22
- # # => all translation records that belong to the :en locale
23
- #
24
- # The :lookup scope adds a condition for looking up all translations
25
- # that either start with the given keys (joined by an optionally given
26
- # separator or I18n.default_separator) or that exactly have this key.
27
- #
28
- # # with translations present for :"foo.bar" and :"foo.baz"
29
- # I18n::Backend::ActiveRecord::Translation.lookup(:foo)
30
- # # => an array with both translation records :"foo.bar" and :"foo.baz"
31
- #
32
- # I18n::Backend::ActiveRecord::Translation.lookup([:foo, :bar])
33
- # I18n::Backend::ActiveRecord::Translation.lookup(:"foo.bar")
34
- # # => an array with the translation record :"foo.bar"
35
- #
36
- # When the StoreProcs module was mixed into this model then Procs will
37
- # be stored to the database as Ruby code and evaluated when :value is
38
- # called.
39
- #
40
- # Translation = I18n::Backend::ActiveRecord::Translation
41
- # Translation.create \
42
- # :locale => 'en'
43
- # :key => 'foo'
44
- # :value => lambda { |key, options| 'FOO' }
45
- # Translation.find_by_locale_and_key('en', 'foo').value
46
- # # => 'FOO'
47
- class ActiveRecord
48
- class Translation < ::ActiveRecord::Base
49
- set_table_name 'translations'
50
- attr_protected :is_proc, :interpolations
51
-
52
- serialize :value
53
- serialize :interpolations, Array
54
-
55
- scope_method = ::ActiveRecord::VERSION::MAJOR == 2 ? :named_scope : :scope
56
-
57
- send scope_method, :locale, lambda { |locale|
58
- { :conditions => { :locale => locale.to_s } }
59
- }
60
-
61
- send scope_method, :lookup, lambda { |keys, *separator|
62
- column_name = connection.quote_column_name('key')
63
- keys = Array(keys).map! { |key| key.to_s }
64
-
65
- unless separator.empty?
66
- warn "[DEPRECATION] Giving a separator to Translation.lookup is deprecated. " <<
67
- "You can change the internal separator by overwriting FLATTEN_SEPARATOR."
68
- end
69
-
70
- namespace = "#{keys.last}#{I18n::Backend::Flatten::FLATTEN_SEPARATOR}%"
71
- { :conditions => ["#{column_name} IN (?) OR #{column_name} LIKE ?", keys, namespace] }
72
- }
73
-
74
- def self.available_locales
75
- Translation.find(:all, :select => 'DISTINCT locale').map { |t| t.locale.to_sym }
76
- end
77
-
78
- def interpolates?(key)
79
- self.interpolations.include?(key) if self.interpolations
80
- end
81
-
82
- def value
83
- if is_proc
84
- Kernel.eval(read_attribute(:value))
85
- else
86
- value = read_attribute(:value)
87
- value == 'f' ? false : value
88
- end
89
- end
90
- end
91
- end
92
- end
93
- end
@@ -1,237 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'yaml'
4
- require 'i18n/core_ext/hash'
5
-
6
- module I18n
7
- module Backend
8
- module Base
9
- include I18n::Backend::Transliterator
10
-
11
- RESERVED_KEYS = [:scope, :default, :separator, :resolve]
12
- RESERVED_KEYS_PATTERN = /%\{(#{RESERVED_KEYS.join("|")})\}/
13
- DEPRECATED_INTERPOLATION_SYNTAX_PATTERN = /(\\)?\{\{([^\}]+)\}\}/
14
- INTERPOLATION_SYNTAX_PATTERN = /%\{([^\}]+)\}/
15
-
16
- # Accepts a list of paths to translation files. Loads translations from
17
- # plain Ruby (*.rb) or YAML files (*.yml). See #load_rb and #load_yml
18
- # for details.
19
- def load_translations(*filenames)
20
- filenames = I18n.load_path.flatten if filenames.empty?
21
- filenames.each { |filename| load_file(filename) }
22
- end
23
-
24
- # This method receives a locale, a data hash and options for storing translations.
25
- # Should be implemented
26
- def store_translations(locale, data, options = {})
27
- raise NotImplementedError
28
- end
29
-
30
- def translate(locale, key, options = {})
31
- raise InvalidLocale.new(locale) unless locale
32
- return key.map { |k| translate(locale, k, options) } if key.is_a?(Array)
33
-
34
- entry = key && lookup(locale, key, options[:scope], options)
35
-
36
- if options.empty?
37
- entry = resolve(locale, key, entry, options)
38
- else
39
- count, default = options.values_at(:count, :default)
40
- values = options.except(*RESERVED_KEYS)
41
- entry = entry.nil? && default ?
42
- default(locale, key, default, options) : resolve(locale, key, entry, options)
43
- end
44
-
45
- raise(I18n::MissingTranslationData.new(locale, key, options)) if entry.nil?
46
- entry = entry.dup if entry.is_a?(String)
47
-
48
- entry = pluralize(locale, entry, count) if count
49
- entry = interpolate(locale, entry, values) if values
50
- entry
51
- end
52
-
53
- # Acts the same as +strftime+, but uses a localized version of the
54
- # format string. Takes a key from the date/time formats translations as
55
- # a format argument (<em>e.g.</em>, <tt>:short</tt> in <tt>:'date.formats'</tt>).
56
- def localize(locale, object, format = :default, options = {})
57
- raise ArgumentError, "Object must be a Date, DateTime or Time object. #{object.inspect} given." unless object.respond_to?(:strftime)
58
-
59
- if Symbol === format
60
- key = format
61
- type = object.respond_to?(:sec) ? 'time' : 'date'
62
- format = I18n.t(:"#{type}.formats.#{key}", options.merge(:raise => true, :object => object, :locale => locale))
63
- end
64
-
65
- # format = resolve(locale, object, format, options)
66
- format = format.to_s.gsub(/%[aAbBp]/) do |match|
67
- case match
68
- when '%a' then I18n.t(:"date.abbr_day_names", :locale => locale, :format => format)[object.wday]
69
- when '%A' then I18n.t(:"date.day_names", :locale => locale, :format => format)[object.wday]
70
- when '%b' then I18n.t(:"date.abbr_month_names", :locale => locale, :format => format)[object.mon]
71
- when '%B' then I18n.t(:"date.month_names", :locale => locale, :format => format)[object.mon]
72
- when '%p' then I18n.t(:"time.#{object.hour < 12 ? :am : :pm}", :locale => locale, :format => format) if object.respond_to? :hour
73
- end
74
- end
75
-
76
- object.strftime(format)
77
- end
78
-
79
- # Returns an array of locales for which translations are available
80
- # ignoring the reserved translation meta data key :i18n.
81
- def available_locales
82
- raise NotImplementedError
83
- end
84
-
85
- def reload!
86
- @skip_syntax_deprecation = false
87
- end
88
-
89
- protected
90
-
91
- # The method which actually looks up for the translation in the store.
92
- def lookup(locale, key, scope = [], options = {})
93
- raise NotImplementedError
94
- end
95
-
96
- # Evaluates defaults.
97
- # If given subject is an Array, it walks the array and returns the
98
- # first translation that can be resolved. Otherwise it tries to resolve
99
- # the translation directly.
100
- def default(locale, object, subject, options = {})
101
- options = options.dup.reject { |key, value| key == :default }
102
- case subject
103
- when Array
104
- subject.each do |item|
105
- result = resolve(locale, object, item, options) and return result
106
- end and nil
107
- else
108
- resolve(locale, object, subject, options)
109
- end
110
- end
111
-
112
- # Resolves a translation.
113
- # If the given subject is a Symbol, it will be translated with the
114
- # given options. If it is a Proc then it will be evaluated. All other
115
- # subjects will be returned directly.
116
- def resolve(locale, object, subject, options = nil)
117
- return subject if options[:resolve] == false
118
- case subject
119
- when Symbol
120
- I18n.translate(subject, (options || {}).merge(:locale => locale, :raise => true))
121
- when Proc
122
- date_or_time = options.delete(:object) || object
123
- resolve(locale, object, subject.call(date_or_time, options), options = {})
124
- else
125
- subject
126
- end
127
- rescue MissingTranslationData
128
- nil
129
- end
130
-
131
- # Picks a translation from an array according to English pluralization
132
- # rules. It will pick the first translation if count is not equal to 1
133
- # and the second translation if it is equal to 1. Other backends can
134
- # implement more flexible or complex pluralization rules.
135
- def pluralize(locale, entry, count)
136
- return entry unless entry.is_a?(Hash) && count
137
-
138
- key = :zero if count == 0 && entry.has_key?(:zero)
139
- key ||= count == 1 ? :one : :other
140
- raise InvalidPluralizationData.new(entry, count) unless entry.has_key?(key)
141
- entry[key]
142
- end
143
-
144
- # Interpolates values into a given string.
145
- #
146
- # interpolate "file %{file} opened by %%{user}", :file => 'test.txt', :user => 'Mr. X'
147
- # # => "file test.txt opened by %{user}"
148
- #
149
- # Note that you have to double escape the <tt>\\</tt> when you want to escape
150
- # the <tt>{{...}}</tt> key in a string (once for the string and once for the
151
- # interpolation).
152
- def interpolate(locale, string, values = {})
153
- return string unless string.is_a?(::String) && !values.empty?
154
- original_values = values.dup
155
-
156
- preserve_encoding(string) do
157
- string = string.gsub(DEPRECATED_INTERPOLATION_SYNTAX_PATTERN) do
158
- escaped, key = $1, $2.to_sym
159
- if escaped
160
- "{{#{key}}}"
161
- else
162
- warn_syntax_deprecation!
163
- "%{#{key}}"
164
- end
165
- end
166
-
167
- keys = string.scan(INTERPOLATION_SYNTAX_PATTERN).flatten
168
- return string if keys.empty?
169
-
170
- values.each do |key, value|
171
- if keys.include?(key.to_s)
172
- value = value.call(values) if interpolate_lambda?(value, string, key)
173
- value = value.to_s unless value.is_a?(::String)
174
- values[key] = value
175
- else
176
- values.delete(key)
177
- end
178
- end
179
-
180
- string % values
181
- end
182
- rescue KeyError => e
183
- if string =~ RESERVED_KEYS_PATTERN
184
- raise ReservedInterpolationKey.new($1.to_sym, string)
185
- else
186
- raise MissingInterpolationArgument.new(original_values, string)
187
- end
188
- end
189
-
190
- def preserve_encoding(string)
191
- if string.respond_to?(:encoding)
192
- encoding = string.encoding
193
- result = yield
194
- result.force_encoding(encoding) if result.respond_to?(:force_encoding)
195
- result
196
- else
197
- yield
198
- end
199
- end
200
-
201
- # returns true when the given value responds to :call and the key is
202
- # an interpolation placeholder in the given string
203
- def interpolate_lambda?(object, string, key)
204
- object.respond_to?(:call) && string =~ /%\{#{key}\}|%\<#{key}>.*?\d*\.?\d*[bBdiouxXeEfgGcps]\}/
205
- end
206
-
207
- # Loads a single translations file by delegating to #load_rb or
208
- # #load_yml depending on the file extension and directly merges the
209
- # data to the existing translations. Raises I18n::UnknownFileType
210
- # for all other file extensions.
211
- def load_file(filename)
212
- type = File.extname(filename).tr('.', '').downcase
213
- raise UnknownFileType.new(type, filename) unless respond_to?(:"load_#{type}")
214
- data = send(:"load_#{type}", filename) # TODO raise a meaningful exception if this does not yield a Hash
215
- data.each { |locale, d| store_translations(locale, d) }
216
- end
217
-
218
- # Loads a plain Ruby translations file. eval'ing the file must yield
219
- # a Hash containing translation data with locales as toplevel keys.
220
- def load_rb(filename)
221
- eval(IO.read(filename), binding, filename)
222
- end
223
-
224
- # Loads a YAML translations file. The data must have locales as
225
- # toplevel keys.
226
- def load_yml(filename)
227
- YAML::load(IO.read(filename))
228
- end
229
-
230
- def warn_syntax_deprecation! #:nodoc:
231
- return if @skip_syntax_deprecation
232
- warn "The {{key}} interpolation syntax in I18n messages is deprecated. Please use %{key} instead.\n#{caller.join("\n")}"
233
- @skip_syntax_deprecation = true
234
- end
235
- end
236
- end
237
- end