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,18 +1,26 @@
1
- require 'active_support/callbacks'
2
-
3
1
  module ActiveSupport
4
2
  module Testing
5
3
  module SetupAndTeardown
6
- def self.included(base)
7
- base.class_eval do
8
- include ActiveSupport::Callbacks
9
- define_callbacks :setup, :teardown
4
+ extend ActiveSupport::Concern
10
5
 
11
- if defined?(MiniTest::Assertions) && TestCase < MiniTest::Assertions
12
- include ForMiniTest
13
- else
14
- include ForClassicTestUnit
15
- end
6
+ included do
7
+ include ActiveSupport::Callbacks
8
+ define_callbacks :setup, :teardown
9
+
10
+ if defined?(MiniTest::Assertions) && TestCase < MiniTest::Assertions
11
+ include ForMiniTest
12
+ else
13
+ include ForClassicTestUnit
14
+ end
15
+ end
16
+
17
+ module ClassMethods
18
+ def setup(*args, &block)
19
+ set_callback(:setup, :before, *args, &block)
20
+ end
21
+
22
+ def teardown(*args, &block)
23
+ set_callback(:teardown, :after, *args, &block)
16
24
  end
17
25
  end
18
26
 
@@ -20,15 +28,16 @@ module ActiveSupport
20
28
  def run(runner)
21
29
  result = '.'
22
30
  begin
23
- run_callbacks :setup
24
- result = super
31
+ _run_setup_callbacks do
32
+ result = super
33
+ end
25
34
  rescue Exception => e
26
- result = runner.puke(self.class, __name__, e)
35
+ result = runner.puke(self.class, method_name, e)
27
36
  ensure
28
37
  begin
29
- run_callbacks :teardown, :enumerator => :reverse_each
38
+ _run_teardown_callbacks
30
39
  rescue Exception => e
31
- result = runner.puke(self.class, __name__, e)
40
+ result = runner.puke(self.class, method_name, e)
32
41
  end
33
42
  end
34
43
  result
@@ -44,23 +53,17 @@ module ActiveSupport
44
53
  def run(result)
45
54
  return if @method_name.to_s == "default_test"
46
55
 
47
- if using_mocha = respond_to?(:mocha_verify)
48
- assertion_counter_klass = if defined?(Mocha::TestCaseAdapter::AssertionCounter)
49
- Mocha::TestCaseAdapter::AssertionCounter
50
- else
51
- Mocha::Integration::TestUnit::AssertionCounter
52
- end
53
- assertion_counter = assertion_counter_klass.new(result)
54
- end
55
-
56
+ mocha_counter = retrieve_mocha_counter(result)
56
57
  yield(Test::Unit::TestCase::STARTED, name)
57
58
  @_result = result
59
+
58
60
  begin
59
61
  begin
60
- run_callbacks :setup
61
- setup
62
- __send__(@method_name)
63
- mocha_verify(assertion_counter) if using_mocha
62
+ _run_setup_callbacks do
63
+ setup
64
+ __send__(@method_name)
65
+ mocha_verify(mocha_counter) if mocha_counter
66
+ end
64
67
  rescue Mocha::ExpectationError => e
65
68
  add_failure(e.message, e.backtrace)
66
69
  rescue Test::Unit::AssertionFailedError => e
@@ -71,7 +74,7 @@ module ActiveSupport
71
74
  ensure
72
75
  begin
73
76
  teardown
74
- run_callbacks :teardown, :enumerator => :reverse_each
77
+ _run_teardown_callbacks
75
78
  rescue Test::Unit::AssertionFailedError => e
76
79
  add_failure(e.message, e.backtrace)
77
80
  rescue Exception => e
@@ -80,12 +83,26 @@ module ActiveSupport
80
83
  end
81
84
  end
82
85
  ensure
83
- mocha_teardown if using_mocha
86
+ mocha_teardown if mocha_counter
84
87
  end
88
+
85
89
  result.add_run
86
90
  yield(Test::Unit::TestCase::FINISHED, name)
87
91
  end
92
+
93
+ protected
94
+
95
+ def retrieve_mocha_counter(result) #:nodoc:
96
+ if using_mocha = respond_to?(:mocha_verify)
97
+ if defined?(Mocha::TestCaseAdapter::AssertionCounter)
98
+ Mocha::TestCaseAdapter::AssertionCounter.new(result)
99
+ else
100
+ Mocha::Integration::TestUnit::AssertionCounter.new(result)
101
+ end
102
+ end
103
+ end
88
104
  end
