pagify 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
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