chewy 7.1.0 → 7.2.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.
Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +58 -0
  3. data/.rubocop.yml +13 -8
  4. data/.rubocop_todo.yml +110 -22
  5. data/CHANGELOG.md +53 -0
  6. data/Gemfile +0 -7
  7. data/Guardfile +3 -1
  8. data/README.md +282 -245
  9. data/chewy.gemspec +3 -5
  10. data/gemfiles/rails.5.2.activerecord.gemfile +8 -14
  11. data/gemfiles/rails.6.0.activerecord.gemfile +8 -14
  12. data/gemfiles/rails.6.1.activerecord.gemfile +8 -14
  13. data/lib/chewy.rb +21 -75
  14. data/lib/chewy/config.rb +40 -40
  15. data/lib/chewy/errors.rb +0 -12
  16. data/lib/chewy/fields/base.rb +11 -1
  17. data/lib/chewy/fields/root.rb +3 -4
  18. data/lib/chewy/index.rb +46 -87
  19. data/lib/chewy/index/actions.rb +51 -32
  20. data/lib/chewy/{type → index}/adapter/active_record.rb +12 -3
  21. data/lib/chewy/{type → index}/adapter/base.rb +2 -3
  22. data/lib/chewy/{type → index}/adapter/object.rb +27 -31
  23. data/lib/chewy/{type → index}/adapter/orm.rb +11 -14
  24. data/lib/chewy/{type → index}/crutch.rb +5 -5
  25. data/lib/chewy/{type → index}/import.rb +36 -27
  26. data/lib/chewy/{type → index}/import/bulk_builder.rb +15 -13
  27. data/lib/chewy/{type → index}/import/bulk_request.rb +6 -6
  28. data/lib/chewy/{type → index}/import/journal_builder.rb +10 -10
  29. data/lib/chewy/{type → index}/import/routine.rb +15 -14
  30. data/lib/chewy/{type → index}/mapping.rb +26 -31
  31. data/lib/chewy/{type → index}/observe.rb +9 -19
  32. data/lib/chewy/index/specification.rb +1 -0
  33. data/lib/chewy/{type → index}/syncer.rb +60 -57
  34. data/lib/chewy/{type → index}/witchcraft.rb +11 -7
  35. data/lib/chewy/{type → index}/wrapper.rb +2 -2
  36. data/lib/chewy/journal.rb +8 -8
  37. data/lib/chewy/minitest/helpers.rb +9 -13
  38. data/lib/chewy/minitest/search_index_receiver.rb +22 -26
  39. data/lib/chewy/railtie.rb +4 -2
  40. data/lib/chewy/rake_helper.rb +82 -107
  41. data/lib/chewy/rspec/update_index.rb +47 -43
  42. data/lib/chewy/search.rb +4 -17
  43. data/lib/chewy/search/loader.rb +18 -30
  44. data/lib/chewy/search/parameters.rb +4 -2
  45. data/lib/chewy/search/parameters/concerns/query_storage.rb +2 -2
  46. data/lib/chewy/search/parameters/source.rb +5 -1
  47. data/lib/chewy/search/query_proxy.rb +9 -2
  48. data/lib/chewy/search/request.rb +82 -86
  49. data/lib/chewy/search/response.rb +4 -4
  50. data/lib/chewy/search/scoping.rb +6 -7
  51. data/lib/chewy/search/scrolling.rb +11 -11
  52. data/lib/chewy/stash.rb +14 -22
  53. data/lib/chewy/strategy.rb +3 -19
  54. data/lib/chewy/strategy/sidekiq.rb +1 -0
  55. data/lib/chewy/version.rb +1 -1
  56. data/lib/generators/chewy/install_generator.rb +1 -1
  57. data/lib/tasks/chewy.rake +10 -22
  58. data/migration_guide.md +14 -0
  59. data/spec/chewy/config_spec.rb +14 -39
  60. data/spec/chewy/fields/base_spec.rb +412 -148
  61. data/spec/chewy/fields/root_spec.rb +16 -24
  62. data/spec/chewy/fields/time_fields_spec.rb +5 -5
  63. data/spec/chewy/index/actions_spec.rb +270 -24
  64. data/spec/chewy/{type → index}/adapter/active_record_spec.rb +68 -40
  65. data/spec/chewy/{type → index}/adapter/object_spec.rb +21 -6
  66. data/spec/chewy/{type → index}/import/bulk_builder_spec.rb +23 -31
  67. data/spec/chewy/{type → index}/import/bulk_request_spec.rb +5 -6
  68. data/spec/chewy/{type → index}/import/journal_builder_spec.rb +9 -15
  69. data/spec/chewy/{type → index}/import/routine_spec.rb +16 -16
  70. data/spec/chewy/{type → index}/import_spec.rb +102 -98
  71. data/spec/chewy/{type → index}/mapping_spec.rb +46 -54
  72. data/spec/chewy/index/observe_spec.rb +116 -0
  73. data/spec/chewy/index/settings_spec.rb +3 -1
  74. data/spec/chewy/index/specification_spec.rb +7 -17
  75. data/spec/chewy/{type → index}/syncer_spec.rb +14 -19
  76. data/spec/chewy/{type → index}/witchcraft_spec.rb +20 -22
  77. data/spec/chewy/index/wrapper_spec.rb +100 -0
  78. data/spec/chewy/index_spec.rb +59 -102
  79. data/spec/chewy/journal_spec.rb +9 -22
  80. data/spec/chewy/minitest/helpers_spec.rb +13 -15
  81. data/spec/chewy/minitest/search_index_receiver_spec.rb +22 -26
  82. data/spec/chewy/multi_search_spec.rb +4 -5
  83. data/spec/chewy/rake_helper_spec.rb +145 -55
  84. data/spec/chewy/rspec/update_index_spec.rb +74 -71
  85. data/spec/chewy/search/loader_spec.rb +19 -37
  86. data/spec/chewy/search/pagination/kaminari_examples.rb +3 -5
  87. data/spec/chewy/search/pagination/kaminari_spec.rb +1 -1
  88. data/spec/chewy/search/parameters/indices_spec.rb +2 -8
  89. data/spec/chewy/search/parameters/order_spec.rb +1 -1
  90. data/spec/chewy/search/parameters/query_storage_examples.rb +67 -21
  91. data/spec/chewy/search/parameters/search_after_spec.rb +4 -1
  92. data/spec/chewy/search/parameters/source_spec.rb +8 -2
  93. data/spec/chewy/search/parameters_spec.rb +12 -3
  94. data/spec/chewy/search/query_proxy_spec.rb +68 -17
  95. data/spec/chewy/search/request_spec.rb +222 -74
  96. data/spec/chewy/search/response_spec.rb +12 -12
  97. data/spec/chewy/search/scrolling_spec.rb +7 -9
  98. data/spec/chewy/search_spec.rb +32 -35
  99. data/spec/chewy/stash_spec.rb +9 -21
  100. data/spec/chewy/strategy/active_job_spec.rb +8 -8
  101. data/spec/chewy/strategy/atomic_spec.rb +9 -10
  102. data/spec/chewy/strategy/sidekiq_spec.rb +8 -8
  103. data/spec/chewy/strategy_spec.rb +19 -15
  104. data/spec/chewy_spec.rb +14 -100
  105. data/spec/spec_helper.rb +2 -21
  106. data/spec/support/active_record.rb +15 -5
  107. metadata +44 -103
  108. data/.circleci/config.yml +0 -214
  109. data/Appraisals +0 -81
  110. data/gemfiles/rails.5.2.mongoid.6.4.gemfile +0 -17
  111. data/gemfiles/sequel.4.45.gemfile +0 -11
  112. data/lib/chewy/search/pagination/will_paginate.rb +0 -43
  113. data/lib/chewy/strategy/resque.rb +0 -27
  114. data/lib/chewy/strategy/shoryuken.rb +0 -40
  115. data/lib/chewy/type.rb +0 -120
  116. data/lib/chewy/type/actions.rb +0 -43
  117. data/lib/chewy/type/adapter/mongoid.rb +0 -67
  118. data/lib/chewy/type/adapter/sequel.rb +0 -93
  119. data/lib/sequel/plugins/chewy_observe.rb +0 -63
  120. data/spec/chewy/search/pagination/will_paginate_examples.rb +0 -63
  121. data/spec/chewy/search/pagination/will_paginate_spec.rb +0 -23
  122. data/spec/chewy/strategy/resque_spec.rb +0 -46
  123. data/spec/chewy/strategy/shoryuken_spec.rb +0 -70
  124. data/spec/chewy/type/actions_spec.rb +0 -50
  125. data/spec/chewy/type/adapter/mongoid_spec.rb +0 -372
  126. data/spec/chewy/type/adapter/sequel_spec.rb +0 -472
  127. data/spec/chewy/type/observe_spec.rb +0 -137
  128. data/spec/chewy/type/wrapper_spec.rb +0 -100
  129. data/spec/chewy/type_spec.rb +0 -55
  130. data/spec/support/mongoid.rb +0 -93
  131. data/spec/support/sequel.rb +0 -80
