tire 0.3.9 → 0.3.10

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/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: