activesupport 2.3.5 → 3.0.0.beta3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. data/CHANGELOG +66 -9
  2. data/lib/active_support/all.rb +2 -7
  3. data/lib/active_support/backtrace_cleaner.rb +31 -9
  4. data/lib/active_support/base64.rb +9 -0
  5. data/lib/active_support/basic_object.rb +7 -10
  6. data/lib/active_support/benchmarkable.rb +60 -0
  7. data/lib/active_support/buffered_logger.rb +14 -9
  8. data/lib/active_support/cache/compressed_mem_cache_store.rb +2 -0
  9. data/lib/active_support/cache/file_store.rb +35 -17
  10. data/lib/active_support/cache/mem_cache_store.rb +32 -23
  11. data/lib/active_support/cache/memory_store.rb +17 -10
  12. data/lib/active_support/cache/strategy/local_cache.rb +9 -1
  13. data/lib/active_support/cache.rb +75 -55
  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/array/access.rb +39 -46
  18. data/lib/active_support/core_ext/array/conversions.rb +145 -182
  19. data/lib/active_support/core_ext/array/extract_options.rb +26 -17
  20. data/lib/active_support/core_ext/array/grouping.rb +87 -93
  21. data/lib/active_support/core_ext/array/random_access.rb +4 -10
  22. data/lib/active_support/core_ext/array/uniq_by.rb +17 -0
  23. data/lib/active_support/core_ext/array/wrap.rb +22 -0
  24. data/lib/active_support/core_ext/array.rb +2 -10
  25. data/lib/active_support/core_ext/big_decimal/conversions.rb +27 -0
  26. data/lib/active_support/core_ext/big_decimal.rb +1 -0
  27. data/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +16 -20
  28. data/lib/active_support/core_ext/cgi.rb +0 -4
  29. data/lib/active_support/core_ext/class/attribute.rb +70 -0
  30. data/lib/active_support/core_ext/class/attribute_accessors.rb +40 -31
  31. data/lib/active_support/core_ext/class/delegating_attributes.rb +37 -40
  32. data/lib/active_support/core_ext/class/inheritable_attributes.rb +100 -11
  33. data/lib/active_support/core_ext/class/subclasses.rb +55 -0
  34. data/lib/active_support/core_ext/class.rb +1 -1
  35. data/lib/active_support/core_ext/date/acts_like.rb +8 -0
  36. data/lib/active_support/core_ext/date/calculations.rb +218 -228
  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 +85 -85
  42. data/lib/active_support/core_ext/date_time/zones.rb +17 -0
  43. data/lib/active_support/core_ext/enumerable.rb +18 -13
  44. data/lib/active_support/core_ext/exception.rb +1 -43
  45. data/lib/active_support/core_ext/file/atomic.rb +35 -40
  46. data/lib/active_support/core_ext/file/path.rb +5 -0
  47. data/lib/active_support/core_ext/file.rb +0 -4
  48. data/lib/active_support/core_ext/float/rounding.rb +15 -20
  49. data/lib/active_support/core_ext/float.rb +0 -6
  50. data/lib/active_support/core_ext/hash/conversions.rb +255 -229
  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/hash.rb +8 -14
  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/integer.rb +1 -7
  63. data/lib/active_support/core_ext/kernel/debugger.rb +1 -1
  64. data/lib/active_support/core_ext/kernel/reporting.rb +9 -7
  65. data/lib/active_support/core_ext/kernel/requires.rb +3 -1
  66. data/lib/active_support/core_ext/kernel/singleton_class.rb +13 -0
  67. data/lib/active_support/core_ext/kernel.rb +1 -1
  68. data/lib/active_support/core_ext/load_error.rb +16 -32
  69. data/lib/active_support/core_ext/logger.rb +3 -2
  70. data/lib/active_support/core_ext/module/aliasing.rb +64 -68
  71. data/lib/active_support/core_ext/module/anonymous.rb +24 -0
  72. data/lib/active_support/core_ext/module/attr_accessor_with_default.rb +1 -1
  73. data/lib/active_support/core_ext/module/attr_internal.rb +4 -4
  74. data/lib/active_support/core_ext/module/attribute_accessors.rb +48 -42
  75. data/lib/active_support/core_ext/module/delegation.rb +22 -11
  76. data/lib/active_support/core_ext/module/deprecation.rb +9 -0
  77. data/lib/active_support/core_ext/module/introspection.rb +77 -79
  78. data/lib/active_support/core_ext/module/method_names.rb +14 -0
  79. data/lib/active_support/core_ext/module/reachable.rb +10 -0
  80. data/lib/active_support/core_ext/module/remove_method.rb +6 -0
  81. data/lib/active_support/core_ext/module/synchronization.rb +4 -1
  82. data/lib/active_support/core_ext/module.rb +7 -18
  83. data/lib/active_support/core_ext/name_error.rb +3 -4
  84. data/lib/active_support/core_ext/numeric/bytes.rb +35 -41
  85. data/lib/active_support/core_ext/numeric/time.rb +70 -74
  86. data/lib/active_support/core_ext/numeric.rb +1 -8
  87. data/lib/active_support/core_ext/object/acts_like.rb +10 -0
  88. data/lib/active_support/core_ext/object/blank.rb +20 -2
  89. data/lib/active_support/core_ext/object/conversions.rb +4 -15
  90. data/lib/active_support/core_ext/object/duplicable.rb +65 -0
  91. data/lib/active_support/core_ext/object/extending.rb +8 -77
  92. data/lib/active_support/core_ext/object/instance_variables.rb +0 -7
  93. data/lib/active_support/core_ext/object/misc.rb +2 -90
  94. data/lib/active_support/core_ext/object/returning.rb +42 -0
  95. data/lib/active_support/core_ext/object/to_param.rb +49 -0
  96. data/lib/active_support/core_ext/object/to_query.rb +27 -0
  97. data/lib/active_support/core_ext/{try.rb → object/try.rb} +4 -4
  98. data/lib/active_support/core_ext/object/with_options.rb +24 -0
  99. data/lib/active_support/core_ext/object.rb +10 -2
  100. data/lib/active_support/core_ext/proc.rb +3 -1
  101. data/lib/active_support/core_ext/process/daemon.rb +17 -19
  102. data/lib/active_support/core_ext/range/blockless_step.rb +24 -27
  103. data/lib/active_support/core_ext/range/conversions.rb +17 -23
  104. data/lib/active_support/core_ext/range/include_range.rb +18 -27
  105. data/lib/active_support/core_ext/range/overlaps.rb +6 -13
  106. data/lib/active_support/core_ext/range.rb +2 -9
  107. data/lib/active_support/core_ext/regexp.rb +5 -0
  108. data/lib/active_support/core_ext/rexml.rb +12 -7
  109. data/lib/active_support/core_ext/string/access.rb +88 -95
  110. data/lib/active_support/core_ext/string/behavior.rb +6 -12
  111. data/lib/active_support/core_ext/string/conversions.rb +20 -21
  112. data/lib/active_support/core_ext/string/exclude.rb +6 -0
  113. data/lib/active_support/core_ext/string/filters.rb +17 -23
  114. data/lib/active_support/core_ext/string/inflections.rb +147 -154
  115. data/lib/active_support/core_ext/string/interpolation.rb +1 -0
  116. data/lib/active_support/core_ext/string/multibyte.rb +68 -74
  117. data/lib/active_support/core_ext/string/output_safety.rb +105 -44
  118. data/lib/active_support/core_ext/string/starts_ends_with.rb +3 -34
  119. data/lib/active_support/core_ext/string/xchar.rb +10 -3
  120. data/lib/active_support/core_ext/string.rb +6 -20
  121. data/lib/active_support/core_ext/time/acts_like.rb +8 -0
  122. data/lib/active_support/core_ext/time/calculations.rb +276 -299
  123. data/lib/active_support/core_ext/time/conversions.rb +79 -84
  124. data/lib/active_support/core_ext/time/marshal.rb +56 -0
  125. data/lib/active_support/core_ext/time/publicize_conversion_methods.rb +10 -0
  126. data/lib/active_support/core_ext/time/zones.rb +73 -81
  127. data/lib/active_support/core_ext/uri.rb +2 -1
  128. data/lib/active_support/core_ext.rb +2 -7
  129. data/lib/active_support/dependencies/autoload.rb +50 -0
  130. data/lib/active_support/dependencies.rb +168 -197
  131. data/lib/active_support/deprecation/behaviors.rb +38 -0
  132. data/lib/active_support/deprecation/method_wrappers.rb +29 -0
  133. data/lib/active_support/deprecation/proxy_wrappers.rb +74 -0
  134. data/lib/active_support/deprecation/reporting.rb +56 -0
  135. data/lib/active_support/deprecation.rb +9 -187
  136. data/lib/active_support/duration.rb +6 -2
  137. data/lib/active_support/hash_with_indifferent_access.rb +141 -0
  138. data/lib/active_support/i18n.rb +3 -0
  139. data/lib/active_support/inflections.rb +1 -1
  140. data/lib/active_support/inflector/inflections.rb +211 -0
  141. data/lib/active_support/inflector/methods.rb +141 -0
  142. data/lib/active_support/inflector/transliterate.rb +77 -0
  143. data/lib/active_support/inflector.rb +4 -403
  144. data/lib/active_support/json/backends/jsongem.rb +16 -10
  145. data/lib/active_support/json/backends/yajl.rb +40 -0
  146. data/lib/active_support/json/backends/yaml.rb +14 -8
  147. data/lib/active_support/json/decoding.rb +17 -1
  148. data/lib/active_support/json/encoding.rb +164 -35
  149. data/lib/active_support/json/variable.rb +4 -3
  150. data/lib/active_support/lazy_load_hooks.rb +17 -0
  151. data/lib/active_support/memoizable.rb +8 -5
  152. data/lib/active_support/message_encryptor.rb +1 -0
  153. data/lib/active_support/message_verifier.rb +12 -29
  154. data/lib/active_support/multibyte/chars.rb +88 -31
  155. data/lib/active_support/multibyte/unicode_database.rb +5 -5
  156. data/lib/active_support/multibyte/utils.rb +6 -7
  157. data/lib/active_support/multibyte.rb +11 -6
  158. data/lib/active_support/notifications/fanout.rb +83 -0
  159. data/lib/active_support/notifications/instrumenter.rb +50 -0
  160. data/lib/active_support/notifications.rb +81 -0
  161. data/lib/active_support/option_merger.rb +2 -0
  162. data/lib/active_support/ordered_hash.rb +28 -11
  163. data/lib/active_support/ordered_options.rb +9 -1
  164. data/lib/active_support/railtie.rb +64 -0
  165. data/lib/active_support/rescuable.rb +11 -6
  166. data/lib/active_support/ruby/shim.rb +21 -0
  167. data/lib/active_support/test_case.rb +10 -8
  168. data/lib/active_support/testing/assertions.rb +17 -0
  169. data/lib/active_support/testing/declarative.rb +31 -12
  170. data/lib/active_support/testing/deprecation.rb +8 -10
  171. data/lib/active_support/testing/isolation.rb +153 -0
  172. data/lib/active_support/testing/pending.rb +48 -0
  173. data/lib/active_support/testing/performance.rb +342 -339
  174. data/lib/active_support/testing/setup_and_teardown.rb +48 -31
  175. data/lib/active_support/time/autoload.rb +5 -0
  176. data/lib/active_support/time.rb +34 -0
  177. data/lib/active_support/time_with_zone.rb +18 -12
  178. data/lib/active_support/values/time_zone.rb +51 -68
  179. data/lib/active_support/version.rb +5 -4
  180. data/lib/active_support/whiny_nil.rb +5 -9
  181. data/lib/active_support/xml_mini/jdom.rb +13 -7
  182. data/lib/active_support/xml_mini/libxml.rb +38 -91
  183. data/lib/active_support/xml_mini/libxmlsax.rb +85 -0
  184. data/lib/active_support/xml_mini/nokogiri.rb +40 -31
  185. data/lib/active_support/xml_mini/nokogirisax.rb +83 -0
  186. data/lib/active_support/xml_mini/rexml.rb +30 -9
  187. data/lib/active_support/xml_mini.rb +2 -0
  188. data/lib/active_support.rb +46 -30
  189. metadata +136 -215
  190. data/lib/active_support/cache/drb_store.rb +0 -14
  191. data/lib/active_support/core_ext/array/wrapper.rb +0 -24
  192. data/lib/active_support/core_ext/base64/encoding.rb +0 -16
  193. data/lib/active_support/core_ext/base64.rb +0 -4
  194. data/lib/active_support/core_ext/bigdecimal/conversions.rb +0 -37
  195. data/lib/active_support/core_ext/bigdecimal.rb +0 -6
  196. data/lib/active_support/core_ext/blank.rb +0 -2
  197. data/lib/active_support/core_ext/class/removal.rb +0 -50
  198. data/lib/active_support/core_ext/date/behavior.rb +0 -42
  199. data/lib/active_support/core_ext/date.rb +0 -10
  200. data/lib/active_support/core_ext/date_time.rb +0 -12
  201. data/lib/active_support/core_ext/duplicable.rb +0 -43
  202. data/lib/active_support/core_ext/float/time.rb +0 -27
  203. data/lib/active_support/core_ext/integer/even_odd.rb +0 -29
  204. data/lib/active_support/core_ext/kernel/daemonizing.rb +0 -7
  205. data/lib/active_support/core_ext/module/inclusion.rb +0 -30
  206. data/lib/active_support/core_ext/module/loading.rb +0 -23
  207. data/lib/active_support/core_ext/module/model_naming.rb +0 -25
  208. data/lib/active_support/core_ext/numeric/conversions.rb +0 -19
  209. data/lib/active_support/core_ext/object/metaclass.rb +0 -13
  210. data/lib/active_support/core_ext/pathname/clean_within.rb +0 -14
  211. data/lib/active_support/core_ext/pathname.rb +0 -7
  212. data/lib/active_support/core_ext/string/bytesize.rb +0 -5
  213. data/lib/active_support/core_ext/string/iterators.rb +0 -23
  214. data/lib/active_support/core_ext/symbol.rb +0 -14
  215. data/lib/active_support/core_ext/time/behavior.rb +0 -13
  216. data/lib/active_support/core_ext/time.rb +0 -42
  217. data/lib/active_support/json/encoders/date.rb +0 -22
  218. data/lib/active_support/json/encoders/date_time.rb +0 -22
  219. data/lib/active_support/json/encoders/enumerable.rb +0 -17
  220. data/lib/active_support/json/encoders/false_class.rb +0 -7
  221. data/lib/active_support/json/encoders/hash.rb +0 -56
  222. data/lib/active_support/json/encoders/nil_class.rb +0 -7
  223. data/lib/active_support/json/encoders/numeric.rb +0 -21
  224. data/lib/active_support/json/encoders/object.rb +0 -10
  225. data/lib/active_support/json/encoders/regexp.rb +0 -9
  226. data/lib/active_support/json/encoders/string.rb +0 -9
  227. data/lib/active_support/json/encoders/symbol.rb +0 -5
  228. data/lib/active_support/json/encoders/time.rb +0 -22
  229. data/lib/active_support/json/encoders/true_class.rb +0 -7
  230. data/lib/active_support/vendor/builder-2.1.2/blankslate.rb +0 -113
  231. data/lib/active_support/vendor/builder-2.1.2/builder/blankslate.rb +0 -20
  232. data/lib/active_support/vendor/builder-2.1.2/builder/css.rb +0 -250
  233. data/lib/active_support/vendor/builder-2.1.2/builder/xchar.rb +0 -115
  234. data/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb +0 -139
  235. data/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb +0 -63
  236. data/lib/active_support/vendor/builder-2.1.2/builder/xmlmarkup.rb +0 -328
  237. data/lib/active_support/vendor/builder-2.1.2/builder.rb +0 -13
  238. data/lib/active_support/vendor/i18n-0.1.3/MIT-LICENSE +0 -20
  239. data/lib/active_support/vendor/i18n-0.1.3/README.textile +0 -20
  240. data/lib/active_support/vendor/i18n-0.1.3/Rakefile +0 -5
  241. data/lib/active_support/vendor/i18n-0.1.3/i18n.gemspec +0 -27
  242. data/lib/active_support/vendor/i18n-0.1.3/lib/i18n/backend/simple.rb +0 -214
  243. data/lib/active_support/vendor/i18n-0.1.3/lib/i18n/exceptions.rb +0 -53
  244. data/lib/active_support/vendor/i18n-0.1.3/lib/i18n.rb +0 -199
  245. data/lib/active_support/vendor/i18n-0.1.3/test/all.rb +0 -5
  246. data/lib/active_support/vendor/i18n-0.1.3/test/i18n_exceptions_test.rb +0 -99
  247. data/lib/active_support/vendor/i18n-0.1.3/test/i18n_test.rb +0 -124
  248. data/lib/active_support/vendor/i18n-0.1.3/test/locale/en.rb +0 -1
  249. data/lib/active_support/vendor/i18n-0.1.3/test/locale/en.yml +0 -3
  250. data/lib/active_support/vendor/i18n-0.1.3/test/simple_backend_test.rb +0 -567
  251. data/lib/active_support/vendor/memcache-client-1.7.4/memcache.rb +0 -1107
  252. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone.rb +0 -47
  253. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone_info.rb +0 -228
  254. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Algiers.rb +0 -55
  255. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Cairo.rb +0 -219
  256. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Casablanca.rb +0 -40
  257. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Harare.rb +0 -18
  258. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Johannesburg.rb +0 -25
  259. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Monrovia.rb +0 -22
  260. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Nairobi.rb +0 -23
  261. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/Buenos_Aires.rb +0 -166
  262. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/San_Juan.rb +0 -86
  263. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Bogota.rb +0 -23
  264. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Caracas.rb +0 -23
  265. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chicago.rb +0 -283
  266. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chihuahua.rb +0 -136
  267. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Denver.rb +0 -204
  268. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Godthab.rb +0 -161
  269. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Guatemala.rb +0 -27
  270. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Halifax.rb +0 -274
  271. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Indiana/Indianapolis.rb +0 -149
  272. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Juneau.rb +0 -194
  273. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/La_Paz.rb +0 -22
  274. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Lima.rb +0 -35
  275. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Los_Angeles.rb +0 -232
  276. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mazatlan.rb +0 -139
  277. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mexico_City.rb +0 -144
  278. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Monterrey.rb +0 -131
  279. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/New_York.rb +0 -282
  280. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Phoenix.rb +0 -30
  281. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Regina.rb +0 -74
  282. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Santiago.rb +0 -205
  283. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Sao_Paulo.rb +0 -171
  284. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/St_Johns.rb +0 -288
  285. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Tijuana.rb +0 -196
  286. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Almaty.rb +0 -67
  287. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baghdad.rb +0 -73
  288. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baku.rb +0 -161
  289. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Bangkok.rb +0 -20
  290. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Chongqing.rb +0 -33
  291. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Colombo.rb +0 -30
  292. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Dhaka.rb +0 -27
  293. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Hong_Kong.rb +0 -87
  294. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Irkutsk.rb +0 -165
  295. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jakarta.rb +0 -30
  296. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jerusalem.rb +0 -163
  297. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kabul.rb +0 -20
  298. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kamchatka.rb +0 -163
  299. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Karachi.rb +0 -30
  300. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Katmandu.rb +0 -20
  301. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kolkata.rb +0 -25
  302. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Krasnoyarsk.rb +0 -163
  303. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuala_Lumpur.rb +0 -31
  304. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuwait.rb +0 -18
  305. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Magadan.rb +0 -163
  306. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Muscat.rb +0 -18
  307. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Novosibirsk.rb +0 -164
  308. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Rangoon.rb +0 -24
  309. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Riyadh.rb +0 -18
  310. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Seoul.rb +0 -34
  311. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Shanghai.rb +0 -35
  312. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Singapore.rb +0 -33
  313. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Taipei.rb +0 -59
  314. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tashkent.rb +0 -47
  315. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tbilisi.rb +0 -78
  316. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tehran.rb +0 -121
  317. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tokyo.rb +0 -30
  318. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Ulaanbaatar.rb +0 -65
  319. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Urumqi.rb +0 -33
  320. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Vladivostok.rb +0 -164
  321. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yakutsk.rb +0 -163
  322. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yekaterinburg.rb +0 -165
  323. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yerevan.rb +0 -165
  324. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Azores.rb +0 -270
  325. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Cape_Verde.rb +0 -23
  326. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/South_Georgia.rb +0 -18
  327. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Adelaide.rb +0 -187
  328. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Brisbane.rb +0 -35
  329. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Darwin.rb +0 -29
  330. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Hobart.rb +0 -193
  331. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Melbourne.rb +0 -185
  332. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Perth.rb +0 -37
  333. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Sydney.rb +0 -185
  334. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Etc/UTC.rb +0 -16
  335. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Amsterdam.rb +0 -228
  336. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Athens.rb +0 -185
  337. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Belgrade.rb +0 -163
  338. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Berlin.rb +0 -188
  339. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bratislava.rb +0 -13
  340. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Brussels.rb +0 -232
  341. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bucharest.rb +0 -181
  342. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Budapest.rb +0 -197
  343. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Copenhagen.rb +0 -179
  344. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Dublin.rb +0 -276
  345. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Helsinki.rb +0 -163
  346. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Istanbul.rb +0 -218
  347. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Kiev.rb +0 -168
  348. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Lisbon.rb +0 -268
  349. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Ljubljana.rb +0 -13
  350. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/London.rb +0 -288
  351. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Madrid.rb +0 -211
  352. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Minsk.rb +0 -170
  353. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Moscow.rb +0 -181
  354. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Paris.rb +0 -232
  355. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Prague.rb +0 -187
  356. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Riga.rb +0 -176
  357. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Rome.rb +0 -215
  358. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sarajevo.rb +0 -13
  359. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Skopje.rb +0 -13
  360. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sofia.rb +0 -173
  361. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Stockholm.rb +0 -165
  362. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Tallinn.rb +0 -172
  363. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vienna.rb +0 -183
  364. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vilnius.rb +0 -170
  365. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Warsaw.rb +0 -212
  366. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Zagreb.rb +0 -13
  367. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Auckland.rb +0 -202
  368. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Fiji.rb +0 -23
  369. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Guam.rb +0 -22
  370. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Honolulu.rb +0 -28
  371. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Majuro.rb +0 -20
  372. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Midway.rb +0 -25
  373. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Noumea.rb +0 -25
  374. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Pago_Pago.rb +0 -26
  375. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Port_Moresby.rb +0 -20
  376. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Tongatapu.rb +0 -27
  377. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/info_timezone.rb +0 -52
  378. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone.rb +0 -51
  379. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone_info.rb +0 -44
  380. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/offset_rationals.rb +0 -98
  381. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/ruby_core_support.rb +0 -56
  382. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/time_or_datetime.rb +0 -292
  383. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone.rb +0 -508
  384. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_definition.rb +0 -56
  385. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_info.rb +0 -40
  386. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_offset_info.rb +0 -94
  387. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_period.rb +0 -198
  388. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_transition_info.rb +0 -129
  389. data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo.rb +0 -33
  390. data/lib/active_support/vendor.rb +0 -28
  391. data/lib/activesupport.rb +0 -2
