es 0.0.1 → 0.0.2
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/Rakefile +6 -1
- data/es.gemspec +4 -0
- data/lib/es.rb +2 -0
- data/lib/es/client.rb +29 -53
- data/lib/es/connection.rb +36 -0
- data/lib/es/raw_client.rb +40 -0
- data/lib/es/version.rb +1 -1
- data/spec/es/client_spec.rb +47 -0
- data/spec/es/connection_spec.rb +41 -0
- data/spec/es/raw_client_spec.rb +56 -0
- metadata +60 -4
data/Rakefile
CHANGED
data/es.gemspec
CHANGED
@@ -17,5 +17,9 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
18
|
gem.require_paths = ["lib"]
|
19
19
|
|
20
|
+
gem.add_dependency 'oj'
|
21
|
+
gem.add_dependency 'curb'
|
22
|
+
|
20
23
|
gem.add_development_dependency 'rspec'
|
24
|
+
gem.add_development_dependency 'rake'
|
21
25
|
end
|
data/lib/es.rb
CHANGED
data/lib/es/client.rb
CHANGED
@@ -1,73 +1,49 @@
|
|
1
|
+
# TODO find a better way to wrap serialization to client
|
1
2
|
module ES
|
2
3
|
class Client
|
3
4
|
def initialize(opts = {})
|
4
|
-
@
|
5
|
-
@
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
def create_index(name, definition)
|
10
|
-
http_put(url(name), serialize(definition))
|
11
|
-
end
|
12
|
-
|
13
|
-
def delete_index(name)
|
14
|
-
http_delete(url(name))
|
5
|
+
@dumper = opts[:dumper] || Oj
|
6
|
+
@client = opts[:client] || begin
|
7
|
+
RawClient.new(opts)
|
8
|
+
end
|
15
9
|
end
|
16
10
|
|
17
11
|
def bulk(requests, path = nil)
|
18
|
-
|
19
|
-
|
20
|
-
end.join(
|
12
|
+
serialized = requests.map do |r|
|
13
|
+
@dumper.dump(r)
|
14
|
+
end.join("\n")
|
21
15
|
|
22
|
-
|
23
|
-
end
|
16
|
+
response = @client.bulk(serialized, path)
|
24
17
|
|
25
|
-
|
26
|
-
http_put(url(path), serialize(data))
|
18
|
+
@dumper.load(response)
|
27
19
|
end
|
28
20
|
|
29
|
-
def
|
30
|
-
|
21
|
+
def get(path)
|
22
|
+
response = @client.get(path)
|
23
|
+
@dumper.load(response)
|
31
24
|
end
|
32
25
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
def http_put(url, data)
|
40
|
-
# TODO refactor
|
41
|
-
response = @backend.put(url, data)
|
42
|
-
if [200, 201].include?(response.response_code)
|
43
|
-
@serializer.load(response.body_str)
|
44
|
-
else
|
45
|
-
raise StandardError.new(response.body_str)
|
46
|
-
end
|
26
|
+
def index(path, data)
|
27
|
+
serialized = @dumper.dump(data)
|
28
|
+
response = @client.index(path, serialized)
|
29
|
+
@dumper.load(response)
|
47
30
|
end
|
48
31
|
|
49
|
-
def
|
50
|
-
|
51
|
-
response = @
|
52
|
-
|
53
|
-
@serializer.load(response.body_str)
|
54
|
-
else
|
55
|
-
raise StandardError.new(response.body_str)
|
56
|
-
end
|
32
|
+
def search(path, data)
|
33
|
+
serialized = @dumper.dump(data)
|
34
|
+
response = @client.search(path, serialized)
|
35
|
+
@dumper.load(response)
|
57
36
|
end
|
58
37
|
|
59
|
-
def
|
60
|
-
|
61
|
-
response = @
|
62
|
-
|
63
|
-
@serializer.load(response.body_str)
|
64
|
-
else
|
65
|
-
raise StandardError.new(response.body_str)
|
66
|
-
end
|
38
|
+
def create_index(path, data)
|
39
|
+
serialized = @dumper.dump(data)
|
40
|
+
response = @client.create_index(path, serialized)
|
41
|
+
@dumper.load(response)
|
67
42
|
end
|
68
43
|
|
69
|
-
def
|
70
|
-
@
|
44
|
+
def delete_index(path)
|
45
|
+
response = @client.delete_index(path)
|
46
|
+
@dumper.load(response)
|
71
47
|
end
|
72
48
|
end
|
73
|
-
end
|
49
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module ES
|
2
|
+
class Connection
|
3
|
+
OK_HTTP_CODES = [200, 201]
|
4
|
+
|
5
|
+
def initialize(host, driver)
|
6
|
+
@host = host
|
7
|
+
@driver = driver
|
8
|
+
end
|
9
|
+
|
10
|
+
def request(method, path, data = nil)
|
11
|
+
response = translate_request(method, "#{@host}/#{path}", data)
|
12
|
+
raise Error.new(response) unless OK_HTTP_CODES.include?(response.response_code)
|
13
|
+
response.body_str
|
14
|
+
end
|
15
|
+
|
16
|
+
class Error < StandardError
|
17
|
+
def initialize(response)
|
18
|
+
super(response)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
def translate_request(method, url, data)
|
24
|
+
case method
|
25
|
+
when :get
|
26
|
+
@driver.http_get(url)
|
27
|
+
when :put
|
28
|
+
@driver.http_put(url, data)
|
29
|
+
when :post
|
30
|
+
@driver.http_post(url, data)
|
31
|
+
when :delete
|
32
|
+
@driver.http_post(url)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module ES
|
2
|
+
class RawClient
|
3
|
+
def initialize(opts = {})
|
4
|
+
@connection = opts[:connection] || begin
|
5
|
+
host = opts[:host] || 'http://localhost:9200'
|
6
|
+
driver = opts[:driver] || Curl
|
7
|
+
Connection.new(host, driver)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def create_index(name, definition)
|
12
|
+
@connection.request(:put, name, definition)
|
13
|
+
end
|
14
|
+
|
15
|
+
def delete_index(name)
|
16
|
+
@connection.request(:delete, name)
|
17
|
+
end
|
18
|
+
|
19
|
+
def get(path)
|
20
|
+
@connection.request(:get, path)
|
21
|
+
end
|
22
|
+
|
23
|
+
def index(path, data)
|
24
|
+
@connection.request(:put, path, data)
|
25
|
+
end
|
26
|
+
|
27
|
+
def search(path, query)
|
28
|
+
@connection.request(:post, action_path(path, :search), query)
|
29
|
+
end
|
30
|
+
|
31
|
+
def bulk(path, requests)
|
32
|
+
@connection.request(:post, action_path(path, :bulk), requests)
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
def action_path(path, action)
|
37
|
+
"#{path}/_#{action}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/es/version.rb
CHANGED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'es/raw_client'
|
2
|
+
require 'es/client'
|
3
|
+
require 'oj'
|
4
|
+
|
5
|
+
describe ES::Client do
|
6
|
+
let(:client) { double(:Client) }
|
7
|
+
subject { described_class.new(client: client) }
|
8
|
+
let(:raw_response) { '{}' }
|
9
|
+
let(:response) { {} }
|
10
|
+
|
11
|
+
it 'serializes data for .create_index' do
|
12
|
+
client.should_receive(:create_index).with('index/1', '[1,2,3]').and_return(raw_response)
|
13
|
+
|
14
|
+
subject.create_index('index/1', [1,2,3]).should == response
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'serializes data for .delete_index' do
|
18
|
+
client.should_receive(:delete_index).with('index/1').and_return(raw_response)
|
19
|
+
|
20
|
+
subject.delete_index('index/1').should == response
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'serializes data for .bulk' do
|
24
|
+
requests = [1, 2, 3]
|
25
|
+
client.should_receive(:bulk).with("1\n2\n3", 'an_index').and_return(raw_response)
|
26
|
+
|
27
|
+
subject.bulk(requests, 'an_index').should == response
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'serializes data for .index' do
|
31
|
+
client.should_receive(:index).with('index/1', '[1,2,3]').and_return(raw_response)
|
32
|
+
|
33
|
+
subject.index('index/1', [1,2,3]).should == response
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'serializes data for .get' do
|
37
|
+
client.should_receive(:get).with('index/1').and_return(raw_response)
|
38
|
+
|
39
|
+
subject.get('index/1').should == response
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'serializes data for .search' do
|
43
|
+
client.should_receive(:search).with('index/1', '[1,2,3]').and_return(raw_response)
|
44
|
+
|
45
|
+
subject.search('index/1', [1,2,3]).should == response
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'es/connection'
|
2
|
+
|
3
|
+
describe ES::Connection do
|
4
|
+
let(:data) { :data }
|
5
|
+
let(:response_body) { :response }
|
6
|
+
let(:response) { stub(response_code: 200, body_str: response_body) }
|
7
|
+
let(:driver) { double(:Driver) }
|
8
|
+
|
9
|
+
subject { described_class.new('http://localhost:9200', driver) }
|
10
|
+
|
11
|
+
it 'sends get request with url to driver' do
|
12
|
+
driver.should_receive(:http_get).with('http://localhost:9200/index/1').and_return(response)
|
13
|
+
|
14
|
+
subject.request(:get, 'index/1').should == response_body
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'sends post request with url to driver' do
|
18
|
+
driver.should_receive(:http_post).with('http://localhost:9200/index', data).and_return(response)
|
19
|
+
|
20
|
+
subject.request(:post, 'index', data).should == response_body
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'sends put request with url to driver' do
|
24
|
+
driver.should_receive(:http_put).with('http://localhost:9200/index', data).and_return(response)
|
25
|
+
|
26
|
+
subject.request(:put, 'index', data).should == response_body
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'sends delete request with url to driver' do
|
30
|
+
driver.should_receive(:http_post).with('http://localhost:9200/index').and_return(response)
|
31
|
+
|
32
|
+
subject.request(:delete, 'index').should == response_body
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'throws error if response code is not 2XX' do
|
36
|
+
error_response = stub(response_code: 400)
|
37
|
+
driver.should_receive(:http_post).and_return(error_response)
|
38
|
+
|
39
|
+
expect { subject.request(:post, 'index/_search', data) }.to raise_error(ES::Connection::Error)
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'es/raw_client'
|
2
|
+
|
3
|
+
describe ES::RawClient do
|
4
|
+
let(:data) { {} }
|
5
|
+
let(:response) { :response }
|
6
|
+
let(:connection) { double(:Connection) }
|
7
|
+
let(:subject) { described_class.new({connection: connection}) }
|
8
|
+
|
9
|
+
context '.create_index' do
|
10
|
+
it 'sends PUT to connection' do
|
11
|
+
connection.should_receive(:request).with(:put, :an_index, data).and_return(response)
|
12
|
+
|
13
|
+
subject.create_index(:an_index, data).should == response
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context '.delete_index' do
|
18
|
+
it 'sends DELETE to connection' do
|
19
|
+
connection.should_receive(:request).with(:delete, :an_index).and_return(response)
|
20
|
+
|
21
|
+
subject.delete_index(:an_index).should == response
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context '.get' do
|
26
|
+
it 'sends GET to connection' do
|
27
|
+
connection.should_receive(:request).with(:get, 'index/1').and_return(response)
|
28
|
+
|
29
|
+
subject.get('index/1').should == response
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context '.index' do
|
34
|
+
it 'sends PUT to connection' do
|
35
|
+
connection.should_receive(:request).with(:put, 'index/1', data).and_return(response)
|
36
|
+
|
37
|
+
subject.index('index/1', data).should == response
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context '.search' do
|
42
|
+
it 'sends POST to connection' do
|
43
|
+
connection.should_receive(:request).with(:post, 'index/_search', data).and_return(response)
|
44
|
+
|
45
|
+
subject.search('index', data).should == response
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context '.bulk' do
|
50
|
+
it 'sends POST to connection' do
|
51
|
+
connection.should_receive(:request).with(:post, 'index/_bulk', data).and_return(response)
|
52
|
+
|
53
|
+
subject.bulk('index', data).should == response
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
metadata
CHANGED
@@ -1,18 +1,56 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: es
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.1
|
5
4
|
prerelease:
|
5
|
+
version: 0.0.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jan Suchal
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-06-
|
12
|
+
date: 2013-06-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: oj
|
16
|
+
version_requirements: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
requirement: !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
|
+
requirements:
|
25
|
+
- - ! '>='
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
type: :runtime
|
29
|
+
prerelease: false
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: curb
|
32
|
+
version_requirements: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
requirement: !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
14
46
|
- !ruby/object:Gem::Dependency
|
15
47
|
name: rspec
|
48
|
+
version_requirements: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
16
54
|
requirement: !ruby/object:Gem::Requirement
|
17
55
|
none: false
|
18
56
|
requirements:
|
@@ -21,12 +59,22 @@ dependencies:
|
|
21
59
|
version: '0'
|
22
60
|
type: :development
|
23
61
|
prerelease: false
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rake
|
24
64
|
version_requirements: !ruby/object:Gem::Requirement
|
25
65
|
none: false
|
26
66
|
requirements:
|
27
67
|
- - ! '>='
|
28
68
|
- !ruby/object:Gem::Version
|
29
69
|
version: '0'
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
30
78
|
description: Simple wrapper for elasticsearch
|
31
79
|
email:
|
32
80
|
- johno@jsmf.net
|
@@ -42,7 +90,12 @@ files:
|
|
42
90
|
- es.gemspec
|
43
91
|
- lib/es.rb
|
44
92
|
- lib/es/client.rb
|
93
|
+
- lib/es/connection.rb
|
94
|
+
- lib/es/raw_client.rb
|
45
95
|
- lib/es/version.rb
|
96
|
+
- spec/es/client_spec.rb
|
97
|
+
- spec/es/connection_spec.rb
|
98
|
+
- spec/es/raw_client_spec.rb
|
46
99
|
homepage: http://github.com/minio-sk/es
|
47
100
|
licenses: []
|
48
101
|
post_install_message:
|
@@ -63,8 +116,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
63
116
|
version: '0'
|
64
117
|
requirements: []
|
65
118
|
rubyforge_project:
|
66
|
-
rubygems_version: 1.8.
|
119
|
+
rubygems_version: 1.8.25
|
67
120
|
signing_key:
|
68
121
|
specification_version: 3
|
69
122
|
summary: Simple wrapper for elasticsearch.
|
70
|
-
test_files:
|
123
|
+
test_files:
|
124
|
+
- spec/es/client_spec.rb
|
125
|
+
- spec/es/connection_spec.rb
|
126
|
+
- spec/es/raw_client_spec.rb
|