@@ -18,54 +18,52 @@ describe :minitest_helper do
18
18
 
19
19
  before do
20
20
  stub_index(:dummies) do
21
- define_type :dummy do
22
- root value: ->(_o) { {} }
23
- end
21
+ root value: ->(_o) { {} }
24
22
  end
25
23
  end
26
24
 
27
25
  context 'assert_indexes' do
28
26
  specify 'doesn\'t fail when index updates correctly' do
29
27
  expect do
30
- assert_indexes DummiesIndex::Dummy do
31
- DummiesIndex::Dummy.bulk body: [{index: {_id: 42, data: {}}}, {index: {_id: 41, data: {}}}]
28
+ assert_indexes DummiesIndex do
29
+ DummiesIndex.bulk body: [{index: {_id: 42, data: {}}}, {index: {_id: 41, data: {}}}]
32
30
  end
33
31
  end.to_not raise_error
34
32
  end
35
33
 
36
34
  specify 'fails when index doesn\'t update' do
37
35
  expect do
38
- assert_indexes DummiesIndex::Dummy do
36
+ assert_indexes DummiesIndex do
39
37
  end
40
38
  end.to raise_error(RSpec::Expectations::ExpectationNotMetError)
41
39
  end
42
40
 
43
41
  specify 'SearchIndexReceiver catches the indexes' do