@@ -1,106 +1,100 @@
1
1
  require 'enumerator'
2
2
 
3
- module ActiveSupport #:nodoc:
4
- module CoreExtensions #:nodoc:
5
- module Array #:nodoc:
6
- module Grouping
7
- # Splits or iterates over the array in groups of size +number+,
8
- # padding any remaining slots with +fill_with+ unless it is +false+.
9
- #
10
- # %w(1 2 3 4 5 6 7).in_groups_of(3) {|group| p group}
11
- # ["1", "2", "3"]
12
- # ["4", "5", "6"]
13
- # ["7", nil, nil]
14
- #
15
- # %w(1 2 3).in_groups_of(2, ' ') {|group| p group}
16
- # ["1", "2"]
17
- # ["3", " "]
18
- #
19
- # %w(1 2 3).in_groups_of(2, false) {|group| p group}
20
- # ["1", "2"]
21
- # ["3"]
22
- def in_groups_of(number, fill_with = nil)
23
- if fill_with == false
24
- collection = self
25
- else
26
- # size % number gives how many extra we have;
27
- # subtracting from number gives how many to add;
28
- # modulo number ensures we don't add group of just fill.
29
- padding = (number - size % number) % number
30
- collection = dup.concat([fill_with] * padding)
31
- end
32
-
33
- if block_given?
34
- collection.each_slice(number) { |slice| yield(slice) }
35
- else
36
- returning [] do |groups|
37
- collection.each_slice(number) { |group| groups << group }
38
- end
39
- end
40
- end
3
+ class Array
4
+ # Splits or iterates over the array in groups of size +number+,
5
+ # padding any remaining slots with +fill_with+ unless it is +false+.
6
+ #
7
+ # %w(1 2 3 4 5 6 7).in_groups_of(3) {|group| p group}
8
+ # ["1", "2", "3"]
9
+ # ["4", "5", "6"]
10
+ # ["7", nil, nil]
11
+ #
12
+ # %w(1 2 3).in_groups_of(2, '&nbsp;') {|group| p group}
13
+ # ["1", "2"]
14
+ # ["3", "&nbsp;"]
15
+ #
16
+ # %w(1 2 3).in_groups_of(2, false) {|group| p group}
17
+ # ["1", "2"]
18
+ # ["3"]
19
+ def in_groups_of(number, fill_with = nil)
20
+ if fill_with == false
21
+ collection = self
22
+ else
23
+ # size % number gives how many extra we have;
24
+ # subtracting from number gives how many to add;
25
+ # modulo number ensures we don't add group of just fill.
26
+ padding = (number - size % number) % number
27
+ collection = dup.concat([fill_with] * padding)
28
+ end
41
29
 
42
- # Splits or iterates over the array in +number+ of groups, padding any
43
- # remaining slots with +fill_with+ unless it is +false+.
44
- #
45
- # %w(1 2 3 4 5 6 7 8 9 10).in_groups(3) {|group| p group}
46
- # ["1", "2", "3", "4"]
47
- # ["5", "6", "7", nil]
48
- # ["8", "9", "10", nil]
49
- #
50
- # %w(1 2 3 4 5 6 7).in_groups(3, '&nbsp;') {|group| p group}
51
- # ["1", "2", "3"]
52
- # ["4", "5", "&nbsp;"]
53
- # ["6", "7", "&nbsp;"]
54
- #
55
- # %w(1 2 3 4 5 6 7).in_groups(3, false) {|group| p group}
56
- # ["1", "2", "3"]
57
- # ["4", "5"]
58
- # ["6", "7"]
59
- def in_groups(number, fill_with = nil)
60
- # size / number gives minor group size;
61
- # size % number gives how many objects need extra accomodation;
62
- # each group hold either division or division + 1 items.
63
- division = size / number
64
- modulo = size % number
30
+ if block_given?
31
+ collection.each_slice(number) { |slice| yield(slice) }
32
+ else
33
+ groups = []
34
+ collection.each_slice(number) { |group| groups << group }
35
+ groups
36
+ end
37
+ end
65
38
 
66
- # create a new array avoiding dup
67
- groups = []
68
- start = 0
39
+ # Splits or iterates over the array in +number+ of groups, padding any
40
+ # remaining slots with +fill_with+ unless it is +false+.
41
+ #
42
+ # %w(1 2 3 4 5 6 7 8 9 10).in_groups(3) {|group| p group}
43
+ # ["1", "2", "3", "4"]
44
+ # ["5", "6", "7", nil]
45
+ # ["8", "9", "10", nil]
46
+ #
47
+ # %w(1 2 3 4 5 6 7).in_groups(3, '&nbsp;') {|group| p group}
48
+ # ["1", "2", "3"]
49
+ # ["4", "5", "&nbsp;"]
50
+ # ["6", "7", "&nbsp;"]
51
+ #
52
+ # %w(1 2 3 4 5 6 7).in_groups(3, false) {|group| p group}
53
+ # ["1", "2", "3"]
54
+ # ["4", "5"]
55
+ # ["6", "7"]
56
+ def in_groups(number, fill_with = nil)
57
+ # size / number gives minor group size;
58
+ # size % number gives how many objects need extra accomodation;
59
+ # each group hold either division or division + 1 items.
60
+ division = size / number
61
+ modulo = size % number
69
62
 
70
- number.times do |index|
71
- length = division + (modulo > 0 && modulo > index ? 1 : 0)
72
- padding = fill_with != false &&
73
- modulo > 0 && length == division ? 1 : 0
74
- groups << slice(start, length).concat([fill_with] * padding)
75
- start += length
76
- end
63
+ # create a new array avoiding dup
64
+ groups = []
65
+ start = 0
77
66
 
