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
@@ -1,137 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Chewy::Type::Observe do
4
- describe '.update_index' do
5
- before do
6
- stub_index(:dummies) do
7
- define_type :dummy
8
- end
9
- end
10
-
11
- let(:backreferenced) { Array.new(3) { |i| double(id: i) } }
12
-
13
- specify do
14
- expect { DummiesIndex::Dummy.update_index(backreferenced) }
15
- .to raise_error Chewy::UndefinedUpdateStrategy
16
- end
17
- specify do
18
- expect { DummiesIndex::Dummy.update_index([]) }
19
- .not_to update_index('dummies#dummy')
20
- end
21
- specify do
22
- expect { DummiesIndex::Dummy.update_index(nil) }
23
- .not_to update_index('dummies#dummy')
24
- end
25
- end
26
-
27
- context 'integration', :orm do
28
- let(:update_condition) { true }
29
-
30
- before do
31
- city_countries_update_proc = if adapter == :sequel
32
- ->(*) { previous_changes.try(:[], :country_id) || country }
33
- else
34
- ->(*) { changes['country_id'] || previous_changes['country_id'] || country }
35
- end
36
-
37
- stub_model(:city) do
38
- update_index(->(city) { "cities##{city.class.name.underscore}" }) { self }
39
- update_index 'countries#country', &city_countries_update_proc
40
- end
41
-
42
- stub_model(:country) do
43
- update_index('cities#city', if: -> { update_condition }) { cities }
44
- update_index(-> { "countries##{self.class.name.underscore}" }, :self)
45
- attr_accessor :update_condition
46
- end
47
-
48
- if adapter == :sequel
49
- City.many_to_one :country
50
- Country.one_to_many :cities
51
- City.plugin :dirty
52
- else
53
- if adapter == :mongoid && Mongoid::VERSION.start_with?('6')
54
- City.belongs_to :country, optional: true
55
- else
56
- City.belongs_to :country
57
- end
58
- Country.has_many :cities
59
- end
60
-
61
- stub_index(:cities) do
62
- define_type City
63
- end
64
-
65
- stub_index(:countries) do
66
- define_type Country
67
- end
68
- end
69
-
70
- context do
71
- let!(:country1) { Chewy.strategy(:atomic) { Country.create!(id: 1, update_condition: update_condition) } }
72
- let!(:country2) { Chewy.strategy(:atomic) { Country.create!(id: 2, update_condition: update_condition) } }
73
- let!(:city) { Chewy.strategy(:atomic) { City.create!(id: 1, country: country1) } }
74
-
75
- specify { expect { city.save! }.to update_index('cities#city').and_reindex(city).only }
76
- specify { expect { city.save! }.to update_index('countries#country').and_reindex(country1).only }
77
-
78
- specify { expect { city.update!(country: nil) }.to update_index('cities#city').and_reindex(city).only }
79
- specify { expect { city.update!(country: nil) }.to update_index('countries#country').and_reindex(country1).only }
80
-
81
- specify { expect { city.update!(country: country2) }.to update_index('cities#city').and_reindex(city).only }
82
- specify { expect { city.update!(country: country2) }.to update_index('countries#country').and_reindex(country1, country2).only }
83
- end
84
-
85
- context do
86
- let!(:country) do
87
- Chewy.strategy(:atomic) do
88
- cities = Array.new(2) { |i| City.create!(id: i) }
89
- if adapter == :sequel
90
- Country.create(id: 1, update_condition: update_condition).tap do |country|
91
- cities.each { |city| country.add_city(city) }
92
- end
93
- else
94
- Country.create!(id: 1, cities: cities, update_condition: update_condition)
95
- end
96
- end
97
- end
98
-
99
- specify { expect { country.save! }.to update_index('cities#city').and_reindex(country.cities).only }
100
- specify { expect { country.save! }.to update_index('countries#country').and_reindex(country).only }
101
-
102
- context 'conditional update' do
103
- let(:update_condition) { false }
104
- specify { expect { country.save! }.not_to update_index('cities#city') }
105
- end
106
- end
107
- end
108
-
109
- context 'transactions', :active_record do
110
- context do
111
- before { stub_model(:city) { update_index 'cities#city', :self } }
112
- before { stub_index(:cities) { define_type City } }
113
-
114
- specify do
115
- Chewy.strategy(:urgent) do
116
- ActiveRecord::Base.transaction do
117
- expect { City.create! }.not_to update_index('cities#city')
118
- end
119
- end
120
- end
121
- end
122
-
123
- context do
124
- before { allow(Chewy).to receive_messages(use_after_commit_callbacks: false) }
125
- before { stub_model(:city) { update_index 'cities#city', :self } }
126
- before { stub_index(:cities) { define_type City } }
127
-
128
- specify do
129
- Chewy.strategy(:urgent) do
130
- ActiveRecord::Base.transaction do
131
- expect { City.create! }.to update_index('cities#city')
132
- end
133
- end
134
- end
135
- end
136
- end
137
- end
@@ -1,100 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Chewy::Type::Wrapper do
4
- before do
5
- stub_class(:city)
6
- stub_index(:cities) do
7
- define_type City
8
- end
9
- end
10
-
11
- let(:city_type) { CitiesIndex::City }
12
-
13
- describe '.build' do
14
- specify do
15
- expect(city_type.build({}).attributes)
16
- .to eq('id' => nil, '_score' => nil, '_explanation' => nil)
17
- end
18
- specify do
19
- expect(city_type.build('_source' => {name: 'Martin'}).attributes)
20
- .to eq('id' => nil, '_score' => nil, '_explanation' => nil, 'name' => 'Martin')
21
- end
22
- specify do
23
- expect(city_type.build('_id' => 42).attributes)
24
- .to eq('id' => 42, '_score' => nil, '_explanation' => nil)
25
- end
26
- specify do
27
- expect(city_type.build('_id' => 42, '_source' => {'id' => 43}).attributes)
28
- .to eq('id' => 43, '_score' => nil, '_explanation' => nil)
29
- end
30
- specify do
31
- expect(city_type.build('_score' => 42, '_explanation' => {foo: 'bar'}).attributes)
32
- .to eq('id' => nil, '_score' => 42, '_explanation' => {foo: 'bar'})
33
- end
34
- specify do
35
- expect(city_type.build('_score' => 42, 'borogoves' => {foo: 'bar'})._data)
36
- .to eq('_score' => 42, 'borogoves' => {foo: 'bar'})
37
- end
38
- end
39
-
40
- describe '#initialize' do
41
- subject(:city) { city_type.new(name: 'Martin', age: 42) }
42
-
43
- it do
44
- is_expected.to respond_to(:name)
45
- .and respond_to(:age)
46
- .and have_attributes(
47
- name: 'Martin',
48
- age: 42
49
- )
50
- end
51
-
52
- it { expect { city.population }.to raise_error(NoMethodError) }
53
-
54
- context 'highlight' do
55
- subject(:city) do
56
- city_type.new(name: 'Martin', age: 42)
57
- .tap do |city|
58
- city._data = {
59
- 'highlight' => {'name' => ['<b>Mar</b>tin']}
60
- }
61
- end
62
- end
63
-
64
- it do
65
- is_expected.to respond_to(:name_highlight)
66
- .and respond_to(:name_highlights)
67
- .and have_attributes(
68
- name: 'Martin',
69
- name_highlight: '<b>Mar</b>tin',
70
- name_highlights: ['<b>Mar</b>tin']
71
- )
72
- end
73
- end
74
- end
75
-
76
- describe '#==' do
77
- specify { expect(city_type.new(id: 42)).to eq(city_type.new(id: 42)) }
78
- specify { expect(city_type.new(id: 42, age: 55)).to eq(city_type.new(id: 42, age: 54)) }
79
- specify { expect(city_type.new(id: 42)).not_to eq(city_type.new(id: 43)) }
80
- specify { expect(city_type.new(id: 42, age: 55)).not_to eq(city_type.new(id: 43, age: 55)) }
81
- specify { expect(city_type.new(age: 55)).to eq(city_type.new(age: 55)) }
82
- specify { expect(city_type.new(age: 55)).not_to eq(city_type.new(age: 54)) }
83
-
84
- specify { expect(city_type.new(id: '42')).to eq(City.new.tap { |m| allow(m).to receive_messages(id: 42) }) }
85
- specify { expect(city_type.new(id: 42)).not_to eq(City.new.tap { |m| allow(m).to receive_messages(id: 43) }) }
86
- specify { expect(city_type.new(id: 42)).not_to eq(Class.new) }
87
-
88
- context 'models', :orm do
89
- before do
90
- stub_model(:city)
91
- stub_index(:cities) do
92
- define_type City
93
- end
94
- end
95
- specify { expect(city_type.new(id: '42')).to eq(City.new.tap { |m| allow(m).to receive_messages(id: 42) }) }
96
- specify { expect(city_type.new(id: 42)).not_to eq(City.new.tap { |m| allow(m).to receive_messages(id: 43) }) }
97
- specify { expect(city_type.new(id: 42)).not_to eq(Class.new) }
98
- end
99
- end
100
- end
@@ -1,55 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Chewy::Type do
4
- describe '.derivable_name' do
5
- specify { expect { Class.new(Chewy::Type).derivable_name }.to raise_error NotImplementedError }
6
-
7
- specify do
8
- index = Class.new(Chewy::Index) { define_type :city }
9
- expect(index::City.derivable_name).to be_nil
10
- end
11
-
12
- specify do
13
- stub_index(:places) { define_type :city }
14
- expect(PlacesIndex::City.derivable_name).to eq('places#city')
15
- end
16
-
17
- specify do
18
- stub_index('namespace/places') { define_type :city }
19
- expect(Namespace::PlacesIndex::City.derivable_name).to eq('namespace/places#city')
20
- end
21
- end
22
-
23
- describe '.types' do
24
- subject { Class.new(Chewy::Type) }
25
- specify { expect(subject.types).to eq([subject]) }
26
- end
27
-
28
- describe '.scopes' do
29
- before do
30
- stub_index(:places) do
31
- def self.by_id; end
32
-
33
- define_type :city do
34
- def self.by_rating; end
35
-
36
- def self.by_name; end
37
- end
38
- end
39
- end
40
-
41
- specify { expect(described_class.scopes).to eq([]) }
42
- specify { expect(PlacesIndex::City.scopes).to match_array(%i[by_rating by_name]) }
43
- specify { expect { PlacesIndex::City.non_existing_method_call }.to raise_error(NoMethodError) }
44
-
45
- specify { expect(PlacesIndex::City._default_import_options).to eq({}) }
46
- specify { expect { PlacesIndex::City.default_import_options(invalid_option: 'Yeah!') }.to raise_error(ArgumentError) }
47
-
48
- context 'default_import_options is set' do
49
- let(:converter) { -> {} }
50
- before { PlacesIndex::City.default_import_options(batch_size: 500, raw_import: converter) }
51
-
52
- specify { expect(PlacesIndex::City._default_import_options).to eq(batch_size: 500, raw_import: converter) }
53
- end
54
- end
55
- end
@@ -1,93 +0,0 @@
1
- require 'database_cleaner'
2
-
3
- CONFIG = {
4
- sessions: {
5
- default: {
6
- uri: 'mongodb://127.0.0.1:27017/chewy_mongoid_test'
7
- }
8
- },
9
- clients: {
10
- default: {
11
- uri: 'mongodb://127.0.0.1:27017/chewy_mongoid_test'
12
- }
13
- }
14
- }.freeze
15
-
16
- Mongoid.configure do |config|
17
- config.load_configuration(CONFIG)
18
- end
19
-
20
- Mongoid.logger = Logger.new('/dev/null')
21
-
22
- module MongoidClassHelpers
23
- extend ActiveSupport::Concern
24
-
25
- module Document
26
- def serializable_hash(options = nil)
27
- hash = super(options)
28
- hash['id'] = hash.delete('_id') if hash.key?('_id')
29
- hash
30
- end
31
- end
32
-
33
- module Country
34
- extend ActiveSupport::Concern
35
-
36
- included do
37
- include Mongoid::Document
38
- include Mongoid::Timestamps::Updated
39
- include Document
40
-
41
- field :name, type: String
42
- field :country_code, type: String
43
- field :rating, type: Integer
44
- end
45
- end
46
-
47
- module City
48
- extend ActiveSupport::Concern
49
-
50
- included do
51
- include Mongoid::Document
52
- include Mongoid::Timestamps::Updated
53
- include Document
54
-
55
- field :name, type: String
56
- field :rating, type: Integer
57
- end
58
- end
59
-
60
- def adapter
61
- :mongoid
62
- end
63
-
64
- def stub_model(name, superclass = nil, &block)
65
- mixin = "MongoidClassHelpers::#{name.to_s.camelize}".safe_constantize || Mongoid::Document
66
-
67
- model = stub_class(name, superclass) do
68
- include mixin
69
- store_in collection: name.to_s.tableize
70
- end
71
- model.tap { |i| i.class_eval(&block) if block }
72
- end
73
- end
74
-
75
- RSpec.configure do |config|
76
- config.include MongoidClassHelpers
77
-
78
- config.filter_run_excluding :active_record
79
- config.filter_run_excluding :sequel
80
-
81
- config.before(:suite) do
82
- DatabaseCleaner.clean_with :truncation
83
- DatabaseCleaner.strategy = :truncation
84
- end
85
-
86
- config.before do
87
- DatabaseCleaner.start
88
- end
89
-
90
- config.after do
91
- DatabaseCleaner.clean
92
- end
93
- end
@@ -1,80 +0,0 @@
1
- require 'database_cleaner'
2
-
3
- DB = Sequel.sqlite # logger: Logger.new(STDERR)
4
- Sequel::Deprecation.output = false
5
-
6
- DB.create_table :countries do
7
- primary_key :id
8
- column :name, :string
9
- column :country_code, :string
10
- column :rating, :integer
11
- column :updated_at, :datetime
12
- end
13
-
14
- DB.create_table :cities do
15
- primary_key :id
16
- column :country_id, :integer
17
- column :name, :string
18
- column :rating, :integer
19
- column :updated_at, :datetime
20
- end
21
-
22
- DB.create_table :rating_cities do
23
- primary_key :rating
24
- column :country_id, :integer
25
- column :name, :string
26
- column :updated_at, :datetime
27
- end
28
-
29
- Sequel::Model.plugin :timestamps, update_on_create: true
30
- Sequel::Model.plugin :chewy_observe
31
-
32
- module SequelClassHelpers
33
- extend ActiveSupport::Concern
34
-
35
- class AdaptedSequelModel < Sequel::Model
36
- # Allow to set primary key using mass assignment.
37
- unrestrict_primary_key
38
-
39
- # Aliases for compatibility with specs that were written with ActiveRecord in mind...
40
- alias_method :save!, :save
41
- alias_method :update_attributes, :update
42
- alias_method :update_attributes!, :update
43
-
44
- class << self
45
- alias_method :create!, :create
46
- end
47
- end
48
-
49
- def adapter
50
- :sequel
51
- end
52
-
53
- def stub_model(name, &block)
54
- stub_class(name, AdaptedSequelModel, &block).tap do |klass|
55
- # Sequel doesn't work well with dynamically created classes,
56
- # so we must set the dataset (table) name manually.
57
- klass.dataset = name.to_s.pluralize.to_sym
58
- end
59
- end
60
- end
61
-
62
- RSpec.configure do |config|
63
- config.include SequelClassHelpers
64
-
65
- config.filter_run_excluding :active_record
66
- config.filter_run_excluding :mongoid
67
-
68
- config.before(:suite) do
69
- DatabaseCleaner.clean_with :truncation
70
- DatabaseCleaner.strategy = :truncation
71
- end
72
-
73
- config.before do
74
- DatabaseCleaner.start
75
- end
76
-
77
- config.after do
78
- DatabaseCleaner.clean
79
- end
80
- end