tire 0.3.9 → 0.3.10

Sign up to get free protection for your applications and to get access to all the features.
data/lib/tire/dsl.rb CHANGED
@@ -16,11 +16,12 @@ module Tire
16
16
  end
17
17
 
18
18
  response = Configuration.client.post( "#{Configuration.url}/#{indices}/_search", payload)
19
+ raise Tire::Search::SearchRequestFailed, response.to_s if response.failure?
19
20
  json = MultiJson.decode(response.body)
20
21
  results = Results::Collection.new(json, options)
21
22
  end
22
23
  rescue Exception => error
23
- STDERR.puts "[REQUEST FAILED] #{error.class} #{error.http_body rescue nil}\n"
24
+ STDERR.puts "[REQUEST FAILED] #{error.class} #{error.message rescue nil}\n"
24
25
  raise
25
26
  ensure
26
27
  end
@@ -16,6 +16,10 @@ module Tire
16
16
  def failure?
17
17
  ! success?
18
18
  end
19
+
20
+ def to_s
21
+ [code, body].join(' : ')
22
+ end
19
23
  end
20
24
 
21
25
  end
data/lib/tire/index.rb CHANGED
@@ -11,26 +11,29 @@ module Tire
11
11
  def exists?
12
12
  @response = Configuration.client.head("#{Configuration.url}/#{@name}")
13
13
  @response.success?
14
+
14
15
  ensure
15
16
  curl = %Q|curl -I "#{Configuration.url}/#{@name}"|
16
- logged(@response.body, 'HEAD', curl) if @response
17
+ logged('HEAD', curl)
17
18
  end
18
19
 
19
20
  def delete
20
21
  @response = Configuration.client.delete "#{Configuration.url}/#{@name}"
21
- return @response.success?
22
+ @response.success?
23
+
22
24
  ensure
23
25
  curl = %Q|curl -X DELETE "#{Configuration.url}/#{@name}"|
24
- logged(@response.body, 'DELETE', curl)
26
+ logged('DELETE', curl)
25
27
  end
26
28
 
27
29
  def create(options={})
28
30
  @options = options
29
31
  @response = Configuration.client.post "#{Configuration.url}/#{@name}", MultiJson.encode(options)
30
32
  @response.success? ? @response : false
33
+
31
34
  ensure
32
35
  curl = %Q|curl -X POST "#{Configuration.url}/#{@name}" -d '#{MultiJson.encode(options)}'|
33
- logged(@response.body, 'CREATE', curl) if @response
36
+ logged('CREATE', curl)
34
37
  end
35
38
 
36
39
  def mapping
@@ -56,11 +59,9 @@ module Tire
56
59
  @response = Configuration.client.post url, document
57
60
  MultiJson.decode(@response.body)
58
61
 
59
- rescue Exception => error
60
- raise
61
62
  ensure
62
63
  curl = %Q|curl -X POST "#{url}" -d '#{document}'|
63
- logged(error, "/#{@name}/#{type}/", curl)
64
+ logged([type, id].join('/'), curl)
64
65
  end
65
66
 
66
67
  def bulk_store documents
@@ -92,9 +93,10 @@ module Tire
92
93
  else
93
94
  STDERR.puts "[ERROR] Too many exceptions occured, giving up. The HTTP response was: #{error.message}"
94
95
  end
96
+
95
97
  ensure
96
98
  curl = %Q|curl -X POST "#{Configuration.url}/_bulk" -d '{... data omitted ...}'|
97
- logged(error, 'BULK', curl)
99
+ logged('BULK', curl)
98
100
  end
99
101
  end
100
102
 
@@ -132,14 +134,21 @@ module Tire
132
134
  end
133
135
  raise ArgumentError, "Please pass a document ID" unless id
134
136
 
135
- result = Configuration.client.delete "#{Configuration.url}/#{@name}/#{type}/#{id}"
137
+ url = "#{Configuration.url}/#{@name}/#{type}/#{id}"
138
+ result = Configuration.client.delete url
136
139
  MultiJson.decode(result.body) if result.success?