78
- if block_given?
79
- groups.each{|g| yield(g) }
80
- else
81
- groups
82
- end
83
- end
67
+ number.times do |index|
68
+ length = division + (modulo > 0 && modulo > index ? 1 : 0)
69
+ padding = fill_with != false &&
70
+ modulo > 0 && length == division ? 1 : 0
71
+ groups << slice(start, length).concat([fill_with] * padding)
72
+ start += length
73
+ end
84
74
 
85
- # Divides the array into one or more subarrays based on a delimiting +value+
86
- # or the result of an optional block.
87
- #
88
- # [1, 2, 3, 4, 5].split(3) # => [[1, 2], [4, 5]]
89
- # (1..10).to_a.split { |i| i % 3 == 0 } # => [[1, 2], [4, 5], [7, 8], [10]]
90
- def split(value = nil)
91
- using_block = block_given?
75
+ if block_given?
76
+ groups.each { |g| yield(g) }
77
+ else
78
+ groups
79
+ end
80
+ end
92
81
 
93
- inject([[]]) do |results, element|
94
- if (using_block && yield(element)) || (value == element)
95
- results << []
96
- else
97
- results.last << element
98
- end
82
+ # Divides the array into one or more subarrays based on a delimiting +value+
83
+ # or the result of an optional block.
84
+ #
85
+ # [1, 2, 3, 4, 5].split(3) # => [[1, 2], [4, 5]]
86
+ # (1..10).to_a.split { |i| i % 3 == 0 } # => [[1, 2], [4, 5], [7, 8], [10]]
87
+ def split(value = nil)
88
+ using_block = block_given?
99
89
 
100
- results
101
- end
102
- end
90
+ inject([[]]) do |results, element|
91
+ if (using_block && yield(element)) || (value == element)
92
+ results << []
93
+ else
94
+ results.last << element
103
95
  end
96
+
97
+ results
104
98
  end
105
99
  end
106
100
  end
@@ -1,12 +1,6 @@
1
- module ActiveSupport #:nodoc:
2
- module CoreExtensions #:nodoc:
3
- module Array #:nodoc:
4
- module RandomAccess
5
- # Returns a random element from the array.
6
- def rand
7
- self[Kernel.rand(length)]
8
- end
9
- end
10
- end
1
+ class Array
2
+ # Returns a random element from the array.
3
+ def rand
4
+ self[Kernel.rand(length)]
11
5
  end
12
6
  end
@@ -0,0 +1,17 @@
1
+ class Array
2
+ # Return an unique array based on the criteria given as a proc.
3
+ #
4
+ # [1, 2, 3, 4].uniq_by { |i| i.odd? }
5
+ # #=> [1, 2]
6
+ #
7
+ def uniq_by
8
+ hash, array = {}, []
9
+ each { |i| hash[yield(i)] ||= (array << i) }
10
+ array
11
+ end
12
+
13
+ # Same as uniq_by, but modifies self.
14
+ def uniq_by!
15
+ replace(uniq_by{ |i| yield(i) })
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ class Array
2
+ # Wraps the object in an Array unless it's an Array. Converts the
3
+ # object to an Array using #to_ary if it implements that.
4
+ #
5
+ # It differs with Array() in that it does not call +to_a+ on
6
+ # the argument:
7
+ #
8
+ # Array(:foo => :bar) # => [[:foo, :bar]]
9
+ # Array.wrap(:foo => :bar) # => [{:foo => :bar}]
10
+ #
11
+ # Array("foo\nbar") # => ["foo\n", "bar"], in Ruby 1.8
12
+ # Array.wrap("foo\nbar") # => ["foo\nbar"]
13
+ def self.wrap(object)
14
+ if object.nil?
15
+ []
16
+ elsif object.respond_to?(:to_ary)
17
+ object.to_ary
18
+ else
19
+ [object]
20
+ end
21
+ end
22
+ end
@@ -1,15 +1,7 @@
1
+ require 'active_support/core_ext/array/wrap'
1
2
  require 'active_support/core_ext/array/access'
3
+ require 'active_support/core_ext/array/uniq_by'
2
4
  require 'active_support/core_ext/array/conversions'
3
5
  require 'active_support/core_ext/array/extract_options'
4
6
  require 'active_support/core_ext/array/grouping'
5
7
  require 'active_support/core_ext/array/random_access'