105
+
89
106
  end
90
107
  end
91
108
  end
@@ -0,0 +1,34 @@
1
+ require 'active_support'
2
+
3
+ module ActiveSupport
4
+ autoload :Duration, 'active_support/duration'
5
+ autoload :TimeWithZone, 'active_support/time_with_zone'
6
+ autoload :TimeZone, 'active_support/values/time_zone'
7
+
8
+ on_load_all do
9
+ [Duration, TimeWithZone, TimeZone]
10
+ end
11
+ end
12
+
13
+ require 'date'
14
+ require 'time'
15
+
16
+ require 'active_support/core_ext/time/publicize_conversion_methods'
17
+ require 'active_support/core_ext/time/marshal_with_utc_flag'
18
+ require 'active_support/core_ext/time/acts_like'
19
+ require 'active_support/core_ext/time/calculations'
20
+ require 'active_support/core_ext/time/conversions'
21
+ require 'active_support/core_ext/time/zones'
22
+
23
+ require 'active_support/core_ext/date/acts_like'
24
+ require 'active_support/core_ext/date/freeze'
25
+ require 'active_support/core_ext/date/calculations'
26
+ require 'active_support/core_ext/date/conversions'
27
+
28
+ require 'active_support/core_ext/date_time/acts_like'
29
+ require 'active_support/core_ext/date_time/calculations'
30
+ require 'active_support/core_ext/date_time/conversions'
31
+ require 'active_support/core_ext/date_time/zones'
32
+
33
+ require 'active_support/core_ext/integer/time'
34
+ require 'active_support/core_ext/numeric/time'
@@ -0,0 +1,5 @@
1
+ module ActiveSupport
2
+ autoload :Duration, 'active_support/duration'
3
+ autoload :TimeWithZone, 'active_support/time_with_zone'
4
+ autoload :TimeZone, 'active_support/values/time_zone'
5
+ end
@@ -1,4 +1,5 @@
1
- require 'tzinfo'
1
+ require "active_support/values/time_zone"
2
+ require 'active_support/core_ext/object/acts_like'
2
3
 
3
4
  module ActiveSupport
4
5
  # A Time-like class that can represent a time in any time zone. Necessary because standard Ruby Time instances are
@@ -15,7 +16,7 @@ module ActiveSupport
15
16
  # Time.zone.now # => Sun, 18 May 2008 13:07:55 EDT -04:00
16
17
  # Time.utc(2007, 2, 10, 20, 30, 45).in_time_zone # => Sat, 10 Feb 2007 15:30:45 EST -05:00
17
18
  #
18
- # See TimeZone and ActiveSupport::CoreExtensions::Time::Zones for further documentation for these methods.
19
+ # See Time and TimeZone for further documentation of these methods.
19
20
  #
20
21
  # TimeWithZone instances implement the same API as Ruby Time instances, so that Time and TimeWithZone instances are interchangable. Examples:
21
22
  #
@@ -31,6 +32,10 @@ module ActiveSupport
31
32
  # t.is_a?(Time) # => true
32
33
  # t.is_a?(ActiveSupport::TimeWithZone) # => true
33
34
  class TimeWithZone
35
+ def self.name
36
+ 'Time' # Report class name as 'Time' to thwart type checking
37
+ end
38
+
34
39
  include Comparable
35
40
  attr_reader :time_zone
36
41
 
@@ -87,7 +92,7 @@ module ActiveSupport
87
92
  alias_method :gmtoff, :utc_offset
88
93
 
89
94
  def formatted_offset(colon = true, alternate_utc_string = nil)
90
- utc? && alternate_utc_string || utc_offset.to_utc_offset_s(colon)
95
+ utc? && alternate_utc_string || TimeZone.seconds_to_utc_offset(utc_offset, colon)
91
96
  end
92
97
 
93
98
  # Time uses +zone+ to display the time zone abbreviation, so we're duck-typing it.
@@ -108,9 +113,9 @@ module ActiveSupport
108
113
  end
109
114
  alias_method :iso8601, :xmlschema
110
115
 
111
- # Coerces the date to a string for JSON encoding.
112
- #
113
- # ISO 8601 format is used if ActiveSupport::JSON::Encoding.use_standard_json_time_format is set.
116
+ # Coerces the date to a string for JSON encoding. The default format is ISO 8601. You can get
117
+ # %Y/%m/%d %H:%M:%S +offset style by setting ActiveSupport::JSON::Encoding.use_standard_json_time_format
118
+ # to false.
114
119
  #
115
120
  # ==== Examples
116
121
  #
@@ -149,8 +154,9 @@ module ActiveSupport
149
154
  # <tt>:db</tt> format outputs time in UTC; all others output time in local.
150
155
  # Uses TimeWithZone's +strftime+, so <tt>%Z</tt> and <tt>%z</tt> work correctly.
151
156
  def to_s(format = :default)
152
- return utc.to_s(format) if format == :db
153
- if formatter = ::Time::DATE_FORMATS[format]
157
+ if format == :db
158
+ utc.to_s(format)
159
+ elsif formatter = ::Time::DATE_FORMATS[format]
154
160
  formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter)
155
161
  else
156
162
  "#{time.strftime("%Y-%m-%d %H:%M:%S")} #{formatted_offset(false, 'UTC')}" # mimicking Ruby 1.9 Time#to_s format
@@ -239,10 +245,10 @@ module ActiveSupport
239
245
  end
240
246
 
241
247
  %w(year mon month day mday wday yday hour min sec to_date).each do |method_name|
242
- class_eval <<-EOV
243
- def #{method_name} # def year
244
- time.#{method_name} # time.year
245
- end # end
248
+ class_eval <<-EOV, __FILE__, __LINE__ + 1
249
+ def #{method_name} # def month
250
+ time.#{method_name} # time.month
251
+ end # end
246
252
  EOV
247
253
  end
248
254
 
@@ -1,3 +1,5 @@
1
+ require 'active_support/core_ext/object/blank'
2
+
1
3
  # The TimeZone class serves as a wrapper around TZInfo::Timezone instances. It allows us to do the following:
2
4
  #
3
5
  # * Limit the set of zones provided by TZInfo to a meaningful subset of 142 zones.
@@ -53,13 +55,13 @@ module ActiveSupport
53
55
  "Newfoundland" => "America/St_Johns",
54
56
  "Brasilia" => "America/Sao_Paulo",
55
57
  "Buenos Aires" => "America/Argentina/Buenos_Aires",
56
- "Georgetown" => "America/Argentina/San_Juan",
58
+ "Georgetown" => "America/Guyana",
57
59
  "Greenland" => "America/Godthab",
58
60
  "Mid-Atlantic" => "Atlantic/South_Georgia",
59
61
  "Azores" => "Atlantic/Azores",
60
62
  "Cape Verde Is." => "Atlantic/Cape_Verde",
61
63
  "Dublin" => "Europe/Dublin",
62
- "Edinburgh" => "Europe/Dublin",
64
+ "Edinburgh" => "Europe/London",
63
65
  "Lisbon" => "Europe/Lisbon",
64
66
  "London" => "Europe/London",
65
67
  "Casablanca" => "Africa/Casablanca",
@@ -88,7 +90,7 @@ module ActiveSupport
88
90
  "Bucharest" => "Europe/Bucharest",
89
91
  "Cairo" => "Africa/Cairo",
90
92
  "Helsinki" => "Europe/Helsinki",
91
- "Kyev" => "Europe/Kiev",
93
+ "Kyiv" => "Europe/Kiev",
92
94
  "Riga" => "Europe/Riga",
93
95
  "Sofia" => "Europe/Sofia",
94
96
  "Tallinn" => "Europe/Tallinn",
@@ -121,7 +123,7 @@ module ActiveSupport
121
123
  "Kolkata" => "Asia/Kolkata",
122
124
  "Mumbai" => "Asia/Kolkata",
123
125
  "New Delhi" => "Asia/Kolkata",
124
- "Kathmandu" => "Asia/Katmandu",
126
+ "Kathmandu" => "Asia/Kathmandu",
125
127
  "Astana" => "Asia/Dhaka",
126
128
  "Dhaka" => "Asia/Dhaka",
127
129
  "Sri Jayawardenepura" => "Asia/Colombo",
@@ -170,34 +172,42 @@ module ActiveSupport
170
172
  MAPPING.freeze
171
173
  end
172
174
 
