stilkov-will_paginate 2.3.6 → 2.3.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -68,11 +68,7 @@ module WillPaginate
68
68
 
69
69
  def self.warn(message, callstack = caller)
70
70
  message = 'WillPaginate: ' + message.strip.gsub(/\s+/, ' ')
71
- behavior.call(message, callstack) if behavior && !silenced?
72
- end
73
-
74
- def self.silenced?
75
- ActiveSupport::Deprecation.silenced?
71
+ ActiveSupport::Deprecation.warn(message, callstack)
76
72
  end
77
73
  end
78
74
  end
@@ -82,7 +82,7 @@ module WillPaginate
82
82
  #
83
83
  # The Array#paginate API has since then changed, but this still serves as a
84
84
  # fine example of WillPaginate::Collection usage.
85
- def self.create(page, per_page, total = nil, &block)
85
+ def self.create(page, per_page, total = nil)
86
86
  pager = new(page, per_page, total)
87
87
  yield pager
88
88
  pager
@@ -61,7 +61,7 @@ module WillPaginate
61
61
  #
62
62
  # All other options (+conditions+, +order+, ...) are forwarded to +find+
63
63
  # and +count+ calls.
64
- def paginate(*args, &block)
64
+ def paginate(*args)
65
65
  options = args.pop
66
66
  page, per_page, total_entries = wp_parse_options(options)
67
67
  finder = (options[:finder] || 'find').to_s
@@ -79,7 +79,7 @@ module WillPaginate
79
79
 
80
80
  args << find_options
81
81
  # @options_from_last_find = nil
82
- pager.replace send(finder, *args, &block)
82
+ pager.replace(send(finder, *args) { |*a| yield(*a) if block_given? })
83
83
 
84
84
  # magic counting for user convenience:
85
85
  pager.total_entries = wp_count(count_options, args, finder) unless pager.total_entries
@@ -96,7 +96,7 @@ module WillPaginate
96
96
  #
97
97
  # See {Faking Cursors in ActiveRecord}[http://weblog.jamisbuck.org/2007/4/6/faking-cursors-in-activerecord]
98
98
  # where Jamis Buck describes this and a more efficient way for MySQL.
99
- def paginated_each(options = {}, &block)
99
+ def paginated_each(options = {})
100
100
  options = { :order => 'id', :page => 1 }.merge options
101
101
  options[:page] = options[:page].to_i
102
102
  options[:total_entries] = 0 # skip the individual count queries
@@ -106,7 +106,7 @@ module WillPaginate
106
106
  collection = paginate(options)
107
107
  with_exclusive_scope(:find => {}) do
108
108
  # using exclusive scope so that the block is yielded in scope-free context
109
- total += collection.each(&block).size
109
+ total += collection.each { |item| yield item }.size
110
110
  end
111
111
  options[:page] += 1
112
112
  end until collection.size < collection.per_page
@@ -161,10 +161,14 @@ module WillPaginate
161
161
 
162
162
  protected
163
163
 
164
- def method_missing_with_paginate(method, *args, &block) #:nodoc:
164
+ def method_missing_with_paginate(method, *args) #:nodoc:
165
165
  # did somebody tried to paginate? if not, let them be
166
166
  unless method.to_s.index('paginate') == 0
167
- return method_missing_without_paginate(method, *args, &block)
167
+ if block_given?
168
+ return method_missing_without_paginate(method, *args) { |*a| yield(*a) }
169
+ else
170
+ return method_missing_without_paginate(method, *args)
171
+ end
168
172
  end
169
173
 
170
174
  # paginate finders are really just find_* with limit and offset
@@ -177,7 +181,7 @@ module WillPaginate
177
181
  options[:finder] = finder
178
182
  args << options
179
183
 
180
- paginate(*args, &block)
184
+ paginate(*args) { |*a| yield(*a) if block_given? }
181
185
  end
182
186
 
183
187
  # Does the not-so-trivial job of finding out the total number of entries
@@ -83,7 +83,7 @@ module WillPaginate
83
83
  #
84
84
  # expected_options = { :conditions => { :colored => 'red' } }
85
85
  # assert_equal expected_options, Shirt.colored('red').proxy_options
86
- def named_scope(name, options = {}, &block)
86
+ def named_scope(name, options = {})
87
87
  name = name.to_sym
88
88
  scopes[name] = lambda do |parent_scope, *args|
89
89
  Scope.new(parent_scope, case options
@@ -91,7 +91,7 @@ module WillPaginate
91
91
  options
92
92
  when Proc
93
93
  options.call(*args)
94
- end, &block)
94
+ end) { |*a| yield(*a) if block_given? }
95
95
  end
96
96
  (class << self; self end).instance_eval do
97
97
  define_method name do |*args|
@@ -112,9 +112,9 @@ module WillPaginate
112
112
 
113
113
  delegate :scopes, :with_scope, :to => :proxy_scope
114
114
 
115
- def initialize(proxy_scope, options, &block)
115
+ def initialize(proxy_scope, options)
116
116
  [options[:extend]].flatten.each { |extension| extend extension } if options[:extend]
117
- extend Module.new(&block) if block_given?
117
+ extend Module.new { |*args| yield(*args) } if block_given?
118
118
  @proxy_scope, @proxy_options = proxy_scope, options.except(:extend)
119
119
  end
120
120
 
@@ -152,12 +152,12 @@ module WillPaginate
152
152
  end
153
153
 
154
154
  private
155
- def method_missing(method, *args, &block)
155
+ def method_missing(method, *args)
156
156
  if scopes.include?(method)
157
157
  scopes[method].call(self, *args)
158
158
  else
159
159
  with_scope :find => proxy_options do
160
- proxy_scope.send(method, *args, &block)
160
+ proxy_scope.send(method, *args) { |*a| yield(*a) if block_given? }
161
161
  end
162
162
  end
163
163
  end
@@ -1,7 +1,7 @@
1
1
  ActiveRecord::Associations::AssociationProxy.class_eval do
2
2
  protected
3
- def with_scope(*args, &block)
4
- @reflection.klass.send :with_scope, *args, &block
3
+ def with_scope(*args)
4
+ @reflection.klass.send(:with_scope, *args) { |*a| yield(*a) if block_given? }
5
5
  end
6
6
  end
7
7
 
@@ -10,11 +10,11 @@ end
10
10
  klass.class_eval do
11
11
  protected
12
12
  alias :method_missing_without_scopes :method_missing_without_paginate
13
- def method_missing_without_paginate(method, *args, &block)
13
+ def method_missing_without_paginate(method, *args)
14
14
  if @reflection.klass.scopes.include?(method)
15
- @reflection.klass.scopes[method].call(self, *args, &block)
15
+ @reflection.klass.scopes[method].call(self, *args) { |*a| yield(*a) if block_given? }
16
16
  else
17
- method_missing_without_scopes(method, *args, &block)
17
+ method_missing_without_scopes(method, *args) { |*a| yield(*a) if block_given? }
18
18
  end
19
19
  end
20
20
  end
@@ -23,14 +23,14 @@ end
23
23
  # Rails 1.2.6
24
24
  ActiveRecord::Associations::HasAndBelongsToManyAssociation.class_eval do
25
25
  protected
26
- def method_missing(method, *args, &block)
26
+ def method_missing(method, *args)
27
27
  if @target.respond_to?(method) || (!@reflection.klass.respond_to?(method) && Class.respond_to?(method))
28
28
  super
29
29
  elsif @reflection.klass.scopes.include?(method)
30
30
  @reflection.klass.scopes[method].call(self, *args)
31
31
  else
32
32
  @reflection.klass.with_scope(:find => { :conditions => @finder_sql, :joins => @join_sql, :readonly => false }) do
