elasticsearch-model 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/CHANGELOG.md +9 -1
- data/README.md +9 -2
- data/Rakefile +7 -1
- data/elasticsearch-model.gemspec +3 -5
- data/gemfiles/4.0.gemfile +0 -1
- data/lib/elasticsearch/model/adapters/active_record.rb +4 -2
- data/lib/elasticsearch/model/importing.rb +29 -4
- data/lib/elasticsearch/model/indexing.rb +1 -1
- data/lib/elasticsearch/model/response/pagination.rb +9 -1
- data/lib/elasticsearch/model/version.rb +1 -1
- data/test/integration/active_record_associations_parent_child.rb +1 -0
- data/test/integration/active_record_associations_test.rb +88 -87
- data/test/integration/active_record_basic_test.rb +13 -13
- data/test/integration/active_record_custom_serialization_test.rb +14 -13
- data/test/integration/active_record_import_test.rb +14 -14
- data/test/integration/active_record_namespaced_model_test.rb +10 -10
- data/test/integration/active_record_pagination_test.rb +14 -14
- data/test/test_helper.rb +11 -5
- data/test/unit/adapter_active_record_test.rb +17 -0
- data/test/unit/callbacks_test.rb +1 -0
- data/test/unit/importing_test.rb +21 -1
- data/test/unit/indexing_test.rb +35 -2
- data/test/unit/proxy_test.rb +1 -0
- data/test/unit/response_pagination_kaminari_test.rb +2 -0
- data/test/unit/response_pagination_will_paginate_test.rb +20 -1
- data/test/unit/searching_search_request_test.rb +5 -0
- data/test/unit/searching_test.rb +1 -0
- metadata +8 -36
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MjRiMDMxMDViNGQxODdmNTQ3Nzc4N2IyOWYyMTdiNzhlMmIzZWZhYw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NjE4NjI4NDBkNDdjNTU4MjU1YTJhZDU0MzRmZTk1NDdkMTgxNDc1Mw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NWJhZjZjNzRiYmYwOTVlZjc4ZTk0ZTRhMWRkNWI0MWMxZTAxODVmYzAwZTM5
|
10
|
+
NDc4MTkxMDZlOTRlMDc1MDkyMGUwZTNjZDU4MWE2Y2I5YmQ4MGI2NDA0NDVi
|
11
|
+
NDI0MGUxNjdjOTE2MTQ4MmM2OTcwM2ZjMDA5Nzg3YTcwY2YzOTg=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NGM2NGM2NTBjNTEzMzdhNjZmYzI5MzM4NDZiYjEwOTQ4Y2Y2NWQyYTZiYWZl
|
14
|
+
YWExZWQzZmI5NWRmOWRjNzExMDE3NGFjMTM2ODk4NDliOTNkOWI1M2UwZjRk
|
15
|
+
MjA1MWFiODE1ZWY5ZGExZDMxZWZmNzIxNzNhNDAyMDlkZjdjZWI=
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,12 @@
|
|
1
|
-
## 0.1.
|
1
|
+
## 0.1.5
|
2
|
+
|
3
|
+
* Improved documentation
|
4
|
+
* Fixes and improvements to the "will_paginate" integration
|
5
|
+
* Added a `:preprocess` option to the `import` method
|
6
|
+
* Changed, that attributes are fetched from `as_indexed_json` in the `update_document` method
|
7
|
+
* Added an option to the import method to return an array of error messages instead of just count
|
8
|
+
* Fixed many problems with dependency hell
|
9
|
+
* Fixed tests so they run on Ruby 2.2
|
2
10
|
|
3
11
|
## 0.1.2
|
4
12
|
|
data/README.md
CHANGED
@@ -126,7 +126,7 @@ Article.__elasticsearch__.client = Elasticsearch::Client.new host: 'api.server.o
|
|
126
126
|
Or configure the client for all models:
|
127
127
|
|
128
128
|
```ruby
|
129
|
-
Elasticsearch::Model.client = Elasticsearch::Client.new log:true
|
129
|
+
Elasticsearch::Model.client = Elasticsearch::Client.new log: true
|
130
130
|
```
|
131
131
|
|
132
132
|
You might want to do this during you application bootstrap process, e.g. in a Rails initializer.
|
@@ -146,6 +146,9 @@ Article.import
|
|
146
146
|
# => 0
|
147
147
|
```
|
148
148
|
|
149
|
+
It's possible to import only records from a specific `scope`, transform the batch with the `transform`
|
150
|
+
and `preprocess` options, or re-create the index by deleting it and creating it with correct mapping with the `force` option -- look for examples in the method documentation.
|
151
|
+
|
149
152
|
No errors were reported during importing, so... let's search the index!
|
150
153
|
|
151
154
|
|
@@ -507,7 +510,8 @@ Article.first.__elasticsearch__.as_indexed_json
|
|
507
510
|
# => {"id"=>1, "title"=>"Quick brown fox"}
|
508
511
|
```
|
509
512
|
|
510
|
-
If you want to customize the serialization, just implement the `as_indexed_json` method yourself
|
513
|
+
If you want to customize the serialization, just implement the `as_indexed_json` method yourself,
|
514
|
+
for instance with the [`as_json`](http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json) method:
|
511
515
|
|
512
516
|
```ruby
|
513
517
|
class Article
|
@@ -524,6 +528,9 @@ Article.first.as_indexed_json
|
|
524
528
|
|
525
529
|
The re-defined method will be used in the indexing methods, such as `index_document`.
|
526
530
|
|
531
|
+
Please note that in Rails 3, you need to either set `include_root_in_json: false`, or prevent adding
|
532
|
+
the "root" in the JSON representation with other means.
|
533
|
+
|
527
534
|
#### Relationships and Associations
|
528
535
|
|
529
536
|
When you have a more complicated structure/schema, you need to customize the `as_indexed_json` method -
|
data/Rakefile
CHANGED
@@ -22,12 +22,18 @@ namespace :test do
|
|
22
22
|
# test.warning = true
|
23
23
|
end
|
24
24
|
|
25
|
-
Rake::TestTask.new(:
|
25
|
+
Rake::TestTask.new(:run_integration) do |test|
|
26
26
|
Rake::Task['test:ci_reporter'].invoke if ENV['CI']
|
27
27
|
test.libs << 'lib' << 'test'
|
28
28
|
test.test_files = FileList["test/integration/**/*_test.rb"]
|
29
29
|
end
|
30
30
|
|
31
|
+
desc "Run integration tests against ActiveModel 3 and 4"
|
32
|
+
task :integration do
|
33
|
+
sh "BUNDLE_GEMFILE='#{File.expand_path('../gemfiles/3.0.gemfile', __FILE__)}' bundle exec rake test:run_integration" unless defined?(RUBY_VERSION) && RUBY_VERSION > '2.2'
|
34
|
+
sh "BUNDLE_GEMFILE='#{File.expand_path('../gemfiles/4.0.gemfile', __FILE__)}' bundle exec rake test:run_integration"
|
35
|
+
end
|
36
|
+
|
31
37
|
Rake::TestTask.new(:all) do |test|
|
32
38
|
Rake::Task['test:ci_reporter'].invoke if ENV['CI']
|
33
39
|
test.libs << 'lib' << 'test'
|
data/elasticsearch-model.gemspec
CHANGED
@@ -34,26 +34,24 @@ Gem::Specification.new do |s|
|
|
34
34
|
|
35
35
|
s.add_development_dependency "sqlite3"
|
36
36
|
s.add_development_dependency "activemodel", "> 3.0"
|
37
|
-
s.add_development_dependency "activerecord", "> 4.0"
|
38
37
|
|
39
38
|
s.add_development_dependency "oj"
|
40
39
|
s.add_development_dependency "kaminari"
|
41
40
|
s.add_development_dependency "will_paginate"
|
42
|
-
# NOTE: Do not add Mongoid here, keep only in 3/4 files
|
43
41
|
|
44
|
-
s.add_development_dependency "minitest", "~> 4
|
42
|
+
s.add_development_dependency "minitest", "~> 4"
|
43
|
+
s.add_development_dependency "test-unit" if defined?(RUBY_VERSION) && RUBY_VERSION > '2.2'
|
45
44
|
s.add_development_dependency "shoulda-context"
|
46
45
|
s.add_development_dependency "mocha"
|
47
46
|
s.add_development_dependency "turn"
|
48
47
|
s.add_development_dependency "yard"
|
49
48
|
s.add_development_dependency "ruby-prof"
|
50
49
|
s.add_development_dependency "pry"
|
51
|
-
s.add_development_dependency "ci_reporter"
|
50
|
+
s.add_development_dependency "ci_reporter", "~> 1.9"
|
52
51
|
|
53
52
|
if defined?(RUBY_VERSION) && RUBY_VERSION > '1.9'
|
54
53
|
s.add_development_dependency "simplecov"
|
55
54
|
s.add_development_dependency "cane"
|
56
55
|
s.add_development_dependency "require-prof"
|
57
|
-
s.add_development_dependency "coveralls"
|
58
56
|
end
|
59
57
|
end
|
data/gemfiles/4.0.gemfile
CHANGED
@@ -78,17 +78,19 @@ module Elasticsearch
|
|
78
78
|
|
79
79
|
module Importing
|
80
80
|
|
81
|
-
# Fetch batches of records from the database
|
81
|
+
# Fetch batches of records from the database (used by the import method)
|
82
|
+
#
|
82
83
|
#
|
83
84
|
# @see http://api.rubyonrails.org/classes/ActiveRecord/Batches.html ActiveRecord::Batches.find_in_batches
|
84
85
|
#
|
85
86
|
def __find_in_batches(options={}, &block)
|
86
87
|
named_scope = options.delete(:scope)
|
88
|
+
preprocess = options.delete(:preprocess)
|
87
89
|
|
88
90
|
scope = named_scope ? self.__send__(named_scope) : self
|
89
91
|
|
90
92
|
scope.find_in_batches(options) do |batch|
|
91
|
-
yield batch
|
93
|
+
yield (preprocess ? self.__send__(preprocess, batch) : batch)
|
92
94
|
end
|
93
95
|
end
|
94
96
|
|
@@ -76,16 +76,36 @@ module Elasticsearch
|
|
76
76
|
#
|
77
77
|
# Article.import transform: transform
|
78
78
|
#
|
79
|
+
# @example Update the batch before yielding it
|
80
|
+
#
|
81
|
+
# class Article
|
82
|
+
# # ...
|
83
|
+
# def enrich(batch)
|
84
|
+
# batch.each do |item|
|
85
|
+
# item.metadata = MyAPI.get_metadata(item.id)
|
86
|
+
# end
|
87
|
+
# batch
|
88
|
+
# end
|
89
|
+
# end
|
90
|
+
#
|
91
|
+
# Article.import preprocess: enrich
|
92
|
+
#
|
93
|
+
# @example Return an array of error elements instead of the number of errors, eg.
|
94
|
+
# to try importing these records again
|
95
|
+
#
|
96
|
+
# Article.import return: 'errors'
|
97
|
+
#
|
79
98
|
def import(options={}, &block)
|
80
|
-
errors =
|
99
|
+
errors = []
|
81
100
|
refresh = options.delete(:refresh) || false
|
82
101
|
target_index = options.delete(:index) || index_name
|
83
102
|
target_type = options.delete(:type) || document_type
|
84
103
|
transform = options.delete(:transform) || __transform
|
104
|
+
return_value = options.delete(:return) || 'count'
|
85
105
|
|
86
106
|
unless transform.respond_to?(:call)
|
87
107
|
raise ArgumentError,
|
88
|
-
"Pass an object responding to `call` as the :
|
108
|
+
"Pass an object responding to `call` as the :transform option, #{transform.class} given"
|
89
109
|
end
|
90
110
|
|
91
111
|
if options.delete(:force)
|
@@ -100,12 +120,17 @@ module Elasticsearch
|
|
100
120
|
|
101
121
|
yield response if block_given?
|
102
122
|
|
103
|
-
errors +=
|
123
|
+
errors += response['items'].select { |k, v| k.values.first['error'] }
|
104
124
|
end
|
105
125
|
|
106
126
|
self.refresh_index! if refresh
|
107
127
|
|
108
|
-
|
128
|
+
case return_value
|
129
|
+
when 'errors'
|
130
|
+
errors
|
131
|
+
else
|
132
|
+
errors.size
|
133
|
+
end
|
109
134
|
end
|
110
135
|
|
111
136
|
def __batch_to_bulk(batch, transform)
|
@@ -336,7 +336,7 @@ module Elasticsearch
|
|
336
336
|
def update_document(options={})
|
337
337
|
if changed_attributes = self.instance_variable_get(:@__changed_attributes)
|
338
338
|
attributes = if respond_to?(:as_indexed_json)
|
339
|
-
|
339
|
+
self.as_indexed_json.select { |k,v| changed_attributes.keys.map(&:to_s).include? k.to_s }
|
340
340
|
else
|
341
341
|
changed_attributes
|
342
342
|
end
|
@@ -102,11 +102,19 @@ module Elasticsearch
|
|
102
102
|
|
103
103
|
# Include the paging methods in results and records
|
104
104
|
#
|
105
|
-
methods = [:current_page, :per_page, :total_entries, :total_pages, :previous_page, :next_page, :out_of_bounds?]
|
105
|
+
methods = [:current_page, :offset, :length, :per_page, :total_entries, :total_pages, :previous_page, :next_page, :out_of_bounds?]
|
106
106
|
Elasticsearch::Model::Response::Results.__send__ :delegate, *methods, to: :response
|
107
107
|
Elasticsearch::Model::Response::Records.__send__ :delegate, *methods, to: :response
|
108
108
|
end
|
109
109
|
|
110
|
+
def offset
|
111
|
+
(current_page - 1) * per_page
|
112
|
+
end
|
113
|
+
|
114
|
+
def length
|
115
|
+
search.definition[:size]
|
116
|
+
end
|
117
|
+
|
110
118
|
# Main pagination method
|
111
119
|
#
|
112
120
|
# @example
|
@@ -1,91 +1,5 @@
|
|
1
1
|
require 'test_helper'
|
2
|
-
|
3
|
-
# ----- Models definition -------------------------------------------------------------------------
|
4
|
-
|
5
|
-
class Category < ActiveRecord::Base
|
6
|
-
has_and_belongs_to_many :posts
|
7
|
-
end
|
8
|
-
|
9
|
-
class Author < ActiveRecord::Base
|
10
|
-
has_many :authorships
|
11
|
-
|
12
|
-
def full_name
|
13
|
-
[first_name, last_name].compact.join(' ')
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class Authorship < ActiveRecord::Base
|
18
|
-
belongs_to :author
|
19
|
-
belongs_to :post, touch: true
|
20
|
-
end
|
21
|
-
|
22
|
-
class Comment < ActiveRecord::Base
|
23
|
-
belongs_to :post, touch: true
|
24
|
-
end
|
25
|
-
|
26
|
-
class Post < ActiveRecord::Base
|
27
|
-
has_and_belongs_to_many :categories, after_add: [ lambda { |a,c| a.__elasticsearch__.index_document } ],
|
28
|
-
after_remove: [ lambda { |a,c| a.__elasticsearch__.index_document } ]
|
29
|
-
has_many :authorships
|
30
|
-
has_many :authors, through: :authorships
|
31
|
-
has_many :comments
|
32
|
-
end
|
33
|
-
|
34
|
-
# ----- Search integration via Concern module -----------------------------------------------------
|
35
|
-
|
36
|
-
module Searchable
|
37
|
-
extend ActiveSupport::Concern
|
38
|
-
|
39
|
-
included do
|
40
|
-
include Elasticsearch::Model
|
41
|
-
include Elasticsearch::Model::Callbacks
|
42
|
-
|
43
|
-
# Set up the mapping
|
44
|
-
#
|
45
|
-
settings index: { number_of_shards: 1, number_of_replicas: 0 } do
|
46
|
-
mapping do
|
47
|
-
indexes :title, analyzer: 'snowball'
|
48
|
-
indexes :created_at, type: 'date'
|
49
|
-
|
50
|
-
indexes :authors do
|
51
|
-
indexes :first_name
|
52
|
-
indexes :last_name
|
53
|
-
indexes :full_name, type: 'multi_field' do
|
54
|
-
indexes :full_name
|
55
|
-
indexes :raw, analyzer: 'keyword'
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
indexes :categories, analyzer: 'keyword'
|
60
|
-
|
61
|
-
indexes :comments, type: 'nested' do
|
62
|
-
indexes :text
|
63
|
-
indexes :author
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
# Customize the JSON serialization for Elasticsearch
|
69
|
-
#
|
70
|
-
def as_indexed_json(options={})
|
71
|
-
{
|
72
|
-
title: title,
|
73
|
-
text: text,
|
74
|
-
categories: categories.map(&:title),
|
75
|
-
authors: authors.as_json(methods: [:full_name], only: [:full_name, :first_name, :last_name]),
|
76
|
-
comments: comments.as_json(only: [:text, :author])
|
77
|
-
}
|
78
|
-
end
|
79
|
-
|
80
|
-
# Update document in the index after touch
|
81
|
-
#
|
82
|
-
after_touch() { __elasticsearch__.index_document }
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
# Include the search integration
|
87
|
-
#
|
88
|
-
Post.__send__ :include, Searchable
|
2
|
+
require 'active_record'
|
89
3
|
|
90
4
|
module Elasticsearch
|
91
5
|
module Model
|
@@ -133,6 +47,93 @@ module Elasticsearch
|
|
133
47
|
end
|
134
48
|
end
|
135
49
|
|
50
|
+
# ----- Models definition -------------------------------------------------------------------------
|
51
|
+
|
52
|
+
class Category < ActiveRecord::Base
|
53
|
+
has_and_belongs_to_many :posts
|
54
|
+
end
|
55
|
+
|
56
|
+
class Author < ActiveRecord::Base
|
57
|
+
has_many :authorships
|
58
|
+
|
59
|
+
def full_name
|
60
|
+
[first_name, last_name].compact.join(' ')
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class Authorship < ActiveRecord::Base
|
65
|
+
belongs_to :author
|
66
|
+
belongs_to :post, touch: true
|
67
|
+
end
|
68
|
+
|
69
|
+
class Comment < ActiveRecord::Base
|
70
|
+
belongs_to :post, touch: true
|
71
|
+
end
|
72
|
+
|
73
|
+
class Post < ActiveRecord::Base
|
74
|
+
has_and_belongs_to_many :categories, after_add: [ lambda { |a,c| a.__elasticsearch__.index_document } ],
|
75
|
+
after_remove: [ lambda { |a,c| a.__elasticsearch__.index_document } ]
|
76
|
+
has_many :authorships
|
77
|
+
has_many :authors, through: :authorships
|
78
|
+
has_many :comments
|
79
|
+
end
|
80
|
+
|
81
|
+
# ----- Search integration via Concern module -----------------------------------------------------
|
82
|
+
|
83
|
+
module Searchable
|
84
|
+
extend ActiveSupport::Concern
|
85
|
+
|
86
|
+
included do
|
87
|
+
include Elasticsearch::Model
|
88
|
+
include Elasticsearch::Model::Callbacks
|
89
|
+
|
90
|
+
# Set up the mapping
|
91
|
+
#
|
92
|
+
settings index: { number_of_shards: 1, number_of_replicas: 0 } do
|
93
|
+
mapping do
|
94
|
+
indexes :title, analyzer: 'snowball'
|
95
|
+
indexes :created_at, type: 'date'
|
96
|
+
|
97
|
+
indexes :authors do
|
98
|
+
indexes :first_name
|
99
|
+
indexes :last_name
|
100
|
+
indexes :full_name, type: 'multi_field' do
|
101
|
+
indexes :full_name
|
102
|
+
indexes :raw, analyzer: 'keyword'
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
indexes :categories, analyzer: 'keyword'
|
107
|
+
|
108
|
+
indexes :comments, type: 'nested' do
|
109
|
+
indexes :text
|
110
|
+
indexes :author
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
# Customize the JSON serialization for Elasticsearch
|
116
|
+
#
|
117
|
+
def as_indexed_json(options={})
|
118
|
+
{
|
119
|
+
title: title,
|
120
|
+
text: text,
|
121
|
+
categories: categories.map(&:title),
|
122
|
+
authors: authors.as_json(methods: [:full_name], only: [:full_name, :first_name, :last_name]),
|
123
|
+
comments: comments.as_json(only: [:text, :author])
|
124
|
+
}
|
125
|
+
end
|
126
|
+
|
127
|
+
# Update document in the index after touch
|
128
|
+
#
|
129
|
+
after_touch() { __elasticsearch__.index_document }
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# Include the search integration
|
134
|
+
#
|
135
|
+
Post.__send__ :include, Searchable
|
136
|
+
|
136
137
|
# ----- Reset the index -----------------------------------------------------------------
|
137
138
|
|
138
139
|
Post.delete_all
|
@@ -1,23 +1,11 @@
|
|
1
1
|
require 'test_helper'
|
2
|
+
require 'active_record'
|
2
3
|
|
3
4
|
puts "ActiveRecord #{ActiveRecord::VERSION::STRING}", '-'*80
|
4
5
|
|
5
6
|
module Elasticsearch
|
6
7
|
module Model
|
7
8
|
class ActiveRecordBasicIntegrationTest < Elasticsearch::Test::IntegrationTestCase
|
8
|
-
|
9
|
-
class ::Article < ActiveRecord::Base
|
10
|
-
include Elasticsearch::Model
|
11
|
-
include Elasticsearch::Model::Callbacks
|
12
|
-
|
13
|
-
settings index: { number_of_shards: 1, number_of_replicas: 0 } do
|
14
|
-
mapping do
|
15
|
-
indexes :title, type: 'string', analyzer: 'snowball'
|
16
|
-
indexes :created_at, type: 'date'
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
9
|
context "ActiveRecord basic integration" do
|
22
10
|
setup do
|
23
11
|
ActiveRecord::Schema.define(:version => 1) do
|
@@ -27,6 +15,18 @@ module Elasticsearch
|
|
27
15
|
end
|
28
16
|
end
|
29
17
|
|
18
|
+
class ::Article < ActiveRecord::Base
|
19
|
+
include Elasticsearch::Model
|
20
|
+
include Elasticsearch::Model::Callbacks
|
21
|
+
|
22
|
+
settings index: { number_of_shards: 1, number_of_replicas: 0 } do
|
23
|
+
mapping do
|
24
|
+
indexes :title, type: 'string', analyzer: 'snowball'
|
25
|
+
indexes :created_at, type: 'date'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
30
|
Article.delete_all
|
31
31
|
Article.__elasticsearch__.create_index! force: true
|
32
32
|
|
@@ -1,24 +1,25 @@
|
|
1
1
|
require 'test_helper'
|
2
|
+
require 'active_record'
|
2
3
|
|
3
4
|
module Elasticsearch
|
4
5
|
module Model
|
5
6
|
class ActiveRecordCustomSerializationTest < Elasticsearch::Test::IntegrationTestCase
|
7
|
+
context "ActiveRecord model with custom JSON serialization" do
|
8
|
+
setup do
|
9
|
+
class ::ArticleWithCustomSerialization < ActiveRecord::Base
|
10
|
+
include Elasticsearch::Model
|
11
|
+
include Elasticsearch::Model::Callbacks
|
6
12
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
mapping do
|
12
|
-
indexes :title
|
13
|
-
end
|
13
|
+
mapping do
|
14
|
+
indexes :title
|
15
|
+
end
|
14
16
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
17
|
+
def as_indexed_json(options={})
|
18
|
+
# as_json(options.merge root: false).slice('title')
|
19
|
+
{ title: self.title }
|
20
|
+
end
|
21
|
+
end
|
19
22
|
|
20
|
-
context "ActiveRecord model with custom JSON serialization" do
|
21
|
-
setup do
|
22
23
|
ActiveRecord::Schema.define(:version => 1) do
|
23
24
|
create_table ArticleWithCustomSerialization.table_name do |t|
|
24
25
|
t.string :title
|
@@ -1,22 +1,9 @@
|
|
1
1
|
require 'test_helper'
|
2
|
+
require 'active_record'
|
2
3
|
|
3
4
|
module Elasticsearch
|
4
5
|
module Model
|
5
6
|
class ActiveRecordImportIntegrationTest < Elasticsearch::Test::IntegrationTestCase
|
6
|
-
|
7
|
-
class ::ImportArticle < ActiveRecord::Base
|
8
|
-
include Elasticsearch::Model
|
9
|
-
|
10
|
-
scope :popular, -> { where('views >= 50') }
|
11
|
-
|
12
|
-
mapping do
|
13
|
-
indexes :title, type: 'string'
|
14
|
-
indexes :views, type: 'integer'
|
15
|
-
indexes :numeric, type: 'integer'
|
16
|
-
indexes :created_at, type: 'date'
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
7
|
context "ActiveRecord importing" do
|
21
8
|
setup do
|
22
9
|
ActiveRecord::Schema.define(:version => 1) do
|
@@ -28,6 +15,19 @@ module Elasticsearch
|
|
28
15
|
end
|
29
16
|
end
|
30
17
|
|
18
|
+
class ::ImportArticle < ActiveRecord::Base
|
19
|
+
include Elasticsearch::Model
|
20
|
+
|
21
|
+
scope :popular, -> { where('views >= 50') }
|
22
|
+
|
23
|
+
mapping do
|
24
|
+
indexes :title, type: 'string'
|
25
|
+
indexes :views, type: 'integer'
|
26
|
+
indexes :numeric, type: 'integer'
|
27
|
+
indexes :created_at, type: 'date'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
31
|
ImportArticle.delete_all
|
32
32
|
ImportArticle.__elasticsearch__.create_index! force: true
|
33
33
|
ImportArticle.__elasticsearch__.client.cluster.health wait_for_status: 'yellow'
|
@@ -1,18 +1,9 @@
|
|
1
1
|
require 'test_helper'
|
2
|
+
require 'active_record'
|
2
3
|
|
3
4
|
module Elasticsearch
|
4
5
|
module Model
|
5
6
|
class ActiveRecordNamespacedModelIntegrationTest < Elasticsearch::Test::IntegrationTestCase
|
6
|
-
|
7
|
-
module ::MyNamespace
|
8
|
-
class Article < ActiveRecord::Base
|
9
|
-
include Elasticsearch::Model
|
10
|
-
include Elasticsearch::Model::Callbacks
|
11
|
-
|
12
|
-
mapping { indexes :title }
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
7
|
context "Namespaced ActiveRecord model integration" do
|
17
8
|
setup do
|
18
9
|
ActiveRecord::Schema.define(:version => 1) do
|
@@ -21,6 +12,15 @@ module Elasticsearch
|
|
21
12
|
end
|
22
13
|
end
|
23
14
|
|
15
|
+
module ::MyNamespace
|
16
|
+
class Article < ActiveRecord::Base
|
17
|
+
include Elasticsearch::Model
|
18
|
+
include Elasticsearch::Model::Callbacks
|
19
|
+
|
20
|
+
mapping { indexes :title }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
24
|
MyNamespace::Article.delete_all
|
25
25
|
MyNamespace::Article.__elasticsearch__.create_index! force: true
|
26
26
|
|
@@ -1,26 +1,24 @@
|
|
1
1
|
require 'test_helper'
|
2
|
+
require 'active_record'
|
2
3
|
|
3
4
|
module Elasticsearch
|
4
5
|
module Model
|
5
6
|
class ActiveRecordPaginationTest < Elasticsearch::Test::IntegrationTestCase
|
7
|
+
context "ActiveRecord pagination" do
|
8
|
+
setup do
|
9
|
+
class ::ArticleForPagination < ActiveRecord::Base
|
10
|
+
include Elasticsearch::Model
|
6
11
|
|
7
|
-
|
8
|
-
include Elasticsearch::Model
|
9
|
-
|
10
|
-
scope :published, -> { where(published: true) }
|
12
|
+
scope :published, -> { where(published: true) }
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
settings index: { number_of_shards: 1, number_of_replicas: 0 } do
|
15
|
+
mapping do
|
16
|
+
indexes :title, type: 'string', analyzer: 'snowball'
|
17
|
+
indexes :created_at, type: 'date'
|
18
|
+
end
|
19
|
+
end
|
16
20
|
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
Kaminari::Hooks.init
|
21
21
|
|
22
|
-
context "ActiveRecord pagination" do
|
23
|
-
setup do
|
24
22
|
ActiveRecord::Schema.define(:version => 1) do
|
25
23
|
create_table ::ArticleForPagination.table_name do |t|
|
26
24
|
t.string :title
|
@@ -29,6 +27,8 @@ module Elasticsearch
|
|
29
27
|
end
|
30
28
|
end
|
31
29
|
|
30
|
+
Kaminari::Hooks.init
|
31
|
+
|
32
32
|
ArticleForPagination.delete_all
|
33
33
|
ArticleForPagination.__elasticsearch__.create_index! force: true
|
34
34
|
|
data/test/test_helper.rb
CHANGED
@@ -10,15 +10,21 @@ at_exit { Elasticsearch::Test::IntegrationTestCase.__run_at_exit_hooks }
|
|
10
10
|
|
11
11
|
puts '-'*80
|
12
12
|
|
13
|
-
|
13
|
+
if defined?(RUBY_VERSION) && RUBY_VERSION > '2.2'
|
14
|
+
require 'test-unit'
|
15
|
+
require 'mocha/test_unit'
|
16
|
+
else
|
17
|
+
require 'minitest/autorun'
|
18
|
+
require 'mocha/mini_test'
|
19
|
+
end
|
20
|
+
|
14
21
|
require 'shoulda-context'
|
15
|
-
|
16
|
-
require 'turn' unless ENV["TM_FILEPATH"] || ENV["NOTURN"] ||
|
22
|
+
|
23
|
+
require 'turn' unless ENV["TM_FILEPATH"] || ENV["NOTURN"] || defined?(RUBY_VERSION) && RUBY_VERSION > '2.2'
|
17
24
|
|
18
25
|
require 'ansi'
|
19
26
|
require 'oj'
|
20
27
|
|
21
|
-
require 'active_record'
|
22
28
|
require 'active_model'
|
23
29
|
|
24
30
|
require 'kaminari'
|
@@ -40,7 +46,7 @@ module Elasticsearch
|
|
40
46
|
def setup
|
41
47
|
ActiveRecord::Base.establish_connection( :adapter => 'sqlite3', :database => ":memory:" )
|
42
48
|
logger = ::Logger.new(STDERR)
|
43
|
-
logger.formatter = lambda { |s, d, p, m| "#{m
|
49
|
+
logger.formatter = lambda { |s, d, p, m| "\e[2;36m#{m}\e[0m\n" }
|
44
50
|
ActiveRecord::Base.logger = logger unless ENV['QUIET']
|
45
51
|
|
46
52
|
ActiveRecord::LogSubscriber.colorize_logging = false
|
@@ -104,6 +104,23 @@ class Elasticsearch::Model::AdapterActiveRecordTest < Test::Unit::TestCase
|
|
104
104
|
DummyClassForActiveRecord.__find_in_batches(scope: :published) do; end
|
105
105
|
end
|
106
106
|
|
107
|
+
should "preprocess the batch if option provided" do
|
108
|
+
class << DummyClassForActiveRecord
|
109
|
+
# Updates/transforms the batch while fetching it from the database
|
110
|
+
# (eg. with information from an external system)
|
111
|
+
#
|
112
|
+
def update_batch(batch)
|
113
|
+
batch.collect { |b| b.to_s + '!' }
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
DummyClassForActiveRecord.expects(:__find_in_batches).returns( [:a, :b] )
|
118
|
+
|
119
|
+
DummyClassForActiveRecord.__find_in_batches(preprocess: :update_batch) do |batch|
|
120
|
+
assert_same_elements ["a!", "b!"], batch
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
107
124
|
context "when transforming models" do
|
108
125
|
setup do
|
109
126
|
@transform = DummyClassForActiveRecord.__transform
|
data/test/unit/callbacks_test.rb
CHANGED
@@ -22,6 +22,7 @@ class Elasticsearch::Model::CallbacksTest < Test::Unit::TestCase
|
|
22
22
|
::DummyCallbacksModel.expects(:__send__).with do |method, parameter|
|
23
23
|
assert_equal :include, method
|
24
24
|
assert_equal DummyCallbacksAdapter::CallbacksMixin, parameter
|
25
|
+
true
|
25
26
|
end
|
26
27
|
|
27
28
|
Elasticsearch::Model::Callbacks.included(DummyCallbacksModel)
|
data/test/unit/importing_test.rb
CHANGED
@@ -48,7 +48,7 @@ class Elasticsearch::Model::ImportingTest < Test::Unit::TestCase
|
|
48
48
|
assert_equal 0, DummyImportingModel.import
|
49
49
|
end
|
50
50
|
|
51
|
-
should "return number of errors" do
|
51
|
+
should "return the number of errors" do
|
52
52
|
Elasticsearch::Model::Adapter.expects(:from_class)
|
53
53
|
.with(DummyImportingModel)
|
54
54
|
.returns(DummyImportingAdapter)
|
@@ -66,6 +66,24 @@ class Elasticsearch::Model::ImportingTest < Test::Unit::TestCase
|
|
66
66
|
assert_equal 1, DummyImportingModel.import
|
67
67
|
end
|
68
68
|
|
69
|
+
should "return an array of error elements" do
|
70
|
+
Elasticsearch::Model::Adapter.expects(:from_class)
|
71
|
+
.with(DummyImportingModel)
|
72
|
+
.returns(DummyImportingAdapter)
|
73
|
+
|
74
|
+
DummyImportingModel.__send__ :include, Elasticsearch::Model::Importing
|
75
|
+
|
76
|
+
client = mock('client')
|
77
|
+
client.expects(:bulk).returns({'items' => [ {'index' => {}}, {'index' => {'error' => 'FAILED'}} ]})
|
78
|
+
|
79
|
+
DummyImportingModel.stubs(:client).returns(client)
|
80
|
+
DummyImportingModel.stubs(:index_name).returns('foo')
|
81
|
+
DummyImportingModel.stubs(:document_type).returns('foo')
|
82
|
+
DummyImportingModel.stubs(:__batch_to_bulk)
|
83
|
+
|
84
|
+
assert_equal [{'index' => {'error' => 'FAILED'}}], DummyImportingModel.import(return: 'errors')
|
85
|
+
end
|
86
|
+
|
69
87
|
should "yield the response" do
|
70
88
|
Elasticsearch::Model::Adapter.expects(:from_class)
|
71
89
|
.with(DummyImportingModel)
|
@@ -90,10 +108,12 @@ class Elasticsearch::Model::ImportingTest < Test::Unit::TestCase
|
|
90
108
|
DummyImportingModel.expects(:__find_in_batches).with do |options|
|
91
109
|
assert_equal 'bar', options[:foo]
|
92
110
|
assert_nil options[:force]
|
111
|
+
true
|
93
112
|
end
|
94
113
|
|
95
114
|
DummyImportingModel.expects(:create_index!).with do |options|
|
96
115
|
assert_equal true, options[:force]
|
116
|
+
true
|
97
117
|
end
|
98
118
|
|
99
119
|
DummyImportingModel.expects(:index_name).returns('foo')
|
data/test/unit/indexing_test.rb
CHANGED
@@ -164,6 +164,7 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
164
164
|
instance.expects(:instance_variable_set).with do |name, value|
|
165
165
|
assert_equal :@__changed_attributes, name
|
166
166
|
assert_equal({foo: 'Two'}, value)
|
167
|
+
true
|
167
168
|
end
|
168
169
|
|
169
170
|
::DummyIndexingModelWithCallbacks.__send__ :include, Elasticsearch::Model::Indexing::InstanceMethods
|
@@ -182,6 +183,7 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
182
183
|
assert_equal 'bar', payload[:type]
|
183
184
|
assert_equal '1', payload[:id]
|
184
185
|
assert_equal 'JSON', payload[:body]
|
186
|
+
true
|
185
187
|
end
|
186
188
|
|
187
189
|
instance.expects(:client).returns(client)
|
@@ -199,6 +201,7 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
199
201
|
|
200
202
|
client.expects(:index).with do |payload|
|
201
203
|
assert_equal 'A', payload[:parent]
|
204
|
+
true
|
202
205
|
end
|
203
206
|
|
204
207
|
instance.expects(:client).returns(client)
|
@@ -218,6 +221,7 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
218
221
|
assert_equal 'foo', payload[:index]
|
219
222
|
assert_equal 'bar', payload[:type]
|
220
223
|
assert_equal '1', payload[:id]
|
224
|
+
true
|
221
225
|
end
|
222
226
|
|
223
227
|
instance.expects(:client).returns(client)
|
@@ -234,6 +238,7 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
234
238
|
|
235
239
|
client.expects(:delete).with do |payload|
|
236
240
|
assert_equal 'A', payload[:parent]
|
241
|
+
true
|
237
242
|
end
|
238
243
|
|
239
244
|
instance.expects(:client).returns(client)
|
@@ -267,6 +272,7 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
267
272
|
assert_equal 'bar', payload[:type]
|
268
273
|
assert_equal '1', payload[:id]
|
269
274
|
assert_equal({foo: 'bar'}, payload[:body][:doc])
|
275
|
+
true
|
270
276
|
end
|
271
277
|
|
272
278
|
instance.expects(:client).returns(client)
|
@@ -282,10 +288,32 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
282
288
|
instance = ::DummyIndexingModelWithCallbacksAndCustomAsIndexedJson.new
|
283
289
|
|
284
290
|
# Set the fake `changes` hash
|
285
|
-
instance.instance_variable_set(:@__changed_attributes, {foo
|
291
|
+
instance.instance_variable_set(:@__changed_attributes, {'foo' => 'B', 'bar' => 'D' })
|
286
292
|
|
287
293
|
client.expects(:update).with do |payload|
|
288
|
-
assert_equal({foo
|
294
|
+
assert_equal({:foo => 'B'}, payload[:body][:doc])
|
295
|
+
true
|
296
|
+
end
|
297
|
+
|
298
|
+
instance.expects(:client).returns(client)
|
299
|
+
instance.expects(:index_name).returns('foo')
|
300
|
+
instance.expects(:document_type).returns('bar')
|
301
|
+
instance.expects(:id).returns('1')
|
302
|
+
|
303
|
+
instance.update_document
|
304
|
+
end
|
305
|
+
|
306
|
+
should "get attributes from as_indexed_json during partial update" do
|
307
|
+
client = mock('client')
|
308
|
+
instance = ::DummyIndexingModelWithCallbacksAndCustomAsIndexedJson.new
|
309
|
+
|
310
|
+
instance.instance_variable_set(:@__changed_attributes, { 'foo' => { 'bar' => 'BAR'} })
|
311
|
+
# Overload as_indexed_json
|
312
|
+
instance.expects(:as_indexed_json).returns({ 'foo' => 'BAR' })
|
313
|
+
|
314
|
+
client.expects(:update).with do |payload|
|
315
|
+
assert_equal({'foo' => 'BAR'}, payload[:body][:doc])
|
316
|
+
true
|
289
317
|
end
|
290
318
|
|
291
319
|
instance.expects(:client).returns(client)
|
@@ -336,6 +364,7 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
336
364
|
assert_equal 'dummy_indexing_model_for_recreates', payload[:index]
|
337
365
|
assert_equal 1, payload[:body][:settings][:index][:number_of_shards]
|
338
366
|
assert_equal 'keyword', payload[:body][:mappings][:dummy_indexing_model_for_recreate][:properties][:foo][:analyzer]
|
367
|
+
true
|
339
368
|
end.returns({})
|
340
369
|
|
341
370
|
DummyIndexingModelForRecreate.expects(:client).returns(client).at_least_once
|
@@ -414,10 +443,12 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
414
443
|
should "create the custom index" do
|
415
444
|
@indices.expects(:exists).with do |arguments|
|
416
445
|
assert_equal 'custom-foo', arguments[:index]
|
446
|
+
true
|
417
447
|
end
|
418
448
|
|
419
449
|
@indices.expects(:create).with do |arguments|
|
420
450
|
assert_equal 'custom-foo', arguments[:index]
|
451
|
+
true
|
421
452
|
end
|
422
453
|
|
423
454
|
DummyIndexingModelForRecreate.create_index! index: 'custom-foo'
|
@@ -426,6 +457,7 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
426
457
|
should "delete the custom index" do
|
427
458
|
@indices.expects(:delete).with do |arguments|
|
428
459
|
assert_equal 'custom-foo', arguments[:index]
|
460
|
+
true
|
429
461
|
end
|
430
462
|
|
431
463
|
DummyIndexingModelForRecreate.delete_index! index: 'custom-foo'
|
@@ -434,6 +466,7 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
434
466
|
should "refresh the custom index" do
|
435
467
|
@indices.expects(:refresh).with do |arguments|
|
436
468
|
assert_equal 'custom-foo', arguments[:index]
|
469
|
+
true
|
437
470
|
end
|
438
471
|
|
439
472
|
DummyIndexingModelForRecreate.refresh_index! index: 'custom-foo'
|
data/test/unit/proxy_test.rb
CHANGED
@@ -48,6 +48,7 @@ class Elasticsearch::Model::SearchTest < Test::Unit::TestCase
|
|
48
48
|
instance.__elasticsearch__.expects(:instance_variable_set).with do |name, value|
|
49
49
|
assert_equal :@__changed_attributes, name
|
50
50
|
assert_equal({foo: 'Two'}, value)
|
51
|
+
true
|
51
52
|
end
|
52
53
|
|
53
54
|
::DummyProxyModelWithCallbacks.__send__ :include, Elasticsearch::Model::Proxy
|
@@ -34,6 +34,7 @@ class Elasticsearch::Model::ResponsePaginationKaminariTest < Test::Unit::TestCas
|
|
34
34
|
.with do |definition|
|
35
35
|
assert_equal 25, definition[:from]
|
36
36
|
assert_equal 25, definition[:size]
|
37
|
+
true
|
37
38
|
end
|
38
39
|
.returns(RESPONSE)
|
39
40
|
|
@@ -51,6 +52,7 @@ class Elasticsearch::Model::ResponsePaginationKaminariTest < Test::Unit::TestCas
|
|
51
52
|
.with do |definition|
|
52
53
|
assert_equal 75, definition[:from]
|
53
54
|
assert_equal 25, definition[:size]
|
55
|
+
true
|
54
56
|
end
|
55
57
|
.returns(RESPONSE)
|
56
58
|
|
@@ -30,8 +30,10 @@ class Elasticsearch::Model::ResponsePaginationWillPaginateTest < Test::Unit::Tes
|
|
30
30
|
@expected_methods = [
|
31
31
|
# methods needed by WillPaginate::CollectionMethods
|
32
32
|
:current_page,
|
33
|
+
:offset,
|
33
34
|
:per_page,
|
34
35
|
:total_entries,
|
36
|
+
:length,
|
35
37
|
|
36
38
|
# methods defined by WillPaginate::CollectionMethods
|
37
39
|
:total_pages,
|
@@ -66,6 +68,19 @@ class Elasticsearch::Model::ResponsePaginationWillPaginateTest < Test::Unit::Tes
|
|
66
68
|
end
|
67
69
|
end
|
68
70
|
|
71
|
+
context "#offset method" do
|
72
|
+
should "calculate offset using current_page and per_page" do
|
73
|
+
@response.per_page(3).page(3)
|
74
|
+
assert_equal 6, @response.offset
|
75
|
+
end
|
76
|
+
end
|
77
|
+
context "#length method" do
|
78
|
+
should "return count of paginated results" do
|
79
|
+
@response.per_page(3).page(3)
|
80
|
+
assert_equal 3, @response.length
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
69
84
|
context "#paginate method" do
|
70
85
|
should "set from/size using defaults" do
|
71
86
|
@response.klass.client
|
@@ -73,6 +88,7 @@ class Elasticsearch::Model::ResponsePaginationWillPaginateTest < Test::Unit::Tes
|
|
73
88
|
.with do |definition|
|
74
89
|
assert_equal 0, definition[:from]
|
75
90
|
assert_equal 33, definition[:size]
|
91
|
+
true
|
76
92
|
end
|
77
93
|
.returns(RESPONSE)
|
78
94
|
|
@@ -90,6 +106,7 @@ class Elasticsearch::Model::ResponsePaginationWillPaginateTest < Test::Unit::Tes
|
|
90
106
|
.with do |definition|
|
91
107
|
assert_equal 33, definition[:from]
|
92
108
|
assert_equal 33, definition[:size]
|
109
|
+
true
|
93
110
|
end
|
94
111
|
.returns(RESPONSE)
|
95
112
|
|
@@ -107,6 +124,7 @@ class Elasticsearch::Model::ResponsePaginationWillPaginateTest < Test::Unit::Tes
|
|
107
124
|
.with do |definition|
|
108
125
|
assert_equal 18, definition[:from]
|
109
126
|
assert_equal 9, definition[:size]
|
127
|
+
true
|
110
128
|
end
|
111
129
|
.returns(RESPONSE)
|
112
130
|
|
@@ -118,12 +136,13 @@ class Elasticsearch::Model::ResponsePaginationWillPaginateTest < Test::Unit::Tes
|
|
118
136
|
assert_equal 9, @response.search.definition[:size]
|
119
137
|
end
|
120
138
|
|
121
|
-
should "
|
139
|
+
should "search for first page if specified page is < 1" do
|
122
140
|
@response.klass.client
|
123
141
|
.expects(:search)
|
124
142
|
.with do |definition|
|
125
143
|
assert_equal 0, definition[:from]
|
126
144
|
assert_equal 33, definition[:size]
|
145
|
+
true
|
127
146
|
end
|
128
147
|
.returns(RESPONSE)
|
129
148
|
|
@@ -18,6 +18,7 @@ class Elasticsearch::Model::SearchRequestTest < Test::Unit::TestCase
|
|
18
18
|
should "pass the search definition as a simple query" do
|
19
19
|
@client.expects(:search).with do |params|
|
20
20
|
assert_equal 'foo', params[:q]
|
21
|
+
true
|
21
22
|
end
|
22
23
|
.returns({})
|
23
24
|
|
@@ -28,6 +29,7 @@ class Elasticsearch::Model::SearchRequestTest < Test::Unit::TestCase
|
|
28
29
|
should "pass the search definition as a Hash" do
|
29
30
|
@client.expects(:search).with do |params|
|
30
31
|
assert_equal( {foo: 'bar'}, params[:body] )
|
32
|
+
true
|
31
33
|
end
|
32
34
|
.returns({})
|
33
35
|
|
@@ -38,6 +40,7 @@ class Elasticsearch::Model::SearchRequestTest < Test::Unit::TestCase
|
|
38
40
|
should "pass the search definition as a JSON string" do
|
39
41
|
@client.expects(:search).with do |params|
|
40
42
|
assert_equal( '{"foo":"bar"}', params[:body] )
|
43
|
+
true
|
41
44
|
end
|
42
45
|
.returns({})
|
43
46
|
|
@@ -52,6 +55,7 @@ class Elasticsearch::Model::SearchRequestTest < Test::Unit::TestCase
|
|
52
55
|
|
53
56
|
@client.expects(:search).with do |params|
|
54
57
|
assert_equal( {foo: 'bar'}, params[:body] )
|
58
|
+
true
|
55
59
|
end
|
56
60
|
.returns({})
|
57
61
|
|
@@ -63,6 +67,7 @@ class Elasticsearch::Model::SearchRequestTest < Test::Unit::TestCase
|
|
63
67
|
@client.expects(:search).with do |params|
|
64
68
|
assert_equal 'foo', params[:q]
|
65
69
|
assert_equal 15, params[:size]
|
70
|
+
true
|
66
71
|
end
|
67
72
|
.returns({})
|
68
73
|
|
data/test/unit/searching_test.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elasticsearch-model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karel Minarik
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: elasticsearch
|
@@ -122,20 +122,6 @@ dependencies:
|
|
122
122
|
- - ! '>'
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '3.0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: activerecord
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ! '>'
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '4.0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ! '>'
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '4.0'
|
139
125
|
- !ruby/object:Gem::Dependency
|
140
126
|
name: oj
|
141
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -184,14 +170,14 @@ dependencies:
|
|
184
170
|
requirements:
|
185
171
|
- - ~>
|
186
172
|
- !ruby/object:Gem::Version
|
187
|
-
version: '4
|
173
|
+
version: '4'
|
188
174
|
type: :development
|
189
175
|
prerelease: false
|
190
176
|
version_requirements: !ruby/object:Gem::Requirement
|
191
177
|
requirements:
|
192
178
|
- - ~>
|
193
179
|
- !ruby/object:Gem::Version
|
194
|
-
version: '4
|
180
|
+
version: '4'
|
195
181
|
- !ruby/object:Gem::Dependency
|
196
182
|
name: shoulda-context
|
197
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -280,16 +266,16 @@ dependencies:
|
|
280
266
|
name: ci_reporter
|
281
267
|
requirement: !ruby/object:Gem::Requirement
|
282
268
|
requirements:
|
283
|
-
- -
|
269
|
+
- - ~>
|
284
270
|
- !ruby/object:Gem::Version
|
285
|
-
version: '
|
271
|
+
version: '1.9'
|
286
272
|
type: :development
|
287
273
|
prerelease: false
|
288
274
|
version_requirements: !ruby/object:Gem::Requirement
|
289
275
|
requirements:
|
290
|
-
- -
|
276
|
+
- - ~>
|
291
277
|
- !ruby/object:Gem::Version
|
292
|
-
version: '
|
278
|
+
version: '1.9'
|
293
279
|
- !ruby/object:Gem::Dependency
|
294
280
|
name: simplecov
|
295
281
|
requirement: !ruby/object:Gem::Requirement
|
@@ -332,20 +318,6 @@ dependencies:
|
|
332
318
|
- - ! '>='
|
333
319
|
- !ruby/object:Gem::Version
|
334
320
|
version: '0'
|
335
|
-
- !ruby/object:Gem::Dependency
|
336
|
-
name: coveralls
|
337
|
-
requirement: !ruby/object:Gem::Requirement
|
338
|
-
requirements:
|
339
|
-
- - ! '>='
|
340
|
-
- !ruby/object:Gem::Version
|
341
|
-
version: '0'
|
342
|
-
type: :development
|
343
|
-
prerelease: false
|
344
|
-
version_requirements: !ruby/object:Gem::Requirement
|
345
|
-
requirements:
|
346
|
-
- - ! '>='
|
347
|
-
- !ruby/object:Gem::Version
|
348
|
-
version: '0'
|
349
321
|
description: ActiveModel/Record integrations for Elasticsearch.
|
350
322
|
email:
|
351
323
|
- karel.minarik@elasticsearch.org
|