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,21 @@
1
+
2
+ module Pagify
3
+ # array paginator would just simply assume your data is an array,
4
+ # and create pages simply for your_data[offset, per_page]
5
+ # if your data is much more complex, use Paginator instead of this
6
+ class ArrayPager < BasicPager
7
+ attr_reader :data
8
+
9
+ # data that you passed in this paginator
10
+ def initialize data, opts = {}
11
+ @data = data
12
+ super(opts.merge(
13
+ :fetcher => lambda{ |offset, per_page|
14
+ data[offset, per_page]
15
+ },
16
+ :counter => lambda{
17
+ data.size
18
+ }))
19
+ end
20
+ end # of ArrayPager
21
+ end # of Pagify
@@ -0,0 +1,114 @@
1
+
2
+ module Pagify
3
+ # pager is something help you paginate the data,
4
+ # through the fetcher and counter you pass in.
5
+ # e.g., for a array, the fetcher would be array[offset, per_page],
6
+ # the counter would be array.size. and for data mapper's resource,
7
+ # fetcher would be Model.all :offset => offset, :limit => per_page.
8
+ # see ArrayPager and DataMapperPager, ActiveRecordPager, etc.
9
+ # if you just simply need them or have a look at the source code
10
+ # for example usage for Pager.
11
+ class BasicPager
12
+ include Enumerable
13
+ attr_reader :fetcher, :counter
14
+ attr_accessor :opts
15
+
16
+ [:per_page, :null_page].each{ |attr|
17
+ define_method(attr) do
18
+ opts[attr]
19
+ end
20
+
21
+ define_method("#{attr}=") do |new_value|
22
+ opts[attr] = new_value
23
+ end
24
+ }
25
+
26
+ # fetcher is function that fetch the data,
27
+ # counter is function that count the data,
28
+ # null_page indicates that pager sohuld
29
+ # the default per_page is 20. you can reset per_page property later.
30
+ def initialize opts = {}
31
+ raise ArgumentError.new('missing fetcher and/or counter.') if
32
+ !opts[:fetcher] || !opts[:counter]
33
+
34
+ raise ArgumentError.new('fetcher or counter does not respond to call.') if
35
+ !opts[:fetcher].respond_to?(:call) || !opts[:counter].respond_to?(:call)
36
+
37
+ @opts = {}
38
+ @fetcher = opts[:fetcher]
39
+ @counter = opts[:counter]
40
+
41
+ self.per_page = opts[:per_page] || 20
42
+ self.null_page = opts[:null_page] || true
43
+ end
44
+
45
+ # if two paginators are equal, then the properties of
46
+ # per_page, fetcher, counter are all equal.
47
+ def == rhs
48
+ return false unless rhs
49
+ self.per_page == rhs.per_page and
50
+ self.fetcher == rhs.fetcher and
51
+ self.counter == rhs.counter
52
+ end
53
+
54
+ # for each page...
55
+ def each; 1.upto(size){ |i| yield page(i) }; end
56
+
57
+ # return all pages in an array
58
+ def to_a; map{ |e| e }; end
59
+ alias_method :pages, :to_a
60
+
61
+ def page_exists? page
62
+ page = normalize_page(page)
63
+ offset = (page - 1) * per_page
64
+ page > 0 && offset < entries_count
65
+ end
66
+
67
+ # create page instance by page number.
68
+ # if page number you specified was not existed,
69
+ # nil would be returned. note, page start at 1, not zero.
70
+ def page page
71
+ if page_exists?(page)
72
+ return BasicPage.new(self, normalize_page(page))
73
+
74
+ else
75
+ if null_page
76
+ return null_page_instance
77
+ else
78
+ return nil
79
+ end
80
+
81
+ end
82
+
83
+ end
84
+ alias_method :[], :page
85
+
86
+ # return the amount of pages
87
+ def size; (entries_count / per_page.to_f).ceil; end
88
+
89
+ # simply call @counter.call
90
+ def entries_count; counter.call; end
91
+
92
+ # get the offset property about the page.
93
+ # it is simply (page-1)*@per_page
94
+ def offset page
95
+ (normalize_page(page) - 1) * per_page
96
+ end
97
+
98
+ protected
99
+ def reject_pager_opts opts
100
+ opts.reject{ |key, value| [:per_page, :null_page].member?(key) }
101
+ end
102
+
103
+ # do nothing for basic pager
104
+ def normalize_page page
105
+ page
106
+ end
107
+
108
+ # return a null pager that stubs anything to 0
109
+ def null_page_instance
110
+ @null_page_instance ||= NullPage.new(self)
111
+ end
112
+
113
+ end # of BasicPager
114
+ end # of Pagify
@@ -0,0 +1,29 @@
1
+
2
+ # you'll need dm-core and dm-aggregates to use DataMapperPager
3
+
4
+ module Pagify
5
+
6
+ class DataMapperPager < BasicPager
7
+ include PageAcceptStringOrBlank
8
+ attr_reader :model
9
+
10
+ def initialize model_class, opts = {}, query = {}
11
+ @model = model_class
12
+ query ||= {}
13
+ query_opts = reject_pager_opts(opts)
14
+
15
+ super(opts.merge(
16
+ :fetcher => lambda{ |offset, per_page|
17
+ model.send :with_scope, query do
18
+ model.all(query_opts.merge(:offset => offset, :limit => per_page))
19
+ end
20
+ },
21
+ :counter => lambda{
22
+ model.send :with_scope, query do
23
+ model.count(query_opts)
24
+ end
25
+ }))
26
+ end
27
+
28
+ end # of DataMapperPager
29
+ end # of Pagify
@@ -0,0 +1,13 @@
1
+
2
+ module Pagify
3
+ module PageAcceptStringOrBlank
4
+ private
5
+ def normalize_page n
6
+ if n.blank?
7
+ n = 1
8
+ else
9
+ n = n.to_i
10
+ end
11
+ end
12
+ end # of PageAcceptStringOrBlank
13
+ end # of Pagify
@@ -0,0 +1,15 @@
1
+
2
+ module Pagify
3
+ # a null paginator that stubs any page into a null page.
4
+ class NullPager < BasicPager
5
+ include Singleton
6
+ def initialize
7
+ super(:fetcher => lambda{|*a|[]}, :counter => lambda{0})
8
+ end
9
+
10
+ private
11
+ def normalize_page n
12
+ 0
13
+ end
14
+ end # of NullPager
15
+ end # of Pagify
@@ -0,0 +1,10 @@
1
+
2
+ module Pagify
3
+ module Pagifier
4
+ def pagify opts = {}
5
+ opts = {:per_page => 20, :null_page => false, :page => 1}.merge(opts)
6
+ page = opts.delete(:page)
7
+ pagify_pager_create(self, opts).page(page)
8
+ end
9
+ end # of Pagifier
10
+ end # of Pagify
@@ -0,0 +1,11 @@
1
+
2
+ require 'pagify/pagifier/abstract'
3
+
4
+ [ActiveRecord::Base, ActiveRecord::Associations::AssociationCollection].each{ |klass|
5
+ klass.module_eval do
6
+ extend Pagify::Pagifier
7
+ def self.pagify_pager_create model, opts
8
+ Pagify::ActiveRecordPager.new model, opts
9
+ end
10
+ end
11
+ }
@@ -0,0 +1,9 @@
1
+
2
+ require 'pagify/pagifier/abstract'
3
+
4
+ class Array
5
+ include Pagify::Pagifier
6
+ def pagify_pager_create model, opts
7
+ Pagify::ArrayPager.new model, opts
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+
2
+ require 'pagify/pagifier/abstract'
3
+
4
+ module DataMapper
5
+ module Model
6
+ include Pagify::Pagifier
7
+ def pagify_pager_create model, opts
8
+ Pagify::DataMapperPager.new(model, opts, model.query)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,4 @@
1
+
2
+ module Pagify
3
+ VERSION = '0.6.1'
4
+ end
@@ -0,0 +1,43 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{pagify}
5
+ s.version = "0.6.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Lin Jen-Shin (aka godfat \347\234\237\345\270\270)"]
9
+ s.date = %q{2009-07-30}
10
+ s.description = %q{ Pagination tools for Array(or custom class), DataMapper and ActiveRecord}
11
+ s.email = %q{godfat (XD) godfat.org}
12
+ s.extra_rdoc_files = ["CHANGES", "LICENSE", "NOTICE", "README", "TODO", "pagify.gemspec"]
13
+ s.files = ["CHANGES", "LICENSE", "NOTICE", "README", "Rakefile", "TODO", "lib/pagify.rb", "lib/pagify/active_record.rb", "lib/pagify/array.rb", "lib/pagify/data_mapper.rb", "lib/pagify/helper/abstract.rb", "lib/pagify/helper/detail/setting.rb", "lib/pagify/helper/detail/setup.rb", "lib/pagify/helper/html.rb", "lib/pagify/helper/rails.rb", "lib/pagify/page/basic.rb", "lib/pagify/page/null.rb", "lib/pagify/pager/active_record.rb", "lib/pagify/pager/array.rb", "lib/pagify/pager/basic.rb", "lib/pagify/pager/data_mapper.rb", "lib/pagify/pager/detail/page_accept_string_or_blank.rb", "lib/pagify/pager/null.rb", "lib/pagify/pagifier/abstract.rb", "lib/pagify/pagifier/active_record.rb", "lib/pagify/pagifier/array.rb", "lib/pagify/pagifier/data_mapper.rb", "lib/pagify/version.rb", "pagify.gemspec", "spec/pagify_spec.rb", "spec/spec_helper.rb", "test/helper.rb", "test/helper_model.rb", "test/helper_pagify.rb", "test/test_active_record.rb", "test/test_array.rb", "test/test_basic.rb", "test/test_data_mapper.rb", "test/test_html.rb", "test/test_null.rb", "test/test_rails.rb"]
14
+ s.homepage = %q{http://github.com/godfat/pagify}
15
+ s.rdoc_options = ["--charset=utf-8", "--inline-source", "--line-numbers", "--promiscuous", "--main", "README"]
16
+ s.require_paths = ["lib"]
17
+ s.rubyforge_project = %q{ludy}
18
+ s.rubygems_version = %q{1.3.4}
19
+ s.summary = %q{Pagination tools for Array(or custom class), DataMapper and ActiveRecord}
20
+ s.test_files = ["test/test_active_record.rb", "test/test_array.rb", "test/test_basic.rb", "test/test_data_mapper.rb", "test/test_html.rb", "test/test_null.rb", "test/test_rails.rb"]
21
+
22
+ if s.respond_to? :specification_version then
23
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
24
+ s.specification_version = 3
25
+
26
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
27
+ s.add_development_dependency(%q<bones>, [">= 2.5.1"])
28
+ s.add_development_dependency(%q<dm-core>, [">= 0.9.9"])
29
+ s.add_development_dependency(%q<dm-aggregates>, [">= 0.9.9"])
30
+ s.add_development_dependency(%q<activerecord>, [">= 2.0.0"])
31
+ else
32
+ s.add_dependency(%q<bones>, [">= 2.5.1"])
33
+ s.add_dependency(%q<dm-core>, [">= 0.9.9"])
34
+ s.add_dependency(%q<dm-aggregates>, [">= 0.9.9"])
35
+ s.add_dependency(%q<activerecord>, [">= 2.0.0"])
36
+ end
37
+ else
38
+ s.add_dependency(%q<bones>, [">= 2.5.1"])
39
+ s.add_dependency(%q<dm-core>, [">= 0.9.9"])
40
+ s.add_dependency(%q<dm-aggregates>, [">= 0.9.9"])
41
+ s.add_dependency(%q<activerecord>, [">= 2.0.0"])
42
+ end
43
+ end
@@ -0,0 +1,8 @@
1
+ # $Id$
2
+
3
+ require File.join(File.dirname(__FILE__), %w[spec_helper])
4
+
5
+ describe Pagify do
6
+ end
7
+
8
+ # EOF
@@ -0,0 +1,17 @@
1
+ # $Id$
2
+
3
+ require File.expand_path(
4
+ File.join(File.dirname(__FILE__), %w[.. lib pagify]))
5
+
6
+ Spec::Runner.configure do |config|
7
+ # == Mock Framework
8
+ #
9
+ # RSpec uses it's own mocking framework by default. If you prefer to
10
+ # use mocha, flexmock or RR, uncomment the appropriate line:
11
+ #
12
+ # config.mock_with :mocha
13
+ # config.mock_with :flexmock
14
+ # config.mock_with :rr
15
+ end
16
+
17
+ # EOF
@@ -0,0 +1,80 @@
1
+
2
+ begin
3
+ require 'bones/smtp_tls'
4
+ rescue LoadError
5
+ require 'net/smtp'
6
+ end
7
+ require 'time'
8
+
9
+ namespace :ann do
10
+
11
+ # A prerequisites task that all other tasks depend upon
12
+ task :prereqs
13
+
14
+ file PROJ.ann.file do
15
+ ann = PROJ.ann
16
+ puts "Generating #{ann.file}"
17
+ File.open(ann.file,'w') do |fd|
18
+ fd.puts("#{PROJ.name} version #{PROJ.version}")
19
+ fd.puts(" by #{Array(PROJ.authors).first}") if PROJ.authors
20
+ fd.puts(" #{PROJ.url}") if PROJ.url.valid?
21
+ fd.puts(" (the \"#{PROJ.release_name}\" release)") if PROJ.release_name
22
+ fd.puts
23
+ fd.puts("== DESCRIPTION")
24
+ fd.puts
25
+ fd.puts(PROJ.description)
26
+ fd.puts
27
+ fd.puts(PROJ.changes.sub(%r/^.*$/, '== CHANGES'))
28
+ fd.puts
29
+ ann.paragraphs.each do |p|
30
+ fd.puts "== #{p.upcase}"
31
+ fd.puts
32
+ fd.puts paragraphs_of(PROJ.readme_file, p).join("\n\n")
33
+ fd.puts
34
+ end
35
+ fd.puts ann.text if ann.text
36
+ end
37
+ end
38
+
39
+ desc "Create an announcement file"
40
+ task :announcement => ['ann:prereqs', PROJ.ann.file]
41
+
42
+ desc "Send an email announcement"
43
+ task :email => ['ann:prereqs', PROJ.ann.file] do
44
+ ann = PROJ.ann
45
+ from = ann.email[:from] || Array(PROJ.authors).first || PROJ.email
46
+ to = Array(ann.email[:to])
47
+
48
+ ### build a mail header for RFC 822
49
+ rfc822msg = "From: #{from}\n"
50
+ rfc822msg << "To: #{to.join(',')}\n"
51
+ rfc822msg << "Subject: [ANN] #{PROJ.name} #{PROJ.version}"
52
+ rfc822msg << " (#{PROJ.release_name})" if PROJ.release_name
53
+ rfc822msg << "\n"
54
+ rfc822msg << "Date: #{Time.new.rfc822}\n"
55
+ rfc822msg << "Message-Id: "
56
+ rfc822msg << "<#{"%.8f" % Time.now.to_f}@#{ann.email[:domain]}>\n\n"
57
+ rfc822msg << File.read(ann.file)
58
+
59
+ params = [:server, :port, :domain, :acct, :passwd, :authtype].map do |key|
60
+ ann.email[key]
61
+ end
62
+
63
+ params[3] = PROJ.email if params[3].nil?
64
+
65
+ if params[4].nil?
66
+ STDOUT.write "Please enter your e-mail password (#{params[3]}): "
67
+ params[4] = STDIN.gets.chomp
68
+ end
69
+
70
+ ### send email
71
+ Net::SMTP.start(*params) {|smtp| smtp.sendmail(rfc822msg, from, to)}
72
+ end
73
+ end # namespace :ann
74
+
75
+ desc 'Alias to ann:announcement'
76
+ task :ann => 'ann:announcement'
77
+
78
+ CLOBBER << PROJ.ann.file
79
+
80
+ # EOF
@@ -0,0 +1,20 @@
1
+
2
+ if HAVE_BONES
3
+
4
+ namespace :bones do
5
+
6
+ desc 'Show the PROJ open struct'
7
+ task :debug do |t|
8
+ atr = if t.application.top_level_tasks.length == 2
9
+ t.application.top_level_tasks.pop
10
+ end
11
+
12
+ if atr then Bones::Debug.show_attr(PROJ, atr)
13
+ else Bones::Debug.show PROJ end
14
+ end
15
+
16
+ end # namespace :bones
17
+
18
+ end # HAVE_BONES
19
+
20
+ # EOF
@@ -0,0 +1,201 @@
1
+
2
+ require 'find'
3
+ require 'rake/packagetask'
4
+ require 'rubygems/user_interaction'
5
+ require 'rubygems/builder'
6
+
7
+ module Bones
8
+ class GemPackageTask < Rake::PackageTask
9
+ # Ruby GEM spec containing the metadata for this package. The
10
+ # name, version and package_files are automatically determined
11
+ # from the GEM spec and don't need to be explicitly provided.
12
+ #
13
+ attr_accessor :gem_spec
14
+
15
+ # Tasks from the Bones gem directory
16
+ attr_reader :bones_files
17
+
18
+ # Create a GEM Package task library. Automatically define the gem
19
+ # if a block is given. If no block is supplied, then +define+
20
+ # needs to be called to define the task.
21
+ #
22
+ def initialize(gem_spec)
23
+ init(gem_spec)
24
+ yield self if block_given?
25
+ define if block_given?
26
+ end
27
+
28
+ # Initialization tasks without the "yield self" or define
29
+ # operations.
30
+ #
31
+ def init(gem)
32
+ super(gem.name, gem.version)
33
+ @gem_spec = gem
34
+ @package_files += gem_spec.files if gem_spec.files
35
+ @bones_files = []
36
+
37
+ local_setup = File.join(Dir.pwd, %w[tasks setup.rb])
38
+ if !test(?e, local_setup)
39
+ Dir.glob(::Bones.path(%w[lib bones tasks *])).each {|fn| bones_files << fn}
40
+ end
41
+ end
42
+
43
+ # Create the Rake tasks and actions specified by this
44
+ # GemPackageTask. (+define+ is automatically called if a block is
45
+ # given to +new+).
46
+ #
47
+ def define
48
+ super
49
+ task :prereqs
50
+ task :package => ['gem:prereqs', "#{package_dir_path}/#{gem_file}"]
51
+ file "#{package_dir_path}/#{gem_file}" => [package_dir_path] + package_files + bones_files do
52
+ when_writing("Creating GEM") {
53
+ chdir(package_dir_path) do
54
+ Gem::Builder.new(gem_spec).build
55
+ verbose(true) {
56
+ mv gem_file, "../#{gem_file}"
57
+ }
58
+ end
59
+ }
60
+ end
61
+
62
+ file package_dir_path => bones_files do
63
+ mkdir_p package_dir rescue nil
64
+
65
+ gem_spec.files = (gem_spec.files +
66
+ bones_files.map {|fn| File.join('tasks', File.basename(fn))}).sort
67
+
68
+ bones_files.each do |fn|
69
+ base_fn = File.join('tasks', File.basename(fn))
70
+ f = File.join(package_dir_path, base_fn)
71
+ fdir = File.dirname(f)
72
+ mkdir_p(fdir) if !File.exist?(fdir)
73
+ if File.directory?(fn)
74
+ mkdir_p(f)
75
+ else
76
+ raise "file name conflict for '#{base_fn}' (conflicts with '#{fn}')" if test(?e, f)
77
+ safe_ln(fn, f)
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ def gem_file
84
+ if @gem_spec.platform == Gem::Platform::RUBY
85
+ "#{package_name}.gem"
86
+ else
87
+ "#{package_name}-#{@gem_spec.platform}.gem"
88
+ end
89
+ end
90
+ end # class GemPackageTask
91
+ end # module Bones
92
+
93
+ namespace :gem do
94
+
95
+ PROJ.gem._spec = Gem::Specification.new do |s|
96
+ s.name = PROJ.name
97
+ s.version = PROJ.version
98
+ s.summary = PROJ.summary
99
+ s.authors = Array(PROJ.authors)
100
+ s.email = PROJ.email
101
+ s.homepage = Array(PROJ.url).first
102
+ s.rubyforge_project = PROJ.rubyforge.name
103
+
104
+ s.description = PROJ.description
105
+
106
+ PROJ.gem.dependencies.each do |dep|
107
+ s.add_dependency(*dep)
108
+ end
109
+
110
+ PROJ.gem.development_dependencies.each do |dep|
111
+ s.add_development_dependency(*dep)
112
+ end
113
+
114
+ s.files = PROJ.gem.files
115
+ s.executables = PROJ.gem.executables.map {|fn| File.basename(fn)}
116
+ s.extensions = PROJ.gem.files.grep %r/extconf\.rb$/
117
+
118
+ s.bindir = 'bin'
119
+ dirs = Dir["{#{PROJ.libs.join(',')}}"]
120
+ s.require_paths = dirs unless dirs.empty?
121
+
122
+ incl = Regexp.new(PROJ.rdoc.include.join('|'))
123
+ excl = PROJ.rdoc.exclude.dup.concat %w[\.rb$ ^(\.\/|\/)?ext]
124
+ excl = Regexp.new(excl.join('|'))
125
+ rdoc_files = PROJ.gem.files.find_all do |fn|
126
+ case fn
127
+ when excl; false
128
+ when incl; true
129
+ else false end
130
+ end
131
+ s.rdoc_options = PROJ.rdoc.opts + ['--main', PROJ.rdoc.main]
132
+ s.extra_rdoc_files = rdoc_files
133
+ s.has_rdoc = true
134
+
135
+ if test ?f, PROJ.test.file
136
+ s.test_file = PROJ.test.file
137
+ else
138
+ s.test_files = PROJ.test.files.to_a
139
+ end
140
+
141
+ # Do any extra stuff the user wants
142
+ PROJ.gem.extras.each do |msg, val|
143
+ case val
144
+ when Proc
145
+ val.call(s.send(msg))
146
+ else
147
+ s.send "#{msg}=", val
148
+ end
149
+ end
150
+ end # Gem::Specification.new
151
+
152
+ Bones::GemPackageTask.new(PROJ.gem._spec) do |pkg|
153
+ pkg.need_tar = PROJ.gem.need_tar
154
+ pkg.need_zip = PROJ.gem.need_zip
155
+ end
156
+
157
+ desc 'Show information about the gem'
158
+ task :debug => 'gem:prereqs' do
159
+ puts PROJ.gem._spec.to_ruby
160
+ end
161
+
162
+ desc 'Write the gemspec '
163
+ task :spec => 'gem:prereqs' do
164
+ File.open("#{PROJ.name}.gemspec", 'w') do |f|
165
+ f.write PROJ.gem._spec.to_ruby
166
+ end
167
+ end
168
+
169
+ desc 'Install the gem'
170
+ task :install => [:clobber, 'gem:package'] do
171
+ sh "#{SUDO} #{GEM} install --local pkg/#{PROJ.gem._spec.full_name}"
172
+
173
+ # use this version of the command for rubygems > 1.0.0
174
+ #sh "#{SUDO} #{GEM} install --no-update-sources pkg/#{PROJ.gem._spec.full_name}"
175
+ end
176
+
177
+ desc 'Uninstall the gem'
178
+ task :uninstall do
179
+ installed_list = Gem.source_index.find_name(PROJ.name)
180
+ if installed_list and installed_list.collect { |s| s.version.to_s}.include?(PROJ.version) then
181
+ sh "#{SUDO} #{GEM} uninstall --version '#{PROJ.version}' --ignore-dependencies --executables #{PROJ.name}"
182
+ end
183
+ end
184
+
185
+ desc 'Reinstall the gem'
186
+ task :reinstall => [:uninstall, :install]
187
+
188
+ desc 'Cleanup the gem'
189
+ task :cleanup do
190
+ sh "#{SUDO} #{GEM} cleanup #{PROJ.gem._spec.name}"
191
+ end
192
+ end # namespace :gem
193
+
194
+
195
+ desc 'Alias to gem:package'
196
+ task :gem => 'gem:package'
197
+
198
+ task :clobber => 'gem:clobber_package'
199
+ remove_desc_for_task 'gem:clobber_package'
200
+
201
+ # EOF