33
- @reflection.klass.send(method, *args, &block)
33
+ @reflection.klass.send(method, *args) { |*a| yield(*a) if block_given? }
34
34
  end
35
35
  end
36
36
  end
@@ -2,7 +2,7 @@ module WillPaginate
2
2
  module VERSION
3
3
  MAJOR = 2
4
4
  MINOR = 3
5
- TINY = 5
5
+ TINY = 8
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -30,9 +30,10 @@ module WillPaginate
30
30
  :separator => ' ', # single space is friendly to spiders and non-graphic browsers
31
31
  :param_name => :page,
32
32
  :params => nil,
33
- :renderer => 'WillPaginate::LinkRenderer',
33
+ :renderer => nil,
34
34
  :page_links => true,
35
- :container => true
35
+ :container => true,
36
+ :xml => false
36
37
  }
37
38
  mattr_reader :pagination_options
38
39
 
@@ -99,11 +100,12 @@ module WillPaginate
99
100
 
100
101
  options = options.symbolize_keys.reverse_merge WillPaginate::ViewHelpers.pagination_options
101
102
  if options[:prev_label]
102
- WillPaginate::Deprecation::warn(":prev_label view parameter is now :previous_label; the old name has been deprecated.")
103
+ WillPaginate::Deprecation::warn(":prev_label view parameter is now :previous_label; the old name has been deprecated", caller)
103
104
  options[:previous_label] = options.delete(:prev_label)
104
105
  end
105
106
 
106
107
  # get the renderer instance
108
+ options[:renderer] ||= options[:xml] ? 'WillPaginate::XmlLinkRenderer' : 'WillPaginate::LinkRenderer'
107
109
  renderer = case options[:renderer]
108
110
  when String
109
111
  options[:renderer].to_s.constantize.new
@@ -111,7 +113,9 @@ module WillPaginate
111
113
  options[:renderer].new
112
114
  else
113
115
  options[:renderer]
114
- end
116
+ end
117
+
118
+
115
119
  # render HTML for pagination
116
120
  renderer.prepare collection, options, self
117
121
  renderer.to_html
@@ -185,12 +189,11 @@ module WillPaginate
185
189
 
186
190
  def self.total_pages_for_collection(collection) #:nodoc:
187
191
  if collection.respond_to?('page_count') and !collection.respond_to?('total_pages')
188
- WillPaginate::Deprecation.warn <<-MSG
192
+ WillPaginate::Deprecation.warn %{
189
193
  You are using a paginated collection of class #{collection.class.name}
190
194
  which conforms to the old API of WillPaginate::Collection by using
191
195
  `page_count`, while the current method name is `total_pages`. Please
192
- upgrade yours or 3rd-party code that provides the paginated collection.
193
- MSG
196
+ upgrade yours or 3rd-party code that provides the paginated collection}, caller
194
197
  class << collection
195
198
  def total_pages; page_count; end
196
199
  end
@@ -251,7 +254,11 @@ module WillPaginate
251
254
  end
252
255
 
253
256
  protected
254
-
257
+
258
+ def options
259
+ @options
260
+ end
261
+
255
262
  # Collects link items for visible page numbers.
256
263
  def windowed_links
257
264
  prev = nil
@@ -322,8 +329,7 @@ module WillPaginate
322
329
  stringified_merge @url_params, @options[:params] if @options[:params]
323
330
 
324
331
  if complex = param_name.index(/[^\w-]/)
325
- page_param = (defined?(CGIMethods) ? CGIMethods : ActionController::AbstractRequest).
326
- parse_query_parameters("#{param_name}=#{page}")
332
+ page_param = parse_query_parameters("#{param_name}=#{page}")
327
333
 
328
334
  stringified_merge @url_params, page_param
329
335
  else
@@ -386,5 +392,29 @@ module WillPaginate
386
392
  end
387
393
  end
388
394
  end