44
- receiver = assert_indexes DummiesIndex::Dummy do
45
- DummiesIndex::Dummy.bulk body: [{index: {_id: 42, data: {}}}, {index: {_id: 41, data: {}}}]
42
+ receiver = assert_indexes DummiesIndex do
43
+ DummiesIndex.bulk body: [{index: {_id: 42, data: {}}}, {index: {_id: 41, data: {}}}]
46
44
  end
47
45
 
48
46
  expect(receiver).to be_a(SearchIndexReceiver)
49
47
 
50
48
  expect(
51
- receiver.indexes_for(DummiesIndex::Dummy)
49
+ receiver.indexes_for(DummiesIndex)
52
50
  .map { |index| index[:_id] }
53
51
  ).to match_array([41, 42])
54
52
  end
55
53
 
56
54
  specify 'Real index is bypassed when asserting' do
57
- expect(DummiesIndex::Dummy).not_to receive(:bulk)
55
+ expect(DummiesIndex).not_to receive(:bulk)
58
56
 
59
- assert_indexes DummiesIndex::Dummy do
60
- DummiesIndex::Dummy.bulk body: [{index: {_id: 42, data: {}}}, {index: {_id: 41, data: {}}}]
57
+ assert_indexes DummiesIndex do
58
+ DummiesIndex.bulk body: [{index: {_id: 42, data: {}}}, {index: {_id: 41, data: {}}}]
61
59
  end
62
60
  end
63
61
 
64
62
  specify 'Real index is allowed when asserting' do
65
- expect(DummiesIndex::Dummy).to receive(:bulk)
63
+ expect(DummiesIndex).to receive(:bulk)
66
64
 
67
- assert_indexes DummiesIndex::Dummy, bypass_actual_index: false do
68
- DummiesIndex::Dummy.bulk body: [{index: {_id: 42, data: {}}}, {index: {_id: 41, data: {}}}]
65
+ assert_indexes DummiesIndex, bypass_actual_index: false do
66
+ DummiesIndex.bulk body: [{index: {_id: 42, data: {}}}, {index: {_id: 41, data: {}}}]
69
67
  end
70
68
  end
71
69
  end
@@ -26,97 +26,93 @@ describe :search_index_receiver do
26
26
 
27
27
  before do
28
28
  stub_index(:dummies) do
29
- define_type :fizz do
30
- root value: ->(_o) { {} }
31
- end
29
+ root value: ->(_o) { {} }
32
30
  end
33
31
 
34
32
  stub_index(:dummies2) do
35
- define_type :buzz do
36
- root value: ->(_o) { {} }
37
- end
33
+ root value: ->(_o) { {} }
38
34
  end
39
35
  end
40
36
 
41
37
  context 'catch' do
42
38
  specify 'archives more than one type' do
43
- receiver.catch search_request(2), DummiesIndex::Fizz
44
- receiver.catch search_request(3), Dummies2Index::Buzz
45
- expect(receiver.indexes.keys).to match_array([DummiesIndex::Fizz, Dummies2Index::Buzz])
39
+ receiver.catch search_request(2), DummiesIndex
40
+ receiver.catch search_request(3), Dummies2Index
41
+ expect(receiver.indexes.keys).to match_array([DummiesIndex, Dummies2Index])
46
42
  end
47
43
  end
48
44
 
49
45
  context 'indexes_for' do
50
46
  before do
51
- receiver.catch search_request(2), DummiesIndex::Fizz
52
- receiver.catch search_request(3), Dummies2Index::Buzz
47
+ receiver.catch search_request(2), DummiesIndex
48
+ receiver.catch search_request(3), Dummies2Index
53
49
  end