140
+
141
+ ensure
142
+ curl = %Q|curl -X DELETE "#{url}"|
143
+ logged(id, curl)
137
144
  end
138
145
 
139
146
  def retrieve(type, id)
140
147
  raise ArgumentError, "Please pass a document ID" unless id
141
148
 
142
- @response = Configuration.client.get "#{Configuration.url}/#{@name}/#{type}/#{id}"
149
+ url = "#{Configuration.url}/#{@name}/#{type}/#{id}"
150
+ @response = Configuration.client.get url
151
+
143
152
  h = MultiJson.decode(@response.body)
144
153
  if Configuration.wrapper == Hash then h
145
154
  else
@@ -148,37 +157,37 @@ module Tire
148
157
  document.update('id' => h['_id'], '_type' => h['_type'], '_index' => h['_index'], '_version' => h['_version'])
149
158
  Configuration.wrapper.new(document)
150
159
  end
160
+
161
+ ensure
162
+ curl = %Q|curl -X GET "#{url}"|
163
+ logged(id, curl)
151
164
  end
152
165
 
153
166
  def refresh
154
167
  @response = Configuration.client.post "#{Configuration.url}/#{@name}/_refresh", ''
155
- rescue Exception => error
156
- raise
168
+
157
169
  ensure
158
170
  curl = %Q|curl -X POST "#{Configuration.url}/#{@name}/_refresh"|
159
- logged(error, '_refresh', curl)
171
+ logged('_refresh', curl)
160
172
  end
161
173
 
162
174
  def open(options={})
163
175
  # TODO: Remove the duplication in the execute > rescue > ensure chain
164
176
  @response = Configuration.client.post "#{Configuration.url}/#{@name}/_open", MultiJson.encode(options)
165
177
  MultiJson.decode(@response.body)['ok']
166
- rescue Exception => error
167
- raise
178
+
168
179
  ensure
169
180
  curl = %Q|curl -X POST "#{Configuration.url}/#{@name}/open"|
170
- logged(error, '_open', curl)
181
+ logged('_open', curl)
171
182
  end
172
183
 
173
184
  def close(options={})
174
- # TODO: Remove the duplication in the execute > rescue > ensure chain
175
185
  @response = Configuration.client.post "#{Configuration.url}/#{@name}/_close", MultiJson.encode(options)
176
186
  MultiJson.decode(@response.body)['ok']
177
- rescue Exception => error
178
- raise
187
+
179
188
  ensure
180
189
  curl = %Q|curl -X POST "#{Configuration.url}/#{@name}/_close"|
181
- logged(error, '_close', curl)
190
+ logged('_close', curl)
182
191
  end
183
192
 
184
193
  def analyze(text, options={})
@@ -186,11 +195,10 @@ module Tire
186
195
  params = options.to_param
187
196
  @response = Configuration.client.get "#{Configuration.url}/#{@name}/_analyze?#{params}", text
188
197
  @response.success? ? MultiJson.decode(@response.body) : false
189
- rescue Exception => error
190
- raise
198
+
191
199
  ensure
192
200
  curl = %Q|curl -X GET "#{Configuration.url}/#{@name}/_analyze?#{params}" -d '#{text}'|
193
- logged(error, '_analyze', curl)
201
+ logged('_analyze', curl)
194
202
  end
195
203
 
196
204
  def register_percolator_query(name, options={}, &block)
@@ -198,21 +206,19 @@ module Tire
198
206
 
199
207
  @response = Configuration.client.put "#{Configuration.url}/_percolator/#{@name}/#{name}", MultiJson.encode(options)
200
208
  MultiJson.decode(@response.body)['ok']