395
+
396
+ def parse_query_parameters(params)
397
+ if defined?(CGIMethods)
398
+ CGIMethods.parse_query_parameters(params)
399
+ elsif defined?(ActionController::AbstractRequest)
400
+ ActionController::AbstractRequest.parse_query_parameters(params)
401
+ elsif defined?(ActionController::UrlEncodedPairParser)
402
+ # For Rails > 2.2
403
+ ActionController::UrlEncodedPairParser.parse_query_parameters(params)
404
+ else
405
+ # For Rails > 2.3
406
+ Rack::Utils.parse_nested_query(params)
407
+ end
408
+ end
409
+ end
410
+
411
+ class XmlLinkRenderer < LinkRenderer
412
+ def to_html
413
+ buffer = options[:buffer] || ""
414
+ xml = options[:builder] || Builder::XmlMarkup.new(:target => buffer, :indent => 2, :margin => 1)
415
+ xml.link :rel => 'next', :href => url_for(@collection.next_page) unless @collection.next_page.nil?
416
+ xml.link :rel => 'prev', :href => url_for(@collection.previous_page) unless @collection.previous_page.nil?
417
+ xml.target!
418
+ end
389
419
  end
390
420
  end
@@ -29,7 +29,10 @@ end
29
29
 
30
30
  # Wrap tests that use Mocha and skip if unavailable.
31
31
  def uses_mocha(test_name)
32
- require 'mocha' unless Object.const_defined?(:Mocha)
32
+ unless Object.const_defined?(:Mocha)
33
+ gem 'mocha', '>= 0.9.5'
34
+ require 'mocha'
35
+ end
33
36
  rescue LoadError => load_error
34
37
  $stderr.puts "Skipping #{test_name} tests. `gem install mocha` and try again."
35
38
  else
@@ -1,6 +1,13 @@
1
1
  require 'lib/activerecord_test_connector'
2
2
 
3
3
  class ActiveRecordTestCase < Test::Unit::TestCase
4
+ if defined?(ActiveSupport::Testing::SetupAndTeardown)
5
+ include ActiveSupport::Testing::SetupAndTeardown
6
+ end
7
+
8
+ if defined?(ActiveRecord::TestFixtures)
9
+ include ActiveRecord::TestFixtures
10
+ end
4
11
  # Set our fixture path
5
12
  if ActiveRecordTestConnector.able_to_connect
6
13
  self.fixture_path = File.join(File.dirname(__FILE__), '..', 'fixtures')
@@ -17,6 +17,13 @@ end
17
17
  ActionController::Base.perform_caching = false
18
18
 
19
19
  class WillPaginate::ViewTestCase < Test::Unit::TestCase
20
+ if defined?(ActionController::TestCase::Assertions)
21
+ include ActionController::TestCase::Assertions
22
+ end
23
+ if defined?(ActiveSupport::Testing::Deprecation)
24
+ include ActiveSupport::Testing::Deprecation
25
+ end
26
+
20
27
  def setup
21
28
  super
22
29
  @controller = DummyController.new
@@ -32,10 +32,10 @@ task :test_databases => %w(test_mysql test_sqlite3 test_postgres)
32
32
  desc %{Test everything on SQLite3, MySQL and PostgreSQL}
33
33
  task :test_full => %w(test test_mysql test_postgres)
34
34
 
35
- desc %{Test everything with Rails 2.1.x, 2.0.x & 1.2.x gems}
35
+ desc %{Test everything with Rails 2.3.x, 2.2.x, 2.1.x, 2.0.x & 1.2.x gems}
36
36
  task :test_all do
37
37
  all = Rake::Task['test_full']
38
- versions = %w(2.1.0 2.0.4 1.2.6)
38
+ versions = %w(2.3.1 2.2.2 2.1.0 2.0.4 1.2.6)
39
39
  versions.each do |version|
40
40
  ENV['RAILS_VERSION'] = "~> #{version}"
41
41
  all.invoke
@@ -165,6 +165,64 @@ class ViewTest < WillPaginate::ViewTestCase
165
165
  end
166
166
  end
167
167
 