6
- require 'active_support/core_ext/array/wrapper'
7
-
8
- class Array #:nodoc:
9
- include ActiveSupport::CoreExtensions::Array::Access
10
- include ActiveSupport::CoreExtensions::Array::Conversions
11
- include ActiveSupport::CoreExtensions::Array::ExtractOptions
12
- include ActiveSupport::CoreExtensions::Array::Grouping
13
- include ActiveSupport::CoreExtensions::Array::RandomAccess
14
- extend ActiveSupport::CoreExtensions::Array::Wrapper
15
- end
@@ -0,0 +1,27 @@
1
+ require 'bigdecimal'
2
+ require 'yaml'
3
+
4
+ class BigDecimal
5
+ YAML_TAG = 'tag:yaml.org,2002:float'
6
+ YAML_MAPPING = { 'Infinity' => '.Inf', '-Infinity' => '-.Inf', 'NaN' => '.NaN' }
7
+
8
+ yaml_as YAML_TAG
9
+
10
+ # This emits the number without any scientific notation.
11
+ # This is better than self.to_f.to_s since it doesn't lose precision.
12
+ #
13
+ # Note that reconstituting YAML floats to native floats may lose precision.
14
+ def to_yaml(opts = {})
15
+ YAML.quick_emit(nil, opts) do |out|
16
+ string = to_s
17
+ out.scalar(YAML_TAG, YAML_MAPPING[string] || string, :plain)
18
+ end
19
+ end
20
+
21
+ DEFAULT_STRING_FORMAT = 'F'
22
+ def to_formatted_s(format = DEFAULT_STRING_FORMAT)
23
+ _original_to_s(format)
24
+ end
25
+ alias_method :_original_to_s, :to_s
26
+ alias_method :to_s, :to_formatted_s
27
+ end
@@ -0,0 +1 @@
1
+ require 'active_support/core_ext/big_decimal/conversions'
@@ -1,23 +1,19 @@
1
- module ActiveSupport #:nodoc:
2
- module CoreExtensions #:nodoc:
3
- module CGI #:nodoc:
4
- module EscapeSkippingSlashes #:nodoc:
5
- if RUBY_VERSION >= '1.9'
6
- def escape_skipping_slashes(str)
7
- str = str.join('/') if str.respond_to? :join
8
- str.gsub(/([^ \/a-zA-Z0-9_.-])/n) do
9
- "%#{$1.unpack('H2' * $1.bytesize).join('%').upcase}"
10
- end.tr(' ', '+')
11
- end
12
- else
13
- def escape_skipping_slashes(str)
14
- str = str.join('/') if str.respond_to? :join
15
- str.gsub(/([^ \/a-zA-Z0-9_.-])/n) do
16
- "%#{$1.unpack('H2').first.upcase}"
17
- end.tr(' ', '+')
18
- end
19
- end
20
- end
1
+ require 'cgi'
2
+
3
+ class CGI #:nodoc:
4
+ if RUBY_VERSION >= '1.9'
5
+ def self.escape_skipping_slashes(str)
6
+ str = str.join('/') if str.respond_to? :join
7
+ str.gsub(/([^ \/a-zA-Z0-9_.-])/n) do
8
+ "%#{$1.unpack('H2' * $1.bytesize).join('%').upcase}"
9
+ end.tr(' ', '+')
10
+ end
11
+ else
12
+ def self.escape_skipping_slashes(str)
13
+ str = str.join('/') if str.respond_to? :join
14
+ str.gsub(/([^ \/a-zA-Z0-9_.-])/n) do
15
+ "%#{$1.unpack('H2').first.upcase}"
16
+ end.tr(' ', '+')
21
17
  end
22
18
  end
23
19
  end
@@ -1,5 +1 @@
1
1
  require 'active_support/core_ext/cgi/escape_skipping_slashes'