54
50
 
55
51
  specify 'returns indexes for a specific type' do
56
- expect(parse_request(receiver.indexes_for(DummiesIndex::Fizz))).to match_array([1, 2])
52
+ expect(parse_request(receiver.indexes_for(DummiesIndex))).to match_array([1, 2])
57
53
  end
58
54
 
59
55
  specify 'returns only indexes for all types' do
60
56
  index_responses = receiver.indexes
61
- expect(index_responses.keys).to match_array([DummiesIndex::Fizz, Dummies2Index::Buzz])
57
+ expect(index_responses.keys).to match_array([DummiesIndex, Dummies2Index])
62
58
  expect(parse_request(index_responses.values.flatten)).to match_array([1, 2, 1, 2, 3])
63
59
  end
64
60
  end
65
61
 
66
62
  context 'deletes_for' do
67
63
  before do
68
- receiver.catch search_request(2, verb: :delete), DummiesIndex::Fizz
69
- receiver.catch search_request(3, verb: :delete), Dummies2Index::Buzz
64
+ receiver.catch search_request(2, verb: :delete), DummiesIndex
65
+ receiver.catch search_request(3, verb: :delete), Dummies2Index
70
66
  end
71
67
 
72
68
  specify 'returns deletes for a specific type' do
73
- expect(receiver.deletes_for(Dummies2Index::Buzz)).to match_array([1, 2, 3])
69
+ expect(receiver.deletes_for(Dummies2Index)).to match_array([1, 2, 3])
74
70
  end
75
71
 
76
72
  specify 'returns only deletes for all types' do
77
73
  deletes = receiver.deletes
78
- expect(deletes.keys).to match_array([DummiesIndex::Fizz, Dummies2Index::Buzz])
74
+ expect(deletes.keys).to match_array([DummiesIndex, Dummies2Index])
79
75
  expect(deletes.values.flatten).to match_array([1, 2, 1, 2, 3])
80
76
  end
81
77
  end
82
78
 
83
79
  context 'indexed?' do
84
80
  before do
85
- receiver.catch search_request(1), DummiesIndex::Fizz
81
+ receiver.catch search_request(1), DummiesIndex
86
82
  end
87
83
 
88
84
  specify 'validates that an object was indexed' do
89
85
  dummy = OpenStruct.new(id: 1)
90
- expect(receiver.indexed?(dummy, DummiesIndex::Fizz)).to be(true)
86
+ expect(receiver.indexed?(dummy, DummiesIndex)).to be(true)
91
87
  end
92
88
 
93
89
  specify 'doesn\'t validate than unindexed objects were indexed' do
94
90
  dummy = OpenStruct.new(id: 2)
95
- expect(receiver.indexed?(dummy, DummiesIndex::Fizz)).to be(false)
91
+ expect(receiver.indexed?(dummy, DummiesIndex)).to be(false)
96
92
  end
97
93
  end
98
94
 
99
95
  context 'deleted?' do
100
96
  before do
101
- receiver.catch search_request(1, verb: :delete), DummiesIndex::Fizz
97
+ receiver.catch search_request(1, verb: :delete), DummiesIndex
102
98
  end
103
99
 
104
100
  specify 'validates than an object was deleted' do
105
101
  dummy = OpenStruct.new(id: 1)
106
- expect(receiver.deleted?(dummy, DummiesIndex::Fizz)).to be(true)
102
+ expect(receiver.deleted?(dummy, DummiesIndex)).to be(true)
107
103
  end
108
104
 
109
105
  specify 'doesn\'t validate than undeleted objects were deleted' do
110
106
  dummy = OpenStruct.new(id: 2)
111
- expect(receiver.deleted?(dummy, DummiesIndex::Fizz)).to be(false)
107
+ expect(receiver.deleted?(dummy, DummiesIndex)).to be(false)
112
108
  end
113
109
  end
114
110
 
115
111
  context 'updated_indexes' do
116
112
  specify 'provides a list of indices updated' do
117
- receiver.catch search_request(2, verb: :delete), DummiesIndex::Fizz
118
- receiver.catch search_request(3, verb: :delete), Dummies2Index::Buzz
119
- expect(receiver.updated_indexes).to match_array([DummiesIndex::Fizz, Dummies2Index::Buzz])
113
+ receiver.catch search_request(2, verb: :delete), DummiesIndex
114
+ receiver.catch search_request(3, verb: :delete), Dummies2Index
115
+ expect(receiver.updated_indexes).to match_array([DummiesIndex, Dummies2Index])
120
116
  end
121
117
  end
122
118
  end
@@ -13,10 +13,9 @@ describe Chewy::MultiSearch do
13
13
  aggs(country: {terms: {field: :country_id}})
