mongoid-scroll 0.2.1 → 0.3.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 614ee5395d9475c74547769cefbfd7c531b09d45
4
+ data.tar.gz: 9a61c61ce360c352a4b69fd770eca27f1ee9a6c7
5
+ SHA512:
6
+ metadata.gz: 05e6f26d88ad8515bb3d0871bed4ea5386d3fb801300394ffedbdb4529833b2fb19ed73da362267e35cba02fba6b11c74e4d8ca4bfecb93cb389bc2408967c84
7
+ data.tar.gz: 3511a0273d3c198987a5812cfb137083216373e6602d03cbfe828ad0fa8c65d4fc577c20598bb1a8239c480d4f891d2179fa89e382b942347e01a063c4bd18a1
data/.rubocop.yml ADDED
@@ -0,0 +1,64 @@
1
+ AllCops:
2
+ Exclude:
3
+ - vendor/**/*
4
+ - gemfiles/vendor/**/*
5
+
6
+ LineLength:
7
+ Enabled: false
8
+
9
+ MethodLength:
10
+ Enabled: false
11
+
12
+ ClassLength:
13
+ Enabled: false
14
+
15
+ Documentation:
16
+ # don't require classes to be documented
17
+ Enabled: false
18
+
19
+ CollectionMethods:
20
+ # don't prefer map to collect, recuce to inject
21
+ Enabled: false
22
+
23
+ Encoding:
24
+ # no need to always specify encoding
25
+ Enabled: false
26
+
27
+ Void:
28
+ # == operator used in void context in specs
29
+ Enabled: false
30
+
31
+ SignalException:
32
+ # prefer raise to fail
33
+ EnforcedStyle: only_raise
34
+
35
+ RaiseArgs:
36
+ # don't care for what kind of raise
37
+ Enabled: false
38
+
39
+ PerlBackrefs:
40
+ # TODO: regular expression matching with $1, $2, etc.
41
+ Enabled: false
42
+
43
+ BlockNesting:
44
+ # TODO: fix too much nesting
45
+ Max: 4
46
+
47
+ Lambda:
48
+ # TODO: replace all lambda with -> or Proc
49
+ Enabled: false
50
+
51
+ Blocks:
52
+ # allow multi-line blocks like expect { }
53
+ Enabled: false
54
+
55
+ WordArray:
56
+ # %w vs. [ '', ... ]
57
+ Enabled: false
58
+
59
+ CyclomaticComplexity:
60
+ Enabled: false
61
+
62
+ FileName:
63
+ Enabled: false
64
+
data/.travis.yml CHANGED
@@ -3,3 +3,15 @@ services:
3
3
 
4
4
  rvm:
5
5
  - 1.9.3
