pagify 0.6.1

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 (55) hide show
  1. data/CHANGES +42 -0
  2. data/LICENSE +201 -0
  3. data/NOTICE +5 -0
  4. data/README +135 -0
  5. data/Rakefile +54 -0
  6. data/TODO +12 -0
  7. data/lib/pagify.rb +14 -0
  8. data/lib/pagify/active_record.rb +17 -0
  9. data/lib/pagify/array.rb +6 -0
  10. data/lib/pagify/data_mapper.rb +8 -0
  11. data/lib/pagify/helper/abstract.rb +112 -0
  12. data/lib/pagify/helper/detail/setting.rb +54 -0
  13. data/lib/pagify/helper/detail/setup.rb +23 -0
  14. data/lib/pagify/helper/html.rb +86 -0
  15. data/lib/pagify/helper/rails.rb +23 -0
  16. data/lib/pagify/page/basic.rb +56 -0
  17. data/lib/pagify/page/null.rb +10 -0
  18. data/lib/pagify/pager/active_record.rb +30 -0
  19. data/lib/pagify/pager/array.rb +21 -0
  20. data/lib/pagify/pager/basic.rb +114 -0
  21. data/lib/pagify/pager/data_mapper.rb +29 -0
  22. data/lib/pagify/pager/detail/page_accept_string_or_blank.rb +13 -0
  23. data/lib/pagify/pager/null.rb +15 -0
  24. data/lib/pagify/pagifier/abstract.rb +10 -0
  25. data/lib/pagify/pagifier/active_record.rb +11 -0
  26. data/lib/pagify/pagifier/array.rb +9 -0
  27. data/lib/pagify/pagifier/data_mapper.rb +11 -0
  28. data/lib/pagify/version.rb +4 -0
  29. data/pagify.gemspec +43 -0
  30. data/spec/pagify_spec.rb +8 -0
  31. data/spec/spec_helper.rb +17 -0
  32. data/tasks/ann.rake +80 -0
  33. data/tasks/bones.rake +20 -0
  34. data/tasks/gem.rake +201 -0
  35. data/tasks/git.rake +40 -0
  36. data/tasks/notes.rake +27 -0
  37. data/tasks/post_load.rake +34 -0
  38. data/tasks/rdoc.rake +51 -0
  39. data/tasks/rubyforge.rake +55 -0
  40. data/tasks/setup.rb +292 -0
  41. data/tasks/spec.rake +54 -0
  42. data/tasks/svn.rake +47 -0
  43. data/tasks/test.rake +40 -0
  44. data/tasks/zentest.rake +36 -0
  45. data/test/helper.rb +26 -0
  46. data/test/helper_model.rb +83 -0
  47. data/test/helper_pagify.rb +39 -0
  48. data/test/test_active_record.rb +66 -0
  49. data/test/test_array.rb +19 -0
  50. data/test/test_basic.rb +22 -0
  51. data/test/test_data_mapper.rb +56 -0
  52. data/test/test_html.rb +186 -0
  53. data/test/test_null.rb +31 -0
  54. data/test/test_rails.rb +32 -0
  55. metadata +163 -0