14
14
  end
15
15
 
16
- define_type City do
17
- field :name, type: 'keyword'
18
- field :country_id, type: 'keyword'
19
- end
16
+ index_scope City
17
+ field :name, type: 'keyword'
18
+ field :country_id, type: 'keyword'
20
19
  end
21
20
  end
22
21
 
@@ -78,7 +77,7 @@ describe Chewy::MultiSearch do
78
77
  is_expected.to have(2).responses
79
78
  expect(responses[0]).to be_a(Chewy::Search::Response)
80
79
  expect(responses[1]).to be_a(Chewy::Search::Response)
81
- expect(responses[1].wrappers).to all(be_a CitiesIndex::City)
80
+ expect(responses[1].wrappers).to all(be_a CitiesIndex)
82
81
  end
83
82
  end
84
83
  end
@@ -8,13 +8,12 @@ describe Chewy::RakeHelper, :orm do
8
8
  stub_model(:country)
9
9
 
10
10
  stub_index(:cities) do
11
- define_type City do
12
- field :name
13
- field :updated_at, type: 'date'
14
- end
11
+ index_scope City
12
+ field :name
13
+ field :updated_at, type: 'date'
15
14
  end
16
15
  stub_index(:countries) do
17
- define_type Country
16
+ index_scope Country
18
17
  end
19
18
  stub_index(:users)
20
19
 
@@ -52,17 +51,18 @@ describe Chewy::RakeHelper, :orm do
52
51
  .to update_index(CitiesIndex)
53
52
  expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
54
53
  \\AResetting CitiesIndex
55
- Imported CitiesIndex::City in \\d+s, stats: index 3
56
- Applying journal to \\[CitiesIndex::City\\], 2 entries, stage 1
57
- Imported CitiesIndex::City in \\d+s, stats: index 2
58
- Imported Chewy::Stash::Specification::Specification in \\d+s, stats: index 1
54
+ Imported CitiesIndex in \\d+s, stats: index 3
55
+ Applying journal to \\[CitiesIndex\\], 2 entries, stage 1
56
+ Imported CitiesIndex in \\d+s, stats: index 2
57
+ Imported Chewy::Stash::Specification in \\d+s, stats: index 1
59
58
  Resetting CountriesIndex
60
- Imported CountriesIndex::Country in \\d+s, stats: index 2
61
- Applying journal to \\[CountriesIndex::Country\\], 1 entries, stage 1
62
- Imported CountriesIndex::Country in \\d+s, stats: index 1
63
- Imported Chewy::Stash::Specification::Specification in \\d+s, stats: index 1
59
+ Imported CountriesIndex in \\d+s, stats: index 2
60
+ Applying journal to \\[CountriesIndex\\], 1 entries, stage 1
61
+ Imported CountriesIndex in \\d+s, stats: index 1
62
+ Imported Chewy::Stash::Specification in \\d+s, stats: index 1
64
63
  Resetting UsersIndex
65
- Imported Chewy::Stash::Specification::Specification in \\d+s, stats: index 1
64
+ Imported UsersIndex in 1s, stats:\s
65
+ Imported Chewy::Stash::Specification in \\d+s, stats: index 1
66
66
  Total: \\d+s\\Z
67
67
  OUTPUT
68
68
  end
@@ -73,10 +73,10 @@ Total: \\d+s\\Z
73
73
  .to update_index(CitiesIndex)
74
74
  expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
75
75
  \\AResetting CitiesIndex
76
- Imported CitiesIndex::City in \\d+s, stats: index 3
77
- Applying journal to \\[CitiesIndex::City\\], 2 entries, stage 1
78
- Imported CitiesIndex::City in \\d+s, stats: index 2
79
- Imported Chewy::Stash::Specification::Specification in \\d+s, stats: index 1
76
+ Imported CitiesIndex in \\d+s, stats: index 3
77
+ Applying journal to \\[CitiesIndex\\], 2 entries, stage 1
78
+ Imported CitiesIndex in \\d+s, stats: index 2
79
+ Imported Chewy::Stash::Specification in \\d+s, stats: index 1
80
80
  Total: \\d+s\\Z
81
81
  OUTPUT
82
82
  end
@@ -87,7 +87,8 @@ Total: \\d+s\\Z
87
87
  .not_to update_index(CitiesIndex)
88
88
  expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
89
89
  \\AResetting UsersIndex
90
- Imported Chewy::Stash::Specification::Specification in \\d+s, stats: index 1
90
+ Imported UsersIndex in 1s, stats:\s
91
+ Imported Chewy::Stash::Specification in \\d+s, stats: index 1
91
92
  Total: \\d+s\\Z
92
93
  OUTPUT
93
94
  end
@@ -100,13 +101,14 @@ Total: \\d+s\\Z
100
101
  .to update_index(CitiesIndex)
101
102
  expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
102
103
  \\AResetting CitiesIndex
103
- Imported CitiesIndex::City in \\d+s, stats: index 3
104
- Imported Chewy::Stash::Specification::Specification in \\d+s, stats: index 1
104
+ Imported CitiesIndex in \\d+s, stats: index 3
105
+ Imported Chewy::Stash::Specification in \\d+s, stats: index 1
105
106
  Resetting CountriesIndex
106
- Imported CountriesIndex::Country in \\d+s, stats: index 2
107
- Imported Chewy::Stash::Specification::Specification in \\d+s, stats: index 1
107
+ Imported CountriesIndex in \\d+s, stats: index 2
108
+ Imported Chewy::Stash::Specification in \\d+s, stats: index 1
108
109
  Resetting UsersIndex
109
- Imported Chewy::Stash::Specification::Specification in \\d+s, stats: index 1
110
+ Imported UsersIndex in 1s, stats:\s
111
+ Imported Chewy::Stash::Specification in \\d+s, stats: index 1
110
112
  Total: \\d+s\\Z
111
113
  OUTPUT
112
114
  end
@@ -125,7 +127,8 @@ Total: \\d+s\\Z
125
127
  \\ASkipping CitiesIndex, the specification didn't change
126
128
  Skipping CountriesIndex, the specification didn't change
127
129
  Resetting UsersIndex
128
- Imported Chewy::Stash::Specification::Specification in \\d+s, stats: index 1
130
+ Imported UsersIndex in 1s, stats:\s
131
+ Imported Chewy::Stash::Specification in \\d+s, stats: index 1
129
132
  Total: \\d+s\\Z
130
133
  OUTPUT
131
134
  end
@@ -136,7 +139,8 @@ Total: \\d+s\\Z
136
139
  .not_to update_index(CitiesIndex)
137
140
  expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
138
141
  \\AResetting UsersIndex
139
- Imported Chewy::Stash::Specification::Specification in \\d+s, stats: index 1
142
+ Imported UsersIndex in 1s, stats:\s
143
+ Imported Chewy::Stash::Specification in \\d+s, stats: index 1
140
144
  Total: \\d+s\\Z
141
145
  OUTPUT
142
146
  end
@@ -165,6 +169,7 @@ Total: \\d+s\\Z
165
169
  expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
166
170
  \\ASkipping CitiesIndex, it does not exists \\(use rake chewy:reset\\[cities\\] to create and update it\\)
167
171
  Skipping CountriesIndex, it does not exists \\(use rake chewy:reset\\[countries\\] to create and update it\\)
172
+ Skipping UsersIndex, it does not exists \\(use rake chewy:reset\\[users\\] to create and update it\\)
168
173
  Total: \\d+s\\Z
169
174
  OUTPUT
170
175
  end
@@ -181,9 +186,10 @@ Total: \\d+s\\Z
181
186
  .to update_index(CitiesIndex)
182
187
  expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
183
188
  \\AUpdating CitiesIndex
184
- Imported CitiesIndex::City in \\d+s, stats: index 3
189
+ Imported CitiesIndex in \\d+s, stats: index 3
185
190
  Updating CountriesIndex
186
- Imported CountriesIndex::Country in \\d+s, stats: index 2
191
+ Imported CountriesIndex in \\d+s, stats: index 2
192
+ Skipping UsersIndex, it does not exists \\(use rake chewy:reset\\[users\\] to create and update it\\)
187
193
  Total: \\d+s\\Z
188
194
  OUTPUT
189
195
  end
@@ -194,7 +200,7 @@ Total: \\d+s\\Z
194
200
  .not_to update_index(CitiesIndex)
195
201
  expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
196
202
  \\AUpdating CountriesIndex
197
- Imported CountriesIndex::Country in \\d+s, stats: index 2
203
+ Imported CountriesIndex in \\d+s, stats: index 2
198
204
  Total: \\d+s\\Z
199
205
  OUTPUT
200
206
  end
@@ -205,7 +211,8 @@ Total: \\d+s\\Z
205
211
  .to update_index(CitiesIndex)
206
212
  expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
207
213
  \\AUpdating CitiesIndex
208
- Imported CitiesIndex::City in \\d+s, stats: index 3
214
+ Imported CitiesIndex in \\d+s, stats: index 3
215
+ Skipping UsersIndex, it does not exists \\(use rake chewy:reset\\[users\\] to create and update it\\)
209
216
  Total: \\d+s\\Z
210
217
  OUTPUT
211
218
  end
@@ -218,15 +225,19 @@ Total: \\d+s\\Z
218
225
  expect { described_class.sync(output: output) }
219
226
  .to update_index(CitiesIndex)
220
227
  expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
221
- \\ASynchronizing CitiesIndex::City
222
- Imported CitiesIndex::City in \\d+s, stats: index 3
228
+ \\ASynchronizing CitiesIndex
229
+ Imported CitiesIndex in \\d+s, stats: index 3
223
230
  Missing documents: \\[[^\\]]+\\]
224
231
  Took \\d+s
225
- Synchronizing CountriesIndex::Country
226
- CountriesIndex::Country doesn't support outdated synchronization
227
- Imported CountriesIndex::Country in \\d+s, stats: index 2
232
+ Synchronizing CountriesIndex
233
+ CountriesIndex doesn't support outdated synchronization
234
+ Imported CountriesIndex in \\d+s, stats: index 2
228
235
  Missing documents: \\[[^\\]]+\\]
229
236
  Took \\d+s
237
+ Synchronizing UsersIndex
238
+ UsersIndex doesn't support outdated synchronization
239
+ Skipping UsersIndex, up to date
240
+ Took \\d+s
230
241
  Total: \\d+s\\Z
231
242
  OUTPUT
232
243
  end
@@ -236,7 +247,6 @@ Total: \\d+s\\Z
236
247
  CitiesIndex.import(cities.first(2))
237
248
  CountriesIndex.import
238
249
 
239
- sleep(1) if ActiveSupport::VERSION::STRING < '4.1.0'
240
250
  cities.first.update(name: 'Name5')
241
251
  end
242
252
 
@@ -245,14 +255,18 @@ Total: \\d+s\\Z
245
255
  expect { described_class.sync(output: output) }
246
256
  .to update_index(CitiesIndex)
247
257
  expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
248
- \\ASynchronizing CitiesIndex::City
249
- Imported CitiesIndex::City in \\d+s, stats: index 2
258
+ \\ASynchronizing CitiesIndex
259
+ Imported CitiesIndex in \\d+s, stats: index 2
250
260
  Missing documents: \\["#{cities.last.id}"\\]
251
261
  Outdated documents: \\["#{cities.first.id}"\\]
252
262
  Took \\d+s
253
- Synchronizing CountriesIndex::Country
254
- CountriesIndex::Country doesn't support outdated synchronization
255
- Skipping CountriesIndex::Country, up to date
263
+ Synchronizing CountriesIndex
264
+ CountriesIndex doesn't support outdated synchronization
265
+ Skipping CountriesIndex, up to date
266
+ Took \\d+s
267
+ Synchronizing UsersIndex
268
+ UsersIndex doesn't support outdated synchronization
269
+ Skipping UsersIndex, up to date
256
270
  Took \\d+s
257
271
  Total: \\d+s\\Z
258
272
  OUTPUT
@@ -263,8 +277,8 @@ Total: \\d+s\\Z
263
277
  expect { described_class.sync(only: CitiesIndex, output: output) }
264
278
  .to update_index(CitiesIndex)
265
279
  expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
266
- \\ASynchronizing CitiesIndex::City
267
- Imported CitiesIndex::City in \\d+s, stats: index 2
280
+ \\ASynchronizing CitiesIndex
281
+ Imported CitiesIndex in \\d+s, stats: index 2
268
282
  Missing documents: \\["#{cities.last.id}"\\]
269
283
  Outdated documents: \\["#{cities.first.id}"\\]
270
284
  Took \\d+s
@@ -277,9 +291,13 @@ Total: \\d+s\\Z
277
291
  expect { described_class.sync(except: ['cities'], output: output) }
278
292
  .not_to update_index(CitiesIndex)
279
293
  expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
280
- \\ASynchronizing CountriesIndex::Country
281
- CountriesIndex::Country doesn't support outdated synchronization
282
- Skipping CountriesIndex::Country, up to date
294
+ \\ASynchronizing CountriesIndex
295
+ CountriesIndex doesn't support outdated synchronization
296
+ Skipping CountriesIndex, up to date
297
+ Took \\d+s
298
+ Synchronizing UsersIndex
299
+ UsersIndex doesn't support outdated synchronization
300
+ Skipping UsersIndex, up to date
283
301
  Took \\d+s
284
302
  Total: \\d+s\\Z
285
303
  OUTPUT
@@ -308,9 +326,9 @@ Total: \\d+s\\Z
308
326
  .to update_index(CitiesIndex)
309
327
  expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
310
328
  \\AApplying journal entries created after [+-:\\d\\s]+
311
- Applying journal to \\[CitiesIndex::City, CountriesIndex::Country\\], 3 entries, stage 1
312
- Imported CitiesIndex::City in \\d+s, stats: index 2
313
- Imported CountriesIndex::Country in \\d+s, stats: index 1
329
+ Applying journal to \\[CitiesIndex, CountriesIndex\\], 3 entries, stage 1
330
+ Imported CitiesIndex in \\d+s, stats: index 2
331
+ Imported CountriesIndex in \\d+s, stats: index 1
314
332
  Total: \\d+s\\Z
315
333
  OUTPUT
316
334
  end
@@ -321,8 +339,8 @@ Total: \\d+s\\Z
321
339
  .not_to update_index(CitiesIndex)
322
340
  expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
323
341
  \\AApplying journal entries created after [+-:\\d\\s]+
324
- Applying journal to \\[CountriesIndex::Country\\], 1 entries, stage 1
325
- Imported CountriesIndex::Country in \\d+s, stats: index 1
342
+ Applying journal to \\[CountriesIndex\\], 1 entries, stage 1
343
+ Imported CountriesIndex in \\d+s, stats: index 1
326
344
  Total: \\d+s\\Z
327
345
  OUTPUT
328
346
  end
@@ -333,8 +351,8 @@ Total: \\d+s\\Z
333
351
  .to update_index(CitiesIndex)
334
352
  expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
335
353
  \\AApplying journal entries created after [+-:\\d\\s]+
336
- Applying journal to \\[CitiesIndex::City\\], 2 entries, stage 1
337
- Imported CitiesIndex::City in \\d+s, stats: index 2
354
+ Applying journal to \\[CitiesIndex\\], 2 entries, stage 1
355
+ Imported CitiesIndex in \\d+s, stats: index 2
338
356
  Total: \\d+s\\Z
339
357
  OUTPUT
340
358
  end
@@ -345,8 +363,8 @@ Total: \\d+s\\Z
345
363
  .not_to update_index(CitiesIndex)
346
364
  expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
347
365
  \\AApplying journal entries created after [+-:\\d\\s]+
348
- Applying journal to \\[CountriesIndex::Country\\], 1 entries, stage 1
349
- Imported CountriesIndex::Country in \\d+s, stats: index 1
366
+ Applying journal to \\[CountriesIndex\\], 1 entries, stage 1
367
+ Imported CountriesIndex in \\d+s, stats: index 1
350
368
  Total: \\d+s\\Z
351
369
  OUTPUT
352
370
  end
@@ -393,4 +411,76 @@ Total: \\d+s\\Z
393
411
  OUTPUT
394
412
  end
395
413
  end
414
+
415
+ describe '.reindex' do
416
+ before do
417
+ journal
418
+ CitiesIndex.create!
419
+ CountriesIndex.create!
420
+ end
421
+
422
+ let(:source_index) { 'cities' }
423
+ let(:dest_index) { 'countries' }
424
+
425
+ context 'with correct arguments' do
426
+ specify do
427
+ output = StringIO.new
428
+ described_class.reindex(source: source_index, dest: dest_index, output: output)
429
+ expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
430
+ \\Source index is cities
431
+ \\Destination index is countries
432
+ cities index successfully reindexed with countries index data
433
+ Total: \\d+s\\Z
434
+ OUTPUT
435
+ end
436
+ end
437
+
438
+ context 'with missing indexes' do
439
+ context 'without dest index' do
440
+ specify do
441
+ output = StringIO.new
442
+ expect { described_class.reindex(source: source_index, output: output) }
443
+ .to raise_error ArgumentError
444
+ end
445
+ end
446
+
447
+ context 'without source index' do
448
+ specify do
449
+ output = StringIO.new
450
+ expect { described_class.reindex(dest: dest_index, output: output) }
451
+ .to raise_error ArgumentError
452
+ end
453
+ end
454
+ end
455
+ end
456
+
457
+ describe '.update_mapping' do
458
+ before do
459
+ journal
460
+ CitiesIndex.create!
461
+ end
462
+
463
+ let(:index_name) { CitiesIndex.index_name }
464
+ let(:nonexistent_index) { 'wrong_index' }
465
+
466
+ context 'with existing index' do
467
+ specify do
468
+ output = StringIO.new
469
+ described_class.update_mapping(name: index_name, output: output)
470
+ expect(output.string).to match(Regexp.new(<<-OUTPUT, Regexp::MULTILINE))
471
+ \\Index name is cities
472
+ cities index successfully updated
473
+ Total: \\d+s\\Z
474
+ OUTPUT
475
+ end
476
+ end
477
+
478
+ context 'with non-existent index name' do
479
+ specify do
480
+ output = StringIO.new
481
+ expect { described_class.update_mapping(name: nonexistent_index, output: output) }
482
+ .to raise_error NameError
483
+ end
484
+ end
485
+ end
396
486
  end