168
+ ## XML rendering ##
169
+
170
+ def test_xml_pagination_output_with_prev_and_next
171
+ paginate({:page => 2, :per_page => 5, :total_entries => 22}, :xml => true)
172
+ expected = <<-XML
173
+ <link rel="next" href="/foo/bar?page=3" />
174
+ <link rel="prev" href="/foo/bar?page=1" />
175
+ XML
176
+ assert_dom_equal expected, @html_result
177
+ end
178
+
179
+ def test_xml_pagination_output_with_prev_only
180
+ paginate({:page => 2, :per_page => 5, :total_entries => 10}, :xml => true)
181
+ expected = <<-XML
182
+ <link rel="prev" href="/foo/bar?page=1" />
183
+ XML
184
+ assert_dom_equal expected, @html_result
185
+ end
186
+
187
+ def test_xml_pagination_output_with_next_only
188
+ paginate({:page => 1, :per_page => 5, :total_entries => 10}, :xml => true)
189
+ expected = <<-XML
190
+ <link rel="next" href="/foo/bar?page=2" />
191
+ XML
192
+ assert_dom_equal expected, @html_result
193
+ end
194
+
195
+ def test_xml_pagination_output_with_single_page
196
+ paginate({:page => 1, :per_page => 5, :total_entries => 5}, :xml => true)
197
+ expected = ""
198
+ assert_dom_equal expected, @html_result
199
+ end
200
+
201
+ def test_xml_pagination_output_with_builder
202
+ expected = <<-XML
203
+ <navigation>
204
+ <link rel="next" href="/foo/bar?page=3" />
205
+ <link rel="prev" href="/foo/bar?page=1" />
206
+ </navigation>
207
+ XML
208
+ xml = Builder::XmlMarkup.new(:indent => 4, :margin => 1)
209
+ xml.navigation do
210
+ paginate({:page => 2, :per_page => 5, :total_entries => 22}, {:xml => true, :builder => xml})
211
+ end
212
+ assert_dom_equal expected, xml.target!
213
+ end
214
+
215
+ def test_xml_pagination_output_with_buffer
216
+ buffer =" Result: \n"
217
+ paginate({:page => 2, :per_page => 5, :total_entries => 22}, {:xml => true, :buffer => buffer})
218
+ expected = <<-XML
219
+ Result:
220
+ <link rel="next" href="/foo/bar?page=3" />
221
+ <link rel="prev" href="/foo/bar?page=1" />
222
+ XML
223
+ assert_dom_equal expected, buffer
224
+ end
225
+
168
226
  ## other helpers ##
169
227
 
170
228
  def test_paginated_section
@@ -192,13 +250,15 @@ class ViewTest < WillPaginate::ViewTestCase
192
250
  @html_result
193
251
  end
194
252
 
195
- def test_page_entries_info_with_longer_class_name
196
- @template = '<%= page_entries_info collection %>'
197
- collection = ('a'..'z').to_a.paginate
198
- collection.first.stubs(:class).returns(mock('class', :name => 'ProjectType'))
253
+ uses_mocha 'class name' do
254
+ def test_page_entries_info_with_longer_class_name
255
+ @template = '<%= page_entries_info collection %>'
256
+ collection = ('a'..'z').to_a.paginate
257
+ collection.first.stubs(:class).returns(mock('class', :name => 'ProjectType'))
199
258
 
200
- paginate collection
201
- assert @html_result.index('project types'), "expected <#{@html_result.inspect}> to mention 'project types'"
259
+ paginate collection
260
+ assert @html_result.index('project types'), "expected <#{@html_result.inspect}> to mention 'project types'"
261
+ end
202
262
  end
203
263
 
204
264
  def test_page_entries_info_with_single_page_collection
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stilkov-will_paginate
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.6
4
+ version: 2.3.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Mislav Marohni\xC4\x87"
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2008-10-26 00:00:00 -07:00
13
+ date: 2009-03-09 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies: []
16
16