@@ -0,0 +1,54 @@
1
+
2
+ if HAVE_SPEC_RAKE_SPECTASK and not PROJ.spec.files.to_a.empty?
3
+ require 'spec/rake/verify_rcov'
4
+
5
+ namespace :spec do
6
+
7
+ desc 'Run all specs with basic output'
8
+ Spec::Rake::SpecTask.new(:run) do |t|
9
+ t.ruby_opts = PROJ.ruby_opts
10
+ t.spec_opts = PROJ.spec.opts
11
+ t.spec_files = PROJ.spec.files
12
+ t.libs += PROJ.libs
13
+ end
14
+
15
+ desc 'Run all specs with text output'
16
+ Spec::Rake::SpecTask.new(:specdoc) do |t|
17
+ t.ruby_opts = PROJ.ruby_opts
18
+ t.spec_opts = PROJ.spec.opts + ['--format', 'specdoc']
19
+ t.spec_files = PROJ.spec.files
20
+ t.libs += PROJ.libs
21
+ end
22
+
23
+ if HAVE_RCOV
24
+ desc 'Run all specs with RCov'
25
+ Spec::Rake::SpecTask.new(:rcov) do |t|
26
+ t.ruby_opts = PROJ.ruby_opts
27
+ t.spec_opts = PROJ.spec.opts
28
+ t.spec_files = PROJ.spec.files
29
+ t.libs += PROJ.libs
30
+ t.rcov = true
31
+ t.rcov_dir = PROJ.rcov.dir
32
+ t.rcov_opts = PROJ.rcov.opts + ['--exclude', 'spec']
33
+ end
34
+
35
+ RCov::VerifyTask.new(:verify) do |t|
36
+ t.threshold = PROJ.rcov.threshold
37
+ t.index_html = File.join(PROJ.rcov.dir, 'index.html')
38
+ t.require_exact_threshold = PROJ.rcov.threshold_exact
39
+ end
40
+
41
+ task :verify => :rcov
42
+ remove_desc_for_task %w(spec:clobber_rcov)
43
+ end
44
+
45
+ end # namespace :spec
46
+
47
+ desc 'Alias to spec:run'
48
+ task :spec => 'spec:run'
49
+
50
+ task :clobber => 'spec:clobber_rcov' if HAVE_RCOV
51
+
52
+ end # if HAVE_SPEC_RAKE_SPECTASK
53
+
54
+ # EOF
@@ -0,0 +1,47 @@
1
+
2
+ if HAVE_SVN
3
+
4
+ unless PROJ.svn.root
5
+ info = %x/svn info ./
6
+ m = %r/^Repository Root:\s+(.*)$/.match(info)
7
+ PROJ.svn.root = (m.nil? ? '' : m[1])
8
+ end
9
+ PROJ.svn.root = File.join(PROJ.svn.root, PROJ.svn.path) unless PROJ.svn.path.empty?
10
+
11
+ namespace :svn do
12
+
13
+ # A prerequisites task that all other tasks depend upon
14
+ task :prereqs
15
+
16
+ desc 'Show tags from the SVN repository'
17
+ task :show_tags => 'svn:prereqs' do |t|
18
+ tags = %x/svn list #{File.join(PROJ.svn.root, PROJ.svn.tags)}/
19
+ tags.gsub!(%r/\/$/, '')
20
+ tags = tags.split("\n").sort {|a,b| b <=> a}
21
+ puts tags
22
+ end
23
+
24
+ desc 'Create a new tag in the SVN repository'
25
+ task :create_tag => 'svn:prereqs' do |t|
26
+ v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
27
+ abort "Versions don't match #{v} vs #{PROJ.version}" if v != PROJ.version
28
+
29
+ svn = PROJ.svn
30
+ trunk = File.join(svn.root, svn.trunk)
31
+ tag = "%s-%s" % [PROJ.name, PROJ.version]
32
+ tag = File.join(svn.root, svn.tags, tag)
33
+ msg = "Creating tag for #{PROJ.name} version #{PROJ.version}"
34
+
35
+ puts "Creating SVN tag '#{tag}'"
36
+ unless system "svn cp -m '#{msg}' #{trunk} #{tag}"
37
+ abort "Tag creation failed"
38
+ end
39
+ end
40
+
41
+ end # namespace :svn
42
+
43
+ task 'gem:release' => 'svn:create_tag'
44
+
45
+ end # if PROJ.svn.path
46
+
47
+ # EOF
@@ -0,0 +1,40 @@
1
+
2
+ if test(?e, PROJ.test.file) or not PROJ.test.files.to_a.empty?
3
+ require 'rake/testtask'
4
+
5
+ namespace :test do
6
+
7
+ Rake::TestTask.new(:run) do |t|
8
+ t.libs = PROJ.libs
9
+ t.test_files = if test(?f, PROJ.test.file) then [PROJ.test.file]
10
+ else PROJ.test.files end
11
+ t.ruby_opts += PROJ.ruby_opts
12
+ t.ruby_opts += PROJ.test.opts
13
+ end
14
+
15
+ if HAVE_RCOV
16
+ desc 'Run rcov on the unit tests'
17
+ task :rcov => :clobber_rcov do
18
+ opts = PROJ.rcov.opts.dup << '-o' << PROJ.rcov.dir
19
+ opts = opts.join(' ')
20
+ files = if test(?f, PROJ.test.file) then [PROJ.test.file]
21
+ else PROJ.test.files end
22
+ files = files.join(' ')
23
+ sh "#{RCOV} #{files} #{opts}"
24
+ end
25
+
26
+ task :clobber_rcov do
27
+ rm_r 'coverage' rescue nil
28
+ end
29
+ end
30
+
31
+ end # namespace :test
32
+
33
+ desc 'Alias to test:run'
34
+ task :test => 'test:run'
35
+
36
+ task :clobber => 'test:clobber_rcov' if HAVE_RCOV
37
+
38
+ end
39
+
40
+ # EOF
@@ -0,0 +1,36 @@
1
+ if HAVE_ZENTEST
2
+
3
+ # --------------------------------------------------------------------------
4
+ if test(?e, PROJ.test.file) or not PROJ.test.files.to_a.empty?
5
+ require 'autotest'
6
+
7
+ namespace :test do
8
+ task :autotest do
9
+ Autotest.run
10
+ end
11
+ end
12
+
13
+ desc "Run the autotest loop"
14
+ task :autotest => 'test:autotest'
15
+
16
+ end # if test
17
+
18
+ # --------------------------------------------------------------------------
19
+ if HAVE_SPEC_RAKE_SPECTASK and not PROJ.spec.files.to_a.empty?
20
+ require 'autotest/rspec'
21
+
22
+ namespace :spec do
23
+ task :autotest do
24
+ load '.autotest' if test(?f, '.autotest')
25
+ Autotest::Rspec.run
26
+ end
27
+ end
28
+
29
+ desc "Run the autotest loop"
30
+ task :autotest => 'spec:autotest'
31
+
32
+ end # if rspec
33
+
34
+ end # if HAVE_ZENTEST
35
+
36
+ # EOF
@@ -0,0 +1,26 @@
1
+
2
+ require 'rubygems'
3
+
4
+ TestCase = begin
5
+ require 'minitest/unit'
6
+ MiniTest::Unit.autorun
7
+ MiniTest::Unit::TestCase
8
+ rescue LoadError
9
+ require 'test/unit'
10
+ Test::Unit::TestCase
11
+ end
12
+
13
+ require 'pagify'
14
+ #gem 'dm-core', '<0.10'
15
+ #gem 'dm-aggregates', '<0.10'
16
+ require 'dm-core'
17
+ require 'dm-aggregates'
18
+ require 'active_record'
19
+
20
+ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('1.8.7')
21
+ class Symbol
22
+ def to_proc
23
+ lambda{ |*args| args.shift.__send__(self, *args) }
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,83 @@
1
+
2
+ module SuiteForModel
3
+
4
+ def test_page_correctness_fixnum
5
+ page_correctness 1
6
+ end
7
+
8
+ def test_page_correctness_string
9
+ page_correctness '1'
10
+ end
11
+
12
+ def test_nil_page_default_page_1
13
+ users = send(:User).pagify :page => nil, :per_page => 2
14
+ assert_equal 2, users.pager.size
15
+ assert_equal 1, users.page
16
+ end
17
+
18
+ def page_correctness page
19
+ users = send(:User).pagify :page => page, :per_page => 2
20
+
21
+ assert_equal 2, users.pager.size
22
+ assert_equal 1, users.page
23
+ assert_equal send(:User).first, users.first
24
+ assert_equal 2, users.size
25
+ assert_equal send(:User).first(:offset => 2, :limit => 1), users.next.first
26
+ assert_equal 1, users.next.size
27
+ assert_equal Pagify::NullPage.new(users.pager), users.next.next
28
+ end
29
+
30
+ def test_condition_chain
31
+ users_A = send(:User).all(:conditions => ['name = ?', 'A']).pagify :page => 1, :per_page => 1
32
+ assert_equal 1, users_A.size
33
+ assert_equal 2, users_A.pager.entries_count
34
+ assert_equal 2, users_A.pager.size # pages
35
+ end
36
+
37
+ def test_association_pagify
38
+ user = send(:User).first
39
+ user.pets.push(*send(:Pet).all)
40
+ assert user.save
41
+ assert_equal 3, user.pets.count
42
+
43
+ page = all_pets_with_name_godfat(user).pagify :page => 2, :per_page => 1
44
+ assert_equal 1, page.size
45
+ assert_equal 2, page.pager.size
46
+ end
47
+
48
+ def self.included test_case
49
+ test_case.module_eval do
50
+ # due to ruby const lookup is different from method lookup
51
+ def User; self.class.const_get(:User); end
52
+ def Pet; self.class.const_get(:Pet); end
53
+ end
54
+
55
+ test_case.const_get(:User).module_eval do
56
+ create :name => 'A'
57
+ create :name => 'A'
58
+ create :name => 'B'
59
+ end
60
+
61
+ test_case.const_get(:Pet).module_eval do
62
+ create :name => 'Qoo'
63
+ create :name => 'godfat'
64
+ create :name => 'godfat'
65
+ end
66
+ end
67
+
68
+ # include Extlib::Hook
69
+ #
70
+ # private
71
+ # def i_give_up
72
+ # if self.class == TestActiveRecord
73
+ # skip "it's toooooo hard to implement this for active record!! patch wanted!"
74
+ # end
75
+ # end
76
+ #
77
+ # [:test_same_pager_with_same_opts,
78
+ # :test_page_correctness,
79
+ # :test_condition_chain].each{ |test|
80
+ # before test.to_sym, :i_give_up
81
+ # }
82
+
83
+ end
@@ -0,0 +1,39 @@
1
+
2
+ class TestPagify < TestCase
3
+ def self.data; @data ||= (0..100).to_a; end
4
+ def for_pager pager
5
+ # assume data.size is 101, data is [0,1,2,3...]
6
+ pager.per_page = 10
7
+ assert_equal 11, pager.size
8
+
9
+ null_page = Pagify::NullPage.new(pager)
10
+
11
+ assert_equal null_page, pager[0]
12
+ assert_equal((0..9).to_a, pager.page(1).to_a)
13
+ assert_equal((10..19).to_a, pager[2].to_a)
14
+ assert_equal(20, pager.page(3).first)
15
+ assert_equal((90..99).to_a, pager[10].to_a)
16
+ assert_equal([100], pager.page(11).to_a)
17
+ assert_equal null_page, pager.page(12)
18
+
19
+ assert_equal(pager[1], pager[2].prev)
20
+ assert_equal(pager.page(11), pager[10].next)
21
+ assert_equal null_page, pager[1].prev
22
+ assert_equal Pagify::NullPage.new(pager), pager[10].next.next
23
+
24
+ assert_equal pager[4].data, pager[4].fetch
25
+ assert_equal(pager[1], pager.pages.first)
26
+ assert_equal(pager[2], pager.to_a[1])
27
+ assert_equal(5050, pager.inject(0){|r, i| r += i.inject(&:+) })
28
+
29
+ assert_equal 4, pager[4].page
30
+
31
+ assert_equal 10, pager[2].begin
32
+ assert_equal 19, pager[2].end
33
+ assert_equal 100, pager[11].end
34
+
35
+ pager.null_page = false
36
+
37
+ assert_nil pager[12]
38
+ end
39
+ end
@@ -0,0 +1,66 @@
1
+
2
+ require 'test/helper'
3
+ require 'test/helper_pagify'
4
+ require 'test/helper_model'
5
+
6
+ require 'pagify/active_record'
7
+
8
+ class TestActiveRecord < TestPagify
9
+ def test_for_active_record
10
+ for_pager Pagify::ActiveRecordPager.new(Topic)
11
+ end
12
+
13
+ class Topic
14
+ class << self
15
+ def count opts = {}
16
+ 101
17
+ end
18
+ def find all, opts = {}
19
+ TestPagify.data[opts[:offset], opts[:limit]]
20
+ end
21
+ end
22
+ end
23
+
24
+ DataMapper.setup(:active_record, 'sqlite3:tmp/active_record.sqlite3')
25
+
26
+ class UserForActiveRecord
27
+ include DataMapper::Resource
28
+ def self.default_repository_name
29
+ :active_record
30
+ end
31
+ property :id, Serial
32
+ property :name, String
33
+ storage_names[default_repository_name] = 'users'
34
+ auto_migrate!
35
+ end
36
+
37
+ class PetForActiveRecord
38
+ include DataMapper::Resource
39
+ def self.default_repository_name
40
+ :active_record
41
+ end
42
+ property :id, Serial
43
+ property :name, String
44
+ property :user_id, Integer, :nullable => true
45
+ storage_names[default_repository_name] = 'pets'
46
+ auto_migrate!
47
+ end
48
+
49
+ ActiveRecord::Base.establish_connection(
50
+ :adapter => 'sqlite3', :database => 'tmp/active_record.sqlite3')
51
+
52
+ class User < ActiveRecord::Base
53
+ has_many :pets
54
+ end
55
+
56
+ class Pet < ActiveRecord::Base
57
+ belongs_to :user
58
+ end
59
+
60
+ include SuiteForModel
61
+
62
+ def all_pets_with_name_godfat user
63
+ user.pets.all(:conditions => ['name = ?', 'godfat'])
64
+ end
65
+
66
+ end
@@ -0,0 +1,19 @@
1
+
2
+ require 'test/helper'
3
+ require 'test/helper_pagify'
4
+
5
+ class TestArray < TestPagify
6
+ def test_offset_bug
7
+ a = (0..9).to_a
8
+ pager = Pagify::ArrayPager.new a
9
+ pager.per_page = 5
10
+ assert_equal 5, pager[1].size
11
+ assert_equal 5, pager[2].size
12
+ assert_equal Pagify::NullPage.new(pager), pager[3]
13
+ end
14
+
15
+ def test_for_array
16
+ for_pager Pagify::ArrayPager.new(TestPagify.data)
17
+ end
18
+
19
+ end
@@ -0,0 +1,22 @@
1
+
2
+ require 'test/helper'
3
+ require 'test/helper_pagify'
4
+
5
+ class TestBasic < TestPagify
6
+ def test_basic
7
+ pager = Pagify::BasicPager.new(
8
+ :fetcher => lambda{ |offset, per_page|
9
+ # if for rails,
10
+ # Data.find :all, :offset => offset, :limit => per_page
11
+ TestPagify.data[offset, per_page]
12
+ },
13
+ :counter => lambda{
14
+ # if for rails,
15
+ # Data.count
16
+ TestPagify.data.size
17
+ })
18
+
19
+ for_pager pager
20
+ end
21
+
22
+ end
@@ -0,0 +1,56 @@
1
+
2
+ require 'test/helper'
3
+ require 'test/helper_pagify'
4
+ require 'test/helper_model'
5
+
6
+ require 'pagify/data_mapper'
7
+
8
+ class TestDataMapper < TestPagify
9
+ def test_for_data_mapper
10
+ for_pager Pagify::DataMapperPager.new(Topic)
11
+ end
12
+
13
+ class Topic
14
+ class << self
15
+ def count opts = {}
16
+ 101
17
+ end
18
+ def all opts = {}
19
+ TestPagify.data[opts[:offset], opts[:limit]]
20
+ end
21
+ def query
22
+ nil
23
+ end
24
+ private
25
+ def with_scope query
26
+ yield
27
+ end
28
+ end
29
+ end
30
+
31
+ DataMapper.setup(:default, 'sqlite3::memory:')
32
+
33
+ class User
34
+ include DataMapper::Resource
35
+ property :id, Serial
36
+ property :name, String
37
+ has n, :pets
38
+ end
39
+
40
+ class Pet
41
+ include DataMapper::Resource
42
+ property :id, Serial
43
+ property :name, String
44
+ belongs_to :user, :nullable => true
45
+ end
46
+
47
+ User.auto_migrate!
48
+ Pet.auto_migrate!
49
+
50
+ include SuiteForModel
51
+
52
+ def all_pets_with_name_godfat user
53
+ user.pets.all(:name => 'godfat')
54
+ end
55
+
56
+ end