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.
- data/.gitignore +2 -0
- data/README.rdoc +42 -0
- data/Rakefile +25 -0
- data/VERSION +1 -0
- data/app/controllers/application.rb +6 -0
- data/app/controllers/beast_application_controller.rb +3 -0
- data/app/controllers/forums_controller.rb +64 -0
- data/app/controllers/moderators_controller.rb +10 -0
- data/app/controllers/monitorships_controller.rb +22 -0
- data/app/controllers/posts_controller.rb +134 -0
- data/app/controllers/topics_controller.rb +110 -0
- data/app/helpers/count_helper.rb +13 -0
- data/app/helpers/forums_helper.rb +15 -0
- data/app/helpers/moderators_helper.rb +2 -0
- data/app/helpers/monitorships_helper.rb +2 -0
- data/app/helpers/posts_helper.rb +3 -0
- data/app/helpers/topics_helper.rb +3 -0
- data/app/models/forum.rb +26 -0
- data/app/models/moderatorship.rb +6 -0
- data/app/models/monitorship.rb +5 -0
- data/app/models/monitorships_sweeper.rb +9 -0
- data/app/models/post.rb +33 -0
- data/app/models/posts_sweeper.rb +12 -0
- data/app/models/topic.rb +94 -0
- data/app/views/forums/_form.html.erb +21 -0
- data/app/views/forums/edit.html.erb +12 -0
- data/app/views/forums/index.html.erb +77 -0
- data/app/views/forums/new.html.erb +10 -0
- data/app/views/forums/show.html.erb +94 -0
- data/app/views/layouts/_head.html.erb +34 -0
- data/app/views/layouts/_post.rss.builder +9 -0
- data/app/views/layouts/application.html.erb +29 -0
- data/app/views/layouts/beast.html.erb +29 -0
- data/app/views/monitorships/create.js.rjs +4 -0
- data/app/views/monitorships/destroy.js.rjs +4 -0
- data/app/views/posts/_edit.html.erb +38 -0
- data/app/views/posts/edit.html.erb +14 -0
- data/app/views/posts/edit.js.rjs +6 -0
- data/app/views/posts/index.html.erb +53 -0
- data/app/views/posts/index.rss.builder +20 -0
- data/app/views/posts/monitored.html.erb +55 -0
- data/app/views/posts/monitored.rss.builder +15 -0
- data/app/views/posts/update.js.rjs +3 -0
- data/app/views/topics/_form.html.erb +28 -0
- data/app/views/topics/edit.html.erb +10 -0
- data/app/views/topics/index.html.erb +2 -0
- data/app/views/topics/new.html.erb +18 -0
- data/app/views/topics/show.html.erb +183 -0
- data/app/views/topics/show.rss.builder +16 -0
- data/config/routes.rb +18 -0
- data/generators/beast/beast_generator.rb +88 -0
- data/generators/beast/templates/migrations/create_savage_tables.rb +73 -0
- data/generators/beast/templates/public/images/clearbits/_readme.txt +12 -0
- data/generators/beast/templates/public/images/clearbits/add.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/addressbook.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/alert.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/apple.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow1_e.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow1_n.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow1_ne.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow1_nw.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow1_s.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow1_se.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow1_sw.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow1_w.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow2_e.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow2_n.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow2_ne.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow2_nw.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow2_s.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow2_se.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow2_sw.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow2_w.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow3_e.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow3_n.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow3_ne.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow3_nw.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow3_s.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow3_se.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow3_sw.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/arrow3_w.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/ascii.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/back.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/bg_blank.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/bg_circle.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/bg_rounded.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/bg_rounded_ne.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/bg_rounded_nw.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/bg_rounded_se.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/bg_rounded_sw.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/bigsmile.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/binary.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/blah.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/bstop.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/buy.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/calday.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/calendar.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/camera.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/cart.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/cd.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/cellphone.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/chat.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/check.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/close.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/comment.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/cube.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/day.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/denied.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/document.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/download.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/edit.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/eject.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/equalizer.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/first.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/flag.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/flash.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/folder.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/forward.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/frown.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/ftp.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/graph.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/heart.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/home.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/html.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/ipod.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/last.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/lock.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/loop.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/mail.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/man.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/manman.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/music.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/mute.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/mute_centered.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/newwindow.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/next.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/night.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/open.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/pause.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/phone.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/play.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/previous.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/quicktime.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/redo.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/reload.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/sad.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/save.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/scream.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/search.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/seconds.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/smile.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/smirk.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/star.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/stop.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/subtract.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/switch.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/target.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/tcp.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/time.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/toggle.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/tongue.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/tools.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/trackback.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/trash.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/tv.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/type.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/undo.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/unlock.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/upload.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/user.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/video.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/volume_high.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/volume_low.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/wifi.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/window.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/woman.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/womanman.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/work.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/zoomin.gif +0 -0
- data/generators/beast/templates/public/images/clearbits/zoomout.gif +0 -0
- data/generators/beast/templates/public/images/feed-icon.png +0 -0
- data/generators/beast/templates/public/images/rails.png +0 -0
- data/generators/beast/templates/public/images/reply_background.png +0 -0
- data/generators/beast/templates/public/images/small_circle.gif +0 -0
- data/generators/beast/templates/public/images/spinner.gif +0 -0
- data/generators/beast/templates/public/images/spinner_black.gif +0 -0
- data/generators/beast/templates/public/images/spinner_bounce.gif +0 -0
- data/generators/beast/templates/public/javascripts/beast.js +80 -0
- data/generators/beast/templates/public/stylesheets/display.css +941 -0
- data/lang/en.yml +206 -0
- data/lib/beast.rb +79 -0
- data/lib/savage_beast/application_helper.rb +91 -0
- data/lib/savage_beast/authentication_system.rb +47 -0
- data/lib/savage_beast/user_init.rb +79 -0
- data/lib/tasks/capistrano.rake +90 -0
- data/lib/tasks/deploy_edge.rake +44 -0
- data/lib/tasks/savage_beast.rake +133 -0
- data/po/beast.pot +712 -0
- data/po/nl/beast.po +700 -0
- data/tested_plugins/acts_as_list/README +23 -0
- data/tested_plugins/acts_as_list/init.rb +3 -0
- data/tested_plugins/acts_as_list/lib/active_record/acts/list.rb +256 -0
- data/tested_plugins/acts_as_list/test/list_test.rb +332 -0
- data/tested_plugins/gibberish/LICENSE +18 -0
- data/tested_plugins/gibberish/README +118 -0
- data/tested_plugins/gibberish/Rakefile +14 -0
- data/tested_plugins/gibberish/init.rb +3 -0
- data/tested_plugins/gibberish/lang/es.yml +3 -0
- data/tested_plugins/gibberish/lang/fr.yml +3 -0
- data/tested_plugins/gibberish/lib/gibberish.rb +8 -0
- data/tested_plugins/gibberish/lib/gibberish/localize.rb +88 -0
- data/tested_plugins/gibberish/lib/gibberish/string_ext.rb +17 -0
- data/tested_plugins/gibberish/test/gibberish_test.rb +203 -0
- data/tested_plugins/gibberish/test/lang/es.yml +1 -0
- data/tested_plugins/gibberish/test/lang/fr.yml +1 -0
- data/tested_plugins/mislav-will_paginate/CHANGELOG.rdoc +110 -0
- data/tested_plugins/mislav-will_paginate/LICENSE +18 -0
- data/tested_plugins/mislav-will_paginate/README.rdoc +107 -0
- data/tested_plugins/mislav-will_paginate/Rakefile +53 -0
- data/tested_plugins/mislav-will_paginate/examples/apple-circle.gif +0 -0
- data/tested_plugins/mislav-will_paginate/examples/index.haml +69 -0
- data/tested_plugins/mislav-will_paginate/examples/index.html +92 -0
- data/tested_plugins/mislav-will_paginate/examples/pagination.css +90 -0
- data/tested_plugins/mislav-will_paginate/examples/pagination.sass +91 -0
- data/tested_plugins/mislav-will_paginate/init.rb +1 -0
- data/tested_plugins/mislav-will_paginate/lib/will_paginate.rb +78 -0
- data/tested_plugins/mislav-will_paginate/lib/will_paginate/array.rb +16 -0
- data/tested_plugins/mislav-will_paginate/lib/will_paginate/collection.rb +146 -0
- data/tested_plugins/mislav-will_paginate/lib/will_paginate/core_ext.rb +32 -0
- data/tested_plugins/mislav-will_paginate/lib/will_paginate/finder.rb +264 -0
- data/tested_plugins/mislav-will_paginate/lib/will_paginate/named_scope.rb +170 -0
- data/tested_plugins/mislav-will_paginate/lib/will_paginate/named_scope_patch.rb +37 -0
- data/tested_plugins/mislav-will_paginate/lib/will_paginate/version.rb +9 -0
- data/tested_plugins/mislav-will_paginate/lib/will_paginate/view_helpers.rb +402 -0
- data/tested_plugins/mislav-will_paginate/test/boot.rb +21 -0
- data/tested_plugins/mislav-will_paginate/test/collection_test.rb +143 -0
- data/tested_plugins/mislav-will_paginate/test/console +8 -0
- data/tested_plugins/mislav-will_paginate/test/database.yml +22 -0
- data/tested_plugins/mislav-will_paginate/test/finder_test.rb +476 -0
- data/tested_plugins/mislav-will_paginate/test/fixtures/admin.rb +3 -0
- data/tested_plugins/mislav-will_paginate/test/fixtures/developer.rb +14 -0
- data/tested_plugins/mislav-will_paginate/test/fixtures/developers_projects.yml +13 -0
- data/tested_plugins/mislav-will_paginate/test/fixtures/project.rb +15 -0
- data/tested_plugins/mislav-will_paginate/test/fixtures/projects.yml +6 -0
- data/tested_plugins/mislav-will_paginate/test/fixtures/replies.yml +29 -0
- data/tested_plugins/mislav-will_paginate/test/fixtures/reply.rb +7 -0
- data/tested_plugins/mislav-will_paginate/test/fixtures/schema.rb +38 -0
- data/tested_plugins/mislav-will_paginate/test/fixtures/topic.rb +10 -0
- data/tested_plugins/mislav-will_paginate/test/fixtures/topics.yml +30 -0
- data/tested_plugins/mislav-will_paginate/test/fixtures/user.rb +2 -0
- data/tested_plugins/mislav-will_paginate/test/fixtures/users.yml +35 -0
- data/tested_plugins/mislav-will_paginate/test/helper.rb +40 -0
- data/tested_plugins/mislav-will_paginate/test/lib/activerecord_test_case.rb +43 -0
- data/tested_plugins/mislav-will_paginate/test/lib/activerecord_test_connector.rb +75 -0
- data/tested_plugins/mislav-will_paginate/test/lib/load_fixtures.rb +11 -0
- data/tested_plugins/mislav-will_paginate/test/lib/view_test_process.rb +178 -0
- data/tested_plugins/mislav-will_paginate/test/tasks.rake +59 -0
- data/tested_plugins/mislav-will_paginate/test/view_test.rb +365 -0
- data/tested_plugins/white_list/README +29 -0
- data/tested_plugins/white_list/Rakefile +22 -0
- data/tested_plugins/white_list/init.rb +2 -0
- data/tested_plugins/white_list/lib/white_list_helper.rb +97 -0
- data/tested_plugins/white_list/test/white_list_test.rb +132 -0
- data/tested_plugins/white_list_formatted_content/init.rb +27 -0
- 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 »"
|
24
|
+
end
|
25
|
+
assert_select 'span', 2
|
26
|
+
assert_select 'span.disabled:first-child', '« Previous'
|
27
|
+
assert_select 'span.current', '1'
|
28
|
+
assert_equal '« Previous 1 2 3 Next »', 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">« 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 »</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('&').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', '« Previous'
|
137
|
+
assert_select elements.last, 'a', 'Next »'
|
138
|
+
end
|
139
|
+
assert_select 'span.current', '6'
|
140
|
+
assert_equal '« Previous 1 2 … 5 6 7 … 10 11 Next »', 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 - 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 - 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 - 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(/</, '<') } %>
|