2
-
3
- class CGI #:nodoc:
4
- extend ActiveSupport::CoreExtensions::CGI::EscapeSkippingSlashes
5
- end
@@ -0,0 +1,70 @@
1
+ require 'active_support/core_ext/kernel/singleton_class'
2
+ require 'active_support/core_ext/module/remove_method'
3
+
4
+ class Class
5
+ # Declare a class-level attribute whose value is inheritable and
6
+ # overwritable by subclasses:
7
+ #
8
+ # class Base
9
+ # class_attribute :setting
10
+ # end
11
+ #
12
+ # class Subclass < Base
13
+ # end
14
+ #
15
+ # Base.setting = true
16
+ # Subclass.setting # => true
17
+ # Subclass.setting = false
18
+ # Subclass.setting # => false
19
+ # Base.setting # => true
20
+ #
21
+ # This matches normal Ruby method inheritance: think of writing an attribute
22
+ # on a subclass as overriding the reader method.
23
+ #
24
+ # For convenience, a query method is defined as well:
25
+ #
26
+ # Subclass.setting? # => false
27
+ #
28
+ # Instances may overwrite the class value in the same way:
29
+ #
30
+ # Base.setting = true
31
+ # object = Base.new
32
+ # object.setting # => true
33
+ # object.setting = false
34
+ # object.setting # => false
35
+ # Base.setting # => true
36
+ #
37
+ # To opt out of the instance writer method, pass :instance_writer => false.
38
+ #
39
+ # object.setting = false # => NoMethodError
40
+ def class_attribute(*attrs)
41
+ instance_writer = !attrs.last.is_a?(Hash) || attrs.pop[:instance_writer]
42
+
43
+ attrs.each do |name|
44
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
45
+ def self.#{name}() nil end
46
+ def self.#{name}?() !!#{name} end
47
+
48
+ def self.#{name}=(val)
49
+ singleton_class.class_eval do
50
+ remove_possible_method(:#{name})
51
+ define_method(:#{name}) { val }
52
+ end
53
+ end
54
+
55
+ def #{name}
56
+ defined?(@#{name}) ? @#{name} : singleton_class.#{name}
57
+ end
58
+
59
+ def #{name}?
60
+ !!#{name}
61
+ end
62
+ RUBY
63
+
64
+ if instance_writer
65
+ body = "def #{name}=(value) @#{name} = value end"
66
+ class_eval body, __FILE__, __LINE__ - 1
67
+ end
68
+ end
69
+ end
70
+ end
@@ -1,3 +1,5 @@
1
+ require 'active_support/core_ext/array/extract_options'
2
+
1
3
  # Extends the class object with class and instance accessors for class attributes,
2
4
  # just like the native attr* accessors for instance attributes.
3
5
  #
@@ -8,47 +10,54 @@
8
10
  # Person.hair_colors = [:brown, :black, :blonde, :red]
9
11
  class Class
10
12
  def cattr_reader(*syms)
11
- syms.flatten.each do |sym|
12
- next if sym.is_a?(Hash)
13
- class_eval(<<-EOS, __FILE__, __LINE__)
14
- unless defined? @@#{sym} # unless defined? @@hair_colors
15
- @@#{sym} = nil # @@hair_colors = nil
16
- end # end
17
- #
18
- def self.#{sym} # def self.hair_colors
19
- @@#{sym} # @@hair_colors
20
- end # end
21
- #
22
- def #{sym} # def hair_colors
23
- @@#{sym} # @@hair_colors
24
- end # end
13
+ options = syms.extract_options!
14
+ syms.each do |sym|
15
+ class_eval(<<-EOS, __FILE__, __LINE__ + 1)
16
+ unless defined? @@#{sym}
17
+ @@#{sym} = nil
18
+ end
19
+
20
+ def self.#{sym}
21
+ @@#{sym}
22
+ end
25
23
  EOS
24
+
25
+ unless options[:instance_reader] == false
26
+ class_eval(<<-EOS, __FILE__, __LINE__ + 1)
27
+ def #{sym}
28
+ @@#{sym}
29
+ end
30
+ EOS
31
+ end
26
32
  end
27
33
  end
28
34
 
29
35
  def cattr_writer(*syms)
30
36
  options = syms.extract_options!
31
- syms.flatten.each do |sym|
32
- class_eval(<<-EOS, __FILE__, __LINE__)
33
- unless defined? @@#{sym} # unless defined? @@hair_colors
34
- @@#{sym} = nil # @@hair_colors = nil
35
- end # end
36
- #
37
- def self.#{sym}=(obj) # def self.hair_colors=(obj)
38
- @@#{sym} = obj # @@hair_colors = obj
39
- end # end
40
- #
41
- #{" #
42
- def #{sym}=(obj) # def hair_colors=(obj)
43
- @@#{sym} = obj # @@hair_colors = obj
44
- end # end
45
- " unless options[:instance_writer] == false } # # instance writer above is generated unless options[:instance_writer] == false
37
+ syms.each do |sym|
38
+ class_eval(<<-EOS, __FILE__, __LINE__ + 1)
39
+ unless defined? @@#{sym}
40
+ @@#{sym} = nil
41
+ end
42
+
43
+ def self.#{sym}=(obj)
44
+ @@#{sym} = obj
45
+ end
46
46
  EOS
47
+
48
+ unless options[:instance_writer] == false
49
+ class_eval(<<-EOS, __FILE__, __LINE__ + 1)
50
+ def #{sym}=(obj)
51
+ @@#{sym} = obj
52
+ end
53
+ EOS
54
+ end
55
+ self.send("#{sym}=", yield) if block_given?
47
56
  end
48
57
  end
49
58
 
50
- def cattr_accessor(*syms)
59
+ def cattr_accessor(*syms, &blk)
51
60
  cattr_reader(*syms)
52
- cattr_writer(*syms)
61
+ cattr_writer(*syms, &blk)
53
62
  end
54
63
  end
@@ -1,47 +1,44 @@
1
- # These class attributes behave something like the class
2
- # inheritable accessors. But instead of copying the hash over at
3
- # the time the subclass is first defined, the accessors simply
4
- # delegate to their superclass unless they have been given a
5
- # specific value. This stops the strange situation where values
6
- # set after class definition don't get applied to subclasses.
1
+ require 'active_support/core_ext/object/blank'
2
+ require 'active_support/core_ext/array/extract_options'
3
+ require 'active_support/core_ext/kernel/singleton_class'
4
+ require 'active_support/core_ext/module/remove_method'
5
+
7
6
  class Class
8
- def superclass_delegating_reader(*names)
9
- class_name_to_stop_searching_on = self.superclass.name.blank? ? "Object" : self.superclass.name
10
- names.each do |name|
11
- class_eval <<-EOS
12
- def self.#{name} # def self.only_reader
13
- if defined?(@#{name}) # if defined?(@only_reader)
14
- @#{name} # @only_reader
15
- elsif superclass < #{class_name_to_stop_searching_on} && # elsif superclass < Object &&
16
- superclass.respond_to?(:#{name}) # superclass.respond_to?(:only_reader)
17
- superclass.#{name} # superclass.only_reader
18
- end # end
19
- end # end
20
- def #{name} # def only_reader
21
- self.class.#{name} # self.class.only_reader
22
- end # end
23
- def self.#{name}? # def self.only_reader?
24
- !!#{name} # !!only_reader
25
- end # end
26
- def #{name}? # def only_reader?
27
- !!#{name} # !!only_reader
28
- end # end
29
- EOS
30
- end
7
+ def superclass_delegating_accessor(name, options = {})
8
+ # Create private _name and _name= methods that can still be used if the public
9
+ # methods are overridden. This allows
10
+ _superclass_delegating_accessor("_#{name}")
11
+
12
+ # Generate the public methods name, name=, and name?
13
+ # These methods dispatch to the private _name, and _name= methods, making them
14
+ # overridable
15
+ singleton_class.send(:define_method, name) { send("_#{name}") }
16
+ singleton_class.send(:define_method, "#{name}?") { !!send("_#{name}") }
17
+ singleton_class.send(:define_method, "#{name}=") { |value| send("_#{name}=", value) }
18
+
19
+ # If an instance_reader is needed, generate methods for name and name= on the
20
+ # class itself, so instances will be able to see them
21
+ define_method(name) { send("_#{name}") } if options[:instance_reader] != false
22
+ define_method("#{name}?") { !!send("#{name}") } if options[:instance_reader] != false
31
23
  end
32
24
 
33
- def superclass_delegating_writer(*names)
34
- names.each do |name|
35
- class_eval <<-EOS
36
- def self.#{name}=(value) # def self.only_writer=(value)
37
- @#{name} = value # @only_writer = value
38
- end # end
39
- EOS
40
- end
25
+ private
26
+
27
+ # Take the object being set and store it in a method. This gives us automatic
28
+ # inheritance behavior, without having to store the object in an instance
29
+ # variable and look up the superclass chain manually.
30
+ def _stash_object_in_method(object, method, instance_reader = true)
31
+ singleton_class.remove_possible_method(method)
32
+ singleton_class.send(:define_method, method) { object }
33
+ remove_possible_method(method)
34
+ define_method(method) { object } if instance_reader
41
35
  end
42
36
 
43
- def superclass_delegating_accessor(*names)
44
- superclass_delegating_reader(*names)
45
- superclass_delegating_writer(*names)
37
+ def _superclass_delegating_accessor(name, options = {})
38
+ singleton_class.send(:define_method, "#{name}=") do |value|
39
+ _stash_object_in_method(value, name, options[:instance_reader] != false)
40
+ end
41
+ send("#{name}=", nil)
46
42
  end
43
+
47
44
  end