will_paginate 3.0.pre2 → 3.0.pre4

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.

Potentially problematic release.


This version of will_paginate might be problematic. Click here for more details.

data/README.rdoc CHANGED
@@ -31,23 +31,9 @@ them mixed in.
31
31
 
32
32
  == Installation
33
33
 
34
- The recommended way is that you get the gem hosted on {gems.github.com}[http://gems.github.com/]:
34
+ In your Gemfile (if using Bundler):
35
35
 
36
- gem install mislav-will_paginate
37
-
38
- In <b>Rails 2.1</b>, add a gem dependency:
39
-
40
- # for Rails 2.1 and newer
41
- config.gem 'mislav-will_paginate', :lib => 'will_paginate', :version => '~> 3.0'
42
-
43
- If you're using Rails 2.0 or older, or any other Ruby framework, just add a simple require to a file
44
- that initializes your application. For example, in Rails you would put this at the end of
45
- "config/environment.rb".
46
-
47
- gem 'mislav-will_paginate', '~> 3.0'
48
- require 'will_paginate'
49
-
50
- That's it. Remember to install the gem on <strong>all</strong> machines that you are deploying to.
36
+ gem 'will_paginate', '~> 3.0.beta'
51
37
 
52
38
  <i>There are extensive {installation
53
39
  instructions}[http://github.com/mislav/will_paginate/wikis/installation] on {the
data/Rakefile CHANGED
@@ -1,10 +1,20 @@
1
1
  require 'rake/rdoctask'
2
+ require 'rspec/core/rake_task'
2
3
 
3
- load 'spec/tasks.rake'
4
-
5
- desc 'Default: run specs.'
6
4
  task :default => :spec
7
5
 
6
+ desc 'Run ALL OF the specs'
7
+ RSpec::Core::RakeTask.new(:spec) do |t|
8
+ # t.ruby_opts = '-w'
9
+ end
10
+
11
+ namespace :spec do
12
+ desc "Run Rails specs"
13
+ RSpec::Core::RakeTask.new(:rails) do |t|
14
+ t.pattern = %w'spec/finders/active_record_spec.rb spec/view_helpers/action_view_spec.rb'
15
+ end
16
+ end
17
+
8
18
  desc 'Generate RDoc documentation for the will_paginate plugin.'
9
19
  Rake::RDocTask.new(:rdoc) do |rdoc|
10
20
  rdoc.rdoc_files.include('README.rdoc', 'LICENSE', 'CHANGELOG.rdoc').
@@ -1,20 +1,9 @@
1
1
  require 'set'
2
2
  require 'will_paginate/array'
3
3
 
4
- # helper to check for method existance in ruby 1.8- and 1.9-compatible way
5
- # because `methods`, `instance_methods` and others return strings in 1.8 and symbols in 1.9
6
- #
7
- # ['foo', 'bar'].include_method?(:foo) # => true
8
- class Array
9
- def include_method?(name)
10
- name = name.to_sym
11
- !!(find { |item| item.to_sym == name })
12
- end
13
- end
14
-
15
- ## everything below copied from ActiveSupport so we don't depend on it ##
4
+ # copied from ActiveSupport so we don't depend on it
16
5
 
17
- unless Hash.instance_methods.include_method? :except
6
+ unless Hash.method_defined? :except
18
7
  Hash.class_eval do
19
8
  # Returns a new hash without the given keys.
20
9
  def except(*keys)
@@ -29,7 +18,7 @@ unless Hash.instance_methods.include_method? :except
29
18
  end
30
19
  end
31
20
 
32
- unless Hash.instance_methods.include_method? :slice
21
+ unless Hash.method_defined? :slice
33
22
  Hash.class_eval do
34
23
  # Returns a new hash with only the given keys.
35
24
  def slice(*keys)
@@ -44,7 +33,7 @@ unless Hash.instance_methods.include_method? :slice
44
33
  end
45
34
  end
46
35
 
47
- unless String.instance_methods.include_method? :constantize
36
+ unless String.method_defined? :constantize
48
37
  String.class_eval do
49
38
  def constantize
50
39
  unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ =~ self
@@ -56,7 +45,7 @@ unless String.instance_methods.include_method? :constantize
56
45
  end
57
46
  end
58
47
 
59
- unless String.instance_methods.include_method? :underscore
48
+ unless String.method_defined? :underscore
60
49
  String.class_eval do
61
50
  def underscore
62
51
  self.to_s.gsub(/::/, '/').
@@ -5,154 +5,163 @@ module WillPaginate::Finders
5
5
  # = Paginating finders for ActiveRecord models
6
6
  #
7
7
  # WillPaginate adds +paginate+, +per_page+ and other methods to
8
- # ActiveRecord::Base class methods and associations. It also hooks into
9
- # +method_missing+ to intercept pagination calls to dynamic finders such as
10
- # +paginate_by_user_id+ and translate them to ordinary finders
11
- # (+find_all_by_user_id+ in this case).
8
+ # ActiveRecord::Base class methods and associations.
12
9
  #
13
10
  # In short, paginating finders are equivalent to ActiveRecord finders; the
14
11
  # only difference is that we start with "paginate" instead of "find" and
15
12
  # that <tt>:page</tt> is required parameter:
16
13
  #
17
14
  # @posts = Post.paginate :all, :page => params[:page], :order => 'created_at DESC'
18
- #
19
- # In paginating finders, "all" is implicit. There is no sense in paginating
20
- # a single record, right? So, you can drop the <tt>:all</tt> argument:
21
- #
22
- # Post.paginate(...) => Post.find :all
23
- # Post.paginate_all_by_something => Post.find_all_by_something
24
- # Post.paginate_by_something => Post.find_all_by_something
25
15
  #
26
16
  module ActiveRecord
27
- include WillPaginate::Finders::Base
28
-
29
17
  # In Rails, this is automatically called to mix-in pagination functionality to ActiveRecord.
30
18
  def self.enable!
31
- ::ActiveRecord::Base.class_eval do
32
- extend ActiveRecord
19
+ ::ActiveRecord::Base.extend Base
20
+ ::ActiveRecord::Base.extend ActiveRecord::Pagination
21
+ ::ActiveRecord::Base.extend ActiveRecord::BaseMethods
22
+
23
+ klasses = [::ActiveRecord::Relation]
24
+ if defined? ::ActiveRecord::Associations::CollectionProxy
25
+ klasses << ::ActiveRecord::Associations::CollectionProxy
26
+ else
27
+ klasses << ::ActiveRecord::Associations::AssociationCollection
33
28
  end
34
29
 
35
30
  # support pagination on associations and scopes
36
- [::ActiveRecord::Relation, ::ActiveRecord::Associations::AssociationCollection].each do |klass|
37
- klass.send(:include, ActiveRecord)
38
- end
31
+ klasses.each { |klass| klass.send(:include, ActiveRecord::Pagination) }
39
32
  end
40
-
41
- # Wraps +find_by_sql+ by simply adding LIMIT and OFFSET to your SQL string
42
- # based on the params otherwise used by paginating finds: +page+ and
43
- # +per_page+.
44
- #
45
- # Example:
46
- #
47
- # @developers = Developer.paginate_by_sql ['select * from developers where salary > ?', 80000],
48
- # :page => params[:page], :per_page => 3
49
- #
50
- # A query for counting rows will automatically be generated if you don't
51
- # supply <tt>:total_entries</tt>. If you experience problems with this
52
- # generated SQL, you might want to perform the count manually in your
53
- # application.
54
- #
55
- def paginate_by_sql(sql, options)
56
- WillPaginate::Collection.create(*wp_parse_options(options)) do |pager|
57
- query = sanitize_sql(sql.dup)
58
- original_query = query.dup
59
- # add limit, offset
60
- query << " LIMIT #{pager.per_page} OFFSET #{pager.offset}"
61
- # perfom the find
62
- pager.replace find_by_sql(query)
63
-
64
- unless pager.total_entries
65
- count_query = original_query.sub /\bORDER\s+BY\s+[\w`,\s]+$/mi, ''
66
- count_query = "SELECT COUNT(*) FROM (#{count_query})"
67
-
68
- unless ['oracle', 'oci'].include?(self.connection.adapter_name.downcase)
69
- count_query << ' AS count_table'
70
- end
71
- # perform the count query
72
- pager.total_entries = count_by_sql(count_query)
33
+
34
+ # makes a Relation look like WillPaginate::Collection
35
+ module RelationMethods
36
+ attr_accessor :current_page
37
+ attr_writer :total_entries, :wp_count_options
38
+
39
+ def per_page(value = nil)
40
+ if value.nil? then limit_value
41
+ else limit(value)
73
42
  end
74
43
  end
75
- end
76
44
 
77
- protected
45
+ # TODO: solve with less relation clones and code dups
46
+ def limit(num)
47
+ rel = super
48
+ if rel.current_page
49
+ rel.offset((rel.current_page-1) * rel.limit_value)
50
+ else
51
+ rel
52
+ end
53
+ end
78
54
 
79
- def wp_query(options, pager, args, &block) #:nodoc:
80
- finder = (options.delete(:finder) || 'find').to_s
81
- find_options = options.except(:count).update(:offset => pager.offset, :limit => pager.per_page)
55
+ def offset(value = nil)
56
+ if value.nil? then offset_value
57
+ else super(value)
58
+ end
59
+ end
82
60
 
83
- if finder == 'find'
84
- if Array === args.first and !pager.total_entries
85
- pager.total_entries = args.first.size
61
+ def total_entries
62
+ @total_entries ||= begin
63
+ if loaded? and size < limit_value and (current_page == 1 or size > 0)
64
+ offset_value + size
65
+ else
66
+ excluded = [:order, :limit, :offset]
67
+ excluded << :includes unless eager_loading?
68
+ rel = self.except(*excluded)
69
+ # TODO: hack. decide whether to keep
70
+ rel = rel.apply_finder_options(@wp_count_options) if defined? @wp_count_options
71
+ rel.count
72
+ end
86
73
  end
87
- args << :all if args.empty?
88
74
  end
89
-
90
- args << find_options
91
- pager.replace send(finder, *args, &block)
92
-
93
- unless pager.total_entries
94
- # magic counting
95
- pager.total_entries = wp_count(options, args, finder)
75
+
76
+ # workaround for Active Record 3.0
77
+ def size
78
+ if !loaded? and limit_value
79
+ [super, limit_value].min
80
+ else
81
+ super
82
+ end
83
+ end
84
+
85
+ def total_pages
86
+ (total_entries / limit_value.to_f).ceil
87
+ end
88
+
89
+ def clone
90
+ other = super
91
+ other.current_page = current_page unless other.current_page
92
+ other.total_entries = nil
93
+ other
94
+ end
95
+
96
+ def to_a
97
+ if current_page.nil? then super # workaround for Active Record 3.0
98
+ else
99
+ ::WillPaginate::Collection.create(current_page, limit_value) do |col|
100
+ col.replace super
101
+ col.total_entries ||= total_entries
102
+ end
103
+ end
96
104
  end
97
105
  end
98
106
 
99
- # Does the not-so-trivial job of finding out the total number of entries
100
- # in the database. It relies on the ActiveRecord +count+ method.
101
- def wp_count(options, args, finder) #:nodoc:
102
- # find out if we are in a model or an association proxy
103
- klass = (@owner and @reflection) ? @reflection.klass : self
104
- count_options = wp_parse_count_options(options, klass)
105
-
106
- # we may have to scope ...
107
- counter = Proc.new { count(count_options) }
108
-
109
- count = if finder.index('find_') == 0 and klass.respond_to?(scoper = finder.sub('find', 'with'))
110
- # scope_out adds a 'with_finder' method which acts like with_scope, if it's present
111
- # then execute the count with the scoping provided by the with_finder
112
- send(scoper, &counter)
113
- elsif finder =~ /^find_(all_by|by)_([_a-zA-Z]\w*)$/
114
- # extract conditions from calls like "paginate_by_foo_and_bar"
115
- attribute_names = $2.split('_and_')
116
- conditions = construct_attributes_from_arguments(attribute_names, args)
117
- with_scope(:find => { :conditions => conditions }, &counter)
118
- else
119
- counter.call
120
- end
121
-
122
- count.respond_to?(:length) ? count.length : count
107
+ module Pagination
108
+ def paginate(options)
109
+ pagenum, per_page, total = wp_parse_options(options)
110
+ count_options = options[:count]
111
+ options = options.except(:page, :per_page, :total_entries, :count)
112
+ rel = limit(per_page).page(pagenum)
113
+ rel = rel.apply_finder_options(options) if options.any?
114
+ rel.wp_count_options = count_options if count_options
115
+ rel
116
+ end
117
+
118
+ def page(num)
119
+ pagenum = num.nil? ? 1 : num.to_i
120
+ raise ::WillPaginate::InvalidPage, num, pagenum if pagenum < 1
121
+ rel = scoped.extending(RelationMethods)
122
+ rel = rel.offset((pagenum-1) * (rel.limit_value || per_page))
123
+ rel = rel.limit(per_page) unless rel.limit_value
124
+ rel.current_page = pagenum
125
+ rel
126
+ end
123
127
  end
124
-
125
- def wp_parse_count_options(options, klass) #:nodoc:
126
- excludees = [:count, :order, :limit, :offset, :readonly]
127
-
128
- # Use :select from scope if it isn't already present.
129
- # FIXME: this triggers extra queries when going through associations
130
- # if options[:select].blank? && current_scoped_methods && current_scoped_methods.select_values.present?
131
- # options[:select] = current_scoped_methods.select_values.join(", ")
132
- # end
133
-
134
- if options[:select] and options[:select] =~ /^\s*DISTINCT\b/i
135
- # Remove quoting and check for table_name.*-like statement.
136
- if options[:select].gsub('`', '') =~ /\w+\.\*/
137
- options[:select] = "DISTINCT #{klass.table_name}.#{klass.primary_key}"
128
+
129
+ module BaseMethods
130
+ # Wraps +find_by_sql+ by simply adding LIMIT and OFFSET to your SQL string
131
+ # based on the params otherwise used by paginating finds: +page+ and
132
+ # +per_page+.
133
+ #
134
+ # Example:
135
+ #
136
+ # @developers = Developer.paginate_by_sql ['select * from developers where salary > ?', 80000],
137
+ # :page => params[:page], :per_page => 3
138
+ #
139
+ # A query for counting rows will automatically be generated if you don't
140
+ # supply <tt>:total_entries</tt>. If you experience problems with this
141
+ # generated SQL, you might want to perform the count manually in your
142
+ # application.
143
+ #
144
+ def paginate_by_sql(sql, options)
145
+ WillPaginate::Collection.create(*wp_parse_options(options)) do |pager|
146
+ query = sanitize_sql(sql.dup)
147
+ original_query = query.dup
148
+ # add limit, offset
149
+ query << " LIMIT #{pager.per_page} OFFSET #{pager.offset}"
150
+ # perfom the find
151
+ pager.replace find_by_sql(query)
152
+
153
+ unless pager.total_entries
154
+ count_query = original_query.sub /\bORDER\s+BY\s+[\w`,\s]+$/mi, ''
155
+ count_query = "SELECT COUNT(*) FROM (#{count_query})"
156
+
157
+ unless self.connection.adapter_name =~ /^(oracle|oci$)/i
158
+ count_query << ' AS count_table'
159
+ end
160
+ # perform the count query
161
+ pager.total_entries = count_by_sql(count_query)
162
+ end
138
163
  end
139
- else
140
- excludees << :select
141
- end
142
-
143
- # count expects (almost) the same options as find
144
- count_options = options.except *excludees
145
-
146
- # merge the hash found in :count
147
- # this allows you to specify :select, :order, or anything else just for the count query
148
- count_options.update options[:count] if options[:count]
149
-
150
- # forget about includes if they are irrelevant when counting
151
- if count_options[:include] and count_options[:conditions].blank? and count_options[:group].blank?
152
- count_options.delete :include
153
164
  end
154
-
155
- count_options
156
165
  end
157
166
  end
158
167
  end
@@ -3,22 +3,20 @@ require 'will_paginate/collection'
3
3
 
4
4
  module WillPaginate
5
5
  class Railtie < Rails::Railtie
6
- initializer "will_paginate.active_record" do |app|
7
- if defined? ::ActiveRecord
6
+ initializer "will_paginate" do |app|
7
+ ActiveSupport.on_load :active_record do
8
8
  require 'will_paginate/finders/active_record'
9
9
  WillPaginate::Finders::ActiveRecord.enable!
10
10
  end
11
- end
12
-
13
- initializer "will_paginate.action_dispatch" do |app|
14
- if defined? ::ActionDispatch::ShowExceptions
11
+
12
+ ActiveSupport.on_load :action_controller do
15
13
  ActionDispatch::ShowExceptions.rescue_responses['WillPaginate::InvalidPage'] = :not_found
16
14
  end
17
- end
18
-
19
- initializer "will_paginate.action_view" do |app|
20
- require 'will_paginate/view_helpers/action_view'
21
- ActionView::Base.send(:include, WillPaginate::ViewHelpers::ActionView)
15
+
16
+ ActiveSupport.on_load :action_view do
17
+ require 'will_paginate/view_helpers/action_view'
18
+ include WillPaginate::ViewHelpers::ActionView
19
+ end
22
20
  end
23
21
  end
24
22
  end
@@ -2,7 +2,7 @@ module WillPaginate #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 3
4
4
  MINOR = 0
5
- TINY = 'pre2'
5
+ TINY = 'pre4'
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -1,6 +1,4 @@
1
1
  require 'will_paginate/view_helpers/base'
2
- require 'action_view'
3
- require 'action_pack/version'
4
2
  require 'will_paginate/view_helpers/link_renderer'
5
3
 
6
4
  module WillPaginate
@@ -63,8 +61,12 @@ module WillPaginate
63
61
  # apply. Don't use the <tt>:id</tt> option; otherwise you'll finish with two
64
62
  # blocks of pagination links sharing the same ID (which is invalid HTML).
65
63
  def paginated_section(*args, &block)
66
- pagination = will_paginate(*args).to_s
67
- pagination + capture(&block) + pagination
64
+ pagination = will_paginate(*args)
65
+ if pagination
66
+ pagination + capture(&block) + pagination
67
+ else
68
+ capture(&block)
69
+ end
68
70
  end
69
71
 
70
72
  protected
@@ -86,7 +88,7 @@ WillPaginate::ViewHelpers::LinkRenderer.class_eval do
86
88
  protected
87
89
 
88
90
  def default_url_params
89
- { :escape => false }
91
+ {}
90
92
  end
91
93
 
92
94
  def url(page)
@@ -131,4 +133,4 @@ WillPaginate::ViewHelpers::LinkRenderer.class_eval do
131
133
  def parse_query_parameters(params)
132
134
  Rack::Utils.parse_nested_query(params)
133
135
  end
134
- end
136
+ end
@@ -59,11 +59,13 @@ module WillPaginate
59
59
  end
60
60
 
61
61
  def previous_page
62
- previous_or_next_page(@collection.previous_page, @options[:previous_label], 'previous_page')
62
+ num = @collection.current_page > 1 && @collection.current_page - 1
63
+ previous_or_next_page(num, @options[:previous_label], 'previous_page')
63
64
  end
64
65
 
65
66
  def next_page
66
- previous_or_next_page(@collection.next_page, @options[:next_label], 'next_page')
67
+ num = @collection.current_page < @collection.total_pages && @collection.current_page + 1
68
+ previous_or_next_page(num, @options[:next_label], 'next_page')
67
69
  end
68
70
 
69
71
  def previous_or_next_page(page, text, classname)
@@ -107,8 +109,8 @@ module WillPaginate
107
109
 
108
110
  def rel_value(page)
109
111
  case page
110
- when @collection.previous_page; 'prev' + (page == 1 ? ' start' : '')
111
- when @collection.next_page; 'next'
112
+ when @collection.current_page - 1; 'prev' + (page == 1 ? ' start' : '')
113
+ when @collection.current_page + 1; 'next'
112
114
  when 1; 'start'
113
115
  end
114
116
  end
data/spec/console CHANGED
@@ -1,8 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
  irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
3
- libs = []
4
-
5
- libs << 'irb/completion'
6
- libs << 'console_fixtures'
7
-
8
- exec "#{irb} -Ilib:spec#{libs.map{ |l| " -r #{l}" }.join} --simple-prompt"
3
+ opts = %w[--simple-prompt -rirb/completion -rconsole_fixtures]
4
+ exec 'bundle', 'exec', irb, '-Ilib:spec', *opts
@@ -1,8 +1,30 @@
1
+ require 'bundler'
2
+ Bundler.setup
3
+
1
4
  require 'will_paginate/finders/active_record'
2
5
  require 'finders/activerecord_test_connector'
6
+
3
7
  ActiverecordTestConnector.setup
4
8
 
9
+ windows = RUBY_PLATFORM =~ /(:?mswin|mingw)/
10
+ # used just for the `color` method
11
+ log_subscriber = ActiveSupport::LogSubscriber.log_subscribers.first
12
+
13
+ IGNORE_SQL = /\b(sqlite_master|sqlite_version)\b|^(CREATE TABLE|PRAGMA)\b/
14
+
15
+ ActiveSupport::Notifications.subscribe(/^sql\./) do |*args|
16
+ data = args.last
17
+ unless data[:name] =~ /^Fixture/ or data[:sql] =~ IGNORE_SQL
18
+ if windows
19
+ puts data[:sql]
20
+ else
21
+ puts log_subscriber.send(:color, data[:sql], :cyan)
22
+ end
23
+ end
24
+ end
25
+
5
26
  # load all fixtures
6
- Fixtures.create_fixtures(ActiverecordTestConnector::FIXTURES_PATH, ActiveRecord::Base.connection.tables)
27
+ ActiverecordTestConnector::Fixtures.create_fixtures \
28
+ ActiverecordTestConnector::FIXTURES_PATH, ActiveRecord::Base.connection.tables
7
29
 
8
- ActiverecordTestConnector.show_sql
30
+ WillPaginate::Finders::ActiveRecord.enable!
@@ -17,7 +17,7 @@ describe WillPaginate::Finders::ActiveRecord do
17
17
 
18
18
  it "should paginate" do
19
19
  lambda {
20
- users = User.paginate(:page => 1, :per_page => 5)
20
+ users = User.paginate(:page => 1, :per_page => 5).to_a
21
21
  users.length.should == 5
22
22
  }.should run_queries(2)
23
23
  end
@@ -28,6 +28,58 @@ describe WillPaginate::Finders::ActiveRecord do
28
28
  }.should raise_error(ArgumentError)
29
29
  end
30
30
 
31
+ describe "relation" do
32
+ it "should return a relation" do
33
+ rel = nil
34
+ lambda {
35
+ rel = Developer.paginate(:page => 1)
36
+ rel.per_page.should == 10
37
+ rel.current_page.should == 1
38
+ }.should run_queries(0)
39
+
40
+ lambda {
41
+ rel.total_pages.should == 2
42
+ }.should run_queries(1)
43
+ end
44
+
45
+ it "should keep per-class per_page number" do
46
+ rel = Developer.order('id').paginate(:page => 1)
47
+ rel.per_page.should == 10
48
+ end
49
+
50
+ it "should be able to change per_page number" do
51
+ rel = Developer.order('id').paginate(:page => 1).limit(5)
52
+ rel.per_page.should == 5
53
+ end
54
+
55
+ it "supports the page() method" do
56
+ rel = Developer.page('1').order('id')
57
+ rel.current_page.should == 1
58
+ rel.per_page.should == 10
59
+ rel.offset.should == 0
60
+
61
+ rel = rel.limit(5).page(2)
62
+ rel.per_page.should == 5
63
+ rel.offset.should == 5
64
+ end
65
+
66
+ it "raises on invalid page number" do
67
+ lambda {
68
+ Developer.page('foo')
69
+ }.should raise_error(ArgumentError)
70
+ end
71
+
72
+ it "supports first limit() then page()" do
73
+ rel = Developer.limit(3).page(3)
74
+ rel.offset.should == 6
75
+ end
76
+
77
+ it "supports first page() then limit()" do
78
+ rel = Developer.page(3).limit(3)
79
+ rel.offset.should == 6
80
+ end
81
+ end
82
+
31
83
  describe "counting" do
32
84
  it "should not accept :count parameter" do
33
85
  pending
@@ -111,6 +163,7 @@ describe WillPaginate::Finders::ActiveRecord do
111
163
  it "should get first page of Topics with a single query" do
112
164
  lambda {
113
165
  result = Topic.paginate :page => nil
166
+ result.to_a # trigger loading of records
114
167
  result.current_page.should == 1
115
168
  result.total_pages.should == 1
116
169
  result.size.should == 4
@@ -156,11 +209,8 @@ describe WillPaginate::Finders::ActiveRecord do
156
209
  it "should paginate with :include and :order" do
157
210
  result = nil
158
211
  lambda {
159
- result = Topic.paginate \
160
- :page => 1,
161
- :include => :replies,
162
- :order => 'replies.created_at asc, topics.created_at asc',
163
- :per_page => 10
212
+ result = Topic.paginate(:page => 1, :include => :replies, :per_page => 10,
213
+ :order => 'replies.created_at asc, topics.created_at asc').to_a
164
214
  }.should run_queries(2)
165
215
 
166
216
  expected = Topic.find :all,
@@ -174,17 +224,19 @@ describe WillPaginate::Finders::ActiveRecord do
174
224
 
175
225
  it "should remove :include for count" do
176
226
  lambda {
177
- Developer.paginate :page => 1, :per_page => 1, :include => :projects
178
- $query_sql.last.should_not include(' JOIN ')
179
- }.should run_queries(4)
227
+ Developer.paginate(:page => 1, :per_page => 1, :include => :projects).to_a
228
+ $query_sql.last.should_not =~ /\bJOIN\b/
229
+ }.should run_queries(3..4)
180
230
  end
181
231
 
182
232
  it "should keep :include for count when they are referenced in :conditions" do
183
- Developer.expects(:find).returns([1])
184
- Developer.expects(:count).with({ :include => :projects, :conditions => 'projects.id > 2' }).returns(0)
233
+ Developer.paginate(
234
+ :page => 1, :per_page => 1,
235
+ :include => :projects,
236
+ :conditions => 'projects.id > 2'
237
+ ).to_a
185
238
 
186
- Developer.paginate :page => 1, :per_page => 1,
187
- :include => :projects, :conditions => 'projects.id > 2'
239
+ $query_sql.last.should =~ /\bJOIN\b/
188
240
  end
189
241
 
190
242
  describe "associations" do
@@ -199,7 +251,7 @@ describe WillPaginate::Finders::ActiveRecord do
199
251
 
200
252
  expected = Topic.find :all,
201
253
  :include => 'replies',
202
- :conditions => ["project_id = #{project.id} AND replies.content LIKE ?", 'Nice%'],
254
+ :conditions => ["project_id = ? AND replies.content LIKE ?", project.id, 'Nice%'],
203
255
  :limit => 10
204
256
 
205
257
  result.should == expected
@@ -218,7 +270,7 @@ describe WillPaginate::Finders::ActiveRecord do
218
270
  }.should run_queries(2)
219
271
 
220
272
  # with explicit order
221
- result = dhh.projects.paginate(:page => 1, :order => 'projects.id')
273
+ result = dhh.projects.paginate(:page => 1).reorder('projects.id')
222
274
  result.should == expected_id_ordered
223
275
  result.total_entries.should == 2
224
276
 
@@ -226,7 +278,7 @@ describe WillPaginate::Finders::ActiveRecord do
226
278
  dhh.projects.find(:all, :order => 'projects.id', :limit => 4)
227
279
  }.should_not raise_error
228
280
 
229
- result = dhh.projects.paginate(:page => 1, :order => 'projects.id', :per_page => 4)
281
+ result = dhh.projects.paginate(:page => 1, :per_page => 4).reorder('projects.id')
230
282
  result.should == expected_id_ordered
231
283
 
232
284
  # has_many with implicit order
@@ -234,7 +286,7 @@ describe WillPaginate::Finders::ActiveRecord do
234
286
  expected = replies(:spam, :witty_retort)
235
287
  # FIXME: wow, this is ugly
236
288
  topic.replies.paginate(:page => 1).map(&:id).sort.should == expected.map(&:id).sort
237
- topic.replies.paginate(:page => 1, :order => 'replies.id ASC').should == expected.reverse
289
+ topic.replies.paginate(:page => 1).reorder('replies.id ASC').should == expected.reverse
238
290
  end
239
291
 
240
292
  it "should paginate through association extension" do
@@ -253,7 +305,8 @@ describe WillPaginate::Finders::ActiveRecord do
253
305
  join_sql = 'LEFT JOIN developers_projects ON users.id = developers_projects.developer_id'
254
306
 
255
307
  lambda {
256
- result = Developer.paginate :page => 1, :joins => join_sql, :conditions => 'project_id = 1'
308
+ result = Developer.paginate(:page => 1, :joins => join_sql, :conditions => 'project_id = 1')
309
+ result.to_a # trigger loading of records
257
310
  result.size.should == 2
258
311
  developer_names = result.map(&:name)
259
312
  developer_names.should include('David')
@@ -262,8 +315,8 @@ describe WillPaginate::Finders::ActiveRecord do
262
315
 
263
316
  lambda {
264
317
  expected = result.to_a
265
- result = Developer.paginate :page => 1, :joins => join_sql,
266
- :conditions => 'project_id = 1', :count => { :select => "users.id" }
318
+ result = Developer.paginate(:page => 1, :joins => join_sql,
319
+ :conditions => 'project_id = 1', :count => { :select => "users.id" }).to_a
267
320
  result.should == expected
268
321
  result.total_entries.should == 2
269
322
  }.should run_queries(1)
@@ -272,8 +325,8 @@ describe WillPaginate::Finders::ActiveRecord do
272
325
  it "should paginate with group" do
273
326
  result = nil
274
327
  lambda {
275
- result = Developer.paginate :page => 1, :per_page => 10,
276
- :group => 'salary', :select => 'salary', :order => 'salary'
328
+ result = Developer.paginate(:page => 1, :per_page => 10,
329
+ :group => 'salary', :select => 'salary', :order => 'salary').to_a
277
330
  }.should run_queries(1)
278
331
 
279
332
  expected = users(:david, :jamis, :dev_10, :poor_jamis).map(&:salary).sort
@@ -337,12 +390,10 @@ describe WillPaginate::Finders::ActiveRecord do
337
390
  }.should_not raise_error
338
391
  end
339
392
 
340
- it "should paginate an array of IDs" do
393
+ it "should not paginate an array of IDs" do
341
394
  lambda {
342
- result = Developer.paginate((1..8).to_a, :per_page => 3, :page => 2, :order => 'id')
343
- result.map(&:id).should == (4..6).to_a
344
- result.total_entries.should == 8
345
- }.should run_queries(1)
395
+ Developer.paginate((1..8).to_a, :per_page => 3, :page => 2, :order => 'id')
396
+ }.should raise_error(ArgumentError)
346
397
  end
347
398
 
348
399
  protected
@@ -351,6 +402,18 @@ describe WillPaginate::Finders::ActiveRecord do
351
402
  QueryCountMatcher.new(num)
352
403
  end
353
404
 
405
+ def show_queries(&block)
406
+ counter = QueryCountMatcher.new(nil)
407
+ counter.run block
408
+ ensure
409
+ queries = counter.performed_queries
410
+ if queries.any?
411
+ puts queries
412
+ else
413
+ puts "no queries"
414
+ end
415
+ end
416
+
354
417
  end
355
418
 
356
419
  class QueryCountMatcher
@@ -359,12 +422,26 @@ class QueryCountMatcher
359
422
  end
360
423
 
361
424
  def matches?(block)
425
+ run(block)
426
+
427
+ if @expected_count.respond_to? :include?
428
+ @expected_count.include? @count
429
+ else
430
+ @count == @expected_count
431
+ end
432
+ end
433
+
434
+ def run(block)
362
435
  $query_count = 0
363
436
  $query_sql = []
364
437
  block.call
365
- @queries = $query_sql
438
+ ensure
439
+ @queries = $query_sql.dup
366
440
  @count = $query_count
367
- @count == @expected_count
441
+ end
442
+
443
+ def performed_queries
444
+ @queries
368
445
  end
369
446
 
370
447
  def failure_message
@@ -372,6 +449,6 @@ class QueryCountMatcher
372
449
  end
373
450
 
374
451
  def negative_failure_message
375
- "expected query count not to be #{$expected_count}"
452
+ "expected query count not to be #{@expected_count}"
376
453
  end
377
454
  end
@@ -1,21 +1,35 @@
1
1
  require 'active_record'
2
- require 'active_record/version'
3
2
  require 'active_record/fixtures'
4
3
  require 'active_support/multibyte' # needed for Ruby 1.9.1
5
4
 
6
- $query_count = $query_sql = nil
5
+ $query_count = 0
6
+ $query_sql = []
7
7
 
8
- class ActiverecordTestConnector
9
- cattr_accessor :able_to_connect
10
- cattr_accessor :connected
8
+ ignore_sql = /^(?:PRAGMA|SELECT (?:currval|CAST|@@IDENTITY|@@ROWCOUNT)|SHOW FIELDS)\b|\bFROM sqlite_master\b/
9
+
10
+ ActiveSupport::Notifications.subscribe(/^sql\./) do |*args|
11
+ payload = args.last
12
+ unless payload[:name] =~ /^Fixture/ or payload[:sql] =~ ignore_sql
13
+ $query_count += 1
14
+ $query_sql << payload[:sql]
15
+ end
16
+ end
17
+
18
+ module ActiverecordTestConnector
19
+ extend self
20
+
21
+ attr_accessor :able_to_connect
22
+ attr_accessor :connected
11
23
 
12
24
  FIXTURES_PATH = File.expand_path('../../fixtures', __FILE__)
13
25
 
26
+ Fixtures = defined?(ActiveRecord::Fixtures) ? ActiveRecord::Fixtures : ::Fixtures
27
+
14
28
  # Set our defaults
15
29
  self.connected = false
16
30
  self.able_to_connect = true
17
31
 
18
- def self.setup
32
+ def setup
19
33
  unless self.connected || !self.able_to_connect
20
34
  setup_connection
21
35
  load_schema
@@ -29,54 +43,31 @@ class ActiverecordTestConnector
29
43
 
30
44
  private
31
45
 
32
- def self.add_load_path(path)
46
+ def add_load_path(path)
33
47
  dep = defined?(ActiveSupport::Dependencies) ? ActiveSupport::Dependencies : ::Dependencies
34
48
  dep.autoload_paths.unshift path
35
49
  end
36
50
 
37
- def self.setup_connection
51
+ def setup_connection
38
52
  db = ENV['DB'].blank?? 'sqlite3' : ENV['DB']
39
53
 
40
54
  configurations = YAML.load_file(File.expand_path('../../database.yml', __FILE__))
41
55
  raise "no configuration for '#{db}'" unless configurations.key? db
42
56
  configuration = configurations[db]
43
57
 
44
- ActiveRecord::Base.logger = Logger.new(STDOUT) if $0 == 'irb'
58
+ # ActiveRecord::Base.logger = Logger.new(STDOUT) if $0 == 'irb'
45
59
  puts "using #{configuration['adapter']} adapter"
46
60
 
47
61
  ActiveRecord::Base.configurations = { db => configuration }
48
62
  ActiveRecord::Base.establish_connection(db)
49
- prepare ActiveRecord::Base.connection
50
63
  end
51
64
 
52
- def self.load_schema
65
+ def load_schema
53
66
  ActiveRecord::Base.silence do
54
67
  ActiveRecord::Migration.verbose = false
55
68
  load File.join(FIXTURES_PATH, 'schema.rb')
56
69
  end
57
70
  end
58
-
59
- def self.prepare(conn)
60
- class << conn
61
- IGNORED_SQL = /^(?:PRAGMA|SELECT (?:currval|CAST|@@IDENTITY|@@ROWCOUNT)|SHOW FIELDS)\b/
62
-
63
- def execute_with_counting(sql, name = nil, &block)
64
- if $query_count and IGNORED_SQL !~ sql
65
- $query_count += 1
66
- $query_sql << sql
67
- end
68
- execute_without_counting(sql, name, &block)
69
- end
70
-
71
- alias_method_chain :execute, :counting
72
- end
73
- end
74
-
75
- def self.show_sql
76
- ActiveSupport::Notifications.subscribe('active_record.sql') do |*args|
77
- puts args.last[:sql]
78
- end
79
- end
80
71
 
81
72
  module FixtureSetup
82
73
  def fixtures(*tables)
@@ -1,8 +1,14 @@
1
1
  require 'spec_helper'
2
- require 'will_paginate/finders/data_mapper'
3
- require File.expand_path('../data_mapper_test_connector', __FILE__)
4
2
 
5
- require 'will_paginate'
3
+ begin
4
+ require 'will_paginate/finders/data_mapper'
5
+ require File.expand_path('../data_mapper_test_connector', __FILE__)
6
+ rescue LoadError => error
7
+ warn "Error running DataMapper specs: #{error.message}"
8
+ datamapper_loaded = false
9
+ else
10
+ datamapper_loaded = true
11
+ end
6
12
 
7
13
  describe WillPaginate::Finders::DataMapper do
8
14
 
@@ -59,4 +65,4 @@ describe WillPaginate::Finders::DataMapper do
59
65
  end
60
66
  end
61
67
 
62
- end
68
+ end if datamapper_loaded
@@ -1,4 +1,6 @@
1
1
  require 'dm-core'
2
+ require 'dm-migrations'
3
+
2
4
  DataMapper.setup :default, 'sqlite3::memory:'
3
5
 
4
6
  # Define models
@@ -1,6 +1,14 @@
1
1
  require 'spec_helper'
2
- require 'will_paginate/finders/sequel'
3
- require File.expand_path('../sequel_test_connector', __FILE__)
2
+
3
+ begin
4
+ require 'will_paginate/finders/sequel'
5
+ require File.expand_path('../sequel_test_connector', __FILE__)
6
+ rescue LoadError, ArgumentError => error
7
+ warn "Error running Sequel specs: #{error.message}"
8
+ sequel_loaded = false
9
+ else
10
+ sequel_loaded = true
11
+ end
4
12
 
5
13
  describe Sequel::Dataset::Pagination, 'extension' do
6
14
 
@@ -50,4 +58,4 @@ describe Sequel::Dataset::Pagination, 'extension' do
50
58
  end
51
59
  end
52
60
 
53
- end
61
+ end if sequel_loaded
@@ -2,28 +2,28 @@ witty_retort:
2
2
  id: 1
3
3
  topic_id: 1
4
4
  content: Birdman is better!
5
- created_at: <%= 6.hours.ago.to_s(:db) %>
5
+ created_at: <%= 6.hours.ago.utc.to_s(:db) %>
6
6
 
7
7
  another:
8
8
  id: 2
9
9
  topic_id: 2
10
10
  content: Nuh uh!
11
- created_at: <%= 1.hour.ago.to_s(:db) %>
11
+ created_at: <%= 1.hour.ago.utc.to_s(:db) %>
12
12
 
13
13
  spam:
14
14
  id: 3
15
15
  topic_id: 1
16
16
  content: Nice site!
17
- created_at: <%= 1.hour.ago.to_s(:db) %>
17
+ created_at: <%= 1.hour.ago.utc.to_s(:db) %>
18
18
 
19
19
  decisive:
20
20
  id: 4
21
21
  topic_id: 4
22
22
  content: "I'm getting to the bottom of this"
23
- created_at: <%= 30.minutes.ago.to_s(:db) %>
23
+ created_at: <%= 30.minutes.ago.utc.to_s(:db) %>
24
24
 
25
25
  brave:
26
26
  id: 5
27
27
  topic_id: 4
28
28
  content: "AR doesn't scare me a bit"
29
- created_at: <%= 10.minutes.ago.to_s(:db) %>
29
+ created_at: <%= 10.minutes.ago.utc.to_s(:db) %>
@@ -1,7 +1,9 @@
1
1
  class Reply < ActiveRecord::Base
2
2
  belongs_to :topic, :include => [:replies]
3
3
 
4
- scope :recent, :conditions => ['replies.created_at > ?', 15.minutes.ago]
5
-
4
+ scope :recent,
5
+ :conditions => ['replies.created_at > ?', 15.minutes.ago],
6
+ :order => 'replies.created_at DESC'
7
+
6
8
  validates_presence_of :content
7
9
  end
@@ -3,7 +3,7 @@ futurama:
3
3
  title: Isnt futurama awesome?
4
4
  subtitle: It really is, isnt it.
5
5
  content: I like futurama
6
- created_at: <%= 1.day.ago.to_s(:db) %>
6
+ created_at: <%= 1.day.ago.utc.to_s(:db) %>
7
7
  updated_at:
8
8
 
9
9
  harvey_birdman:
@@ -11,7 +11,7 @@ harvey_birdman:
11
11
  title: Harvey Birdman is the king of all men
12
12
  subtitle: yup
13
13
  content: He really is
14
- created_at: <%= 2.hours.ago.to_s(:db) %>
14
+ created_at: <%= 2.hours.ago.utc.to_s(:db) %>
15
15
  updated_at:
16
16
 
17
17
  rails:
@@ -20,11 +20,11 @@ rails:
20
20
  title: Rails is nice
21
21
  subtitle: It makes me happy
22
22
  content: except when I have to hack internals to fix pagination. even then really.
23
- created_at: <%= 20.minutes.ago.to_s(:db) %>
23
+ created_at: <%= 20.minutes.ago.utc.to_s(:db) %>
24
24
 
25
25
  ar:
26
26
  id: 4
27
27
  project_id: 1
28
28
  title: ActiveRecord sometimes freaks me out
29
29
  content: "I mean, what's the deal with eager loading?"
30
- created_at: <%= 15.minutes.ago.to_s(:db) %>
30
+ created_at: <%= 15.minutes.ago.utc.to_s(:db) %>
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,5 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- require 'spec/autorun'
1
+ require 'rspec'
2
+ require File.expand_path('../view_helpers/view_example_group', __FILE__)
4
3
 
5
4
  module MyExtras
6
5
  protected
@@ -22,7 +21,7 @@ module MyExtras
22
21
  end
23
22
  end
24
23
 
25
- Spec::Runner.configure do |config|
24
+ RSpec.configure do |config|
26
25
  # config.include My::Pony, My::Horse, :type => :farm
27
26
  config.include MyExtras
28
27
  # config.predicate_matchers[:swim] = :can_swim?
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'active_support/rescuable' # needed for Ruby 1.9.1
3
3
  require 'action_controller'
4
- require 'view_helpers/view_example_group'
5
4
  require 'will_paginate/view_helpers/action_view'
6
5
  require 'will_paginate/collection'
7
6
 
@@ -311,6 +310,14 @@ class DummyController
311
310
  def params
312
311
  @request.params
313
312
  end
313
+
314
+ def env
315
+ {}
316
+ end
317
+
318
+ def _prefixes
319
+ []
320
+ end
314
321
  end
315
322
 
316
323
  class IbocorpController < DummyController
@@ -349,6 +356,11 @@ class DummyRequest
349
356
  def host_with_port
350
357
  'example.com'
351
358
  end
359
+ alias host host_with_port
360
+
361
+ def optional_port
362
+ ''
363
+ end
352
364
 
353
365
  def protocol
354
366
  'http:'
@@ -1,6 +1,7 @@
1
+ require 'active_support'
1
2
  require 'action_dispatch/testing/assertions'
2
3
 
3
- class ViewExampleGroup < Spec::Example::ExampleGroup
4
+ module ViewExampleGroup
4
5
 
5
6
  include ActionDispatch::Assertions::SelectorAssertions
6
7
 
@@ -38,8 +39,8 @@ class ViewExampleGroup < Spec::Example::ExampleGroup
38
39
  def validate_page_numbers(expected, links, param_name = :page)
39
40
  param_pattern = /\W#{Regexp.escape(param_name.to_s)}=([^&]*)/
40
41
 
41
- links.map { |e|
42
- e['href'] =~ param_pattern
42
+ links.map { |el|
43
+ unescape_href(el) =~ param_pattern
43
44
  $1 ? $1.to_i : $1
44
45
  }.should == expected
45
46
  end
@@ -52,9 +53,10 @@ class ViewExampleGroup < Spec::Example::ExampleGroup
52
53
  pages = [] if numbers
53
54
 
54
55
  links.each do |el|
55
- el['href'].should =~ pattern
56
+ href = unescape_href(el)
57
+ href.should =~ pattern
56
58
  if numbers
57
- el['href'] =~ pattern
59
+ href =~ pattern
58
60
  pages << ($1.nil?? nil : $1.to_i)
59
61
  end
60
62
  end
@@ -65,10 +67,14 @@ class ViewExampleGroup < Spec::Example::ExampleGroup
65
67
  def assert_no_links_match(pattern)
66
68
  assert_select 'div.pagination a[href]' do |elements|
67
69
  elements.each do |el|
68
- el['href'] !~ pattern
70
+ unescape_href(el).should_not =~ pattern
69
71
  end
70
72
  end
71
73
  end
74
+
75
+ def unescape_href(el)
76
+ CGI.unescape CGI.unescapeHTML(el['href'])
77
+ end
72
78
 
73
79
  def build_message(message, pattern, *args)
74
80
  built_message = pattern.dup
@@ -80,7 +86,11 @@ class ViewExampleGroup < Spec::Example::ExampleGroup
80
86
 
81
87
  end
82
88
 
83
- Spec::Example::ExampleGroupFactory.register(:view_helpers, ViewExampleGroup)
89
+ RSpec.configure do |config|
90
+ config.include ViewExampleGroup, :type => :view, :example_group => {
91
+ :file_path => %r{spec/view_helpers/}
92
+ }
93
+ end
84
94
 
85
95
  module HTML
86
96
  Node.class_eval do
metadata CHANGED
@@ -1,13 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: will_paginate
3
3
  version: !ruby/object:Gem::Version
4
- hash: -1876988247
5
- prerelease: true
6
- segments:
7
- - 3
8
- - 0
9
- - pre2
10
- version: 3.0.pre2
4
+ prerelease: 4
5
+ version: 3.0.pre4
11
6
  platform: ruby
12
7
  authors:
13
8
  - "Mislav Marohni\xC4\x87"
@@ -15,8 +10,7 @@ autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
12
 
18
- date: 2010-02-05 00:00:00 +01:00
19
- default_executable:
13
+ date: 2010-02-05 00:00:00 Z
20
14
  dependencies: []
21
15
 
22
16
  description: The will_paginate library provides a simple, yet powerful and extensible API for pagination and rendering of page links in web application templates.
@@ -74,10 +68,7 @@ files:
74
68
  - spec/fixtures/topics.yml
75
69
  - spec/fixtures/user.rb
76
70
  - spec/fixtures/users.yml
77
- - spec/rcov.opts
78
- - spec/spec.opts
79
71
  - spec/spec_helper.rb
80
- - spec/tasks.rake
81
72
  - spec/view_helpers/action_view_spec.rb
82
73
  - spec/view_helpers/base_spec.rb
83
74
  - spec/view_helpers/link_renderer_base_spec.rb
@@ -85,7 +76,6 @@ files:
85
76
  - README.rdoc
86
77
  - LICENSE
87
78
  - CHANGELOG.rdoc
88
- has_rdoc: true
89
79
  homepage: http://github.com/mislav/will_paginate/wikis
90
80
  licenses: []
91
81
 
@@ -101,25 +91,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
101
91
  requirements:
102
92
  - - ">="
103
93
  - !ruby/object:Gem::Version
104
- hash: 3
105
- segments:
106
- - 0
107
94
  version: "0"
108
95
  required_rubygems_version: !ruby/object:Gem::Requirement
109
96
  none: false
110
97
  requirements:
111
98
  - - ">"
112
99
  - !ruby/object:Gem::Version
113
- hash: 25
114
- segments:
115
- - 1
116
- - 3
117
- - 1
118
100
  version: 1.3.1
119
101
  requirements: []
120
102
 
121
103
  rubyforge_project:
122
- rubygems_version: 1.3.7
104
+ rubygems_version: 1.8.5
123
105
  signing_key:
124
106
  specification_version: 3
125
107
  summary: Adaptive pagination plugin for web frameworks and other applications
data/spec/rcov.opts DELETED
@@ -1,2 +0,0 @@
1
- --exclude ^\/,^spec\/,core_ext.rb,deprecation.rb
2
- --no-validator-links
data/spec/spec.opts DELETED
@@ -1,2 +0,0 @@
1
- --colour
2
- --reverse
data/spec/tasks.rake DELETED
@@ -1,60 +0,0 @@
1
- require 'spec/rake/spectask'
2
-
3
- spec_opts = 'spec/spec.opts'
4
-
5
- desc 'Run framework-agnostic specs'
6
- Spec::Rake::SpecTask.new(:spec) do |t|
7
- t.libs << 'spec'
8
- t.spec_opts = ['--options', spec_opts]
9
- t.spec_files = FileList.new('spec/**/*_spec.rb') do |files|
10
- files.exclude(/\b(active_record|active_resource|action_view|data_mapper|sequel)_/)
11
- end
12
- end
13
-
14
- namespace :spec do
15
- desc 'Run specs for core, ActiveRecord and ActionView'
16
- Spec::Rake::SpecTask.new(:rails) do |t|
17
- t.libs << 'spec'
18
- t.spec_opts = ['--options', spec_opts]
19
- t.spec_files = FileList.new('spec/**/*_spec.rb') do |files|
20
- files.exclude(/\b(data_mapper|sequel)_/)
21
- end
22
- end
23
-
24
- desc 'Run specs for DataMapper'
25
- Spec::Rake::SpecTask.new(:datamapper) do |t|
26
- t.libs << 'spec'
27
- t.spec_opts = ['--options', spec_opts]
28
- t.spec_files = FileList.new('spec/finders_spec.rb', 'spec/finders/data_mapper_spec.rb')
29
- end
30
-
31
- desc 'Run specs for Sequel'
32
- Spec::Rake::SpecTask.new(:sequel) do |t|
33
- t.libs << 'spec'
34
- t.spec_opts = ['--options', spec_opts]
35
- t.spec_files = FileList.new('spec/finders_spec.rb', 'spec/finders/sequel_spec.rb')
36
- end
37
-
38
- desc 'Analyze spec coverage with RCov'
39
- Spec::Rake::SpecTask.new(:rcov) do |t|
40
- t.libs << 'spec'
41
- t.spec_opts = ['--options', spec_opts]
42
- t.rcov = true
43
- t.rcov_opts = lambda do
44
- IO.readlines('spec/rcov.opts').map { |l| l.chomp.split(" ") }.flatten
45
- end
46
- end
47
-
48
- desc 'Print Specdoc for all specs'
49
- Spec::Rake::SpecTask.new(:doc) do |t|
50
- t.libs << 'spec'
51
- t.spec_opts = ['--format', 'specdoc', '--dry-run']
52
- end
53
-
54
- desc 'Generate HTML report'
55
- Spec::Rake::SpecTask.new(:html) do |t|
56
- t.libs << 'spec'
57
- t.spec_opts = ['--format', 'html:doc/spec_results.html', '--diff']
58
- t.fail_on_error = false
59
- end
60
- end