chewy 0.7.0 → 0.8.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 +4 -4
- data/.gitignore +2 -0
- data/.rspec +0 -1
- data/.travis.yml +2 -2
- data/Appraisals +6 -2
- data/CHANGELOG.md +29 -1
- data/Gemfile +4 -0
- data/README.md +137 -19
- data/chewy.gemspec +1 -0
- data/gemfiles/rails.3.2.activerecord.gemfile +2 -0
- data/gemfiles/rails.3.2.activerecord.kaminari.gemfile +1 -1
- data/gemfiles/rails.4.0.activerecord.gemfile +2 -0
- data/gemfiles/rails.4.0.activerecord.kaminari.gemfile +1 -1
- data/gemfiles/rails.4.0.mongoid.gemfile +2 -0
- data/gemfiles/rails.4.0.mongoid.kaminari.gemfile +1 -1
- data/gemfiles/rails.4.1.activerecord.gemfile +2 -0
- data/gemfiles/rails.4.1.activerecord.kaminari.gemfile +1 -1
- data/gemfiles/rails.4.1.mongoid.gemfile +2 -0
- data/gemfiles/rails.4.1.mongoid.kaminari.gemfile +1 -1
- data/gemfiles/rails.4.2.activerecord.gemfile +2 -0
- data/gemfiles/rails.4.2.activerecord.kaminari.gemfile +1 -1
- data/gemfiles/rails.4.2.mongoid.gemfile +2 -0
- data/gemfiles/rails.4.2.mongoid.kaminari.gemfile +1 -1
- data/lib/chewy.rb +1 -2
- data/lib/chewy/config.rb +3 -3
- data/lib/chewy/fields/base.rb +27 -30
- data/lib/chewy/fields/root.rb +9 -19
- data/lib/chewy/query.rb +34 -1
- data/lib/chewy/railtie.rb +1 -0
- data/lib/chewy/rspec/update_index.rb +16 -6
- data/lib/chewy/strategy.rb +12 -0
- data/lib/chewy/strategy/atomic.rb +1 -1
- data/lib/chewy/strategy/resque.rb +26 -0
- data/lib/chewy/strategy/sidekiq.rb +26 -0
- data/lib/chewy/strategy/urgent.rb +1 -1
- data/lib/chewy/type.rb +2 -0
- data/lib/chewy/type/adapter/active_record.rb +7 -3
- data/lib/chewy/type/adapter/mongoid.rb +5 -0
- data/lib/chewy/type/adapter/orm.rb +1 -1
- data/lib/chewy/type/crutch.rb +31 -0
- data/lib/chewy/type/import.rb +7 -6
- data/lib/chewy/type/mapping.rb +7 -3
- data/lib/chewy/type/observe.rb +24 -35
- data/lib/chewy/version.rb +1 -1
- data/spec/chewy/fields/base_spec.rb +26 -19
- data/spec/chewy/query_spec.rb +13 -0
- data/spec/chewy/runtime_spec.rb +1 -1
- data/spec/chewy/strategy/resque_spec.rb +35 -0
- data/spec/chewy/strategy/sidekiq_spec.rb +35 -0
- data/spec/chewy/type/adapter/mongoid_spec.rb +18 -9
- data/spec/chewy/type/mapping_spec.rb +14 -9
- data/spec/chewy/type/observe_spec.rb +22 -7
- data/spec/spec_helper.rb +1 -0
- metadata +23 -2
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            module Chewy
         | 
| 2 | 
            +
              class Type
         | 
| 3 | 
            +
                module Crutch
         | 
| 4 | 
            +
                  extend ActiveSupport::Concern
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  included do
         | 
| 7 | 
            +
                    class_attribute :_crutches
         | 
| 8 | 
            +
                    self._crutches = {}
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  class Crutches
         | 
| 12 | 
            +
                    def initialize type, collection
         | 
| 13 | 
            +
                      @type, @collection = type, collection
         | 
| 14 | 
            +
                      @type._crutches.keys.each do |name|
         | 
| 15 | 
            +
                        singleton_class.class_eval <<-METHOD, __FILE__, __LINE__ + 1
         | 
| 16 | 
            +
                          def #{name}
         | 
| 17 | 
            +
                            @#{name} ||= @type._crutches[:#{name}].call @collection
         | 
| 18 | 
            +
                          end
         | 
| 19 | 
            +
                        METHOD
         | 
| 20 | 
            +
                      end
         | 
| 21 | 
            +
                    end
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  module ClassMethods
         | 
| 25 | 
            +
                    def crutch name, &block
         | 
| 26 | 
            +
                      self._crutches = _crutches.merge(name.to_sym => block)
         | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
            end
         | 
    
        data/lib/chewy/type/import.rb
    CHANGED
    
    | @@ -78,11 +78,12 @@ module Chewy | |
| 78 78 | 
             
                    def bulk_body(action_objects, indexed_objects = nil)
         | 
| 79 79 | 
             
                      action_objects.inject([]) do |result, (action, objects)|
         | 
| 80 80 | 
             
                        method = "#{action}_bulk_entry"
         | 
| 81 | 
            -
                         | 
| 81 | 
            +
                        crutches = Chewy::Type::Crutch::Crutches.new self, objects
         | 
| 82 | 
            +
                        result.concat(objects.map { |object| send(method, object, indexed_objects, crutches) }.flatten)
         | 
| 82 83 | 
             
                      end
         | 
| 83 84 | 
             
                    end
         | 
| 84 85 |  | 
| 85 | 
            -
                    def delete_bulk_entry(object, indexed_objects = nil)
         | 
| 86 | 
            +
                    def delete_bulk_entry(object, indexed_objects = nil, crutches = nil)
         | 
| 86 87 | 
             
                      entry = {}
         | 
| 87 88 |  | 
| 88 89 | 
             
                      if self.root_object.id
         | 
| @@ -102,7 +103,7 @@ module Chewy | |
| 102 103 | 
             
                      [{ delete: entry }]
         | 
| 103 104 | 
             
                    end
         | 
| 104 105 |  | 
| 105 | 
            -
                    def index_bulk_entry(object, indexed_objects = nil)
         | 
| 106 | 
            +
                    def index_bulk_entry(object, indexed_objects = nil, crutches = nil)
         | 
| 106 107 | 
             
                      entry = {}
         | 
| 107 108 |  | 
| 108 109 | 
             
                      if self.root_object.id
         | 
| @@ -119,7 +120,7 @@ module Chewy | |
| 119 120 | 
             
                        existing_object = entry[:_id].present? && indexed_objects && indexed_objects[entry[:_id].to_s]
         | 
| 120 121 | 
             
                      end
         | 
| 121 122 |  | 
| 122 | 
            -
                      entry[:data] = object_data(object)
         | 
| 123 | 
            +
                      entry[:data] = object_data(object, crutches)
         | 
| 123 124 |  | 
| 124 125 | 
             
                      if existing_object && entry[:parent].to_s != existing_object[:parent]
         | 
| 125 126 | 
             
                        [{ delete: entry.except(:data).merge(parent: existing_object[:parent]) }, { index: entry }]
         | 
| @@ -148,8 +149,8 @@ module Chewy | |
| 148 149 | 
             
                      end
         | 
| 149 150 | 
             
                    end
         | 
| 150 151 |  | 
| 151 | 
            -
                    def object_data object
         | 
| 152 | 
            -
                      (self.root_object ||= build_root).compose(object)[type_name.to_sym]
         | 
| 152 | 
            +
                    def object_data object, crutches = nil
         | 
| 153 | 
            +
                      (self.root_object ||= build_root).compose(object, crutches)[type_name.to_sym]
         | 
| 153 154 | 
             
                    end
         | 
| 154 155 |  | 
| 155 156 | 
             
                    def extract_errors result
         | 
    
        data/lib/chewy/type/mapping.rb
    CHANGED
    
    | @@ -154,7 +154,11 @@ module Chewy | |
| 154 154 | 
             
                  private
         | 
| 155 155 |  | 
| 156 156 | 
             
                    def expand_nested field, &block
         | 
| 157 | 
            -
                       | 
| 157 | 
            +
                      if @_current_field
         | 
| 158 | 
            +
                        field.parent = @_current_field
         | 
| 159 | 
            +
                        @_current_field.children.push(field)
         | 
| 160 | 
            +
                      end
         | 
| 161 | 
            +
             | 
| 158 162 | 
             
                      if block
         | 
| 159 163 | 
             
                        previous_field, @_current_field = @_current_field, field
         | 
| 160 164 | 
             
                        block.call
         | 
| @@ -164,8 +168,8 @@ module Chewy | |
| 164 168 |  | 
| 165 169 | 
             
                    def build_root options = {}, &block
         | 
| 166 170 | 
             
                      self.root_object = Chewy::Fields::Root.new(type_name, options)
         | 
| 167 | 
            -
                      expand_nested( | 
| 168 | 
            -
                      @_current_field =  | 
| 171 | 
            +
                      expand_nested(root_object, &block)
         | 
| 172 | 
            +
                      @_current_field = root_object
         | 
| 169 173 | 
             
                    end
         | 
| 170 174 | 
             
                  end
         | 
| 171 175 | 
             
                end
         | 
    
        data/lib/chewy/type/observe.rb
    CHANGED
    
    | @@ -3,52 +3,41 @@ module Chewy | |
| 3 3 | 
             
                module Observe
         | 
| 4 4 | 
             
                  extend ActiveSupport::Concern
         | 
| 5 5 |  | 
| 6 | 
            -
                   | 
| 7 | 
            -
                     | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
                       | 
| 12 | 
            -
                         | 
| 13 | 
            -
             | 
| 14 | 
            -
                         | 
| 15 | 
            -
             | 
| 16 | 
            -
                         | 
| 17 | 
            -
                          instance_eval(&block)
         | 
| 18 | 
            -
                        end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                        Chewy.derive_type(type_name).update_index(backreference, options)
         | 
| 6 | 
            +
                  def self.update_proc(type_name, *args, &block)
         | 
| 7 | 
            +
                    options = args.extract_options!
         | 
| 8 | 
            +
                    method = args.first
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                    Proc.new do
         | 
| 11 | 
            +
                      backreference = if method && method.to_s == 'self'
         | 
| 12 | 
            +
                        self
         | 
| 13 | 
            +
                      elsif method
         | 
| 14 | 
            +
                        send(method)
         | 
| 15 | 
            +
                      else
         | 
| 16 | 
            +
                        instance_eval(&block)
         | 
| 21 17 | 
             
                      end
         | 
| 22 18 |  | 
| 23 | 
            -
                       | 
| 24 | 
            -
                      after_destroy &update
         | 
| 19 | 
            +
                      Chewy.derive_type(type_name).update_index(backreference, options)
         | 
| 25 20 | 
             
                    end
         | 
| 26 21 | 
             
                  end
         | 
| 27 22 |  | 
| 28 | 
            -
                  module  | 
| 23 | 
            +
                  module MongoidMethods
         | 
| 29 24 | 
             
                    def update_index(type_name, *args, &block)
         | 
| 30 | 
            -
                       | 
| 31 | 
            -
                      method = args.first
         | 
| 25 | 
            +
                      update_proc = Observe.update_proc(type_name, *args, &block)
         | 
| 32 26 |  | 
| 33 | 
            -
                       | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
                          self
         | 
| 38 | 
            -
                        elsif method
         | 
| 39 | 
            -
                          send(method)
         | 
| 40 | 
            -
                        else
         | 
| 41 | 
            -
                          instance_eval(&block)
         | 
| 42 | 
            -
                        end
         | 
| 27 | 
            +
                      after_save &update_proc
         | 
| 28 | 
            +
                      after_destroy &update_proc
         | 
| 29 | 
            +
                    end
         | 
| 30 | 
            +
                  end
         | 
| 43 31 |  | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 32 | 
            +
                  module ActiveRecordMethods
         | 
| 33 | 
            +
                    def update_index(type_name, *args, &block)
         | 
| 34 | 
            +
                      update_proc = Observe.update_proc(type_name, *args, &block)
         | 
| 46 35 |  | 
| 47 36 | 
             
                      if Chewy.use_after_commit_callbacks
         | 
| 48 | 
            -
                        after_commit & | 
| 37 | 
            +
                        after_commit &update_proc
         | 
| 49 38 | 
             
                      else
         | 
| 50 | 
            -
                        after_save & | 
| 51 | 
            -
                        after_destroy & | 
| 39 | 
            +
                        after_save &update_proc
         | 
| 40 | 
            +
                        after_destroy &update_proc
         | 
| 52 41 | 
             
                      end
         | 
| 53 42 | 
             
                    end
         | 
| 54 43 | 
             
                  end
         | 
    
        data/lib/chewy/version.rb
    CHANGED
    
    
| @@ -14,9 +14,9 @@ describe Chewy::Fields::Base do | |
| 14 14 |  | 
| 15 15 | 
             
                context 'nested fields' do
         | 
| 16 16 | 
             
                  before do
         | 
| 17 | 
            -
                    field. | 
| 18 | 
            -
                    field. | 
| 19 | 
            -
                    field. | 
| 17 | 
            +
                    field.children.push(described_class.new(:subname1, value: ->(o){ o.subvalue1 }))
         | 
| 18 | 
            +
                    field.children.push(described_class.new(:subname2, value: ->{ subvalue2 }))
         | 
| 19 | 
            +
                    field.children.push(described_class.new(:subname3))
         | 
| 20 20 | 
             
                  end
         | 
| 21 21 |  | 
| 22 22 | 
             
                  specify { expect(field.compose(double(value: double(subvalue1: 'hello', subvalue2: 'value', subname3: 'world'))))
         | 
| @@ -32,8 +32,13 @@ describe Chewy::Fields::Base do | |
| 32 32 |  | 
| 33 33 | 
             
                context 'parent objects' do
         | 
| 34 34 | 
             
                  let!(:country) { described_class.new(:name, value: ->(country){ country.cities }) }
         | 
| 35 | 
            -
                  let!(:city) {  | 
| 36 | 
            -
                  let!(:district) {  | 
| 35 | 
            +
                  let!(:city) { described_class.new(:name, value: ->(city, country) { city.districts.map { |district| [district, country.name] } }) }
         | 
| 36 | 
            +
                  let!(:district) { described_class.new(:name, value: ->(district, city, country) { [district, city.name, country.name] }) }
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  before do
         | 
| 39 | 
            +
                    country.children.push(city)
         | 
| 40 | 
            +
                    city.children.push(district)
         | 
| 41 | 
            +
                  end
         | 
| 37 42 |  | 
| 38 43 | 
             
                  specify { expect(country.compose(double(name: 'Thailand', cities: [
         | 
| 39 44 | 
             
                    double(name: 'Bangkok', districts: ['First', 'Second'])
         | 
| @@ -48,8 +53,8 @@ describe Chewy::Fields::Base do | |
| 48 53 | 
             
                context 'implicit values' do
         | 
| 49 54 | 
             
                  let(:field) { described_class.new(:name, type: 'string') }
         | 
| 50 55 | 
             
                  before do
         | 
| 51 | 
            -
                    field. | 
| 52 | 
            -
                    field. | 
| 56 | 
            +
                    field.children.push(described_class.new(:name))
         | 
| 57 | 
            +
                    field.children.push(described_class.new(:untouched))
         | 
| 53 58 | 
             
                  end
         | 
| 54 59 |  | 
| 55 60 | 
             
                  specify { expect(field.compose(double(name: 'Alex'))).to eq({name: 'Alex'}) }
         | 
| @@ -60,28 +65,21 @@ describe Chewy::Fields::Base do | |
| 60 65 | 
             
                  let(:object) { double(name: { key1: 'value1', key2: 'value2' }) }
         | 
| 61 66 |  | 
| 62 67 | 
             
                  before do
         | 
| 63 | 
            -
                    field. | 
| 64 | 
            -
                    field. | 
| 68 | 
            +
                    field.children.push(described_class.new(:key1, value: ->(h){ h[:key1] }))
         | 
| 69 | 
            +
                    field.children.push(described_class.new(:key2, value: ->(h){ h[:key2] }))
         | 
| 65 70 | 
             
                  end
         | 
| 66 71 |  | 
| 67 72 | 
             
                  specify{ expect(field.compose(object)).to eq({ name: { 'key1' => 'value1', 'key2' => 'value2' } }) }
         | 
| 68 73 | 
             
                end
         | 
| 69 74 | 
             
              end
         | 
| 70 75 |  | 
| 71 | 
            -
              describe '#nested' do
         | 
| 72 | 
            -
                let(:field) { described_class.new(:name) }
         | 
| 73 | 
            -
             | 
| 74 | 
            -
                specify { expect { field.nested(described_class.new(:name1)) }
         | 
| 75 | 
            -
                  .to change { field.nested[:name1] }.from(nil).to(an_instance_of(described_class))  }
         | 
| 76 | 
            -
              end
         | 
| 77 | 
            -
             | 
| 78 76 | 
             
              describe '#mappings_hash' do
         | 
| 79 77 | 
             
                let(:field) { described_class.new(:name, type: :object) }
         | 
| 80 78 | 
             
                let(:fields1) { 2.times.map { |i| described_class.new("name#{i+1}", type: "string#{i+1}") } }
         | 
| 81 79 | 
             
                let(:fields2) { 2.times.map { |i| described_class.new("name#{i+3}", type: "string#{i+3}") } }
         | 
| 82 80 | 
             
                before do
         | 
| 83 | 
            -
                  fields1.each { |m| field. | 
| 84 | 
            -
                  fields2.each { |m| fields1[0]. | 
| 81 | 
            +
                  fields1.each { |m| field.children.push(m) }
         | 
| 82 | 
            +
                  fields2.each { |m| fields1[0].children.push(m) }
         | 
| 85 83 | 
             
                end
         | 
| 86 84 |  | 
| 87 85 | 
             
                specify { expect(field.mappings_hash).to eq({name: {type: :object, properties: {
         | 
| @@ -317,7 +315,16 @@ describe Chewy::Fields::Base do | |
| 317 315 | 
             
                    stub_model(:country)
         | 
| 318 316 |  | 
| 319 317 | 
             
                    City.belongs_to :country
         | 
| 320 | 
            -
             | 
| 318 | 
            +
             | 
| 319 | 
            +
                    if active_record?
         | 
| 320 | 
            +
                      if ActiveRecord::VERSION::MAJOR >= 4
         | 
| 321 | 
            +
                        Country.has_many :cities, -> { order :id }
         | 
| 322 | 
            +
                      else
         | 
| 323 | 
            +
                        Country.has_many :cities, order: :id
         | 
| 324 | 
            +
                      end
         | 
| 325 | 
            +
                    else # mongoid
         | 
| 326 | 
            +
                      Country.has_many :cities, order: :id.asc
         | 
| 327 | 
            +
                    end
         | 
| 321 328 |  | 
| 322 329 | 
             
                    stub_index(:countries) do
         | 
| 323 330 | 
             
                      define_type Country do
         | 
    
        data/spec/chewy/query_spec.rb
    CHANGED
    
    | @@ -39,6 +39,8 @@ describe Chewy::Query do | |
| 39 39 | 
             
                specify { expect(subject.types(:product, :country).count).to eq(6) }
         | 
| 40 40 | 
             
                specify { expect(subject.filter(term: {age: 10}).count).to eq(1) }
         | 
| 41 41 | 
             
                specify { expect(subject.query(term: {age: 10}).count).to eq(1) }
         | 
| 42 | 
            +
                specify { expect(subject.search_type(:count).count).to eq(0) }
         | 
| 43 | 
            +
                specify { expect(subject.search_type(:count).total).to eq(9) }
         | 
| 42 44 | 
             
              end
         | 
| 43 45 |  | 
| 44 46 | 
             
              describe '#==' do
         | 
| @@ -101,6 +103,13 @@ describe Chewy::Query do | |
| 101 103 | 
             
                specify { expect { subject.offset(10) }.not_to change { subject.criteria.request_options } }
         | 
| 102 104 | 
             
              end
         | 
| 103 105 |  | 
| 106 | 
            +
              describe '#script_fields' do
         | 
| 107 | 
            +
                specify { expect(subject.script_fields(distance: 'test()')).to be_a described_class }
         | 
| 108 | 
            +
                specify { expect(subject.script_fields(distance: 'test()')).not_to eq(subject) }
         | 
| 109 | 
            +
                specify { expect(subject.script_fields(distance: 'test()').criteria.script_fields).to include(distance: 'test()') }
         | 
| 110 | 
            +
                specify { expect { subject.script_fields(distance: 'test()') }.not_to change { subject.criteria.script_fields } }
         | 
| 111 | 
            +
              end
         | 
| 112 | 
            +
             | 
| 104 113 | 
             
              describe '#script_score' do
         | 
| 105 114 | 
             
                specify { expect(subject.script_score('23')).to be_a described_class }
         | 
| 106 115 | 
             
                specify { expect(subject.script_score('23')).not_to eq(subject) }
         | 
| @@ -422,6 +431,10 @@ describe Chewy::Query do | |
| 422 431 | 
             
                specify { expect(subject.types([:product, :city]).types!(:country).criteria.types).to match_array(['country']) }
         | 
| 423 432 | 
             
              end
         | 
| 424 433 |  | 
| 434 | 
            +
              describe '#search_type' do
         | 
| 435 | 
            +
                specify { expect(subject.search_type(:count).options).to include(search_type: :count) }
         | 
| 436 | 
            +
              end
         | 
| 437 | 
            +
             | 
| 425 438 | 
             
              describe '#aggregations' do
         | 
| 426 439 | 
             
                specify { expect(subject.aggregations(attribute: {terms: {field: 'attribute'}})).to be_a described_class }
         | 
| 427 440 | 
             
                specify { expect(subject.aggregations(attribute: {terms: {field: 'attribute'}})).not_to eq(subject) }
         | 
    
        data/spec/chewy/runtime_spec.rb
    CHANGED
    
    | @@ -4,6 +4,6 @@ describe Chewy::Runtime do | |
| 4 4 | 
             
              describe '.version' do
         | 
| 5 5 | 
             
                specify { expect(described_class.version).to be_a(described_class::Version) }
         | 
| 6 6 | 
             
                specify { expect(described_class.version).to be >= '1.0' }
         | 
| 7 | 
            -
                specify { expect(described_class.version).to be < '1. | 
| 7 | 
            +
                specify { expect(described_class.version).to be < '1.6' }
         | 
| 8 8 | 
             
              end
         | 
| 9 9 | 
             
            end
         | 
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            if defined?(::Resque)
         | 
| 4 | 
            +
              require 'resque_spec'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              describe Chewy::Strategy::Resque do
         | 
| 7 | 
            +
                around { |example| Chewy.strategy(:bypass) { example.run } }
         | 
| 8 | 
            +
                before { ResqueSpec.reset! }
         | 
| 9 | 
            +
                before do
         | 
| 10 | 
            +
                  stub_model(:city) do
         | 
| 11 | 
            +
                    update_index('cities#city') { self }
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  stub_index(:cities) do
         | 
| 15 | 
            +
                    define_type City
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                let(:city) { City.create!(name: 'hello') }
         | 
| 20 | 
            +
                let(:other_city) { City.create!(name: 'world') }
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                specify do
         | 
| 23 | 
            +
                  expect { [city, other_city].map(&:save!) }
         | 
| 24 | 
            +
                    .not_to update_index(CitiesIndex::City, strategy: :resque)
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                specify do
         | 
| 28 | 
            +
                  with_resque do
         | 
| 29 | 
            +
                    expect { [city, other_city].map(&:save!) }
         | 
| 30 | 
            +
                      .to update_index(CitiesIndex::City, strategy: :resque)
         | 
| 31 | 
            +
                      .and_reindex(city, other_city)
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
            end
         | 
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            if defined?(::Sidekiq)
         | 
| 4 | 
            +
              require 'sidekiq/testing'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              describe Chewy::Strategy::Sidekiq do
         | 
| 7 | 
            +
                around { |example| Chewy.strategy(:bypass) { example.run } }
         | 
| 8 | 
            +
                before { ::Sidekiq::Worker.clear_all }
         | 
| 9 | 
            +
                before do
         | 
| 10 | 
            +
                  stub_model(:city) do
         | 
| 11 | 
            +
                    update_index('cities#city') { self }
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  stub_index(:cities) do
         | 
| 15 | 
            +
                    define_type City
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                let(:city) { City.create!(name: 'hello') }
         | 
| 20 | 
            +
                let(:other_city) { City.create!(name: 'world') }
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                specify do
         | 
| 23 | 
            +
                  expect { [city, other_city].map(&:save!) }
         | 
| 24 | 
            +
                    .not_to update_index(CitiesIndex::City, strategy: :sidekiq)
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                specify do
         | 
| 28 | 
            +
                  ::Sidekiq::Testing.inline! do
         | 
| 29 | 
            +
                    expect { [city, other_city].map(&:save!) }
         | 
| 30 | 
            +
                      .to update_index(CitiesIndex::City, strategy: :sidekiq)
         | 
| 31 | 
            +
                      .and_reindex(city, other_city)
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
            end
         | 
| @@ -41,10 +41,19 @@ describe Chewy::Type::Adapter::Mongoid, :mongoid do | |
| 41 41 | 
             
                subject { described_class.new(City) }
         | 
| 42 42 | 
             
                let!(:cities) { 3.times.map { City.create! } }
         | 
| 43 43 |  | 
| 44 | 
            -
                specify { expect(subject.identify(City.all)).to match_array(cities.map(&:id)) }
         | 
| 45 | 
            -
                specify { expect(subject.identify(cities)).to eq(cities.map(&:id)) }
         | 
| 46 | 
            -
                specify { expect(subject.identify(cities.first)).to eq([cities.first.id]) }
         | 
| 47 | 
            -
                specify { expect(subject.identify(cities.first(2).map(&:id))).to eq(cities.first(2).map(&:id)) }
         | 
| 44 | 
            +
                specify { expect(subject.identify(City.all)).to match_array(cities.map(&:id).map(&:to_s)) }
         | 
| 45 | 
            +
                specify { expect(subject.identify(cities)).to eq(cities.map(&:id).map(&:to_s)) }
         | 
| 46 | 
            +
                specify { expect(subject.identify(cities.first)).to eq([cities.first.id.to_s]) }
         | 
| 47 | 
            +
                specify { expect(subject.identify(cities.first(2).map(&:id))).to eq(cities.first(2).map(&:id).map(&:to_s)) }
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                context 'non-bson ids' do
         | 
| 50 | 
            +
                  let!(:cities) { 3.times.map { |i| City.create! id: i+1 } }
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  specify { expect(subject.identify(City.all)).to match_array(cities.map(&:id)) }
         | 
| 53 | 
            +
                  specify { expect(subject.identify(cities)).to eq(cities.map(&:id)) }
         | 
| 54 | 
            +
                  specify { expect(subject.identify(cities.first)).to eq([cities.first.id]) }
         | 
| 55 | 
            +
                  specify { expect(subject.identify(cities.first(2).map(&:id))).to eq(cities.first(2).map(&:id)) }
         | 
| 56 | 
            +
                end
         | 
| 48 57 | 
             
              end
         | 
| 49 58 |  | 
| 50 59 | 
             
              describe '#import' do
         | 
| @@ -59,7 +68,7 @@ describe Chewy::Type::Adapter::Mongoid, :mongoid do | |
| 59 68 | 
             
                  let!(:deleted) { 4.times.map { |i| City.create!.tap(&:destroy) }.sort_by(&:id) }
         | 
| 60 69 | 
             
                  subject { described_class.new(City) }
         | 
| 61 70 |  | 
| 62 | 
            -
                  specify { expect(import).to  | 
| 71 | 
            +
                  specify { expect(import).to match([{index: match_array(cities)}]) }
         | 
| 63 72 | 
             
                  specify { expect(import nil).to eq([]) }
         | 
| 64 73 |  | 
| 65 74 | 
             
                  specify { expect(import(City.order(:id.asc))).to eq([{index: cities}]) }
         | 
| @@ -145,8 +154,8 @@ describe Chewy::Type::Adapter::Mongoid, :mongoid do | |
| 145 154 | 
             
                end
         | 
| 146 155 |  | 
| 147 156 | 
             
                context 'default scope' do
         | 
| 148 | 
            -
                  let!(:cities) { 4.times.map { |i| City.create!(rating: i/3) }.sort_by(&:id) }
         | 
| 149 | 
            -
                  let!(:deleted) { 3.times.map { |i| City.create | 
| 157 | 
            +
                  let!(:cities) { 4.times.map { |i| City.create!(id: i, rating: i/3) }.sort_by(&:id) }
         | 
| 158 | 
            +
                  let!(:deleted) { 3.times.map { |i| City.create!(id: 4 + i).tap(&:destroy) }.sort_by(&:id) }
         | 
| 150 159 | 
             
                  subject { described_class.new(City.where(rating: 0)) }
         | 
| 151 160 |  | 
| 152 161 | 
             
                  specify { expect(import).to eq([{index: cities.first(3)}]) }
         | 
| @@ -242,8 +251,8 @@ describe Chewy::Type::Adapter::Mongoid, :mongoid do | |
| 242 251 |  | 
| 243 252 | 
             
              describe '#load' do
         | 
| 244 253 | 
             
                context do
         | 
| 245 | 
            -
                  let!(:cities) { 3.times.map { |i| City.create!(rating: i/2) }.sort_by(&:id) }
         | 
| 246 | 
            -
                  let!(:deleted) { 2.times.map { |i| City.create | 
| 254 | 
            +
                  let!(:cities) { 3.times.map { |i| City.create!(id: i, rating: i/2) }.sort_by(&:id) }
         | 
| 255 | 
            +
                  let!(:deleted) { 2.times.map { |i| City.create!(id: 3 + i).tap(&:destroy) }.sort_by(&:id) }
         | 
| 247 256 |  | 
| 248 257 | 
             
                  let(:type) { double(type_name: 'user') }
         | 
| 249 258 |  |