6
+ - 2.0.0
7
+ - 2.1.2
8
+ - jruby-19mode
9
+ - rbx-2
10
+
11
+ env:
12
+ - MONGOID_VERSION=3
13
+ - MONGOID_VERSION=4
14
+
15
+ language: ruby
16
+
17
+ cache: bundler
data/CHANGELOG.md CHANGED
@@ -1,16 +1,22 @@
1
+ 0.3.0 (1/7/2014)
2
+ ----------------
3
+
4
+ * Compatibility with Mongoid 4.x - [@dblock](https://github.com/dblock).
5
+ * Implemeneted Rubocop, Ruby linter - [@dblock](https://github.com/dblock).
6
+
1
7
  0.2.1 (3/21/2013)
2
- =================
8
+ -----------------
3
9
 
4
10
  * Fix: scroll over a collection that has duplicate values while data is being modified in a way that causes a change in the natural sort order - [@dblock](https://github.com/dblock).
5
11
 
6
12
  0.2.0 (3/14/2013)
7
- =================
13
+ -----------------
8
14
 
9
15
  * Extended `Moped::Query` with `scroll` - [@dblock](https://github.com/dblock).
10
16
  * `Mongoid::Scroll::Cursor.from_record` can now be called with either a Mongoid field or `field_type` and `field_name` in the `options` hash - [@dblock](https://github.com/dblock).
11
17
 
12
18
  0.1.0 (2/14/2013)
13
- =================
19
+ -----------------
14
20
 
15
21
  * Initial public release, extends `Mongoid::Criteria` with `scroll` - [@dblock](https://github.com/dblock).
16
22
 
data/Gemfile CHANGED
@@ -2,9 +2,19 @@ source "http://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
+ case version = ENV['MONGOID_VERSION'] || '~> 4.0'
6
+ when /4/
7
+ gem 'mongoid', '~> 4.0'
8
+ when /3/
9
+ gem 'mongoid', '~> 3.1'
10
+ else
11
+ gem 'mongoid', version
12
+ end
13
+
5
14
  group :development, :test do
6
15
  gem "rake"
7
16
  gem "bundler"
8
- gem "rspec"
17
+ gem "rspec", "~> 2.9"
9
18
  gem "faker"
19
+ gem "rubocop", "0.24.0"
10
20
  end
data/README.md CHANGED
@@ -6,7 +6,7 @@ Mongoid extension that enables infinite scrolling for `Mongoid::Criteria` and `M
6
6
  Demo
7
7
  ----
8
8
 
9
- Check out [artsy.net](http://artsy.net) homepage. Scroll down.
9
+ Check out [shows on artsy.net](http://artsy.net/shows). Keep scrolling down.
10
10
 
11
11
  There're also two code samples for Mongoid and Moped in [examples](examples). Run `bundle exec ruby examples/mongoid_scroll_feed.rb`.
12
12
 
data/Rakefile CHANGED
@@ -7,7 +7,7 @@ begin
7
7
  Bundler.setup(:default, :development)
8
8
  rescue Bundler::BundlerError => e
9
9
  $stderr.puts e.message
10
- $stderr.puts "Run `bundle install` to install missing gems"
10
+ $stderr.puts 'Run `bundle install` to install missing gems'
11
11
  exit e.status_code
12
12
  end
13
13
 
@@ -20,5 +20,8 @@ RSpec::Core::RakeTask.new(:spec) do |spec|
20
20
  spec.pattern = FileList['spec/**/*_spec.rb']
21
21
  end
22
22
 
23
- task :default => :spec
23
+ task :spec
24
+ require 'rubocop/rake_task'
25
+ RuboCop::RakeTask.new(:rubocop)
24
26
 
27
+ task default: [:rubocop, :spec]
@@ -4,7 +4,7 @@ Bundler.setup(:default, :development)
4
4
  require 'mongoid-scroll'
5
5
  require 'faker'
6
6
 
7
- Mongoid.connect_to "mongoid_scroll_demo"
7
+ Mongoid.connect_to 'mongoid_scroll_demo'
8
8
  Mongoid.purge!
9
9
 
10
10
  module Feed
@@ -12,7 +12,7 @@ module Feed
12
12
  include Mongoid::Document
13
13
  field :title, type: String
14
14
  field :position, type: Integer
15
- index({ position: 1, _id: 1 })
15
+ index(position: 1, _id: 1)
16
16
  end
17
17
  end
18
18
 
@@ -23,7 +23,7 @@ scroll_by = 7
23
23
 
24
24
  # insert items with a position out-of-order
25
25
  rands = (0..total_items).to_a.sort { rand }[0..total_items]
26
- total_items.times do |i|
26
+ total_items.times do |_i|
27
27
  Feed::Item.create! title: Faker::Lorem.sentence, position: rands.pop
28
28
  end
29
29
 
@@ -34,7 +34,7 @@ Feed::Item.create_indexes
34
34
 
35
35
  total_shown = 0
36
36
  next_cursor = nil
37
- while true
37
+ loop do
38
38
  current_cursor = next_cursor
39
39
  next_cursor = nil
40
40
  Feed::Item.asc(:position).limit(scroll_by).scroll(current_cursor) do |item, cursor|
@@ -4,7 +4,7 @@ Bundler.setup(:default, :development)
4
4
  require 'mongoid-scroll'
5
5
  require 'faker'
6
6
 
7
- Mongoid.connect_to "mongoid_scroll_demo"
7
+ Mongoid.connect_to 'mongoid_scroll_demo'
8
8
  Mongoid.purge!
9
9
 
10
10
  # total items to insert
@@ -14,7 +14,7 @@ scroll_by = 7
14
14
 
15
15
  # insert items with a position out-of-order
16
16
  rands = (0..total_items).to_a.sort { rand }[0..total_items]
17
- total_items.times do |i|
17
+ total_items.times do
18
18
  Mongoid.default_session['feed_items'].insert(title: Faker::Lorem.sentence, position: rands.pop)
19
19
  end
20
20
 
@@ -25,10 +25,10 @@ Moped.logger.level = Logger::DEBUG
25
25
 
26
26
  total_shown = 0
27
27
  next_cursor = nil
28
- while true
28
+ loop do
29
29
  current_cursor = next_cursor
30
30
  next_cursor = nil
31
- Mongoid.default_session['feed_items'].find.limit(scroll_by).sort(position: 1).scroll(current_cursor, { field_type: Integer, field_name: 'position' }) do |item, cursor|
31
+ Mongoid.default_session['feed_items'].find.limit(scroll_by).sort(position: 1).scroll(current_cursor, field_type: Integer, field_name: 'position') do |item, cursor|
32
32
  puts "#{item['position']}: #{item['title']}"
33
33
  next_cursor = cursor
34
34
  total_shown += 1
@@ -36,7 +36,7 @@ while true
36
36
  break unless next_cursor
37
37
  # destroy an item just for the heck of it, scroll is not affected
38
38
  item = Mongoid.default_session['feed_items'].find.sort(position: 1).first
39
- Mongoid.default_session['feed_items'].find(_id: item["_id"]).remove
39
+ Mongoid.default_session['feed_items'].find(_id: item['_id']).remove
40
40
  end
41
41
 
42
42
  # this will be 20
@@ -1,13 +1,12 @@
1
1
  module Mongoid
2
2
  module Criterion
3
3
  module Scrollable
4
-
5
- def scroll(cursor = nil, &block)
4
+ def scroll(cursor = nil, &_block)
6
5
  criteria = self
7
6
  # we don't support scrolling over a criteria with multiple fields
8
7
  if criteria.options[:sort] && criteria.options[:sort].keys.size != 1
9
8
  raise Mongoid::Scroll::Errors::MultipleSortFieldsError.new(sort: criteria.options[:sort])
10
- elsif ! criteria.options.has_key?(:sort) || criteria.options[:sort].empty?
9
+ elsif !criteria.options.key?(:sort) || criteria.options[:sort].empty?
11
10
  # introduce a default sort order if there's none
12
11
  criteria = criteria.asc(:_id)
13
12
  end
@@ -27,7 +26,6 @@ module Mongoid
27
26
  criteria
28
27
  end
29
28
  end
30
-
31
29
  end
32
30
  end
33
31
  end
@@ -1,7 +1,6 @@
1
1
  module Mongoid
2
2
  module Scroll
3
3
  class Cursor
4
-
5
4
  attr_accessor :value, :tiebreak_id, :field_type, :field_name, :direction
6
5
 
7
6
  def initialize(value = nil, options = {})
@@ -12,10 +11,10 @@ module Mongoid
12
11
 
13
12
  def criteria
14
13
  mongo_value = value.class.mongoize(value) if value
15
- compare_direction = direction == 1 ? "$gt" : "$lt"
14
+ compare_direction = direction == 1 ? '$gt' : '$lt'
16
15
  cursor_criteria = { field_name => { compare_direction => mongo_value } } if mongo_value
17
16
  tiebreak_criteria = { field_name => mongo_value, :_id => { compare_direction => tiebreak_id } } if mongo_value && tiebreak_id
18
- (cursor_criteria || tiebreak_criteria) ? { '$or' => [ cursor_criteria, tiebreak_criteria].compact } : {}
17
+ cursor_criteria || tiebreak_criteria ? { '$or' => [cursor_criteria, tiebreak_criteria].compact } : {}
19
18
  end
20
19
 
21
20
  class << self
@@ -23,70 +22,71 @@ module Mongoid
23
22
  cursor = Mongoid::Scroll::Cursor.new(nil, options)
24
23
  value = record.respond_to?(cursor.field_name) ? record.send(cursor.field_name) : record[cursor.field_name]
25
24
  cursor.value = Mongoid::Scroll::Cursor.parse_field_value(cursor.field_type, cursor.field_name, value)
26
- cursor.tiebreak_id = record["_id"]
25
+ cursor.tiebreak_id = record['_id']
27
26
  cursor
28
27
  end
29
28
  end
30
29
 
31
30
  def to_s
32
- tiebreak_id ? [ Mongoid::Scroll::Cursor.transform_field_value(field_type, field_name, value), tiebreak_id ].join(":") : nil
31
+ tiebreak_id ? [Mongoid::Scroll::Cursor.transform_field_value(field_type, field_name, value), tiebreak_id].join(':') : nil
33
32
  end
34
33
 
35
34
  private
36
35
 
37
- def parse(value)
38
- return unless value
39
- parts = value.split(":")
40
- unless parts.length >= 2
41
- raise Mongoid::Scroll::Errors::InvalidCursorError.new({ cursor: value })
42
- end
43
- id = parts[-1]
44
- value = parts[0...-1].join(":")
45
- @value = Mongoid::Scroll::Cursor.parse_field_value(field_type, field_name, value)
36
+ def parse(value)
37
+ return unless value
38
+ parts = value.split(':')
39
+ unless parts.length >= 2
40
+ raise Mongoid::Scroll::Errors::InvalidCursorError.new(cursor: value)
41
+ end
42
+ id = parts[-1]
43
+ value = parts[0...-1].join(':')
44
+ @value = Mongoid::Scroll::Cursor.parse_field_value(field_type, field_name, value)
45
+ if Mongoid::Scroll.mongoid3?
46
46
  @tiebreak_id = Moped::BSON::ObjectId(id)
47
+ else
48
+ @tiebreak_id = BSON::ObjectId.from_string(id)
47
49
  end
50
+ end
48
51
 
49
- class << self
50
-
51
- def extract_field_options(options)
52
- if options && (field_name = options[:field_name]) && (field_type = options[:field_type])
53
- [ field_type.to_s, field_name.to_s ]
54
- elsif options && (field = options[:field])
55
- [ field.type.to_s, field.name.to_s ]
56
- else
57
- raise ArgumentError.new "Missing options[:field_name] and/or options[:field_type]."
58
- end
52
+ class << self
53
+ def extract_field_options(options)
54
+ if options && (field_name = options[:field_name]) && (field_type = options[:field_type])
55
+ [field_type.to_s, field_name.to_s]
56
+ elsif options && (field = options[:field])
57
+ [field.type.to_s, field.name.to_s]
58
+ else
59
+ raise ArgumentError.new 'Missing options[:field_name] and/or options[:field_type].'
59
60
  end
61
+ end
60
62
 
61
- def parse_field_value(field_type, field_name, value)
62
- case field_type.to_s
63
- when "Moped::BSON::ObjectId" then value
64
- when "String" then value.to_s
65
- when "DateTime" then value.is_a?(DateTime) ? value : Time.at(value.to_i).to_datetime
66
- when "Time" then value.is_a?(Time) ? value : Time.at(value.to_i)
67
- when "Date" then value.is_a?(Date) ? value : Time.at(value.to_i).utc.to_date
68
- when "Float" then value.to_f
69
- when "Integer" then value.to_i
70
- else
71
- raise Mongoid::Scroll::Errors::UnsupportedFieldTypeError.new(field: field_name, type: field_type)
72
- end
63
+ def parse_field_value(field_type, field_name, value)
64
+ case field_type.to_s
65
+ when 'BSON::ObjectId', 'Moped::BSON::ObjectId' then value
66
+ when 'String' then value.to_s
67
+ when 'DateTime' then value.is_a?(DateTime) ? value : Time.at(value.to_i).to_datetime
68
+ when 'Time' then value.is_a?(Time) ? value : Time.at(value.to_i)
69
+ when 'Date' then value.is_a?(Date) ? value : Time.at(value.to_i).utc.to_date
70
+ when 'Float' then value.to_f
71
+ when 'Integer' then value.to_i
72
+ else
73
+ raise Mongoid::Scroll::Errors::UnsupportedFieldTypeError.new(field: field_name, type: field_type)
73
74
  end
75
+ end
74
76
 
75
- def transform_field_value(field_type, field_name, value)
76
- case field_type.to_s
77
- when "Moped::BSON::ObjectId" then value
78
- when "String" then value.to_s
79
- when "Date" then Time.utc_time(value.year, value.month, value.day).to_i
80
- when "DateTime", "Time" then value.to_i
81
- when "Float" then value.to_f
82
- when "Integer" then value.to_i
83
- else
84
- raise Mongoid::Scroll::Errors::UnsupportedFieldTypeError.new(field: field_name, type: field_type)
85
- end
77
+ def transform_field_value(field_type, field_name, value)
78
+ case field_type.to_s
79
+ when 'BSON::ObjectId', 'Moped::BSON::ObjectId' then value
80
+ when 'String' then value.to_s
81
+ when 'Date' then Time.utc(value.year, value.month, value.day).to_i
82
+ when 'DateTime', 'Time' then value.to_i
83
+ when 'Float' then value.to_f
84
+ when 'Integer' then value.to_i
85
+ else
86
+ raise Mongoid::Scroll::Errors::UnsupportedFieldTypeError.new(field: field_name, type: field_type)
86
87
  end
87
-
88
88
  end
89
-
89
+ end
90
90
  end
91
91
  end
92
92
  end
@@ -2,7 +2,6 @@ module Mongoid
2
2
  module Scroll
3
3
  module Errors
4
4
  class Base < StandardError
5
-
6
5
  # Problem occurred.
7
6
  attr_reader :problem
8
7
 
@@ -21,60 +20,59 @@ module Mongoid
21
20
  @summary = create_summary(key, attributes)
22
21
  @resolution = create_resolution(key, attributes)
23
22
 
24
- "\nProblem:\n #{@problem}"+
25
- "\nSummary:\n #{@summary}"+
23
+ "\nProblem:\n #{@problem}" \
24
+ "\nSummary:\n #{@summary}" \
26
25
  "\nResolution:\n #{@resolution}"
27
26
  end
28
27
 
29
28
  private
30
29
 
31
- BASE_KEY = "mongoid.scroll.errors.messages" #:nodoc:
32
-
33
- # Given the key of the specific error and the options hash, translate the
34
- # message.
35
- #
36
- # === Parameters
37
- # [key] The key of the error in the locales.
38
- # [options] The objects to pass to create the message.
39
- #
40
- # Returns a localized error message string.
41
- def translate(key, options)
42
- ::I18n.translate("#{BASE_KEY}.#{key}", { :locale => :en }.merge(options)).strip
43
- end
30
+ BASE_KEY = 'mongoid.scroll.errors.messages' #:nodoc:
44
31
 
45
- # Create the problem.
46
- #
47
- # === Parameters
48
- # [key] The error key.
49
- # [attributes] The attributes to interpolate.
50
- #
51
- # Returns the problem.
52
- def create_problem(key, attributes)
53
- translate("#{key}.message", attributes)
54
- end
32
+ # Given the key of the specific error and the options hash, translate the
33
+ # message.
34
+ #
35
+ # === Parameters
36
+ # [key] The key of the error in the locales.
37
+ # [options] The objects to pass to create the message.
38
+ #
39
+ # Returns a localized error message string.
40
+ def translate(key, options)
41
+ ::I18n.translate("#{BASE_KEY}.#{key}", { locale: :en }.merge(options)).strip
42
+ end
55
43
 
56
- # Create the summary.
57
- #
58
- # === Parameters
59
- # [key] The error key.
60
- # [attributes] The attributes to interpolate.
61
- #
62
- # Returns the summary.
63
- def create_summary(key, attributes)
64
- translate("#{key}.summary", attributes)
65
- end
44
+ # Create the problem.
45
+ #
46
+ # === Parameters
47
+ # [key] The error key.
48
+ # [attributes] The attributes to interpolate.
49
+ #
50
+ # Returns the problem.
51
+ def create_problem(key, attributes)
52
+ translate("#{key}.message", attributes)
53
+ end
66
54
 
67
- # Create the resolution.
68
- #
69
- # === Parameters
70
- # [key] The error key.
71
- # [attributes] The attributes to interpolate.
72
- #
73
- # Returns the resolution.
74
- def create_resolution(key, attributes)
75
- translate("#{key}.resolution", attributes)
76
- end
55
+ # Create the summary.
56
+ #
57
+ # === Parameters
58
+ # [key] The error key.
59
+ # [attributes] The attributes to interpolate.
60
+ #
61
+ # Returns the summary.
62
+ def create_summary(key, attributes)
63
+ translate("#{key}.summary", attributes)
64
+ end
77
65
 
66
+ # Create the resolution.
67
+ #
68
+ # === Parameters
69
+ # [key] The error key.
70
+ # [attributes] The attributes to interpolate.
71
+ #
72
+ # Returns the resolution.
73
+ def create_resolution(key, attributes)
74
+ translate("#{key}.resolution", attributes)
75
+ end
78
76
  end
79
77
  end
80
78
  end
@@ -2,11 +2,9 @@ module Mongoid
2
2
  module Scroll
3
3
  module Errors
4
4
  class InvalidCursorError < Mongoid::Scroll::Errors::Base
5
-
6
5
  def initialize(opts = {})
7
- super(compose_message("invalid_cursor", opts))
6
+ super(compose_message('invalid_cursor', opts))
8
7
  end
9
-
10
8
  end
11
9
  end
12
10
  end
@@ -2,14 +2,12 @@ module Mongoid
2
2
  module Scroll
3
3
  module Errors
4
4
  class MultipleSortFieldsError < Mongoid::Scroll::Errors::Base
5
-
6
5
  def initialize(opts = {})
7
6
  if opts[:sort] && opts[:sort].is_a?(Hash)
8
- opts = opts.merge(sort: opts[:sort].keys.join(", "))
7
+ opts = opts.merge(sort: opts[:sort].keys.join(', '))
9
8
  end
10
- super(compose_message("multiple_sort_fields", opts))
9
+ super(compose_message('multiple_sort_fields', opts))
11
10
  end
12
-
13
11
  end
14
12
  end
15
13
  end
@@ -2,11 +2,9 @@ module Mongoid
2
2
  module Scroll
3
3
  module Errors
4
4
  class NoSuchFieldError < Mongoid::Scroll::Errors::Base
5
-
6
5
  def initialize(opts = {})
7
- super(compose_message("no_such_field", opts))
6
+ super(compose_message('no_such_field', opts))
8
7
  end
9
-
10
8
  end
11
9
  end
12
10
  end
@@ -2,11 +2,9 @@ module Mongoid
2
2
  module Scroll
3
3
  module Errors
4
4
  class UnsupportedFieldTypeError < Mongoid::Scroll::Errors::Base
5
-
6
5
  def initialize(opts = {})
7
- super(compose_message("unsupported_field_type", opts))
6
+ super(compose_message('unsupported_field_type', opts))
8
7
  end
9
-
10
8
  end
11
9
  end
12
10
  end
@@ -0,0 +1,7 @@
1
+ module Mongoid
2
+ module Scroll
3
+ def self.mongoid3?
4
+ ::Mongoid.const_defined? :Observer
5
+ end
6
+ end
7
+ end
@@ -1,5 +1,5 @@
1
1
  module Mongoid
2
2
  module Scroll
3
- VERSION = '0.2.1'
3
+ VERSION = '0.3.0'
4
4
  end
5
5
  end
@@ -1,9 +1,10 @@
1
1
  require 'i18n'
2
2
 
3
- I18n.load_path << File.join(File.dirname(__FILE__), "config", "locales", "en.yml")
3
+ I18n.load_path << File.join(File.dirname(__FILE__), 'config', 'locales', 'en.yml')
4
4
 
5
5
  require 'mongoid'
6
6
  require 'mongoid/scroll/version'
7
+ require 'mongoid/scroll/mongoid'
7
8
  require 'mongoid/scroll/errors'
8
9
  require 'mongoid/scroll/cursor'
9
10
 
@@ -1,2 +1 @@
1
1
  require 'mongoid-scroll'
2
-
@@ -1,25 +1,29 @@
1
1
  module Moped
2
2
  module Scrollable
3
-
4
- def scroll(cursor = nil, options = { field_type: Moped::BSON::ObjectId }, &block)
3
+ def scroll(cursor = nil, options = nil, &_block)
4
+ options = if Mongoid::Scroll.mongoid3?
5
+ { field_type: Moped::BSON::ObjectId }
6
+ else
7
+ { field_type: BSON::ObjectId }
8
+ end unless options
5
9
  query = Query.new(collection, operation.selector.dup)
6
10
  query.operation.skip = operation.skip
7
11
  query.operation.limit = operation.limit
8
12
  # we don't support scrolling over a criteria with multiple fields
9
- if query.operation.selector["$orderby"] && query.operation.selector["$orderby"].keys.size != 1
10
- raise Mongoid::Scroll::Errors::MultipleSortFieldsError.new(sort: query.operation.selector["$orderby"])
11
- elsif ! query.operation.selector.has_key?("$orderby") || query.operation.selector["$orderby"].empty?
13
+ if query.operation.selector['$orderby'] && query.operation.selector['$orderby'].keys.size != 1
14
+ raise Mongoid::Scroll::Errors::MultipleSortFieldsError.new(sort: query.operation.selector['$orderby'])
15
+ elsif !query.operation.selector.key?('$orderby') || query.operation.selector['$orderby'].empty?
12
16
  # introduce a default sort order if there's none
13
17
  query.sort(_id: 1)
14
18
  end
15
19
  # scroll field and direction
16
- scroll_field = query.operation.selector["$orderby"].keys.first
17
- scroll_direction = query.operation.selector["$orderby"].values.first.to_i
20
+ scroll_field = query.operation.selector['$orderby'].keys.first
21
+ scroll_direction = query.operation.selector['$orderby'].values.first.to_i
18
22
  # scroll cursor from the parameter, with value and tiebreak_id
19
23
  cursor_options = { field_name: scroll_field, field_type: options[:field_type], direction: scroll_direction }
20
24
  cursor = cursor.is_a?(Mongoid::Scroll::Cursor) ? cursor : Mongoid::Scroll::Cursor.new(cursor, cursor_options)
21
- query.operation.selector["$query"] = query.operation.selector["$query"].merge(cursor.criteria)
22
- query.operation.selector["$orderby"] = query.operation.selector["$orderby"].merge(_id: scroll_direction)
25
+ query.operation.selector['$query'] = query.operation.selector['$query'].merge(cursor.criteria)
26
+ query.operation.selector['$orderby'] = query.operation.selector['$orderby'].merge(_id: scroll_direction)
23
27
  # scroll
24
28
  if block_given?
25
29
  query.each do |record|
@@ -29,6 +33,5 @@ module Moped
29
33
  query
30
34
  end
31
35
  end
32
-
33
36
  end
34
37
  end
@@ -1,20 +1,18 @@
1
- $:.push File.expand_path("../lib", __FILE__)
2
- require "mongoid/scroll/version"
1
+ $LOAD_PATH.push File.expand_path('../lib', __FILE__)
2
+ require 'mongoid/scroll/version'
3
3
 
4
4
  Gem::Specification.new do |s|
5
- s.name = "mongoid-scroll"
5
+ s.name = 'mongoid-scroll'
6
6
  s.version = Mongoid::Scroll::VERSION
7
- s.authors = [ "Daniel Doubrovkine", "Frank Macreery" ]
8
- s.email = "dblock@dblock.org"
7
+ s.authors = ['Daniel Doubrovkine', 'Frank Macreery']
8
+ s.email = 'dblock@dblock.org'
9
9
  s.platform = Gem::Platform::RUBY
10
10
  s.required_rubygems_version = '>= 1.3.6'
11
11
  s.files = `git ls-files`.split("\n")
12
- s.require_paths = [ "lib" ]
13
- s.homepage = "http://github.com/dblock/mongoid-scroll"
14
- s.licenses = [ "MIT" ]
15
- s.summary = "Mongoid extensions to enable infinite scroll."
16
- s.add_dependency "mongoid", ">= 3.0"
17
- s.add_dependency "i18n"
12
+ s.require_paths = ['lib']
13
+ s.homepage = 'http://github.com/dblock/mongoid-scroll'
14
+ s.licenses = ['MIT']
15
+ s.summary = 'Mongoid extensions to enable infinite scroll.'
16
+ s.add_dependency 'mongoid', '>= 3.0'
17
+ s.add_dependency 'i18n'
18
18
  end
19
-
20
-
@@ -1,32 +1,32 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mongoid::Criteria do
4
- context "scrollable" do
4
+ context 'scrollable' do
5
5
  subject do
6
6
  Feed::Item
7
7
  end
8
- it ":scroll" do
8
+ it ':scroll' do
9
9
  subject.should.respond_to? :scroll
10
10
  end
11
11
  end
12
- context "with multiple sort fields" do
12
+ context 'with multiple sort fields' do
13
13
  subject do
14
14
  Feed::Item.desc(:name).asc(:value)
15
15
  end
16
- it "raises Mongoid::Scroll::Errors::MultipleSortFieldsError" do
16
+ it 'raises Mongoid::Scroll::Errors::MultipleSortFieldsError' do
17
17
  expect { subject.scroll }.to raise_error Mongoid::Scroll::Errors::MultipleSortFieldsError,
18
- /You're attempting to scroll over data with a sort order that includes multiple fields: name, value./
18
+ /You're attempting to scroll over data with a sort order that includes multiple fields: name, value./
19
19
  end
20
20
  end
21
- context "with no sort" do
21
+ context 'with no sort' do
22
22
  subject do
23
23
  Feed::Item.all
24
24
  end
25
- it "adds a default sort by _id" do
26
- subject.scroll.options[:sort].should == { "_id" => 1 }
25
+ it 'adds a default sort by _id' do
26
+ subject.scroll.options[:sort].should == { '_id' => 1 }
27
27
  end
28
28
  end
29
- context "with data" do
29
+ context 'with data' do
30
30
  before :each do
31
31
  10.times do |i|
32
32
  Feed::Item.create!(
@@ -38,10 +38,10 @@ describe Mongoid::Criteria do
38
38
  )
39
39
  end
40
40
  end
41
- context "default" do
42
- it "scrolls all" do
41
+ context 'default' do
42
+ it 'scrolls all' do
43
43
  records = []
44
- Feed::Item.all.scroll do |record, next_cursor|
44
+ Feed::Item.all.scroll do |record, _next_cursor|
45
45
  records << record
46
46
  end
47
47
  records.size.should == 10
@@ -50,15 +50,15 @@ describe Mongoid::Criteria do
50
50
  end
51
51
  { a_string: String, a_integer: Integer, a_date: Date, a_datetime: DateTime }.each_pair do |field_name, field_type|
52
52
  context field_type do
53
- it "scrolls all with a block" do
53
+ it 'scrolls all with a block' do
54
54
  records = []
55
- Feed::Item.asc(field_name).scroll do |record, next_cursor|
55
+ Feed::Item.asc(field_name).scroll do |record, _next_cursor|
56
56
  records << record
57
57
  end
58
58
  records.size.should == 10
59
59
  records.should eq Feed::Item.all.to_a
60
60
  end
61
- it "scrolls all with a break" do
61
+ it 'scrolls all with a break' do
62
62
  records = []
63
63
  cursor = nil
64
64
  Feed::Item.asc(field_name).limit(5).scroll do |record, next_cursor|
@@ -73,19 +73,19 @@ describe Mongoid::Criteria do
73
73
  records.size.should == 10
74
74
  records.should eq Feed::Item.all.to_a
75
75
  end
76
- it "scrolls in descending order" do
76
+ it 'scrolls in descending order' do
77
77
  records = []
78
- Feed::Item.desc(field_name).limit(3).scroll do |record, next_cursor|
78
+ Feed::Item.desc(field_name).limit(3).scroll do |record, _next_cursor|
79
79
  records << record
80
80
  end
81
81
  records.size.should == 3
82
82
  records.should eq Feed::Item.desc(field_name).limit(3).to_a
83
83
  end
84
- it "map" do
85
- record = Feed::Item.desc(field_name).limit(3).scroll.map { |record, cursor| record }.last
86
- cursor = Mongoid::Scroll::Cursor.from_record(record, { field_type: field_type, field_name: field_name })
84
+ it 'map' do
85
+ record = Feed::Item.desc(field_name).limit(3).scroll.map { |r, _| r }.last
86
+ cursor = Mongoid::Scroll::Cursor.from_record(record, field_type: field_type, field_name: field_name)
87
87
  cursor.should_not be_nil
88
- cursor.to_s.split(":").should == [
88
+ cursor.to_s.split(':').should == [
89
89
  Mongoid::Scroll::Cursor.transform_field_value(field_type, field_name, record.send(field_name)).to_s,
90
90
  record.id.to_s
91
91
  ]
@@ -93,18 +93,18 @@ describe Mongoid::Criteria do
93
93
  end
94
94
  end
95
95
  end
96
- context "with overlapping data" do
96
+ context 'with overlapping data' do
97
97
  before :each do
98
98
  3.times { Feed::Item.create! a_integer: 5 }
99
99
  Feed::Item.first.update_attributes!(name: Array(1000).join('a'))
100
100
  end
101
- it "natural order is different from order by id" do
101
+ it 'natural order is different from order by id' do
102
102
  # natural order isn't necessarily going to be the same as _id order
103
103
  # if a document is updated and grows in size, it may need to be relocated and
104
104
  # thus cause the natural order to change
105
- Feed::Item.order_by("$natural" => 1).to_a.should_not eq Feed::Item.order_by(_id: 1).to_a
105
+ Feed::Item.order_by('$natural' => 1).to_a.should_not eq Feed::Item.order_by(_id: 1).to_a
106
106
  end
107
- [ { a_integer: 1 }, { a_integer: -1 }].each do |sort_order|
107
+ [{ a_integer: 1 }, { a_integer: -1 }].each do |sort_order|
108
108
  it "scrolls by #{sort_order}" do
109
109
  records = []
110
110
  cursor = nil
@@ -113,7 +113,7 @@ describe Mongoid::Criteria do
113
113
  cursor = next_cursor
114
114
  end
115
115
  records.size.should == 2
116
- Feed::Item.order_by(sort_order).scroll(cursor) do |record, next_cursor|
116
+ Feed::Item.order_by(sort_order).scroll(cursor) do |record, _next_cursor|
117
117
  records << record
118
118
  end
119
119
  records.size.should == 3
@@ -1,120 +1,120 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mongoid::Scroll::Cursor do
4
- context "an empty cursor" do
4
+ context 'an empty cursor' do
5
5
  subject do
6
- Mongoid::Scroll::Cursor.new nil, field_name: "a_string", field_type: String
6
+ Mongoid::Scroll::Cursor.new nil, field_name: 'a_string', field_type: String
7
7
  end
8
8
  its(:tiebreak_id) { should be_nil }
9
9
  its(:value) { should be_nil }
10
10
  its(:criteria) { should eq({}) }
11
11
  end
12
- context "an invalid cursor" do
13
- it "raises InvalidCursorError" do
14
- expect { Mongoid::Scroll::Cursor.new "invalid", field_name: "a_string", field_type: String }.to raise_error Mongoid::Scroll::Errors::InvalidCursorError,
15
- /The cursor supplied is invalid: invalid./
12
+ context 'an invalid cursor' do
13
+ it 'raises InvalidCursorError' do
14
+ expect { Mongoid::Scroll::Cursor.new 'invalid', field_name: 'a_string', field_type: String }.to raise_error Mongoid::Scroll::Errors::InvalidCursorError,
15
+ /The cursor supplied is invalid: invalid./
16
16
  end
17
17
  end
18
- context "a string field cursor" do
19
- let(:feed_item) { Feed::Item.create!(a_string: "astring") }
18
+ context 'a string field cursor' do
19
+ let(:feed_item) { Feed::Item.create!(a_string: 'astring') }
20
20
  subject do
21
- Mongoid::Scroll::Cursor.new "#{feed_item.a_string}:#{feed_item.id}", field_name: "a_string", field_type: String
21
+ Mongoid::Scroll::Cursor.new "#{feed_item.a_string}:#{feed_item.id}", field_name: 'a_string', field_type: String
22
22
  end
23
23
  its(:value) { should eq feed_item.a_string }
24
24
  its(:tiebreak_id) { should eq feed_item.id }
25
25
  its(:criteria) {
26
- should eq({ "$or" => [
27
- { "a_string" => { "$gt" => feed_item.a_string }},
28
- { "a_string" => feed_item.a_string, :_id => { "$gt" => feed_item.id }}
29
- ]})
26
+ should eq('$or' => [
27
+ { 'a_string' => { '$gt' => feed_item.a_string } },
28
+ { 'a_string' => feed_item.a_string, :_id => { '$gt' => feed_item.id } }
29
+ ])
30
30
  }
31
31
  end
32
- context "an integer field cursor" do
32
+ context 'an integer field cursor' do
33
33
  let(:feed_item) { Feed::Item.create!(a_integer: 10) }
34
34
  subject do
35
- Mongoid::Scroll::Cursor.new "#{feed_item.a_integer}:#{feed_item.id}", field_name: "a_integer", field_type: Integer
35
+ Mongoid::Scroll::Cursor.new "#{feed_item.a_integer}:#{feed_item.id}", field_name: 'a_integer', field_type: Integer
36
36
  end
37
37
  its(:value) { should eq feed_item.a_integer }
38
38
  its(:tiebreak_id) { should eq feed_item.id }
39
39
  its(:criteria) {
40
- should eq({ "$or" => [
41
- { "a_integer" => { "$gt" => feed_item.a_integer }},
42
- { "a_integer" => feed_item.a_integer, :_id => { "$gt" => feed_item.id }}
43
- ]})
40
+ should eq('$or' => [
41
+ { 'a_integer' => { '$gt' => feed_item.a_integer } },
42
+ { 'a_integer' => feed_item.a_integer, :_id => { '$gt' => feed_item.id } }
43
+ ])
44
44
  }
45
45
  end
46
- context "a date/time field cursor" do
46
+ context 'a date/time field cursor' do
47
47
  let(:feed_item) { Feed::Item.create!(a_datetime: DateTime.new(2013, 12, 21, 1, 42, 3)) }
48
48
  subject do
49
- Mongoid::Scroll::Cursor.new "#{feed_item.a_datetime.to_i}:#{feed_item.id}", field_name: "a_datetime", field_type: DateTime
49
+ Mongoid::Scroll::Cursor.new "#{feed_item.a_datetime.to_i}:#{feed_item.id}", field_name: 'a_datetime', field_type: DateTime
50
50
  end
51
51
  its(:value) { should eq feed_item.a_datetime }
52
52
  its(:tiebreak_id) { should eq feed_item.id }
53
53
  its(:to_s) { should eq "#{feed_item.a_datetime.to_i}:#{feed_item.id}" }
54
54
  its(:criteria) {
55
- should eq({ "$or" => [
56
- { "a_datetime" => { "$gt" => feed_item.a_datetime }},
57
- { "a_datetime" => feed_item.a_datetime, :_id => { "$gt" => feed_item.id }}
58
- ]})
55
+ should eq('$or' => [
56
+ { 'a_datetime' => { '$gt' => feed_item.a_datetime } },
57
+ { 'a_datetime' => feed_item.a_datetime, :_id => { '$gt' => feed_item.id } }
58
+ ])
59
59
  }
60
60
  end
61
- context "a date field cursor" do
61
+ context 'a date field cursor' do
62
62
  let(:feed_item) { Feed::Item.create!(a_date: Date.new(2013, 12, 21)) }
63
63
  subject do
64
- Mongoid::Scroll::Cursor.new "#{feed_item.a_date.to_datetime.to_i}:#{feed_item.id}", field_name: "a_date", field_type: Date
64
+ Mongoid::Scroll::Cursor.new "#{feed_item.a_date.to_datetime.to_i}:#{feed_item.id}", field_name: 'a_date', field_type: Date
65
65
  end
66
66
  its(:value) { should eq feed_item.a_date }
67
67
  its(:tiebreak_id) { should eq feed_item.id }
68
68
  its(:to_s) { should eq "#{feed_item.a_date.to_datetime.to_i}:#{feed_item.id}" }
69
69
  its(:criteria) {
70
- should eq({ "$or" => [
71
- { "a_date" => { "$gt" => feed_item.a_date.to_datetime }},
72
- { "a_date" => feed_item.a_date.to_datetime, :_id => { "$gt" => feed_item.id }}
73
- ]})
70
+ should eq('$or' => [
71
+ { 'a_date' => { '$gt' => feed_item.a_date.to_datetime } },
72
+ { 'a_date' => feed_item.a_date.to_datetime, :_id => { '$gt' => feed_item.id } }
73
+ ])
74
74
  }
75
75
  end
76
- context "a time field cursor" do
76
+ context 'a time field cursor' do
77
77
  let(:feed_item) { Feed::Item.create!(a_time: Time.new(2013, 12, 21, 1, 2, 3)) }
78
78
  subject do
79
- Mongoid::Scroll::Cursor.new "#{feed_item.a_time.to_i}:#{feed_item.id}", field_name: "a_time", field_type: Time
79
+ Mongoid::Scroll::Cursor.new "#{feed_item.a_time.to_i}:#{feed_item.id}", field_name: 'a_time', field_type: Time
80
80
  end
81
81
  its(:value) { should eq feed_item.a_time }
82
82
  its(:tiebreak_id) { should eq feed_item.id }
83
83
  its(:to_s) { should eq "#{feed_item.a_time.to_i}:#{feed_item.id}" }
84
84
  its(:criteria) {
85
- should eq({ "$or" => [
86
- { "a_time" => { "$gt" => feed_item.a_time }},
87
- { "a_time" => feed_item.a_time, :_id => { "$gt" => feed_item.id }}
88
- ]})
85
+ should eq('$or' => [
86
+ { 'a_time' => { '$gt' => feed_item.a_time } },
87
+ { 'a_time' => feed_item.a_time, :_id => { '$gt' => feed_item.id } }
88
+ ])
89
89
  }
90
90
  end
91
- context "a time field cursor with a field option" do
91
+ context 'a time field cursor with a field option' do
92
92
  let(:feed_item) { Feed::Item.create!(a_time: Time.new(2013, 12, 21, 1, 2, 3)) }
93
93
  subject do
94
- Mongoid::Scroll::Cursor.new "#{feed_item.a_time.to_i}:#{feed_item.id}", field: Feed::Item.fields["a_time"]
94
+ Mongoid::Scroll::Cursor.new "#{feed_item.a_time.to_i}:#{feed_item.id}", field: Feed::Item.fields['a_time']
95
95
  end
96
96
  its(:value) { should eq feed_item.a_time }
97
97
  its(:tiebreak_id) { should eq feed_item.id }
98
98
  its(:to_s) { should eq "#{feed_item.a_time.to_i}:#{feed_item.id}" }
99
99
  its(:criteria) {
100
- should eq({ "$or" => [
101
- { "a_time" => { "$gt" => feed_item.a_time }},
102
- { "a_time" => feed_item.a_time, :_id => { "$gt" => feed_item.id }}
103
- ]})
100
+ should eq('$or' => [
101
+ { 'a_time' => { '$gt' => feed_item.a_time } },
102
+ { 'a_time' => feed_item.a_time, :_id => { '$gt' => feed_item.id } }
103
+ ])
104
104
  }
105
105
  end
106
- context "an array field cursor" do
107
- let(:feed_item) { Feed::Item.create!(a_array: [ "x", "y" ]) }
108
- it "is not supported" do
106
+ context 'an array field cursor' do
107
+ let(:feed_item) { Feed::Item.create!(a_array: ['x', 'y']) }
108
+ it 'is not supported' do
109
109
  expect {
110
- Mongoid::Scroll::Cursor.from_record feed_item, field_name: "a_array", field_type: Array
110
+ Mongoid::Scroll::Cursor.from_record feed_item, field_name: 'a_array', field_type: Array
111
111
  }.to raise_error Mongoid::Scroll::Errors::UnsupportedFieldTypeError, /The type of the field 'a_array' is not supported: Array./
112
112
  end
113
113
  end
114
- context "an invalid field cursor" do
115
- it "raises ArgumentError" do
114
+ context 'an invalid field cursor' do
115
+ it 'raises ArgumentError' do
116
116
  expect {
117
- Mongoid::Scroll::Cursor.new "invalid:whatever", {}
117
+ Mongoid::Scroll::Cursor.new 'invalid:whatever', {}
118
118
  }.to raise_error ArgumentError
119
119
  end
120
120
  end
@@ -3,4 +3,3 @@ require 'spec_helper'
3
3
  describe Mongoid::Scroll::VERSION do
4
4
  it { should_not be_nil }
5
5
  end
6
-
@@ -1,32 +1,32 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Moped::Query do
4
- context "scrollable" do
4
+ context 'scrollable' do
5
5
  subject do
6
6
  Mongoid.default_session['feed_items'].find
7
7
  end
8
- it ":scroll" do
8
+ it ':scroll' do
9
9
  subject.should.respond_to? :scroll
10
10
  end
11
11
  end
12
- context "with multiple sort fields" do
12
+ context 'with multiple sort fields' do
13
13
  subject do
14
14
  Mongoid.default_session['feed_items'].find.sort(name: 1, value: -1)
15
15
  end
16
- it "raises Mongoid::Scroll::Errors::MultipleSortFieldsError" do
16
+ it 'raises Mongoid::Scroll::Errors::MultipleSortFieldsError' do
17
17
  expect { subject.scroll }.to raise_error Mongoid::Scroll::Errors::MultipleSortFieldsError,
18
- /You're attempting to scroll over data with a sort order that includes multiple fields: name, value./
18
+ /You're attempting to scroll over data with a sort order that includes multiple fields: name, value./
19
19
  end
20
20
  end
21
- context "with no sort" do
21
+ context 'with no sort' do
22
22
  subject do
23
23
  Mongoid.default_session['feed_items'].find
24
24
  end
25
- it "adds a default sort by _id" do
26
- subject.scroll.operation.selector["$orderby"].should == { _id: 1 }
25
+ it 'adds a default sort by _id' do
26
+ subject.scroll.operation.selector['$orderby'].should == { _id: 1 }
27
27
  end
28
28
  end
29
- context "with data" do
29
+ context 'with data' do
30
30
  before :each do
31
31
  10.times do |i|
32
32
  Mongoid.default_session['feed_items'].insert(
@@ -38,10 +38,10 @@ describe Moped::Query do
38
38
  )
39
39
  end
40
40
  end
41
- context "default" do
42
- it "scrolls all" do
41
+ context 'default' do
42
+ it 'scrolls all' do
43
43
  records = []
44
- Mongoid.default_session['feed_items'].find.scroll do |record, next_cursor|
44
+ Mongoid.default_session['feed_items'].find.scroll do |record, _next_cursor|
45
45
  records << record
46
46
  end
47
47
  records.size.should == 10
@@ -50,63 +50,63 @@ describe Moped::Query do
50
50
  end
51
51
  { a_string: String, a_integer: Integer, a_date: Date, a_datetime: DateTime }.each_pair do |field_name, field_type|
52
52
  context field_type do
53
- it "scrolls all with a block" do
53
+ it 'scrolls all with a block' do
54
54
  records = []
55
- Mongoid.default_session['feed_items'].find.sort(field_name => 1).scroll(nil, { field_type: field_type }) do |record, next_cursor|
55
+ Mongoid.default_session['feed_items'].find.sort(field_name => 1).scroll(nil, field_type: field_type) do |record, _next_cursor|
56
56
  records << record
57
57
  end
58
58
  records.size.should == 10
59
59
  records.should eq Mongoid.default_session['feed_items'].find.to_a
60
60
  end
61
- it "scrolls all with a break" do
61
+ it 'scrolls all with a break' do
62
62
  records = []
63
63
  cursor = nil
64
- Mongoid.default_session['feed_items'].find.sort(field_name => 1).limit(5).scroll(nil, { field_type: field_type }) do |record, next_cursor|
64
+ Mongoid.default_session['feed_items'].find.sort(field_name => 1).limit(5).scroll(nil, field_type: field_type) do |record, next_cursor|
65
65
  records << record
66
66
  cursor = next_cursor
67
67
  end
68
68
  records.size.should == 5
69
- Mongoid.default_session['feed_items'].find.sort(field_name => 1).scroll(cursor, { field_type: field_type }) do |record, next_cursor|
69
+ Mongoid.default_session['feed_items'].find.sort(field_name => 1).scroll(cursor, field_type: field_type) do |record, next_cursor|
70
70
  records << record
71
71
  cursor = next_cursor
72
72
  end
73
73
  records.size.should == 10
74
74
  records.should eq Mongoid.default_session['feed_items'].find.to_a
75
75
  end
76
- it "scrolls in descending order" do
76
+ it 'scrolls in descending order' do
77
77
  records = []
78
- Mongoid.default_session['feed_items'].find.sort(field_name => -1).limit(3).scroll(nil, { field_type: field_type, field_name: field_name }) do |record, next_cursor|
78
+ Mongoid.default_session['feed_items'].find.sort(field_name => -1).limit(3).scroll(nil, field_type: field_type, field_name: field_name) do |record, _next_cursor|
79
79
  records << record
80
80
  end
81
81
  records.size.should == 3
82
82
  records.should eq Mongoid.default_session['feed_items'].find.sort(field_name => -1).limit(3).to_a
83
83
  end
84
- it "map" do
85
- record = Mongoid.default_session['feed_items'].find.limit(3).scroll(nil, { field_type: field_type, field_name: field_name }).map {
86
- |record, cursor| record
84
+ it 'map' do
85
+ record = Mongoid.default_session['feed_items'].find.limit(3).scroll(nil, field_type: field_type, field_name: field_name).map {
86
+ |r, _| r
87
87
  }.last
88
- cursor = Mongoid::Scroll::Cursor.from_record(record, { field_type: field_type, field_name: field_name })
88
+ cursor = Mongoid::Scroll::Cursor.from_record(record, field_type: field_type, field_name: field_name)
89
89
  cursor.should_not be_nil
90
- cursor.to_s.split(":").should == [
90
+ cursor.to_s.split(':').should == [
91
91
  Mongoid::Scroll::Cursor.transform_field_value(field_type, field_name, record[field_name.to_s]).to_s,
92
- record["_id"].to_s
92
+ record['_id'].to_s
93
93
  ]
94
94
  end
95
95
  end
96
96
  end
97
97
  end
98
- context "with overlapping data" do
98
+ context 'with overlapping data' do
99
99
  before :each do
100
100
  3.times { Feed::Item.create! a_integer: 5 }
101
101
  Feed::Item.first.update_attributes!(name: Array(1000).join('a'))
102
102
  end
103
- it "natural order is different from order by id" do
103
+ it 'natural order is different from order by id' do
104
104
  # natural order isn't necessarily going to be the same as _id order
105
105
  # if a document is updated and grows in size, it may need to be relocated and
106
106
  # thus cause the natural order to change
107
- Feed::Item.order_by("$natural" => 1).to_a.should_not eq Feed::Item.order_by(_id: 1).to_a
107
+ Feed::Item.order_by('$natural' => 1).to_a.should_not eq Feed::Item.order_by(_id: 1).to_a
108
108
  end
109
- [ { a_integer: 1 }, { a_integer: -1 }].each do |sort_order|
109
+ [{ a_integer: 1 }, { a_integer: -1 }].each do |sort_order|
110
110
  it "scrolls by #{sort_order}" do
111
111
  records = []
112
112
  cursor = nil
@@ -115,7 +115,7 @@ describe Moped::Query do
115
115
  cursor = next_cursor
116
116
  end
117
117
  records.size.should == 2
118
- Mongoid.default_session['feed_items'].find.sort(sort_order).scroll(cursor) do |record, next_cursor|
118
+ Mongoid.default_session['feed_items'].find.sort(sort_order).scroll(cursor) do |record, _next_cursor|
119
119
  records << record
120
120
  end
121
121
  records.size.should == 3
data/spec/spec_helper.rb CHANGED
@@ -18,4 +18,3 @@ RSpec.configure do |config|
18
18
  Mongoid.purge!
19
19
  end
20
20
  end
21
-
@@ -2,6 +2,7 @@ module Feed
2
2
  class Item
3
3
  include Mongoid::Document
4
4
 
5
+ field :name, type: String
5
6
  field :a_integer, type: Integer
6
7
  field :a_string, type: String
7
8
  field :a_datetime, type: DateTime
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid-scroll
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
5
- prerelease:
4
+ version: 0.3.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Daniel Doubrovkine
@@ -10,38 +9,34 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2013-02-21 00:00:00.000000000 Z
12
+ date: 2014-07-02 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: mongoid
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
- - - ! '>='
18
+ - - '>='
21
19
  - !ruby/object:Gem::Version
22
20
  version: '3.0'
23
21
  type: :runtime
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
24
  requirements:
28
- - - ! '>='
25
+ - - '>='
29
26
  - !ruby/object:Gem::Version
30
27
  version: '3.0'
31
28
  - !ruby/object:Gem::Dependency
32
29
  name: i18n
33
30
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
31
  requirements:
36
- - - ! '>='
32
+ - - '>='
37
33
  - !ruby/object:Gem::Version
38
34
  version: '0'
39
35
  type: :runtime
40
36
  prerelease: false
41
37
  version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
38
  requirements:
44
- - - ! '>='
39
+ - - '>='
45
40
  - !ruby/object:Gem::Version
46
41
  version: '0'
47
42
  description:
@@ -52,6 +47,7 @@ extra_rdoc_files: []
52
47
  files:
53
48
  - .gitignore
54
49
  - .rspec
50
+ - .rubocop.yml
55
51
  - .travis.yml
56
52
  - CHANGELOG.md
57
53
  - Gemfile
@@ -70,6 +66,7 @@ files:
70
66
  - lib/mongoid/scroll/errors/multiple_sort_fields_error.rb
71
67
  - lib/mongoid/scroll/errors/no_such_field_error.rb
72
68
  - lib/mongoid/scroll/errors/unsupported_field_type_error.rb
69
+ - lib/mongoid/scroll/mongoid.rb
73
70
  - lib/mongoid/scroll/version.rb
74
71
  - lib/mongoid_scroll.rb
75
72
  - lib/moped/scrollable.rb
@@ -83,29 +80,25 @@ files:
83
80
  homepage: http://github.com/dblock/mongoid-scroll
84
81
  licenses:
85
82
  - MIT
83
+ metadata: {}
86
84
  post_install_message:
87
85
  rdoc_options: []
88
86
  require_paths:
89
87
  - lib
90
88
  required_ruby_version: !ruby/object:Gem::Requirement
91
- none: false
92
89
  requirements:
93
- - - ! '>='
90
+ - - '>='
94
91
  - !ruby/object:Gem::Version
95
92
  version: '0'
96
- segments:
97
- - 0
98
- hash: -2452181324971075888
99
93
  required_rubygems_version: !ruby/object:Gem::Requirement
100
- none: false
101
94
  requirements:
102
- - - ! '>='
95
+ - - '>='
103
96
  - !ruby/object:Gem::Version
104
97
  version: 1.3.6
105
98
  requirements: []
106
99
  rubyforge_project:
107
- rubygems_version: 1.8.25
100
+ rubygems_version: 2.1.11
108
101
  signing_key:
109
- specification_version: 3
102
+ specification_version: 4
110
103
  summary: Mongoid extensions to enable infinite scroll.
111
104
  test_files: []