201
- rescue Exception => error
202
- raise
203
- ensure
204
- curl = %Q|curl -X PUT "#{Configuration.url}/_percolator/#{@name}/?pretty=1" -d '#{MultiJson.encode(options)}'|
205
- logged(error, '_percolator', curl)
209
+
210
+ ensure
211
+ curl = %Q|curl -X PUT "#{Configuration.url}/_percolator/#{@name}/?pretty=1" -d '#{MultiJson.encode(options)}'|
212
+ logged('_percolator', curl)
206
213
  end
207
214
 
208
215
  def unregister_percolator_query(name)
209
216
  @response = Configuration.client.delete "#{Configuration.url}/_percolator/#{@name}/#{name}"
210
217
  MultiJson.decode(@response.body)['ok']
211
- rescue Exception => error
212
- raise
213
- ensure
214
- curl = %Q|curl -X DELETE "#{Configuration.url}/_percolator/#{@name}"|
215
- logged(error, '_percolator', curl)
218
+
219
+ ensure
220
+ curl = %Q|curl -X DELETE "#{Configuration.url}/_percolator/#{@name}"|
221
+ logged('_percolator', curl)
216
222
  end
217
223
 
218
224
  def percolate(*args, &block)
@@ -229,26 +235,24 @@ module Tire
229
235
  @response = Configuration.client.get "#{Configuration.url}/#{@name}/#{type}/_percolate", MultiJson.encode(payload)
230
236
  MultiJson.decode(@response.body)['matches']
231
237
 
232
- rescue Exception => error
233
- # raise
234
- ensure
235
- curl = %Q|curl -X GET "#{Configuration.url}/#{@name}/#{type}/_percolate?pretty=1" -d '#{payload.to_json}'|
236
- logged(error, '_percolate', curl)
238
+ ensure
239
+ curl = %Q|curl -X GET "#{Configuration.url}/#{@name}/#{type}/_percolate?pretty=1" -d '#{payload.to_json}'|
240
+ logged('_percolate', curl)
237
241
  end
238
242
 
239
- def logged(error=nil, endpoint='/', curl='')
243
+ def logged(endpoint='/', curl='')
240
244
  if Configuration.logger
245
+ error = $!
241
246
 
242
247
  Configuration.logger.log_request endpoint, @name, curl
243
248
 
244
- code = @response ? @response.code : error.message rescue 200
249
+ code = @response ? @response.code : error.class rescue 200
245
250
 
246
251
  if Configuration.logger.level.to_s == 'debug'
247
- # FIXME: Depends on RestClient implementation
248
252
  body = if @response
249
253
  defined?(Yajl) ? Yajl::Encoder.encode(@response.body, :pretty => true) : MultiJson.encode(@response.body)
250
254
  else
251
- error.http_body rescue ''
255
+ error.message rescue ''
252
256
  end
253
257
  else
254
258
  body = ''
data/lib/tire/logger.rb CHANGED
@@ -7,9 +7,9 @@ module Tire
7
7
  else
8
8
  File.open(device, 'a')
9
9
  end
10
- @device.sync = true
10
+ @device.sync = true if @device.respond_to?(:sync)
11
11
  @options = options
12
- at_exit { @device.close unless @device.closed? }
12
+ at_exit { @device.close unless @device.closed? } if @device.respond_to?(:closed?) && @device.respond_to?(:close)
13
13
  end
14
14
 
15
15
  def level
@@ -46,8 +46,8 @@ module Tire
46
46
  content = "# #{time}"
47
47
  content += " [#{status}]"
48
48
  content += " (#{took} msec)" if took
49
- content += "\n#\n" unless json == ''
50
- json.each_line { |line| content += "# #{line}" } unless json == ''
49
+ content += "\n#\n" unless json.to_s !~ /\S/
50
+ json.to_s.each_line { |line| content += "# #{line}" } unless json.to_s !~ /\S/
51
51
  content += "\n\n"
52
52
  write content
53
53
  end
data/lib/tire/search.rb CHANGED
@@ -8,10 +8,10 @@ module Tire
8
8
 
9
9
  def initialize(indices=nil, options = {}, &block)
10
10
  @indices = Array(indices)