175
+ UTC_OFFSET_WITH_COLON = '%s%02d:%02d'
176
+ UTC_OFFSET_WITHOUT_COLON = UTC_OFFSET_WITH_COLON.sub(':', '')
177
+
178
+ # Assumes self represents an offset from UTC in seconds (as returned from Time#utc_offset)
179
+ # and turns this into an +HH:MM formatted string. Example:
180
+ #
181
+ # TimeZone.seconds_to_utc_offset(-21_600) # => "-06:00"
182
+ def self.seconds_to_utc_offset(seconds, colon = true)
183
+ format = colon ? UTC_OFFSET_WITH_COLON : UTC_OFFSET_WITHOUT_COLON
184
+ sign = (seconds < 0 ? '-' : '+')
185
+ hours = seconds.abs / 3600
186
+ minutes = (seconds.abs % 3600) / 60
187
+ format % [sign, hours, minutes]
188
+ end
189
+
173
190
  include Comparable
174
191
  attr_reader :name
175
- attr_reader :tzinfo
176
192
 
177
193
  # Create a new TimeZone object with the given name and offset. The
178
194
  # offset is the number of seconds that this time zone is offset from UTC
179
195
  # (GMT). Seconds were chosen as the offset unit because that is the unit that
180
196
  # Ruby uses to represent time zone offsets (see Time#utc_offset).
181
- def initialize(name, utc_offset = nil, tzinfo = nil)
197
+ def initialize(name, utc_offset, tzinfo = nil)
182
198
  @name = name
183
199
  @utc_offset = utc_offset
184
- @tzinfo = tzinfo || TimeZone.find_tzinfo(name)
185
- @current_period = nil
200
+ @tzinfo = tzinfo
186
201
  end
187
202
 
188
203
  def utc_offset
189
- if @utc_offset
190
- @utc_offset
191
- else
192
- @current_period ||= tzinfo.current_period
193
- @current_period.utc_offset
194
- end
204
+ @utc_offset ||= tzinfo.current_period.utc_offset
195
205
  end
196
206
 
197
207
  # Returns the offset of this time zone as a formatted string, of the
198
208
  # format "+HH:MM".
199
209
  def formatted_offset(colon=true, alternate_utc_string = nil)
200
- utc_offset == 0 && alternate_utc_string || utc_offset.to_utc_offset_s(colon)
210
+ utc_offset == 0 && alternate_utc_string || self.class.seconds_to_utc_offset(utc_offset, colon)
201
211
  end
202
212
 
203
213
  # Compare this time zone to the parameter. The two are comapred first on
@@ -294,11 +304,76 @@ module ActiveSupport
294
304
  end
295
305
 
296
306
  # TODO: Preload instead of lazy load for thread safety
297
- def self.find_tzinfo(name)
307
+ def tzinfo
298
308
  require 'tzinfo' unless defined?(TZInfo)
