chewy 7.1.0 → 7.2.0

Sign up to get free protection for your applications and to get access to all the features.
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