11
+ @types = Array(options.delete(:type))
11
12
  @options = options
12
- @type = @options[:type]
13
13
 
14
- @url = Configuration.url+['/', @indices.join(','), @type, '_search'].compact.join('/').squeeze('/')
14
+ @url = Configuration.url+['/', @indices.join(','), @types.join(','), '_search'].compact.join('/').squeeze('/')
15
15
 
16
16
  block.arity < 1 ? instance_eval(&block) : block.call(self) if block_given?
17
17
  end
@@ -69,7 +69,7 @@ module Tire
69
69
  @response = Configuration.client.get(@url, self.to_json)
70
70
  if @response.failure?
71
71
  STDERR.puts "[REQUEST FAILED] #{self.to_curl}\n"
72
- raise SearchRequestFailed
72
+ raise SearchRequestFailed, @response.to_s
73
73
  end
74
74
  @json = MultiJson.decode(@response.body)
75
75
  @results = Results::Collection.new(@json, @options)
@@ -119,7 +119,7 @@ module Tire
119
119
  body = ''
120
120
  end
121
121
 
122
- Configuration.logger.log_response code || 'N/A', took || 'N/A', body
122
+ Configuration.logger.log_response code || 'N/A', took || 'N/A', body || 'N/A'
123
123
  end
124
124
  end
125
125
 
data/lib/tire/version.rb CHANGED
@@ -1,10 +1,10 @@
1
1
  module Tire
2
- VERSION = "0.3.9"
2
+ VERSION = "0.3.10"
3
3
 
4
4
  CHANGELOG =<<-END
5
5
  IMPORTANT CHANGES LATELY:
6
6
 
7
- * Added support for filtered queries [#134]
8
- * Added support for "custom_score" queries [#133]
7
+ * Fixes and improvements for Logger [#142]
8
+ * Better handling of search exceptions [#145]
9
9
  END
10
10
  end
@@ -37,6 +37,10 @@ module Tire
37
37
  assert Response.new('NotFound', 404).failure?
38
38
  end
39
39
 
40
+ should "return string representation" do
41
+ assert_equal "200 : Hello", Response.new('Hello', 200).to_s
42
+ end
43
+
40
44
  end
41
45
 
42
46
  end
@@ -46,6 +46,13 @@ module Tire
46
46
  end
47
47
  end
48
48
 
49
+ should "raise SearchRequestFailed when receiving bad response from backend" do
50
+ assert_raise(Search::SearchRequestFailed) do
51
+ Tire::Configuration.client.expects(:post).returns( mock_response('INDEX DOES NOT EXIST', 404) )
52
+ Tire.search 'not-existing', :query => { :query_string => { :query => 'foo' }}
53
+ end
54
+ end
55
+
49
56
  end
50
57
 
51
58
  end
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.3.9
4
+ version: 0.3.10
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: 2011-10-30 00:00:00.000000000 Z
12
+ date: 2011-11-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &70250440988100 !ruby/object:Gem::Requirement
16
+ requirement: &70120928192280 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.9.2
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70250440988100
24
+ version_requirements: *70120928192280
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rest-client
27
- requirement: &70250440987640 !ruby/object:Gem::Requirement
27
+ requirement: &70120928191820 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.6.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70250440987640
35
+ version_requirements: *70120928191820
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: multi_json
38
- requirement: &70250440987180 !ruby/object:Gem::Requirement
38
+ requirement: &70120928191360 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '1.0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70250440987180
46
+ version_requirements: *70120928191360
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: activemodel
49
- requirement: &70250440986720 !ruby/object:Gem::Requirement
49
+ requirement: &70120928190900 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '3.0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70250440986720
57
+ version_requirements: *70120928190900
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: bundler
60
- requirement: &70250440986260 !ruby/object:Gem::Requirement
60
+ requirement: &70120928190440 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.0.0
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70250440986260
68
+ version_requirements: *70120928190440
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: yajl-ruby
71
- requirement: &70250436367320 !ruby/object:Gem::Requirement
71
+ requirement: &70120928189980 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 0.8.0
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70250436367320
79
+ version_requirements: *70120928189980
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: shoulda
82
- requirement: &70250436365820 !ruby/object:Gem::Requirement
82
+ requirement: &70120928189600 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70250436365820
90
+ version_requirements: *70120928189600
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: mocha
93
- requirement: &70250436364080 !ruby/object:Gem::Requirement
93
+ requirement: &70120928189140 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70250436364080
101
+ version_requirements: *70120928189140
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: activerecord
104
- requirement: &70250436362640 !ruby/object:Gem::Requirement
104
+ requirement: &70120928188640 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: 3.0.7
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *70250436362640
112
+ version_requirements: *70120928188640
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: mongoid
115
- requirement: &70250436361060 !ruby/object:Gem::Requirement
115
+ requirement: &70120928188140 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ~>
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: 2.2.1
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *70250436361060
123
+ version_requirements: *70120928188140
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: sqlite3
126
- requirement: &70250441020080 !ruby/object:Gem::Requirement
126
+ requirement: &70120928187760 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *70250441020080
134
+ version_requirements: *70120928187760
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: supermodel
137
- requirement: &70250441019620 !ruby/object:Gem::Requirement
137
+ requirement: &70120928187300 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ! '>='
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: '0'
143
143
  type: :development
144
144
  prerelease: false
145
- version_requirements: *70250441019620
145
+ version_requirements: *70120928187300
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: rdoc
148
- requirement: &70250441019180 !ruby/object:Gem::Requirement
148
+ requirement: &70120932742840 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ! '>='
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: '0'
154
154
  type: :development
155
155
  prerelease: false
156
- version_requirements: *70250441019180
156
+ version_requirements: *70120932742840
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: rcov
159
- requirement: &70250441018760 !ruby/object:Gem::Requirement
159
+ requirement: &70120934930540 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - ! '>='
@@ -164,10 +164,10 @@ dependencies:
164
164
  version: '0'
165
165
  type: :development
166
166
  prerelease: false
167
- version_requirements: *70250441018760
167
+ version_requirements: *70120934930540
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: turn
170
- requirement: &70250441018340 !ruby/object:Gem::Requirement
170
+ requirement: &70120934930120 !ruby/object:Gem::Requirement
171
171
  none: false
172
172
  requirements:
173
173
  - - ! '>='
@@ -175,7 +175,7 @@ dependencies:
175
175
  version: '0'
176
176
  type: :development
177
177
  prerelease: false
178
- version_requirements: *70250441018340
178
+ version_requirements: *70120934930120
179
179
  description: ! " Tire is a Ruby client for the ElasticSearch search engine/database.\n\n
180
180
  \ It provides Ruby-like API for fluent communication with the ElasticSearch server\n
181
181
  \ and blends with ActiveModel class for convenient usage in Rails applications.\n\n
@@ -289,9 +289,8 @@ homepage: http://github.com/karmi/tire
289
289
  licenses: []
290
290
  post_install_message: ! "================================================================================\n\n
291
291
  \ Please check the documentation at <http://karmi.github.com/tire/>.\n\n--------------------------------------------------------------------------------\n\n
292
- \ IMPORTANT CHANGES LATELY:\n\n * Added support for filtered queries [#134]\n *
293
- Added support for \"custom_score\" queries [#133]\n\n See the full changelog at
294
- <http://github.com/karmi/tire/commits/v0.3.9>.\n\n--------------------------------------------------------------------------------\n"
292
+ \ IMPORTANT CHANGES LATELY:\n\n * Fixes and improvements for Logger [#142]\n
293
+ \ * Better handling of search exceptions [#145]\n\n See the full changelog at <http://github.com/karmi/tire/commits/v0.3.10>.\n\n--------------------------------------------------------------------------------\n"
295
294
  rdoc_options:
296
295
  - --charset=UTF-8
297
296
  require_paths: