yoga_pants 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ # v0.1.1
4
+
5
+ - ElasticSearch errors now have their own exceptions
6
+
3
7
  # v0.1.0
4
8
 
5
9
  - Added multi_search (thanks to @dhotson)
@@ -5,15 +5,6 @@ module YogaPants
5
5
  # * failing over to nodes in a list
6
6
  # * ES-specific error handling
7
7
 
8
- class RequestError < RuntimeError
9
- attr_reader :http_error
10
-
11
- def initialize(message, http_error = nil)
12
- @http_error = nil
13
- super(message)
14
- end
15
- end
16
-
17
8
  attr_accessor :hosts, :options, :active_host
18
9
 
19
10
  def initialize(hosts, options = {})
@@ -55,6 +46,8 @@ module YogaPants
55
46
 
56
47
  BULK_OPERATIONS_WITH_DATA = [:index, :create].freeze
57
48
  def bulk(path, operations, args = {})
49
+ return [] if operations.empty?
50
+
58
51
  path = path.sub(%r{/(?:_bulk)?$}, '/_bulk')
59
52
 
60
53
  with_error_handling do
@@ -112,6 +105,38 @@ module YogaPants
112
105
  connection.reset
113
106
  end
114
107
 
108
+ class RequestError < RuntimeError; end
109
+
110
+ class HTTPRequestError < RequestError
111
+ attr_reader :http_error
112
+
113
+ def initialize(message, http_error)
114
+ super(message)
115
+ @http_error = http_error
116
+ end
117
+ end
118
+
119
+ class ElasticSearchError < RequestError
120
+ attr_reader :elasticsearch_exception_name
121
+ attr_reader :elasticsearch_exception_details
122
+
123
+ def initialize(elasticsearch_error_message, original_exception)
124
+ super(elasticsearch_error_message)
125
+ set_backtrace(original_exception.backtrace)
126
+ parse_and_set_elasticsearch_error_message(elasticsearch_error_message)
127
+ end
128
+
129
+ def parse_and_set_elasticsearch_error_message(message)
130
+ if message =~ /(\w+)\[(.+)\]/m
131
+ @elasticsearch_exception_name = $1
132
+ @elasticsearch_exception_details = $2
133
+ else
134
+ @elasticsearch_exception_name = message
135
+ end
136
+ end
137
+
138
+ end
139
+
115
140
  private
116
141
 
117
142
  def connection
@@ -134,10 +159,10 @@ module YogaPants
134
159
  @retries += 1
135
160
  pick_next_host
136
161
  retry
137
- elsif e.body.is_a?(Hash) && error = e.body['error']
138
- raise RequestError.new("ElasticSearch Error: #{error}", e).tap { |ex| ex.set_backtrace(e.backtrace) }
162
+ elsif e.body.is_a?(Hash) && error_message = e.body['error']
163
+ raise ElasticSearchError.new(error_message, e)
139
164
  else
140
- raise RequestError.new(e.message, e).tap { |ex| ex.set_backtrace(e.backtrace) }
165
+ raise HTTPRequestError.new(e.message, e)
141
166
  end
142
167
  end
143
168
  end
@@ -33,6 +33,7 @@ module YogaPants
33
33
  @host = host.chomp('/')
34
34
  @options = options || {}
35
35
  @http = HTTPClient.new
36
+ @http.debug_dev = @options[:debug_io] if @options[:debug_io].respond_to?(:<<)
36
37
 
37
38
  default_timeout = @options[:timeout] || 5
38
39
  http.connect_timeout = @options[:connect_timeout] || default_timeout
@@ -1,3 +1,3 @@
1
1
  module YogaPants
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -97,7 +97,7 @@ module YogaPants
97
97
  [:index, {:_index => 'yoga_pants_test', :_type => 'doc', :_id => 1}, {:bar => 1}],
98
98
  [:index, {:_index => '', :_type => 'doc', :_id => 2}, {:bar => 'invalid'}],
99
99
  ])
100
- end.to raise_error(Client::RequestError, "ElasticSearch Error: ElasticSearchException[String index out of range: 0]; nested: StringIndexOutOfBoundsException[String index out of range: 0]; ")
100
+ end.to raise_error(Client::ElasticSearchError, "ElasticSearchException[String index out of range: 0]; nested: StringIndexOutOfBoundsException[String index out of range: 0]; ")
101
101
 
102
102
  subject.exists?("/yoga_pants_test/doc/1").should be_false
103
103
  subject.exists?("/yoga_pants_test/doc/2").should be_false
@@ -137,7 +137,7 @@ module YogaPants
137
137
  subject.post("/yoga_pants_test/doc/1", :body => {
138
138
  :foo => 'bar'
139
139
  })
140
- expect { subject.get("/yoga_pants_test/doc/1/_mlt?min_term_freq=invalid") }.to raise_error(Client::RequestError, "ElasticSearch Error: Failed to parse int parameter [min_term_freq] with value [invalid]")
140
+ expect { subject.get("/yoga_pants_test/doc/1/_mlt?min_term_freq=invalid") }.to raise_error(Client::ElasticSearchError, "Failed to parse int parameter [min_term_freq] with value [invalid]")
141
141
  end
142
142
  end
143
143
 
@@ -154,7 +154,7 @@ module YogaPants
154
154
 
155
155
  it "raises an RequestError" do
156
156
  VCR.use_cassette('connection_refused') do
157
- expect { subject.exists?("/foo") }.to raise_error(Client::RequestError, "Connection refused to http://localhost:1")
157
+ expect { subject.exists?("/foo") }.to raise_error(Client::HTTPRequestError, "Connection refused to http://localhost:1")
158
158
  end
159
159
  end
160
160
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yoga_pants
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,22 +9,27 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-27 00:00:00.000000000 Z
12
+ date: 2013-06-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httpclient
16
- requirement: &70351042094460 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - =
19
+ - - '='
20
20
  - !ruby/object:Gem::Version
21
21
  version: 2.2.5
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70351042094460
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - '='
28
+ - !ruby/object:Gem::Version
29
+ version: 2.2.5
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: multi_json
27
- requirement: &70351042094000 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: '0'
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *70351042094000
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: rspec
38
- requirement: &70351042093480 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: '0'
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *70351042093480
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: vcr
49
- requirement: &70351042093000 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
@@ -54,10 +69,15 @@ dependencies:
54
69
  version: '0'
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *70351042093000
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: webmock
60
- requirement: &70351042092560 !ruby/object:Gem::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'
66
86
  type: :development
67
87
  prerelease: false
68
- version_requirements: *70351042092560
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
69
94
  - !ruby/object:Gem::Dependency
70
95
  name: rake
71
- requirement: &70351042092020 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
72
97
  none: false
73
98
  requirements:
74
99
  - - ! '>='
@@ -76,7 +101,12 @@ dependencies:
76
101
  version: '0'
77
102
  type: :development
78
103
  prerelease: false
79
- version_requirements: *70351042092020
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
80
110
  description: A super lightweight interface to ElasticSearch's HTTP REST API
81
111
  email:
82
112
  executables: []
@@ -129,10 +159,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
159
  version: '0'
130
160
  requirements: []
131
161
  rubyforge_project:
132
- rubygems_version: 1.8.11
162
+ rubygems_version: 1.8.23
133
163
  signing_key:
134
164
  specification_version: 3
135
165
  summary: A super lightweight interface to ElasticSearch's HTTP REST API.
136
166
  test_files:
137
167
  - spec/integration/basic_spec.rb
138
168
  - spec/spec_helper.rb
169
+ has_rdoc: