tire 0.5.7 → 0.5.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +2 -7
- data/README.markdown +3 -3
- data/examples/rails-application-template.rb +6 -6
- data/lib/tire/model/persistence/attributes.rb +1 -1
- data/lib/tire/model/persistence/storage.rb +18 -14
- data/lib/tire/results/collection.rb +1 -1
- data/lib/tire/results/item.rb +5 -1
- data/lib/tire/tasks.rb +1 -3
- data/lib/tire/version.rb +7 -5
- data/test/integration/active_model_searchable_test.rb +12 -7
- data/test/integration/active_record_searchable_test.rb +30 -1
- data/test/integration/boosting_queries_test.rb +4 -3
- data/test/integration/constant_score_queries_test.rb +3 -2
- data/test/integration/percolator_test.rb +10 -4
- data/test/integration/persistent_model_test.rb +39 -2
- data/test/models/persistent_article_with_defaults.rb +1 -1
- data/test/models/persistent_article_with_strict_mapping.rb +26 -0
- data/test/test_helper.rb +3 -2
- data/test/unit/model_persistence_test.rb +38 -5
- data/test/unit/results_item_test.rb +8 -3
- data/tire.gemspec +1 -1
- metadata +159 -50
data/.travis.yml
CHANGED
@@ -5,10 +5,9 @@
|
|
5
5
|
language: ruby
|
6
6
|
|
7
7
|
rvm:
|
8
|
-
- 2.0.0
|
9
|
-
- 1.9.3
|
10
8
|
- 1.8.7
|
11
|
-
-
|
9
|
+
- 1.9.3
|
10
|
+
- 2.0.0
|
12
11
|
- jruby-19mode
|
13
12
|
|
14
13
|
env:
|
@@ -26,10 +25,6 @@ matrix:
|
|
26
25
|
exclude:
|
27
26
|
- rvm: 1.8.7
|
28
27
|
env: TEST_COMMAND="rake test:integration"
|
29
|
-
- rvm: ree
|
30
|
-
env: TEST_COMMAND="rake test:integration"
|
31
|
-
allow_failures:
|
32
|
-
- rvm: ree
|
33
28
|
|
34
29
|
notifications:
|
35
30
|
disable: true
|
data/README.markdown
CHANGED
@@ -18,9 +18,9 @@ Installation
|
|
18
18
|
|
19
19
|
OK. First, you need a running _Elasticsearch_ server. Thankfully, it's easy. Let's define easy:
|
20
20
|
|
21
|
-
$ curl -k -L -o elasticsearch-0.20.
|
22
|
-
$ tar -zxvf elasticsearch-0.20.
|
23
|
-
$ ./elasticsearch-0.20.
|
21
|
+
$ curl -k -L -o elasticsearch-0.20.6.tar.gz http://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.20.6.tar.gz
|
22
|
+
$ tar -zxvf elasticsearch-0.20.6.tar.gz
|
23
|
+
$ ./elasticsearch-0.20.6/bin/elasticsearch -f
|
24
24
|
|
25
25
|
See, easy. On a Mac, you can also use _Homebrew_:
|
26
26
|
|
@@ -62,7 +62,7 @@ file ".gitignore", <<-END.gsub(/ /, '')
|
|
62
62
|
tmp/**/*
|
63
63
|
config/database.yml
|
64
64
|
db/*.sqlite3
|
65
|
-
vendor/elasticsearch-0.20.
|
65
|
+
vendor/elasticsearch-0.20.6/
|
66
66
|
END
|
67
67
|
|
68
68
|
git :init
|
@@ -71,11 +71,11 @@ git :commit => "-m 'Initial commit: Clean application'"
|
|
71
71
|
|
72
72
|
unless (RestClient.get('http://localhost:9200') rescue false)
|
73
73
|
COMMAND = <<-COMMAND.gsub(/^ /, '')
|
74
|
-
curl -k -L -# -o elasticsearch-0.20.
|
75
|
-
"http://
|
76
|
-
tar -zxf elasticsearch-0.20.
|
77
|
-
rm -f elasticsearch-0.20.
|
78
|
-
./elasticsearch-0.20.
|
74
|
+
curl -k -L -# -o elasticsearch-0.20.6.tar.gz \
|
75
|
+
"http://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.20.6.tar.gz"
|
76
|
+
tar -zxf elasticsearch-0.20.6.tar.gz
|
77
|
+
rm -f elasticsearch-0.20.6.tar.gz
|
78
|
+
./elasticsearch-0.20.6/bin/elasticsearch -p #{destination_root}/tmp/pids/elasticsearch.pid
|
79
79
|
COMMAND
|
80
80
|
|
81
81
|
puts "\n"
|
@@ -17,8 +17,11 @@ module Tire
|
|
17
17
|
def create(args={})
|
18
18
|
document = new(args)
|
19
19
|
return false unless document.valid?
|
20
|
-
document.save
|
21
|
-
|
20
|
+
if result = document.save
|
21
|
+
document
|
22
|
+
else
|
23
|
+
result
|
24
|
+
end
|
22
25
|
end
|
23
26
|
end
|
24
27
|
|
@@ -36,33 +39,34 @@ module Tire
|
|
36
39
|
def update_index
|
37
40
|
run_callbacks :update_elasticsearch_index do
|
38
41
|
if destroyed?
|
39
|
-
index.remove self
|
42
|
+
response = index.remove self
|
40
43
|
else
|
41
|
-
response
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
44
|
+
if response = index.store( self, {:percolate => percolator} )
|
45
|
+
self.id ||= response['_id']
|
46
|
+
self._index = response['_index']
|
47
|
+
self._type = response['_type']
|
48
|
+
self._version = response['_version']
|
49
|
+
self.matches = response['matches']
|
50
|
+
end
|
48
51
|
end
|
52
|
+
response
|
49
53
|
end
|
50
54
|
end
|
51
55
|
|
52
56
|
def save
|
53
57
|
return false unless valid?
|
54
58
|
run_callbacks :save do
|
55
|
-
update_index
|
59
|
+
response = update_index
|
60
|
+
!! response['ok']
|
56
61
|
end
|
57
|
-
self
|
58
62
|
end
|
59
63
|
|
60
64
|
def destroy
|
61
65
|
run_callbacks :destroy do
|
62
66
|
@destroyed = true
|
63
|
-
update_index
|
67
|
+
response = update_index
|
68
|
+
! response.nil?
|
64
69
|
end
|
65
|
-
self.freeze
|
66
70
|
end
|
67
71
|
|
68
72
|
def destroyed? ; !!@destroyed; end
|
@@ -136,7 +136,7 @@ module Tire
|
|
136
136
|
"based on _type '#{type}'.", e.backtrace
|
137
137
|
end
|
138
138
|
|
139
|
-
records[type] = __find_records_by_ids klass, items.map { |h| h['_id'] }
|
139
|
+
records[type] = Array(__find_records_by_ids klass, items.map { |h| h['_id'] })
|
140
140
|
end
|
141
141
|
|
142
142
|
# Reorder records to preserve the order from search results
|
data/lib/tire/results/item.rb
CHANGED
@@ -60,7 +60,11 @@ module Tire
|
|
60
60
|
|
61
61
|
def to_hash
|
62
62
|
@attributes.reduce({}) do |sum, item|
|
63
|
-
|
63
|
+
if item.last.is_a?(Array)
|
64
|
+
sum[ item.first ] = item.last.map { |item| item.respond_to?(:to_hash) ? item.to_hash : item }
|
65
|
+
else
|
66
|
+
sum[ item.first ] = item.last.respond_to?(:to_hash) ? item.last.to_hash : item.last
|
67
|
+
end
|
64
68
|
sum
|
65
69
|
end
|
66
70
|
end
|
data/lib/tire/tasks.rb
CHANGED
@@ -5,8 +5,6 @@ module Tire
|
|
5
5
|
module Tasks
|
6
6
|
|
7
7
|
module Import
|
8
|
-
HRULE = '='*90
|
9
|
-
|
10
8
|
def delete_index(index)
|
11
9
|
puts "[IMPORT] Deleting index '#{index.name}'"
|
12
10
|
index.delete
|
@@ -95,7 +93,7 @@ namespace :tire do
|
|
95
93
|
end
|
96
94
|
|
97
95
|
if ENV['CLASS'].to_s == ''
|
98
|
-
puts
|
96
|
+
puts '='*90, 'USAGE', '='*90, import_model_desc, ""
|
99
97
|
exit(1)
|
100
98
|
end
|
101
99
|
|
data/lib/tire/version.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
module Tire
|
2
|
-
VERSION = "0.5.
|
2
|
+
VERSION = "0.5.8"
|
3
3
|
|
4
4
|
CHANGELOG =<<-END
|
5
5
|
IMPORTANT CHANGES LATELY:
|
6
6
|
|
7
|
-
*
|
8
|
-
*
|
9
|
-
*
|
10
|
-
*
|
7
|
+
* Fixed, that Model::Persistence uses "string" as the default mapping type
|
8
|
+
* Fixed, that Model::Persistence returns true/false for #save and #destroy operations
|
9
|
+
* Fixed the `uninitialized constant HRULE` in Rake tasks
|
10
|
+
* Fixed `Item#to_hash` functionality to work with Arrays
|
11
|
+
* Updated the Rails application template and install instructions
|
12
|
+
* Improved the test suite for Travis
|
11
13
|
END
|
12
14
|
end
|
@@ -69,7 +69,7 @@ module Tire
|
|
69
69
|
|
70
70
|
a.index.refresh
|
71
71
|
results = SupermodelArticle.search 'test'
|
72
|
-
|
72
|
+
|
73
73
|
assert_equal 0, results.count
|
74
74
|
end
|
75
75
|
|
@@ -90,21 +90,26 @@ module Tire
|
|
90
90
|
|
91
91
|
setup do
|
92
92
|
module ::Rails; end
|
93
|
+
@article = SupermodelArticle.new :title => 'Test'
|
94
|
+
@article.save
|
95
|
+
@article.index.refresh
|
93
96
|
end
|
94
97
|
|
95
|
-
should "
|
96
|
-
a = SupermodelArticle.new :title => 'Test'
|
97
|
-
a.save
|
98
|
-
a.index.refresh
|
99
|
-
|
98
|
+
should "fake the underlying model with _source" do
|
100
99
|
results = SupermodelArticle.search 'test'
|
101
100
|
|
102
101
|
assert_instance_of Results::Item, results.first
|
103
102
|
assert_instance_of SupermodelArticle, results.first.load
|
104
|
-
|
105
103
|
assert_equal 'Test', results.first.load.title
|
106
104
|
end
|
107
105
|
|
106
|
+
should "load the record from database" do
|
107
|
+
results = SupermodelArticle.search 'test', load: true
|
108
|
+
|
109
|
+
assert_instance_of SupermodelArticle, results.first
|
110
|
+
assert_equal 'Test', results.first.title
|
111
|
+
end
|
112
|
+
|
108
113
|
end
|
109
114
|
|
110
115
|
end
|
@@ -134,6 +134,20 @@ module Tire
|
|
134
134
|
assert_equal ActiveRecordArticle.find(1), results.first
|
135
135
|
end
|
136
136
|
|
137
|
+
should "load single record" do
|
138
|
+
a = ActiveRecordArticle.create :title => 'foo'
|
139
|
+
a.save
|
140
|
+
a.index.refresh
|
141
|
+
|
142
|
+
results = ActiveRecordArticle.search load: true do
|
143
|
+
query { string 'title:foo' }
|
144
|
+
end
|
145
|
+
|
146
|
+
assert_instance_of ActiveRecordArticle, results.first
|
147
|
+
assert_equal 'foo', results.first.title
|
148
|
+
assert_equal 3, a.length # Make sure we have the "real model"
|
149
|
+
end
|
150
|
+
|
137
151
|
should "load records with options on query search" do
|
138
152
|
assert_equal ActiveRecordArticle.find(['1'], :include => 'comments').first,
|
139
153
|
ActiveRecordArticle.search('"Test 1"',
|
@@ -598,9 +612,14 @@ module Tire
|
|
598
612
|
|
599
613
|
context "percolated search" do
|
600
614
|
setup do
|
615
|
+
delete_registered_queries
|
616
|
+
delete_percolator_index if ENV['TRAVIS']
|
601
617
|
ActiveRecordModelWithPercolation.index.register_percolator_query('alert') { string 'warning' }
|
602
618
|
Tire.index('_percolator').refresh
|
603
|
-
|
619
|
+
end
|
620
|
+
|
621
|
+
teardown do
|
622
|
+
ActiveRecordModelWithPercolation.index.unregister_percolator_query('alert') { string 'warning' }
|
604
623
|
end
|
605
624
|
|
606
625
|
should "return matching queries when percolating" do
|
@@ -616,6 +635,16 @@ module Tire
|
|
616
635
|
|
617
636
|
end
|
618
637
|
|
638
|
+
private
|
639
|
+
|
640
|
+
def delete_registered_queries
|
641
|
+
Configuration.client.delete("#{Configuration.url}/_percolator/active_record_model_with_percolations/alert") rescue nil
|
642
|
+
end
|
643
|
+
|
644
|
+
def delete_percolator_index
|
645
|
+
Configuration.client.delete("#{Configuration.url}/_percolator") rescue nil
|
646
|
+
end
|
647
|
+
|
619
648
|
end
|
620
649
|
|
621
650
|
end
|
@@ -8,7 +8,7 @@ module Tire
|
|
8
8
|
context "Boosting queries" do
|
9
9
|
|
10
10
|
should "allow to set multiple queries per condition" do
|
11
|
-
s = Tire.search('articles-test') do
|
11
|
+
s = Tire.search('articles-test', search_type: 'dfs_query_then_fetch') do
|
12
12
|
query do
|
13
13
|
boosting negative_boost: 0.2 do
|
14
14
|
positive { string "title:Two title:One tags:ruby tags:python" }
|
@@ -25,7 +25,8 @@ module Tire
|
|
25
25
|
setup do
|
26
26
|
# Tire.configure { logger STDERR }
|
27
27
|
@index = Tire.index('featured-results-test') do
|
28
|
-
delete
|
28
|
+
delete
|
29
|
+
create
|
29
30
|
store title: 'Kitchen special tool', featured: true
|
30
31
|
store title: 'Kitchen tool tool tool', featured: false
|
31
32
|
store title: 'Garage tool', featured: false
|
@@ -38,7 +39,7 @@ module Tire
|
|
38
39
|
end
|
39
40
|
|
40
41
|
should "return featured results first" do
|
41
|
-
s = Tire.search('featured-results-test') do
|
42
|
+
s = Tire.search('featured-results-test', search_type: 'dfs_query_then_fetch') do
|
42
43
|
query do
|
43
44
|
boosting negative_boost: 0.1 do
|
44
45
|
positive do
|
@@ -25,7 +25,8 @@ module Tire
|
|
25
25
|
# Adapted from: http://www.fullscale.co/blog/2013/01/24/Implementing_Featured_Results_With_ElasticSearch.html
|
26
26
|
setup do
|
27
27
|
@index = Tire.index('featured-results-test') do
|
28
|
-
delete
|
28
|
+
delete
|
29
|
+
create
|
29
30
|
store title: 'Kitchen special tool', featured: true
|
30
31
|
store title: 'Kitchen tool tool tool', featured: false
|
31
32
|
store title: 'Garage tool', featured: false
|
@@ -39,7 +40,7 @@ module Tire
|
|
39
40
|
|
40
41
|
|
41
42
|
should "return featured results first" do
|
42
|
-
s = Tire.search('featured-results-test') do
|
43
|
+
s = Tire.search('featured-results-test', search_type: 'dfs_query_then_fetch') do
|
43
44
|
query do
|
44
45
|
boolean do
|
45
46
|
should do
|
@@ -8,11 +8,13 @@ module Tire
|
|
8
8
|
context "Percolator" do
|
9
9
|
setup do
|
10
10
|
delete_registered_queries
|
11
|
+
delete_percolator_index if ENV['TRAVIS']
|
11
12
|
@index = Tire.index('percolator-test')
|
12
13
|
@index.create
|
13
14
|
end
|
14
15
|
teardown do
|
15
16
|
delete_registered_queries
|
17
|
+
delete_percolator_index if ENV['TRAVIS']
|
16
18
|
@index.delete
|
17
19
|
end
|
18
20
|
|
@@ -101,11 +103,15 @@ module Tire
|
|
101
103
|
private
|
102
104
|
|
103
105
|
def delete_registered_queries
|
104
|
-
Configuration.client.
|
105
|
-
Configuration.client.
|
106
|
-
Configuration.client.
|
106
|
+
Configuration.client.delete("#{Configuration.url}/_percolator/percolator-test/alert") rescue nil
|
107
|
+
Configuration.client.delete("#{Configuration.url}/_percolator/percolator-test/gantz") rescue nil
|
108
|
+
Configuration.client.delete("#{Configuration.url}/_percolator/percolator-test/weather") rescue nil
|
107
109
|
end
|
108
110
|
|
109
|
-
|
111
|
+
def delete_percolator_index
|
112
|
+
Configuration.client.delete("#{Configuration.url}/_percolator") rescue nil
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
110
116
|
|
111
117
|
end
|
@@ -7,13 +7,16 @@ module Tire
|
|
7
7
|
|
8
8
|
def setup
|
9
9
|
super
|
10
|
-
PersistentArticle.
|
10
|
+
PersistentArticle.create_elasticsearch_index
|
11
|
+
PersistentArticleWithDefaults.create_elasticsearch_index
|
12
|
+
PersistentArticleWithStrictMapping.create_elasticsearch_index
|
11
13
|
end
|
12
14
|
|
13
15
|
def teardown
|
14
16
|
super
|
15
17
|
PersistentArticle.index.delete
|
16
18
|
PersistentArticleWithDefaults.index.delete
|
19
|
+
PersistentArticleWithStrictMapping.index.delete
|
17
20
|
end
|
18
21
|
|
19
22
|
context "PersistentModel" do
|
@@ -184,9 +187,14 @@ module Tire
|
|
184
187
|
|
185
188
|
context "percolated search" do
|
186
189
|
setup do
|
190
|
+
delete_registered_queries
|
191
|
+
delete_percolator_index if ENV['TRAVIS']
|
187
192
|
PersistentArticleWithPercolation.index.register_percolator_query('alert') { string 'warning' }
|
188
193
|
Tire.index('_percolator').refresh
|
189
|
-
|
194
|
+
end
|
195
|
+
|
196
|
+
teardown do
|
197
|
+
PersistentArticleWithPercolation.index.unregister_percolator_query('alert') { string 'warning' }
|
190
198
|
end
|
191
199
|
|
192
200
|
should "return matching queries when percolating" do
|
@@ -200,6 +208,35 @@ module Tire
|
|
200
208
|
end
|
201
209
|
end
|
202
210
|
|
211
|
+
context "with strict mapping" do
|
212
|
+
should "successfuly save valid model" do
|
213
|
+
a = PersistentArticleWithStrictMapping.create :title => 'Test'
|
214
|
+
assert a.save
|
215
|
+
end
|
216
|
+
should "return false when creating fails" do
|
217
|
+
a = PersistentArticleWithStrictMapping.create :created => 'NOTVALID'
|
218
|
+
assert_equal false, a
|
219
|
+
end
|
220
|
+
should "return false when saving fails for invalid format" do
|
221
|
+
a = PersistentArticleWithStrictMapping.new :created => 'NOTVALID'
|
222
|
+
assert_equal false, a.save
|
223
|
+
end
|
224
|
+
should "return false when saving fails for unmapped property" do
|
225
|
+
a = PersistentArticleWithStrictMapping.new :myproperty => true
|
226
|
+
assert_equal false, a.save
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
end
|
231
|
+
|
232
|
+
private
|
233
|
+
|
234
|
+
def delete_registered_queries
|
235
|
+
Configuration.client.delete("#{Configuration.url}/_percolator/persistent_article_with_percolations/alert") rescue nil
|
236
|
+
end
|
237
|
+
|
238
|
+
def delete_percolator_index
|
239
|
+
Configuration.client.delete("#{Configuration.url}/_percolator") rescue nil
|
203
240
|
end
|
204
241
|
|
205
242
|
end
|
@@ -6,7 +6,7 @@ class PersistentArticleWithDefaults
|
|
6
6
|
property :published_on
|
7
7
|
property :tags, :default => []
|
8
8
|
property :hidden, :default => false
|
9
|
-
property :options, :default => {:switches => []}
|
9
|
+
property :options, :type => 'object', :default => {:switches => []}
|
10
10
|
property :created_at, :default => lambda { Time.now }
|
11
11
|
|
12
12
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# Example class with Elasticsearch persistence and strict mapping
|
2
|
+
|
3
|
+
class PersistentArticleWithStrictMapping
|
4
|
+
|
5
|
+
include Tire::Model::Persistence
|
6
|
+
|
7
|
+
mapping :dynamic => 'strict' do
|
8
|
+
property :title, :type => 'string'
|
9
|
+
property :created, :type => 'date'
|
10
|
+
end
|
11
|
+
|
12
|
+
def myproperty
|
13
|
+
@myproperty
|
14
|
+
end
|
15
|
+
|
16
|
+
def myproperty= value
|
17
|
+
self.class.properties << 'myproperty'
|
18
|
+
@myproperty = value
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_indexed_json
|
22
|
+
json = { :title => self.title, :created => self.created }
|
23
|
+
json[:myproperty] = 'NOTVALID' if self.myproperty
|
24
|
+
json.to_json
|
25
|
+
end
|
26
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -25,9 +25,9 @@ else
|
|
25
25
|
require 'sqlite3'
|
26
26
|
end
|
27
27
|
|
28
|
-
require 'shoulda'
|
29
|
-
require 'turn/autorun' unless ENV["TM_FILEPATH"] || JRUBY
|
28
|
+
require 'shoulda-context'
|
30
29
|
require 'mocha/setup'
|
30
|
+
require 'turn/autorun' unless ENV["TM_FILEPATH"] || JRUBY
|
31
31
|
|
32
32
|
require 'active_support/core_ext/hash/indifferent_access'
|
33
33
|
|
@@ -51,6 +51,7 @@ require File.dirname(__FILE__) + '/models/persistent_article_in_index'
|
|
51
51
|
require File.dirname(__FILE__) + '/models/persistent_article_in_namespace'
|
52
52
|
require File.dirname(__FILE__) + '/models/persistent_article_with_casting'
|
53
53
|
require File.dirname(__FILE__) + '/models/persistent_article_with_defaults'
|
54
|
+
require File.dirname(__FILE__) + '/models/persistent_article_with_strict_mapping'
|
54
55
|
require File.dirname(__FILE__) + '/models/persistent_articles_with_custom_index_name'
|
55
56
|
require File.dirname(__FILE__) + '/models/validated_model'
|
56
57
|
|
@@ -50,6 +50,10 @@ module Tire
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
+
should "define property as a string by default" do
|
54
|
+
assert_equal 'string', PersistentArticle.mapping[:title][:type]
|
55
|
+
end
|
56
|
+
|
53
57
|
end
|
54
58
|
|
55
59
|
context "Finders" do
|
@@ -387,10 +391,6 @@ module Tire
|
|
387
391
|
assert ! ValidatedModel.create(:name => nil)
|
388
392
|
end
|
389
393
|
|
390
|
-
end
|
391
|
-
|
392
|
-
context "when creating" do
|
393
|
-
|
394
394
|
should "set the id property" do
|
395
395
|
Configuration.client.expects(:post).
|
396
396
|
with do |url, payload|
|
@@ -418,6 +418,14 @@ module Tire
|
|
418
418
|
assert_equal '123', article.id
|
419
419
|
end
|
420
420
|
|
421
|
+
should "return false when the operation fails" do
|
422
|
+
Configuration.client.expects(:post).
|
423
|
+
returns(mock_response('{"ok":false}', 400))
|
424
|
+
|
425
|
+
article = PersistentArticleWithStrictMapping.create :title => 'Test'
|
426
|
+
assert_equal false, article
|
427
|
+
end
|
428
|
+
|
421
429
|
end
|
422
430
|
|
423
431
|
context "when saving" do
|
@@ -479,6 +487,14 @@ module Tire
|
|
479
487
|
assert_equal '456', article.id
|
480
488
|
end
|
481
489
|
|
490
|
+
should "return false when the operation fails" do
|
491
|
+
Configuration.client.expects(:post).
|
492
|
+
returns(mock_response('{"ok":false}', 400))
|
493
|
+
|
494
|
+
article = PersistentArticleWithStrictMapping.new
|
495
|
+
assert_equal false, article.save
|
496
|
+
end
|
497
|
+
|
482
498
|
end
|
483
499
|
|
484
500
|
context "when destroying" do
|
@@ -500,6 +516,14 @@ module Tire
|
|
500
516
|
article.destroy
|
501
517
|
end
|
502
518
|
|
519
|
+
should "return false when the operation fails" do
|
520
|
+
Configuration.client.expects(:delete).
|
521
|
+
returns(mock_response('{"ok":false}', 400))
|
522
|
+
|
523
|
+
article = PersistentArticleWithStrictMapping.new
|
524
|
+
assert_equal false, article.destroy
|
525
|
+
end
|
526
|
+
|
503
527
|
end
|
504
528
|
|
505
529
|
context "when updating attributes" do
|
@@ -519,6 +543,14 @@ module Tire
|
|
519
543
|
assert_equal ['three'], @article.tags
|
520
544
|
end
|
521
545
|
|
546
|
+
should "return false when the operation fails" do
|
547
|
+
Configuration.client.expects(:post).
|
548
|
+
returns(mock_response('{"ok":false}', 400))
|
549
|
+
|
550
|
+
article = PersistentArticleWithStrictMapping.new
|
551
|
+
assert_equal false, article.update_attributes(:created => 'NOTVALID')
|
552
|
+
end
|
553
|
+
|
522
554
|
end
|
523
555
|
|
524
556
|
end
|
@@ -529,6 +561,7 @@ module Tire
|
|
529
561
|
expected = {
|
530
562
|
:settings => {},
|
531
563
|
:mappings => { :persistent_article_with_mapping => {
|
564
|
+
:dynamic => 'strict',
|
532
565
|
:properties => { :title => { :type => 'string', :analyzer => 'snowball', :boost => 10 } }
|
533
566
|
}}
|
534
567
|
}
|
@@ -542,7 +575,7 @@ module Tire
|
|
542
575
|
include Tire::Model::Search
|
543
576
|
include Tire::Model::Callbacks
|
544
577
|
|
545
|
-
mapping do
|
578
|
+
mapping :dynamic => 'strict' do
|
546
579
|
property :title, :type => 'string', :analyzer => 'snowball', :boost => 10
|
547
580
|
end
|
548
581
|
|
@@ -15,9 +15,12 @@ module Tire
|
|
15
15
|
context "Item" do
|
16
16
|
|
17
17
|
setup do
|
18
|
-
@document = Results::Item.new :title
|
19
|
-
:author
|
20
|
-
:awards
|
18
|
+
@document = Results::Item.new :title => 'Test',
|
19
|
+
:author => { :name => 'Kafka' },
|
20
|
+
:awards => { :best_fiction => { :year => '1925' } },
|
21
|
+
:reviews => [ { :stars => 5, :comment => 'great' },
|
22
|
+
{ :stars => 3, :comment => 'decent' } ]
|
23
|
+
|
21
24
|
end
|
22
25
|
|
23
26
|
should "be initialized with a Hash or Hash like object" do
|
@@ -115,6 +118,8 @@ module Tire
|
|
115
118
|
assert_instance_of Hash, @document.to_hash
|
116
119
|
assert_instance_of Hash, @document.to_hash[:author]
|
117
120
|
assert_instance_of Hash, @document.to_hash[:awards][:best_fiction]
|
121
|
+
assert_instance_of Hash, @document.to_hash[:reviews][0]
|
122
|
+
assert_instance_of Hash, @document.to_hash[:reviews][1]
|
118
123
|
|
119
124
|
assert_equal 'Kafka', @document.to_hash[:author][:name]
|
120
125
|
assert_equal '1925', @document.to_hash[:awards][:best_fiction][:year]
|
data/tire.gemspec
CHANGED
@@ -37,7 +37,7 @@ Gem::Specification.new do |s|
|
|
37
37
|
# = Development dependencies
|
38
38
|
#
|
39
39
|
s.add_development_dependency "bundler", "~> 1.0"
|
40
|
-
s.add_development_dependency "shoulda"
|
40
|
+
s.add_development_dependency "shoulda-context"
|
41
41
|
s.add_development_dependency "mocha", "~> 0.13"
|
42
42
|
s.add_development_dependency "minitest", "~> 2.12"
|
43
43
|
s.add_development_dependency "activerecord", ">= 3.0"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tire
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-05-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: rest-client
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: '1.6'
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '1.6'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: multi_json
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '1.3'
|
44
54
|
type: :runtime
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.3'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: activemodel
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ! '>='
|
@@ -54,10 +69,15 @@ dependencies:
|
|
54
69
|
version: '3.0'
|
55
70
|
type: :runtime
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '3.0'
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: hashr
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
83
|
- - ~>
|
@@ -65,10 +85,15 @@ dependencies:
|
|
65
85
|
version: 0.0.19
|
66
86
|
type: :runtime
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 0.0.19
|
69
94
|
- !ruby/object:Gem::Dependency
|
70
95
|
name: activesupport
|
71
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
72
97
|
none: false
|
73
98
|
requirements:
|
74
99
|
- - ! '>='
|
@@ -76,10 +101,15 @@ dependencies:
|
|
76
101
|
version: '0'
|
77
102
|
type: :runtime
|
78
103
|
prerelease: false
|
79
|
-
version_requirements:
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
80
110
|
- !ruby/object:Gem::Dependency
|
81
111
|
name: ansi
|
82
|
-
requirement:
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
83
113
|
none: false
|
84
114
|
requirements:
|
85
115
|
- - ! '>='
|
@@ -87,10 +117,15 @@ dependencies:
|
|
87
117
|
version: '0'
|
88
118
|
type: :runtime
|
89
119
|
prerelease: false
|
90
|
-
version_requirements:
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
91
126
|
- !ruby/object:Gem::Dependency
|
92
127
|
name: bundler
|
93
|
-
requirement:
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
94
129
|
none: false
|
95
130
|
requirements:
|
96
131
|
- - ~>
|
@@ -98,10 +133,15 @@ dependencies:
|
|
98
133
|
version: '1.0'
|
99
134
|
type: :development
|
100
135
|
prerelease: false
|
101
|
-
version_requirements:
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ~>
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '1.0'
|
102
142
|
- !ruby/object:Gem::Dependency
|
103
|
-
name: shoulda
|
104
|
-
requirement:
|
143
|
+
name: shoulda-context
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
105
145
|
none: false
|
106
146
|
requirements:
|
107
147
|
- - ! '>='
|
@@ -109,10 +149,15 @@ dependencies:
|
|
109
149
|
version: '0'
|
110
150
|
type: :development
|
111
151
|
prerelease: false
|
112
|
-
version_requirements:
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
113
158
|
- !ruby/object:Gem::Dependency
|
114
159
|
name: mocha
|
115
|
-
requirement:
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
116
161
|
none: false
|
117
162
|
requirements:
|
118
163
|
- - ~>
|
@@ -120,10 +165,15 @@ dependencies:
|
|
120
165
|
version: '0.13'
|
121
166
|
type: :development
|
122
167
|
prerelease: false
|
123
|
-
version_requirements:
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ~>
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0.13'
|
124
174
|
- !ruby/object:Gem::Dependency
|
125
175
|
name: minitest
|
126
|
-
requirement:
|
176
|
+
requirement: !ruby/object:Gem::Requirement
|
127
177
|
none: false
|
128
178
|
requirements:
|
129
179
|
- - ~>
|
@@ -131,10 +181,15 @@ dependencies:
|
|
131
181
|
version: '2.12'
|
132
182
|
type: :development
|
133
183
|
prerelease: false
|
134
|
-
version_requirements:
|
184
|
+
version_requirements: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
186
|
+
requirements:
|
187
|
+
- - ~>
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: '2.12'
|
135
190
|
- !ruby/object:Gem::Dependency
|
136
191
|
name: activerecord
|
137
|
-
requirement:
|
192
|
+
requirement: !ruby/object:Gem::Requirement
|
138
193
|
none: false
|
139
194
|
requirements:
|
140
195
|
- - ! '>='
|
@@ -142,10 +197,15 @@ dependencies:
|
|
142
197
|
version: '3.0'
|
143
198
|
type: :development
|
144
199
|
prerelease: false
|
145
|
-
version_requirements:
|
200
|
+
version_requirements: !ruby/object:Gem::Requirement
|
201
|
+
none: false
|
202
|
+
requirements:
|
203
|
+
- - ! '>='
|
204
|
+
- !ruby/object:Gem::Version
|
205
|
+
version: '3.0'
|
146
206
|
- !ruby/object:Gem::Dependency
|
147
207
|
name: mongoid
|
148
|
-
requirement:
|
208
|
+
requirement: !ruby/object:Gem::Requirement
|
149
209
|
none: false
|
150
210
|
requirements:
|
151
211
|
- - ~>
|
@@ -153,10 +213,15 @@ dependencies:
|
|
153
213
|
version: '2.2'
|
154
214
|
type: :development
|
155
215
|
prerelease: false
|
156
|
-
version_requirements:
|
216
|
+
version_requirements: !ruby/object:Gem::Requirement
|
217
|
+
none: false
|
218
|
+
requirements:
|
219
|
+
- - ~>
|
220
|
+
- !ruby/object:Gem::Version
|
221
|
+
version: '2.2'
|
157
222
|
- !ruby/object:Gem::Dependency
|
158
223
|
name: redis-persistence
|
159
|
-
requirement:
|
224
|
+
requirement: !ruby/object:Gem::Requirement
|
160
225
|
none: false
|
161
226
|
requirements:
|
162
227
|
- - ! '>='
|
@@ -164,10 +229,15 @@ dependencies:
|
|
164
229
|
version: '0'
|
165
230
|
type: :development
|
166
231
|
prerelease: false
|
167
|
-
version_requirements:
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
none: false
|
234
|
+
requirements:
|
235
|
+
- - ! '>='
|
236
|
+
- !ruby/object:Gem::Version
|
237
|
+
version: '0'
|
168
238
|
- !ruby/object:Gem::Dependency
|
169
239
|
name: faraday
|
170
|
-
requirement:
|
240
|
+
requirement: !ruby/object:Gem::Requirement
|
171
241
|
none: false
|
172
242
|
requirements:
|
173
243
|
- - ! '>='
|
@@ -175,10 +245,15 @@ dependencies:
|
|
175
245
|
version: '0'
|
176
246
|
type: :development
|
177
247
|
prerelease: false
|
178
|
-
version_requirements:
|
248
|
+
version_requirements: !ruby/object:Gem::Requirement
|
249
|
+
none: false
|
250
|
+
requirements:
|
251
|
+
- - ! '>='
|
252
|
+
- !ruby/object:Gem::Version
|
253
|
+
version: '0'
|
179
254
|
- !ruby/object:Gem::Dependency
|
180
255
|
name: yajl-ruby
|
181
|
-
requirement:
|
256
|
+
requirement: !ruby/object:Gem::Requirement
|
182
257
|
none: false
|
183
258
|
requirements:
|
184
259
|
- - ~>
|
@@ -186,10 +261,15 @@ dependencies:
|
|
186
261
|
version: '1.0'
|
187
262
|
type: :development
|
188
263
|
prerelease: false
|
189
|
-
version_requirements:
|
264
|
+
version_requirements: !ruby/object:Gem::Requirement
|
265
|
+
none: false
|
266
|
+
requirements:
|
267
|
+
- - ~>
|
268
|
+
- !ruby/object:Gem::Version
|
269
|
+
version: '1.0'
|
190
270
|
- !ruby/object:Gem::Dependency
|
191
271
|
name: sqlite3
|
192
|
-
requirement:
|
272
|
+
requirement: !ruby/object:Gem::Requirement
|
193
273
|
none: false
|
194
274
|
requirements:
|
195
275
|
- - ! '>='
|
@@ -197,10 +277,15 @@ dependencies:
|
|
197
277
|
version: '0'
|
198
278
|
type: :development
|
199
279
|
prerelease: false
|
200
|
-
version_requirements:
|
280
|
+
version_requirements: !ruby/object:Gem::Requirement
|
281
|
+
none: false
|
282
|
+
requirements:
|
283
|
+
- - ! '>='
|
284
|
+
- !ruby/object:Gem::Version
|
285
|
+
version: '0'
|
201
286
|
- !ruby/object:Gem::Dependency
|
202
287
|
name: bson_ext
|
203
|
-
requirement:
|
288
|
+
requirement: !ruby/object:Gem::Requirement
|
204
289
|
none: false
|
205
290
|
requirements:
|
206
291
|
- - ! '>='
|
@@ -208,10 +293,15 @@ dependencies:
|
|
208
293
|
version: '0'
|
209
294
|
type: :development
|
210
295
|
prerelease: false
|
211
|
-
version_requirements:
|
296
|
+
version_requirements: !ruby/object:Gem::Requirement
|
297
|
+
none: false
|
298
|
+
requirements:
|
299
|
+
- - ! '>='
|
300
|
+
- !ruby/object:Gem::Version
|
301
|
+
version: '0'
|
212
302
|
- !ruby/object:Gem::Dependency
|
213
303
|
name: curb
|
214
|
-
requirement:
|
304
|
+
requirement: !ruby/object:Gem::Requirement
|
215
305
|
none: false
|
216
306
|
requirements:
|
217
307
|
- - ! '>='
|
@@ -219,10 +309,15 @@ dependencies:
|
|
219
309
|
version: '0'
|
220
310
|
type: :development
|
221
311
|
prerelease: false
|
222
|
-
version_requirements:
|
312
|
+
version_requirements: !ruby/object:Gem::Requirement
|
313
|
+
none: false
|
314
|
+
requirements:
|
315
|
+
- - ! '>='
|
316
|
+
- !ruby/object:Gem::Version
|
317
|
+
version: '0'
|
223
318
|
- !ruby/object:Gem::Dependency
|
224
319
|
name: oj
|
225
|
-
requirement:
|
320
|
+
requirement: !ruby/object:Gem::Requirement
|
226
321
|
none: false
|
227
322
|
requirements:
|
228
323
|
- - ! '>='
|
@@ -230,10 +325,15 @@ dependencies:
|
|
230
325
|
version: '0'
|
231
326
|
type: :development
|
232
327
|
prerelease: false
|
233
|
-
version_requirements:
|
328
|
+
version_requirements: !ruby/object:Gem::Requirement
|
329
|
+
none: false
|
330
|
+
requirements:
|
331
|
+
- - ! '>='
|
332
|
+
- !ruby/object:Gem::Version
|
333
|
+
version: '0'
|
234
334
|
- !ruby/object:Gem::Dependency
|
235
335
|
name: turn
|
236
|
-
requirement:
|
336
|
+
requirement: !ruby/object:Gem::Requirement
|
237
337
|
none: false
|
238
338
|
requirements:
|
239
339
|
- - ~>
|
@@ -241,7 +341,12 @@ dependencies:
|
|
241
341
|
version: '0.9'
|
242
342
|
type: :development
|
243
343
|
prerelease: false
|
244
|
-
version_requirements:
|
344
|
+
version_requirements: !ruby/object:Gem::Requirement
|
345
|
+
none: false
|
346
|
+
requirements:
|
347
|
+
- - ~>
|
348
|
+
- !ruby/object:Gem::Version
|
349
|
+
version: '0.9'
|
245
350
|
description: ! " Tire is a Ruby client for the Elasticsearch search engine/database.\n\n
|
246
351
|
\ It provides Ruby-like API for fluent communication with the Elasticsearch server\n
|
247
352
|
\ and blends with ActiveModel class for convenient usage in Rails applications.\n\n
|
@@ -362,6 +467,7 @@ files:
|
|
362
467
|
- test/models/persistent_article_with_casting.rb
|
363
468
|
- test/models/persistent_article_with_defaults.rb
|
364
469
|
- test/models/persistent_article_with_percolation.rb
|
470
|
+
- test/models/persistent_article_with_strict_mapping.rb
|
365
471
|
- test/models/persistent_articles_with_custom_index_name.rb
|
366
472
|
- test/models/supermodel_article.rb
|
367
473
|
- test/models/validated_model.rb
|
@@ -397,10 +503,12 @@ homepage: http://github.com/karmi/tire
|
|
397
503
|
licenses: []
|
398
504
|
post_install_message: ! "================================================================================\n\n
|
399
505
|
\ Please check the documentation at <http://karmi.github.com/tire/>.\n\n--------------------------------------------------------------------------------\n\n
|
400
|
-
\ IMPORTANT CHANGES LATELY:\n\n *
|
401
|
-
|
402
|
-
|
403
|
-
|
506
|
+
\ IMPORTANT CHANGES LATELY:\n\n * Fixed, that Model::Persistence uses \"string\"
|
507
|
+
as the default mapping type\n * Fixed, that Model::Persistence returns true/false
|
508
|
+
for #save and #destroy operations\n * Fixed the `uninitialized constant HRULE`
|
509
|
+
in Rake tasks\n * Fixed `Item#to_hash` functionality to work with Arrays\n * Updated
|
510
|
+
the Rails application template and install instructions\n * Improved the test suite
|
511
|
+
for Travis\n\n See the full changelog at <http://github.com/karmi/tire/commits/v0.5.8>.\n\n--------------------------------------------------------------------------------\n"
|
404
512
|
rdoc_options:
|
405
513
|
- --charset=UTF-8
|
406
514
|
require_paths:
|
@@ -419,7 +527,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
419
527
|
version: 1.3.6
|
420
528
|
requirements: []
|
421
529
|
rubyforge_project: tire
|
422
|
-
rubygems_version: 1.8.
|
530
|
+
rubygems_version: 1.8.23
|
423
531
|
signing_key:
|
424
532
|
specification_version: 3
|
425
533
|
summary: Ruby client for Elasticsearch
|
@@ -479,6 +587,7 @@ test_files:
|
|
479
587
|
- test/models/persistent_article_with_casting.rb
|
480
588
|
- test/models/persistent_article_with_defaults.rb
|
481
589
|
- test/models/persistent_article_with_percolation.rb
|
590
|
+
- test/models/persistent_article_with_strict_mapping.rb
|
482
591
|
- test/models/persistent_articles_with_custom_index_name.rb
|
483
592
|
- test/models/supermodel_article.rb
|
484
593
|
- test/models/validated_model.rb
|