299
- ::TZInfo::Timezone.get(MAPPING[name] || name)
300
- rescue TZInfo::InvalidTimezoneIdentifier
301
- nil
309
+ @tzinfo ||= TZInfo::Timezone.get(MAPPING[name])
310
+ end
311
+
312
+ unless const_defined?(:ZONES)
313
+ ZONES = []
314
+ ZONES_MAP = {}
315
+ [[-39_600, "International Date Line West", "Midway Island", "Samoa" ],
316
+ [-36_000, "Hawaii" ],
317
+ [-32_400, "Alaska" ],
318
+ [-28_800, "Pacific Time (US & Canada)", "Tijuana" ],
319
+ [-25_200, "Mountain Time (US & Canada)", "Chihuahua", "Mazatlan",
320
+ "Arizona" ],
321
+ [-21_600, "Central Time (US & Canada)", "Saskatchewan", "Guadalajara",
322
+ "Mexico City", "Monterrey", "Central America" ],
323
+ [-18_000, "Eastern Time (US & Canada)", "Indiana (East)", "Bogota",
324
+ "Lima", "Quito" ],
325
+ [-16_200, "Caracas" ],
326
+ [-14_400, "Atlantic Time (Canada)", "Georgetown", "La Paz", "Santiago" ],
327
+ [-12_600, "Newfoundland" ],
328
+ [-10_800, "Brasilia", "Buenos Aires", "Greenland" ],
329
+ [ -7_200, "Mid-Atlantic" ],
330
+ [ -3_600, "Azores", "Cape Verde Is." ],
331
+ [ 0, "Dublin", "Edinburgh", "Lisbon", "London", "Casablanca",
332
+ "Monrovia", "UTC" ],
333
+ [ 3_600, "Belgrade", "Bratislava", "Budapest", "Ljubljana", "Prague",
334
+ "Sarajevo", "Skopje", "Warsaw", "Zagreb", "Brussels",
335
+ "Copenhagen", "Madrid", "Paris", "Amsterdam", "Berlin",
336
+ "Bern", "Rome", "Stockholm", "Vienna",
337
+ "West Central Africa" ],
338
+ [ 7_200, "Bucharest", "Cairo", "Helsinki", "Kyiv", "Riga", "Sofia",
339
+ "Tallinn", "Vilnius", "Athens", "Istanbul", "Minsk",
340
+ "Jerusalem", "Harare", "Pretoria" ],
341
+ [ 10_800, "Moscow", "St. Petersburg", "Volgograd", "Kuwait", "Riyadh",
342
+ "Nairobi", "Baghdad" ],
343
+ [ 12_600, "Tehran" ],
344
+ [ 14_400, "Abu Dhabi", "Muscat", "Baku", "Tbilisi", "Yerevan" ],
345
+ [ 16_200, "Kabul" ],
346
+ [ 18_000, "Ekaterinburg", "Islamabad", "Karachi", "Tashkent" ],
347
+ [ 19_800, "Chennai", "Kolkata", "Mumbai", "New Delhi", "Sri Jayawardenepura" ],
348
+ [ 20_700, "Kathmandu" ],
349
+ [ 21_600, "Astana", "Dhaka", "Almaty",
350
+ "Novosibirsk" ],
351
+ [ 23_400, "Rangoon" ],
352
+ [ 25_200, "Bangkok", "Hanoi", "Jakarta", "Krasnoyarsk" ],
353
+ [ 28_800, "Beijing", "Chongqing", "Hong Kong", "Urumqi",
354
+ "Kuala Lumpur", "Singapore", "Taipei", "Perth", "Irkutsk",
355
+ "Ulaan Bataar" ],
356
+ [ 32_400, "Seoul", "Osaka", "Sapporo", "Tokyo", "Yakutsk" ],
357
+ [ 34_200, "Darwin", "Adelaide" ],
358
+ [ 36_000, "Canberra", "Melbourne", "Sydney", "Brisbane", "Hobart",
359
+ "Vladivostok", "Guam", "Port Moresby" ],
360
+ [ 39_600, "Magadan", "Solomon Is.", "New Caledonia" ],
361
+ [ 43_200, "Fiji", "Kamchatka", "Marshall Is.", "Auckland",
362
+ "Wellington" ],
363
+ [ 46_800, "Nuku'alofa" ]].
364
+ each do |offset, *places|
365
+ places.sort.each do |place|
366
+ place.freeze
367
+ zone = new(place, offset)
368
+ ZONES << zone
369
+ ZONES_MAP[place] = zone
370
+ end
371
+ end
372
+ ZONES.freeze
373
+ ZONES_MAP.freeze
374
+
375
+ US_ZONES = ZONES.find_all { |z| z.name =~ /US|Arizona|Indiana|Hawaii|Alaska/ }
376
+ US_ZONES.freeze
302
377
  end
303
378
 
304
379
  class << self
@@ -315,68 +390,7 @@ module ActiveSupport
315
390
  # TimeZone objects per time zone, in many cases, to make it easier
316
391
  # for users to find their own time zone.
317
392
  def all
318
- @zones ||= zones_map.values.sort
319
- end
320
-
321
- def zones_map
322
- unless defined?(@zones_map)
323
- @zones_map = {}
324
- [[-39_600, "International Date Line West", "Midway Island", "Samoa" ],
325
- [-36_000, "Hawaii" ],
326
- [-32_400, "Alaska" ],
327
- [-28_800, "Pacific Time (US & Canada)", "Tijuana" ],
328
- [-25_200, "Mountain Time (US & Canada)", "Chihuahua", "Mazatlan",
329
- "Arizona" ],
330
- [-21_600, "Central Time (US & Canada)", "Saskatchewan", "Guadalajara",
331
- "Mexico City", "Monterrey", "Central America" ],
332
- [-18_000, "Eastern Time (US & Canada)", "Indiana (East)", "Bogota",
333
- "Lima", "Quito" ],
334
- [-16_200, "Caracas" ],
335
- [-14_400, "Atlantic Time (Canada)", "La Paz", "Santiago" ],
336
- [-12_600, "Newfoundland" ],
337
- [-10_800, "Brasilia", "Buenos Aires", "Georgetown", "Greenland" ],
338
- [ -7_200, "Mid-Atlantic" ],
339
- [ -3_600, "Azores", "Cape Verde Is." ],
340
- [ 0, "Dublin", "Edinburgh", "Lisbon", "London", "Casablanca",
341
- "Monrovia", "UTC" ],
342
- [ 3_600, "Belgrade", "Bratislava", "Budapest", "Ljubljana", "Prague",
343
- "Sarajevo", "Skopje", "Warsaw", "Zagreb", "Brussels",
344
- "Copenhagen", "Madrid", "Paris", "Amsterdam", "Berlin",
345
- "Bern", "Rome", "Stockholm", "Vienna",
346
- "West Central Africa" ],
347
- [ 7_200, "Bucharest", "Cairo", "Helsinki", "Kyev", "Riga", "Sofia",
348
- "Tallinn", "Vilnius", "Athens", "Istanbul", "Minsk",
349
- "Jerusalem", "Harare", "Pretoria" ],
350
- [ 10_800, "Moscow", "St. Petersburg", "Volgograd", "Kuwait", "Riyadh",
351
- "Nairobi", "Baghdad" ],
352
- [ 12_600, "Tehran" ],
353
- [ 14_400, "Abu Dhabi", "Muscat", "Baku", "Tbilisi", "Yerevan" ],
354
- [ 16_200, "Kabul" ],
355
- [ 18_000, "Ekaterinburg", "Islamabad", "Karachi", "Tashkent" ],
356
- [ 19_800, "Chennai", "Kolkata", "Mumbai", "New Delhi", "Sri Jayawardenepura" ],
357
- [ 20_700, "Kathmandu" ],
358
- [ 21_600, "Astana", "Dhaka", "Almaty",
359
- "Novosibirsk" ],
360
- [ 23_400, "Rangoon" ],
361
- [ 25_200, "Bangkok", "Hanoi", "Jakarta", "Krasnoyarsk" ],
362
- [ 28_800, "Beijing", "Chongqing", "Hong Kong", "Urumqi",
363
- "Kuala Lumpur", "Singapore", "Taipei", "Perth", "Irkutsk",
364
- "Ulaan Bataar" ],
365
- [ 32_400, "Seoul", "Osaka", "Sapporo", "Tokyo", "Yakutsk" ],
366
- [ 34_200, "Darwin", "Adelaide" ],
367
- [ 36_000, "Canberra", "Melbourne", "Sydney", "Brisbane", "Hobart",
368
- "Vladivostok", "Guam", "Port Moresby" ],
369
- [ 39_600, "Magadan", "Solomon Is.", "New Caledonia" ],
370
- [ 43_200, "Fiji", "Kamchatka", "Marshall Is.", "Auckland",
371
- "Wellington" ],
372
- [ 46_800, "Nuku'alofa" ]].
373
- each do |offset, *places|
374
- places.each do |place|
375
- @zones_map[place] = create(place, offset)
376
- end
377
- end
378
- end
379
- @zones_map
393
+ ZONES
380
394
  end
381
395
 
382
396
  # Locate a specific time zone object. If the argument is a string, it
@@ -387,11 +401,7 @@ module ActiveSupport
387
401
  def [](arg)
388
402
  case arg
389
403
  when String
390
- if tz = zones_map[arg]
391
- tz
392
- elsif tz = lookup(arg)
393
- zones_map[arg] = tz
394
- end
404
+ ZONES_MAP[arg]
395
405
  when Numeric, ActiveSupport::Duration
396
406
  arg *= 3600 if arg.abs <= 13
397
407
  all.find { |z| z.utc_offset == arg.to_i }
@@ -403,14 +413,8 @@ module ActiveSupport
403
413
  # A convenience method for returning a collection of TimeZone objects
404
414
  # for time zones in the USA.
405
415
  def us_zones
406
- @us_zones ||= all.find_all { |z| z.name =~ /US|Arizona|Indiana|Hawaii|Alaska/ }
416
+ US_ZONES
407
417
  end
408
-
409
- private
410
-
411
- def lookup(name)
412
- (tzinfo = find_tzinfo(name)) && create(tzinfo.name.freeze)
413
- end
414
418
  end
415
419
  end
416
420
  end