savage-beast 0.1.0

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 (265) hide show
  1. data/.gitignore +2 -0
  2. data/README.rdoc +42 -0
  3. data/Rakefile +25 -0
  4. data/VERSION +1 -0
  5. data/app/controllers/application.rb +6 -0
  6. data/app/controllers/beast_application_controller.rb +3 -0
  7. data/app/controllers/forums_controller.rb +64 -0
  8. data/app/controllers/moderators_controller.rb +10 -0
  9. data/app/controllers/monitorships_controller.rb +22 -0
  10. data/app/controllers/posts_controller.rb +134 -0
  11. data/app/controllers/topics_controller.rb +110 -0
  12. data/app/helpers/count_helper.rb +13 -0
  13. data/app/helpers/forums_helper.rb +15 -0
  14. data/app/helpers/moderators_helper.rb +2 -0
  15. data/app/helpers/monitorships_helper.rb +2 -0
  16. data/app/helpers/posts_helper.rb +3 -0
  17. data/app/helpers/topics_helper.rb +3 -0
  18. data/app/models/forum.rb +26 -0
  19. data/app/models/moderatorship.rb +6 -0
  20. data/app/models/monitorship.rb +5 -0
  21. data/app/models/monitorships_sweeper.rb +9 -0
  22. data/app/models/post.rb +33 -0
  23. data/app/models/posts_sweeper.rb +12 -0
  24. data/app/models/topic.rb +94 -0
  25. data/app/views/forums/_form.html.erb +21 -0
  26. data/app/views/forums/edit.html.erb +12 -0
  27. data/app/views/forums/index.html.erb +77 -0
  28. data/app/views/forums/new.html.erb +10 -0
  29. data/app/views/forums/show.html.erb +94 -0
  30. data/app/views/layouts/_head.html.erb +34 -0
  31. data/app/views/layouts/_post.rss.builder +9 -0
  32. data/app/views/layouts/application.html.erb +29 -0
  33. data/app/views/layouts/beast.html.erb +29 -0
  34. data/app/views/monitorships/create.js.rjs +4 -0
  35. data/app/views/monitorships/destroy.js.rjs +4 -0
  36. data/app/views/posts/_edit.html.erb +38 -0
  37. data/app/views/posts/edit.html.erb +14 -0
  38. data/app/views/posts/edit.js.rjs +6 -0
  39. data/app/views/posts/index.html.erb +53 -0
  40. data/app/views/posts/index.rss.builder +20 -0
  41. data/app/views/posts/monitored.html.erb +55 -0
  42. data/app/views/posts/monitored.rss.builder +15 -0
  43. data/app/views/posts/update.js.rjs +3 -0
  44. data/app/views/topics/_form.html.erb +28 -0
  45. data/app/views/topics/edit.html.erb +10 -0
  46. data/app/views/topics/index.html.erb +2 -0
  47. data/app/views/topics/new.html.erb +18 -0
  48. data/app/views/topics/show.html.erb +183 -0
  49. data/app/views/topics/show.rss.builder +16 -0
  50. data/config/routes.rb +18 -0
  51. data/generators/beast/beast_generator.rb +88 -0
  52. data/generators/beast/templates/migrations/create_savage_tables.rb +73 -0
  53. data/generators/beast/templates/public/images/clearbits/_readme.txt +12 -0
  54. data/generators/beast/templates/public/images/clearbits/add.gif +0 -0
  55. data/generators/beast/templates/public/images/clearbits/addressbook.gif +0 -0
  56. data/generators/beast/templates/public/images/clearbits/alert.gif +0 -0
  57. data/generators/beast/templates/public/images/clearbits/apple.gif +0 -0
  58. data/generators/beast/templates/public/images/clearbits/arrow1_e.gif +0 -0
  59. data/generators/beast/templates/public/images/clearbits/arrow1_n.gif +0 -0
  60. data/generators/beast/templates/public/images/clearbits/arrow1_ne.gif +0 -0
  61. data/generators/beast/templates/public/images/clearbits/arrow1_nw.gif +0 -0
  62. data/generators/beast/templates/public/images/clearbits/arrow1_s.gif +0 -0
  63. data/generators/beast/templates/public/images/clearbits/arrow1_se.gif +0 -0
  64. data/generators/beast/templates/public/images/clearbits/arrow1_sw.gif +0 -0
  65. data/generators/beast/templates/public/images/clearbits/arrow1_w.gif +0 -0
  66. data/generators/beast/templates/public/images/clearbits/arrow2_e.gif +0 -0
  67. data/generators/beast/templates/public/images/clearbits/arrow2_n.gif +0 -0
  68. data/generators/beast/templates/public/images/clearbits/arrow2_ne.gif +0 -0
  69. data/generators/beast/templates/public/images/clearbits/arrow2_nw.gif +0 -0
  70. data/generators/beast/templates/public/images/clearbits/arrow2_s.gif +0 -0
  71. data/generators/beast/templates/public/images/clearbits/arrow2_se.gif +0 -0
  72. data/generators/beast/templates/public/images/clearbits/arrow2_sw.gif +0 -0
  73. data/generators/beast/templates/public/images/clearbits/arrow2_w.gif +0 -0
  74. data/generators/beast/templates/public/images/clearbits/arrow3_e.gif +0 -0
  75. data/generators/beast/templates/public/images/clearbits/arrow3_n.gif +0 -0
  76. data/generators/beast/templates/public/images/clearbits/arrow3_ne.gif +0 -0
  77. data/generators/beast/templates/public/images/clearbits/arrow3_nw.gif +0 -0
  78. data/generators/beast/templates/public/images/clearbits/arrow3_s.gif +0 -0
  79. data/generators/beast/templates/public/images/clearbits/arrow3_se.gif +0 -0
  80. data/generators/beast/templates/public/images/clearbits/arrow3_sw.gif +0 -0
  81. data/generators/beast/templates/public/images/clearbits/arrow3_w.gif +0 -0
  82. data/generators/beast/templates/public/images/clearbits/ascii.gif +0 -0
  83. data/generators/beast/templates/public/images/clearbits/back.gif +0 -0
  84. data/generators/beast/templates/public/images/clearbits/bg_blank.gif +0 -0
  85. data/generators/beast/templates/public/images/clearbits/bg_circle.gif +0 -0
  86. data/generators/beast/templates/public/images/clearbits/bg_rounded.gif +0 -0
  87. data/generators/beast/templates/public/images/clearbits/bg_rounded_ne.gif +0 -0
  88. data/generators/beast/templates/public/images/clearbits/bg_rounded_nw.gif +0 -0
  89. data/generators/beast/templates/public/images/clearbits/bg_rounded_se.gif +0 -0
  90. data/generators/beast/templates/public/images/clearbits/bg_rounded_sw.gif +0 -0
  91. data/generators/beast/templates/public/images/clearbits/bigsmile.gif +0 -0
  92. data/generators/beast/templates/public/images/clearbits/binary.gif +0 -0
  93. data/generators/beast/templates/public/images/clearbits/blah.gif +0 -0
  94. data/generators/beast/templates/public/images/clearbits/bstop.gif +0 -0
  95. data/generators/beast/templates/public/images/clearbits/buy.gif +0 -0
  96. data/generators/beast/templates/public/images/clearbits/calday.gif +0 -0
  97. data/generators/beast/templates/public/images/clearbits/calendar.gif +0 -0
  98. data/generators/beast/templates/public/images/clearbits/camera.gif +0 -0
  99. data/generators/beast/templates/public/images/clearbits/cart.gif +0 -0
  100. data/generators/beast/templates/public/images/clearbits/cd.gif +0 -0
  101. data/generators/beast/templates/public/images/clearbits/cellphone.gif +0 -0
  102. data/generators/beast/templates/public/images/clearbits/chat.gif +0 -0
  103. data/generators/beast/templates/public/images/clearbits/check.gif +0 -0
  104. data/generators/beast/templates/public/images/clearbits/close.gif +0 -0
  105. data/generators/beast/templates/public/images/clearbits/comment.gif +0 -0
  106. data/generators/beast/templates/public/images/clearbits/cube.gif +0 -0
  107. data/generators/beast/templates/public/images/clearbits/day.gif +0 -0
  108. data/generators/beast/templates/public/images/clearbits/denied.gif +0 -0
  109. data/generators/beast/templates/public/images/clearbits/document.gif +0 -0
  110. data/generators/beast/templates/public/images/clearbits/download.gif +0 -0
  111. data/generators/beast/templates/public/images/clearbits/edit.gif +0 -0
  112. data/generators/beast/templates/public/images/clearbits/eject.gif +0 -0
  113. data/generators/beast/templates/public/images/clearbits/equalizer.gif +0 -0
  114. data/generators/beast/templates/public/images/clearbits/first.gif +0 -0
  115. data/generators/beast/templates/public/images/clearbits/flag.gif +0 -0
  116. data/generators/beast/templates/public/images/clearbits/flash.gif +0 -0
  117. data/generators/beast/templates/public/images/clearbits/folder.gif +0 -0
  118. data/generators/beast/templates/public/images/clearbits/forward.gif +0 -0
  119. data/generators/beast/templates/public/images/clearbits/frown.gif +0 -0
  120. data/generators/beast/templates/public/images/clearbits/ftp.gif +0 -0
  121. data/generators/beast/templates/public/images/clearbits/graph.gif +0 -0
  122. data/generators/beast/templates/public/images/clearbits/heart.gif +0 -0
  123. data/generators/beast/templates/public/images/clearbits/home.gif +0 -0
  124. data/generators/beast/templates/public/images/clearbits/html.gif +0 -0
  125. data/generators/beast/templates/public/images/clearbits/ipod.gif +0 -0
  126. data/generators/beast/templates/public/images/clearbits/last.gif +0 -0
  127. data/generators/beast/templates/public/images/clearbits/lock.gif +0 -0
  128. data/generators/beast/templates/public/images/clearbits/loop.gif +0 -0
  129. data/generators/beast/templates/public/images/clearbits/mail.gif +0 -0
  130. data/generators/beast/templates/public/images/clearbits/man.gif +0 -0
  131. data/generators/beast/templates/public/images/clearbits/manman.gif +0 -0
  132. data/generators/beast/templates/public/images/clearbits/music.gif +0 -0
  133. data/generators/beast/templates/public/images/clearbits/mute.gif +0 -0
  134. data/generators/beast/templates/public/images/clearbits/mute_centered.gif +0 -0
  135. data/generators/beast/templates/public/images/clearbits/newwindow.gif +0 -0
  136. data/generators/beast/templates/public/images/clearbits/next.gif +0 -0
  137. data/generators/beast/templates/public/images/clearbits/night.gif +0 -0
  138. data/generators/beast/templates/public/images/clearbits/open.gif +0 -0
  139. data/generators/beast/templates/public/images/clearbits/pause.gif +0 -0
  140. data/generators/beast/templates/public/images/clearbits/phone.gif +0 -0
  141. data/generators/beast/templates/public/images/clearbits/play.gif +0 -0
  142. data/generators/beast/templates/public/images/clearbits/previous.gif +0 -0
  143. data/generators/beast/templates/public/images/clearbits/quicktime.gif +0 -0
  144. data/generators/beast/templates/public/images/clearbits/redo.gif +0 -0
  145. data/generators/beast/templates/public/images/clearbits/reload.gif +0 -0
  146. data/generators/beast/templates/public/images/clearbits/sad.gif +0 -0
  147. data/generators/beast/templates/public/images/clearbits/save.gif +0 -0
  148. data/generators/beast/templates/public/images/clearbits/scream.gif +0 -0
  149. data/generators/beast/templates/public/images/clearbits/search.gif +0 -0
  150. data/generators/beast/templates/public/images/clearbits/seconds.gif +0 -0
  151. data/generators/beast/templates/public/images/clearbits/smile.gif +0 -0
  152. data/generators/beast/templates/public/images/clearbits/smirk.gif +0 -0
  153. data/generators/beast/templates/public/images/clearbits/star.gif +0 -0
  154. data/generators/beast/templates/public/images/clearbits/stop.gif +0 -0
  155. data/generators/beast/templates/public/images/clearbits/subtract.gif +0 -0
  156. data/generators/beast/templates/public/images/clearbits/switch.gif +0 -0
  157. data/generators/beast/templates/public/images/clearbits/target.gif +0 -0
  158. data/generators/beast/templates/public/images/clearbits/tcp.gif +0 -0
  159. data/generators/beast/templates/public/images/clearbits/time.gif +0 -0
  160. data/generators/beast/templates/public/images/clearbits/toggle.gif +0 -0
  161. data/generators/beast/templates/public/images/clearbits/tongue.gif +0 -0
  162. data/generators/beast/templates/public/images/clearbits/tools.gif +0 -0
  163. data/generators/beast/templates/public/images/clearbits/trackback.gif +0 -0
  164. data/generators/beast/templates/public/images/clearbits/trash.gif +0 -0
  165. data/generators/beast/templates/public/images/clearbits/tv.gif +0 -0
  166. data/generators/beast/templates/public/images/clearbits/type.gif +0 -0
  167. data/generators/beast/templates/public/images/clearbits/undo.gif +0 -0
  168. data/generators/beast/templates/public/images/clearbits/unlock.gif +0 -0
  169. data/generators/beast/templates/public/images/clearbits/upload.gif +0 -0
  170. data/generators/beast/templates/public/images/clearbits/user.gif +0 -0
  171. data/generators/beast/templates/public/images/clearbits/video.gif +0 -0
  172. data/generators/beast/templates/public/images/clearbits/volume_high.gif +0 -0
  173. data/generators/beast/templates/public/images/clearbits/volume_low.gif +0 -0
  174. data/generators/beast/templates/public/images/clearbits/wifi.gif +0 -0
  175. data/generators/beast/templates/public/images/clearbits/window.gif +0 -0
  176. data/generators/beast/templates/public/images/clearbits/woman.gif +0 -0
  177. data/generators/beast/templates/public/images/clearbits/womanman.gif +0 -0
  178. data/generators/beast/templates/public/images/clearbits/work.gif +0 -0
  179. data/generators/beast/templates/public/images/clearbits/zoomin.gif +0 -0
  180. data/generators/beast/templates/public/images/clearbits/zoomout.gif +0 -0
  181. data/generators/beast/templates/public/images/feed-icon.png +0 -0
  182. data/generators/beast/templates/public/images/rails.png +0 -0
  183. data/generators/beast/templates/public/images/reply_background.png +0 -0
  184. data/generators/beast/templates/public/images/small_circle.gif +0 -0
  185. data/generators/beast/templates/public/images/spinner.gif +0 -0
  186. data/generators/beast/templates/public/images/spinner_black.gif +0 -0
  187. data/generators/beast/templates/public/images/spinner_bounce.gif +0 -0
  188. data/generators/beast/templates/public/javascripts/beast.js +80 -0
  189. data/generators/beast/templates/public/stylesheets/display.css +941 -0
  190. data/lang/en.yml +206 -0
  191. data/lib/beast.rb +79 -0
  192. data/lib/savage_beast/application_helper.rb +91 -0
  193. data/lib/savage_beast/authentication_system.rb +47 -0
  194. data/lib/savage_beast/user_init.rb +79 -0
  195. data/lib/tasks/capistrano.rake +90 -0
  196. data/lib/tasks/deploy_edge.rake +44 -0
  197. data/lib/tasks/savage_beast.rake +133 -0
  198. data/po/beast.pot +712 -0
  199. data/po/nl/beast.po +700 -0
  200. data/tested_plugins/acts_as_list/README +23 -0
  201. data/tested_plugins/acts_as_list/init.rb +3 -0
  202. data/tested_plugins/acts_as_list/lib/active_record/acts/list.rb +256 -0
  203. data/tested_plugins/acts_as_list/test/list_test.rb +332 -0
  204. data/tested_plugins/gibberish/LICENSE +18 -0
  205. data/tested_plugins/gibberish/README +118 -0
  206. data/tested_plugins/gibberish/Rakefile +14 -0
  207. data/tested_plugins/gibberish/init.rb +3 -0
  208. data/tested_plugins/gibberish/lang/es.yml +3 -0
  209. data/tested_plugins/gibberish/lang/fr.yml +3 -0
  210. data/tested_plugins/gibberish/lib/gibberish.rb +8 -0
  211. data/tested_plugins/gibberish/lib/gibberish/localize.rb +88 -0
  212. data/tested_plugins/gibberish/lib/gibberish/string_ext.rb +17 -0
  213. data/tested_plugins/gibberish/test/gibberish_test.rb +203 -0
  214. data/tested_plugins/gibberish/test/lang/es.yml +1 -0
  215. data/tested_plugins/gibberish/test/lang/fr.yml +1 -0
  216. data/tested_plugins/mislav-will_paginate/CHANGELOG.rdoc +110 -0
  217. data/tested_plugins/mislav-will_paginate/LICENSE +18 -0
  218. data/tested_plugins/mislav-will_paginate/README.rdoc +107 -0
  219. data/tested_plugins/mislav-will_paginate/Rakefile +53 -0
  220. data/tested_plugins/mislav-will_paginate/examples/apple-circle.gif +0 -0
  221. data/tested_plugins/mislav-will_paginate/examples/index.haml +69 -0
  222. data/tested_plugins/mislav-will_paginate/examples/index.html +92 -0
  223. data/tested_plugins/mislav-will_paginate/examples/pagination.css +90 -0
  224. data/tested_plugins/mislav-will_paginate/examples/pagination.sass +91 -0
  225. data/tested_plugins/mislav-will_paginate/init.rb +1 -0
  226. data/tested_plugins/mislav-will_paginate/lib/will_paginate.rb +78 -0
  227. data/tested_plugins/mislav-will_paginate/lib/will_paginate/array.rb +16 -0
  228. data/tested_plugins/mislav-will_paginate/lib/will_paginate/collection.rb +146 -0
  229. data/tested_plugins/mislav-will_paginate/lib/will_paginate/core_ext.rb +32 -0
  230. data/tested_plugins/mislav-will_paginate/lib/will_paginate/finder.rb +264 -0
  231. data/tested_plugins/mislav-will_paginate/lib/will_paginate/named_scope.rb +170 -0
  232. data/tested_plugins/mislav-will_paginate/lib/will_paginate/named_scope_patch.rb +37 -0
  233. data/tested_plugins/mislav-will_paginate/lib/will_paginate/version.rb +9 -0
  234. data/tested_plugins/mislav-will_paginate/lib/will_paginate/view_helpers.rb +402 -0
  235. data/tested_plugins/mislav-will_paginate/test/boot.rb +21 -0
  236. data/tested_plugins/mislav-will_paginate/test/collection_test.rb +143 -0
  237. data/tested_plugins/mislav-will_paginate/test/console +8 -0
  238. data/tested_plugins/mislav-will_paginate/test/database.yml +22 -0
  239. data/tested_plugins/mislav-will_paginate/test/finder_test.rb +476 -0
  240. data/tested_plugins/mislav-will_paginate/test/fixtures/admin.rb +3 -0
  241. data/tested_plugins/mislav-will_paginate/test/fixtures/developer.rb +14 -0
  242. data/tested_plugins/mislav-will_paginate/test/fixtures/developers_projects.yml +13 -0
  243. data/tested_plugins/mislav-will_paginate/test/fixtures/project.rb +15 -0
  244. data/tested_plugins/mislav-will_paginate/test/fixtures/projects.yml +6 -0
  245. data/tested_plugins/mislav-will_paginate/test/fixtures/replies.yml +29 -0
  246. data/tested_plugins/mislav-will_paginate/test/fixtures/reply.rb +7 -0
  247. data/tested_plugins/mislav-will_paginate/test/fixtures/schema.rb +38 -0
  248. data/tested_plugins/mislav-will_paginate/test/fixtures/topic.rb +10 -0
  249. data/tested_plugins/mislav-will_paginate/test/fixtures/topics.yml +30 -0
  250. data/tested_plugins/mislav-will_paginate/test/fixtures/user.rb +2 -0
  251. data/tested_plugins/mislav-will_paginate/test/fixtures/users.yml +35 -0
  252. data/tested_plugins/mislav-will_paginate/test/helper.rb +40 -0
  253. data/tested_plugins/mislav-will_paginate/test/lib/activerecord_test_case.rb +43 -0
  254. data/tested_plugins/mislav-will_paginate/test/lib/activerecord_test_connector.rb +75 -0
  255. data/tested_plugins/mislav-will_paginate/test/lib/load_fixtures.rb +11 -0
  256. data/tested_plugins/mislav-will_paginate/test/lib/view_test_process.rb +178 -0
  257. data/tested_plugins/mislav-will_paginate/test/tasks.rake +59 -0
  258. data/tested_plugins/mislav-will_paginate/test/view_test.rb +365 -0
  259. data/tested_plugins/white_list/README +29 -0
  260. data/tested_plugins/white_list/Rakefile +22 -0
  261. data/tested_plugins/white_list/init.rb +2 -0
  262. data/tested_plugins/white_list/lib/white_list_helper.rb +97 -0
  263. data/tested_plugins/white_list/test/white_list_test.rb +132 -0
  264. data/tested_plugins/white_list_formatted_content/init.rb +27 -0
  265. metadata +322 -0
@@ -0,0 +1,59 @@
1
+ require 'rake/testtask'
2
+
3
+ desc 'Test the will_paginate plugin.'
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.pattern = 'test/**/*_test.rb'
6
+ t.verbose = true
7
+ t.libs << 'test'
8
+ end
9
+
10
+ # I want to specify environment variables at call time
11
+ class EnvTestTask < Rake::TestTask
12
+ attr_accessor :env
13
+
14
+ def ruby(*args)
15
+ env.each { |key, value| ENV[key] = value } if env
16
+ super
17
+ env.keys.each { |key| ENV.delete key } if env
18
+ end
19
+ end
20
+
21
+ for configuration in %w( sqlite3 mysql postgres )
22
+ EnvTestTask.new("test_#{configuration}") do |t|
23
+ t.pattern = 'test/finder_test.rb'
24
+ t.verbose = true
25
+ t.env = { 'DB' => configuration }
26
+ t.libs << 'test'
27
+ end
28
+ end
29
+
30
+ task :test_databases => %w(test_mysql test_sqlite3 test_postgres)
31
+
32
+ desc %{Test everything on SQLite3, MySQL and PostgreSQL}
33
+ task :test_full => %w(test test_mysql test_postgres)
34
+
35
+ desc %{Test everything with Rails 2.1.x, 2.0.x & 1.2.x gems}
36
+ task :test_all do
37
+ all = Rake::Task['test_full']
38
+ versions = %w(2.1.0 2.0.4 1.2.6)
39
+ versions.each do |version|
40
+ ENV['RAILS_VERSION'] = "~> #{version}"
41
+ all.invoke
42
+ reset_invoked unless version == versions.last
43
+ end
44
+ end
45
+
46
+ def reset_invoked
47
+ %w( test_full test test_mysql test_postgres ).each do |name|
48
+ Rake::Task[name].instance_variable_set '@already_invoked', false
49
+ end
50
+ end
51
+
52
+ task :rcov do
53
+ excludes = %w( lib/will_paginate/named_scope*
54
+ lib/will_paginate/core_ext.rb
55
+ lib/will_paginate.rb
56
+ rails* )
57
+
58
+ system %[rcov -Itest:lib test/*.rb -x #{excludes.join(',')}]
59
+ end
@@ -0,0 +1,365 @@
1
+ require 'helper'
2
+ require 'lib/view_test_process'
3
+
4
+ class AdditionalLinkAttributesRenderer < WillPaginate::LinkRenderer
5
+ def initialize(link_attributes = nil)
6
+ super()
7
+ @additional_link_attributes = link_attributes || { :default => 'true' }
8
+ end
9
+
10
+ def page_link(page, text, attributes = {})
11
+ @template.link_to text, url_for(page), attributes.merge(@additional_link_attributes)
12
+ end
13
+ end
14
+
15
+ class ViewTest < WillPaginate::ViewTestCase
16
+
17
+ ## basic pagination ##
18
+
19
+ def test_will_paginate
20
+ paginate do |pagination|
21
+ assert_select 'a[href]', 3 do |elements|
22
+ validate_page_numbers [2,3,2], elements
23
+ assert_select elements.last, ':last-child', "Next &raquo;"
24
+ end
25
+ assert_select 'span', 2
26
+ assert_select 'span.disabled:first-child', '&laquo; Previous'
27
+ assert_select 'span.current', '1'
28
+ assert_equal '&laquo; Previous 1 2 3 Next &raquo;', pagination.first.inner_text
29
+ end
30
+ end
31
+
32
+ def test_no_pagination_when_page_count_is_one
33
+ paginate :per_page => 30
34
+ assert_equal '', @html_result
35
+ end
36
+
37
+ def test_will_paginate_with_options
38
+ paginate({ :page => 2 },
39
+ :class => 'will_paginate', :previous_label => 'Prev', :next_label => 'Next') do
40
+ assert_select 'a[href]', 4 do |elements|
41
+ validate_page_numbers [1,1,3,3], elements
42
+ # test rel attribute values:
43
+ assert_select elements[1], 'a', '1' do |link|
44
+ assert_equal 'prev start', link.first['rel']
45
+ end
46
+ assert_select elements.first, 'a', "Prev" do |link|
47
+ assert_equal 'prev start', link.first['rel']
48
+ end
49
+ assert_select elements.last, 'a', "Next" do |link|
50
+ assert_equal 'next', link.first['rel']
51
+ end
52
+ end
53
+ assert_select 'span.current', '2'
54
+ end
55
+ end
56
+
57
+ def test_will_paginate_using_renderer_class
58
+ paginate({}, :renderer => AdditionalLinkAttributesRenderer) do
59
+ assert_select 'a[default=true]', 3
60
+ end
61
+ end
62
+
63
+ def test_will_paginate_using_renderer_instance
64
+ renderer = WillPaginate::LinkRenderer.new
65
+ renderer.gap_marker = '<span class="my-gap">~~</span>'
66
+
67
+ paginate({ :per_page => 2 }, :inner_window => 0, :outer_window => 0, :renderer => renderer) do
68
+ assert_select 'span.my-gap', '~~'
69
+ end
70
+
71
+ renderer = AdditionalLinkAttributesRenderer.new(:title => 'rendered')
72
+ paginate({}, :renderer => renderer) do
73
+ assert_select 'a[title=rendered]', 3
74
+ end
75
+ end
76
+
77
+ def test_prev_next_links_have_classnames
78
+ paginate do |pagination|
79
+ assert_select 'span.disabled.prev_page:first-child'
80
+ assert_select 'a.next_page[href]:last-child'
81
+ end
82
+ end
83
+
84
+ def test_prev_label_deprecated
85
+ assert_deprecated ':previous_label' do
86
+ paginate({ :page => 2 }, :prev_label => 'Deprecated') do
87
+ assert_select 'a[href]:first-child', 'Deprecated'
88
+ end
89
+ end
90
+ end
91
+
92
+ def test_full_output
93
+ paginate
94
+ expected = <<-HTML
95
+ <div class="pagination"><span class="disabled prev_page">&laquo; Previous</span>
96
+ <span class="current">1</span>
97
+ <a href="/foo/bar?page=2" rel="next">2</a>
98
+ <a href="/foo/bar?page=3">3</a>
99
+ <a href="/foo/bar?page=2" class="next_page" rel="next">Next &raquo;</a></div>
100
+ HTML
101
+ expected.strip!.gsub!(/\s{2,}/, ' ')
102
+
103
+ assert_dom_equal expected, @html_result
104
+ end
105
+
106
+ def test_escaping_of_urls
107
+ paginate({:page => 1, :per_page => 1, :total_entries => 2},
108
+ :page_links => false, :params => { :tag => '<br>' })
109
+
110
+ assert_select 'a[href]', 1 do |links|
111
+ query = links.first['href'].split('?', 2)[1]
112
+ assert_equal %w(page=2 tag=%3Cbr%3E), query.split('&amp;').sort
113
+ end
114
+ end
115
+
116
+ ## advanced options for pagination ##
117
+
118
+ def test_will_paginate_without_container
119
+ paginate({}, :container => false)
120
+ assert_select 'div.pagination', 0, 'main DIV present when it shouldn\'t'
121
+ assert_select 'a[href]', 3
122
+ end
123
+
124
+ def test_will_paginate_without_page_links
125
+ paginate({ :page => 2 }, :page_links => false) do
126
+ assert_select 'a[href]', 2 do |elements|
127
+ validate_page_numbers [1,3], elements
128
+ end
129
+ end
130
+ end
131
+
132
+ def test_will_paginate_windows
133
+ paginate({ :page => 6, :per_page => 1 }, :inner_window => 1) do |pagination|
134
+ assert_select 'a[href]', 8 do |elements|
135
+ validate_page_numbers [5,1,2,5,7,10,11,7], elements
136
+ assert_select elements.first, 'a', '&laquo; Previous'
137
+ assert_select elements.last, 'a', 'Next &raquo;'
138
+ end
139
+ assert_select 'span.current', '6'
140
+ assert_equal '&laquo; Previous 1 2 &hellip; 5 6 7 &hellip; 10 11 Next &raquo;', pagination.first.inner_text
141
+ end
142
+ end
143
+
144
+ def test_will_paginate_eliminates_small_gaps
145
+ paginate({ :page => 6, :per_page => 1 }, :inner_window => 2) do
146
+ assert_select 'a[href]', 12 do |elements|
147
+ validate_page_numbers [5,1,2,3,4,5,7,8,9,10,11,7], elements
148
+ end
149
+ end
150
+ end
151
+
152
+ def test_container_id
153
+ paginate do |div|
154
+ assert_nil div.first['id']
155
+ end
156
+
157
+ # magic ID
158
+ paginate({}, :id => true) do |div|
159
+ assert_equal 'fixnums_pagination', div.first['id']
160
+ end
161
+
162
+ # explicit ID
163
+ paginate({}, :id => 'custom_id') do |div|
164
+ assert_equal 'custom_id', div.first['id']
165
+ end
166
+ end
167
+
168
+ ## other helpers ##
169
+
170
+ def test_paginated_section
171
+ @template = <<-ERB
172
+ <% paginated_section collection, options do %>
173
+ <%= content_tag :div, '', :id => "developers" %>
174
+ <% end %>
175
+ ERB
176
+
177
+ paginate
178
+ assert_select 'div.pagination', 2
179
+ assert_select 'div.pagination + div#developers', 1
180
+ end
181
+
182
+ def test_page_entries_info
183
+ @template = '<%= page_entries_info collection %>'
184
+ array = ('a'..'z').to_a
185
+
186
+ paginate array.paginate(:page => 2, :per_page => 5)
187
+ assert_equal %{Displaying strings <b>6&nbsp;-&nbsp;10</b> of <b>26</b> in total},
188
+ @html_result
189
+
190
+ paginate array.paginate(:page => 7, :per_page => 4)
191
+ assert_equal %{Displaying strings <b>25&nbsp;-&nbsp;26</b> of <b>26</b> in total},
192
+ @html_result
193
+ end
194
+
195
+ uses_mocha 'class name' do
196
+ def test_page_entries_info_with_longer_class_name
197
+ @template = '<%= page_entries_info collection %>'
198
+ collection = ('a'..'z').to_a.paginate
199
+ collection.first.stubs(:class).returns(mock('class', :name => 'ProjectType'))
200
+
201
+ paginate collection
202
+ assert @html_result.index('project types'), "expected <#{@html_result.inspect}> to mention 'project types'"
203
+ end
204
+ end
205
+
206
+ def test_page_entries_info_with_single_page_collection
207
+ @template = '<%= page_entries_info collection %>'
208
+
209
+ paginate(('a'..'d').to_a.paginate(:page => 1, :per_page => 5))
210
+ assert_equal %{Displaying <b>all 4</b> strings}, @html_result
211
+
212
+ paginate(['a'].paginate(:page => 1, :per_page => 5))
213
+ assert_equal %{Displaying <b>1</b> string}, @html_result
214
+
215
+ paginate([].paginate(:page => 1, :per_page => 5))
216
+ assert_equal %{No entries found}, @html_result
217
+ end
218
+
219
+ def test_page_entries_info_with_custom_entry_name
220
+ @template = '<%= page_entries_info collection, :entry_name => "author" %>'
221
+
222
+ entries = (1..20).to_a
223
+
224
+ paginate(entries.paginate(:page => 1, :per_page => 5))
225
+ assert_equal %{Displaying authors <b>1&nbsp;-&nbsp;5</b> of <b>20</b> in total}, @html_result
226
+
227
+ paginate(entries.paginate(:page => 1, :per_page => 20))
228
+ assert_equal %{Displaying <b>all 20</b> authors}, @html_result
229
+
230
+ paginate(['a'].paginate(:page => 1, :per_page => 5))
231
+ assert_equal %{Displaying <b>1</b> author}, @html_result
232
+
233
+ paginate([].paginate(:page => 1, :per_page => 5))
234
+ assert_equal %{No authors found}, @html_result
235
+ end
236
+
237
+ ## parameter handling in page links ##
238
+
239
+ def test_will_paginate_preserves_parameters_on_get
240
+ @request.params :foo => { :bar => 'baz' }
241
+ paginate
242
+ assert_links_match /foo%5Bbar%5D=baz/
243
+ end
244
+
245
+ def test_will_paginate_doesnt_preserve_parameters_on_post
246
+ @request.post
247
+ @request.params :foo => 'bar'
248
+ paginate
249
+ assert_no_links_match /foo=bar/
250
+ end
251
+
252
+ def test_adding_additional_parameters
253
+ paginate({}, :params => { :foo => 'bar' })
254
+ assert_links_match /foo=bar/
255
+ end
256
+
257
+ def test_adding_anchor_parameter
258
+ paginate({}, :params => { :anchor => 'anchor' })
259
+ assert_links_match /#anchor$/
260
+ end
261
+
262
+ def test_removing_arbitrary_parameters
263
+ @request.params :foo => 'bar'
264
+ paginate({}, :params => { :foo => nil })
265
+ assert_no_links_match /foo=bar/
266
+ end
267
+
268
+ def test_adding_additional_route_parameters
269
+ paginate({}, :params => { :controller => 'baz', :action => 'list' })
270
+ assert_links_match %r{\Wbaz/list\W}
271
+ end
272
+
273
+ def test_will_paginate_with_custom_page_param
274
+ paginate({ :page => 2 }, :param_name => :developers_page) do
275
+ assert_select 'a[href]', 4 do |elements|
276
+ validate_page_numbers [1,1,3,3], elements, :developers_page
277
+ end
278
+ end
279
+ end
280
+
281
+ def test_complex_custom_page_param
282
+ @request.params :developers => { :page => 2 }
283
+
284
+ paginate({ :page => 2 }, :param_name => 'developers[page]') do
285
+ assert_select 'a[href]', 4 do |links|
286
+ assert_links_match /\?developers%5Bpage%5D=\d+$/, links
287
+ validate_page_numbers [1,1,3,3], links, 'developers[page]'
288
+ end
289
+ end
290
+ end
291
+
292
+ def test_custom_routing_page_param
293
+ @request.symbolized_path_parameters.update :controller => 'dummy', :action => nil
294
+ paginate :per_page => 2 do
295
+ assert_select 'a[href]', 6 do |links|
296
+ assert_links_match %r{/page/(\d+)$}, links, [2, 3, 4, 5, 6, 2]
297
+ end
298
+ end
299
+ end
300
+
301
+ def test_custom_routing_page_param_with_dot_separator
302
+ @request.symbolized_path_parameters.update :controller => 'dummy', :action => 'dots'
303
+ paginate :per_page => 2 do
304
+ assert_select 'a[href]', 6 do |links|
305
+ assert_links_match %r{/page\.(\d+)$}, links, [2, 3, 4, 5, 6, 2]
306
+ end
307
+ end
308
+ end
309
+
310
+ def test_custom_routing_with_first_page_hidden
311
+ @request.symbolized_path_parameters.update :controller => 'ibocorp', :action => nil
312
+ paginate :page => 2, :per_page => 2 do
313
+ assert_select 'a[href]', 7 do |links|
314
+ assert_links_match %r{/ibocorp(?:/(\d+))?$}, links, [nil, nil, 3, 4, 5, 6, 3]
315
+ end
316
+ end
317
+ end
318
+
319
+ ## internal hardcore stuff ##
320
+
321
+ class LegacyCollection < WillPaginate::Collection
322
+ alias :page_count :total_pages
323
+ undef :total_pages
324
+ end
325
+
326
+ def test_deprecation_notices_with_page_count
327
+ collection = LegacyCollection.new(1, 1, 2)
328
+
329
+ assert_deprecated collection.class.name do
330
+ paginate collection
331
+ end
332
+ end
333
+
334
+ uses_mocha 'view internals' do
335
+ def test_collection_name_can_be_guessed
336
+ collection = mock
337
+ collection.expects(:total_pages).returns(1)
338
+
339
+ @template = '<%= will_paginate options %>'
340
+ @controller.controller_name = 'developers'
341
+ @view.assigns['developers'] = collection
342
+
343
+ paginate(nil)
344
+ end
345
+ end
346
+
347
+ def test_inferred_collection_name_raises_error_when_nil
348
+ @template = '<%= will_paginate options %>'
349
+ @controller.controller_name = 'developers'
350
+
351
+ e = assert_raise ArgumentError do
352
+ paginate(nil)
353
+ end
354
+ assert e.message.include?('@developers')
355
+ end
356
+
357
+ if ActionController::Base.respond_to? :rescue_responses
358
+ # only on Rails 2
359
+ def test_rescue_response_hook_presence
360
+ assert_equal :not_found,
361
+ ActionController::Base.rescue_responses['WillPaginate::InvalidPage']
362
+ end
363
+ end
364
+
365
+ end
@@ -0,0 +1,29 @@
1
+ WhiteList
2
+ =========
3
+
4
+ This White Listing helper will html encode all tags and strip all attributes that aren't specifically allowed.
5
+ It also strips href/src tags with invalid protocols, like javascript: especially. It does its best to counter any
6
+ tricks that hackers may use, like throwing in unicode/ascii/hex values to get past the javascript: filters. Check out
7
+ the extensive test suite.
8
+
9
+ <%= white_list @article.body %>
10
+
11
+ You can add or remove tags/attributes if you want to customize it a bit.
12
+
13
+ Add table tags
14
+
15
+ WhiteListHelper.tags.merge %w(table td th)
16
+
17
+ Remove tags
18
+
19
+ WhiteListHelper.tags.delete 'div'
20
+
21
+ Change allowed attributes
22
+
23
+ WhiteListHelper.attributes.merge %w(id class style)
24
+
25
+ white_list accepts a block for custom tag escaping. Shown below is the default block that white_list uses if none is given.
26
+ The block is called for all bad tags, and every text node. node is an instance of HTML::Node (either HTML::Tag or HTML::Text).
27
+ bad is nil for text nodes inside good tags, or is the tag name of the bad tag.
28
+
29
+ <%= white_list(@article.body) { |node, bad| white_listed_bad_tags.include?(bad) ? nil : node.to_s.gsub(/</, '&lt;') } %>