rubberband 0.0.2 → 0.0.4
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/VERSION +1 -1
- data/lib/elasticsearch/client/hits.rb +4 -3
- data/lib/elasticsearch/client/index.rb +11 -5
- data/lib/elasticsearch/client/retrying_client.rb +5 -4
- data/lib/elasticsearch/encoding.rb +6 -1
- data/lib/elasticsearch/transport.rb +12 -1
- data/lib/elasticsearch/transport/base.rb +7 -2
- data/lib/elasticsearch/transport/base_protocol.rb +171 -34
- data/lib/elasticsearch/transport/http.rb +6 -219
- data/lib/elasticsearch/transport/thrift.rb +101 -0
- data/lib/elasticsearch/transport/thrift/elasticsearch_constants.rb +12 -0
- data/lib/elasticsearch/transport/thrift/elasticsearch_types.rb +124 -0
- data/lib/elasticsearch/transport/thrift/rest.rb +83 -0
- data/lib/rubberband.rb +1 -0
- data/rubberband.gemspec +83 -0
- data/test/elasticsearch_test.rb +1 -1
- data/test/hits_test.rb +72 -5
- data/vendor/elasticsearch/elasticsearch.thrift +81 -0
- metadata +15 -14
- data/.gitignore +0 -2
@@ -0,0 +1,101 @@
|
|
1
|
+
begin
|
2
|
+
require 'thrift'
|
3
|
+
rescue LoadError => error
|
4
|
+
raise "Please install the thrift gem (>= 0.5.0) to use the Thrift transport."
|
5
|
+
end
|
6
|
+
|
7
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "thrift"))
|
8
|
+
require 'rest'
|
9
|
+
|
10
|
+
module ElasticSearch
|
11
|
+
module Transport
|
12
|
+
class Thrift < Base
|
13
|
+
|
14
|
+
DEFAULTS = {
|
15
|
+
:timeout => 5,
|
16
|
+
:thrift_protocol => ::Thrift::BinaryProtocol,
|
17
|
+
:thrift_protocol_extra_params => [],
|
18
|
+
:thrift_transport => ::Thrift::Socket,
|
19
|
+
:thrift_transport_wrapper => ::Thrift::BufferedTransport,
|
20
|
+
:client_class => ElasticSearch::Thrift::Rest::Client
|
21
|
+
}.freeze
|
22
|
+
|
23
|
+
def initialize(server, options={})
|
24
|
+
super
|
25
|
+
@options = DEFAULTS.merge(@options)
|
26
|
+
end
|
27
|
+
|
28
|
+
def connect!
|
29
|
+
host, port = parse_server(@server)
|
30
|
+
|
31
|
+
@transport = @options[:thrift_transport].new(host, port.to_i, @options[:timeout])
|
32
|
+
@transport = @transport_wrapper.new(@transport) if @transport_wrapper
|
33
|
+
@transport.open
|
34
|
+
|
35
|
+
@client = @options[:client_class].new(@options[:thrift_protocol].new(@transport, *@options[:thrift_protocol_extra_params]))
|
36
|
+
rescue ::Thrift::TransportException, Errno::ECONNREFUSED
|
37
|
+
close
|
38
|
+
raise ConnectionFailed
|
39
|
+
end
|
40
|
+
|
41
|
+
def close
|
42
|
+
@transport.close rescue nil
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def parse_server(server)
|
48
|
+
host, port = server.to_s.split(":")
|
49
|
+
raise ArgumentError, 'Servers must be in the form "host:port"' unless host and port
|
50
|
+
[host, port]
|
51
|
+
end
|
52
|
+
|
53
|
+
def stringify!(hash)
|
54
|
+
hash.keys.each do |k|
|
55
|
+
hash[k.to_s] = hash.delete(k).to_s
|
56
|
+
end
|
57
|
+
hash
|
58
|
+
end
|
59
|
+
|
60
|
+
def request(method, operation, params={}, body=nil, headers={})
|
61
|
+
begin
|
62
|
+
uri = generate_uri(operation)
|
63
|
+
#puts "request: #{@server} #{method} #{uri} #{params.inspect} #{body}"
|
64
|
+
request = ElasticSearch::Thrift::RestRequest.new
|
65
|
+
case method
|
66
|
+
when :get
|
67
|
+
request.method = ElasticSearch::Thrift::Method::GET
|
68
|
+
when :put
|
69
|
+
request.method = ElasticSearch::Thrift::Method::GET
|
70
|
+
when :post
|
71
|
+
request.method = ElasticSearch::Thrift::Method::POST
|
72
|
+
when :delete
|
73
|
+
request.method = ElasticSearch::Thrift::Method::DELETE
|
74
|
+
end
|
75
|
+
|
76
|
+
request.uri = uri
|
77
|
+
request.parameters = stringify!(params)
|
78
|
+
request.body = body
|
79
|
+
request.headers = stringify!(headers)
|
80
|
+
response = @client.execute(request)
|
81
|
+
handle_error(response) if response.status >= 500
|
82
|
+
response
|
83
|
+
rescue Exception => e
|
84
|
+
case e
|
85
|
+
when ::Thrift::TransportException
|
86
|
+
case e.type
|
87
|
+
when ::Thrift::TransportException::TIMED_OUT
|
88
|
+
raise TimeoutError
|
89
|
+
else
|
90
|
+
raise ConnectionFailed
|
91
|
+
end
|
92
|
+
#TODO Thrift::ApplicationException, Thrift::ProtocolException, IOError.. retryable or fatal?
|
93
|
+
else
|
94
|
+
raise e
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
#
|
2
|
+
# Autogenerated by Thrift
|
3
|
+
#
|
4
|
+
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
|
5
|
+
#
|
6
|
+
|
7
|
+
|
8
|
+
module ElasticSearch
|
9
|
+
module Thrift
|
10
|
+
module Method
|
11
|
+
GET = 0
|
12
|
+
PUT = 1
|
13
|
+
POST = 2
|
14
|
+
DELETE = 3
|
15
|
+
HEAD = 4
|
16
|
+
OPTIONS = 5
|
17
|
+
VALUE_MAP = {0 => "GET", 1 => "PUT", 2 => "POST", 3 => "DELETE", 4 => "HEAD", 5 => "OPTIONS"}
|
18
|
+
VALID_VALUES = Set.new([GET, PUT, POST, DELETE, HEAD, OPTIONS]).freeze
|
19
|
+
end
|
20
|
+
|
21
|
+
module Status
|
22
|
+
CONT = 100
|
23
|
+
SWITCHING_PROTOCOLS = 101
|
24
|
+
OK = 200
|
25
|
+
CREATED = 201
|
26
|
+
ACCEPTED = 202
|
27
|
+
NON_AUTHORITATIVE_INFORMATION = 203
|
28
|
+
NO_CONTENT = 204
|
29
|
+
RESET_CONTENT = 205
|
30
|
+
PARTIAL_CONTENT = 206
|
31
|
+
MULTI_STATUS = 207
|
32
|
+
MULTIPLE_CHOICES = 300
|
33
|
+
MOVED_PERMANENTLY = 301
|
34
|
+
FOUND = 302
|
35
|
+
SEE_OTHER = 303
|
36
|
+
NOT_MODIFIED = 304
|
37
|
+
USE_PROXY = 305
|
38
|
+
TEMPORARY_REDIRECT = 307
|
39
|
+
BAD_REQUEST = 400
|
40
|
+
UNAUTHORIZED = 401
|
41
|
+
PAYMENT_REQUIRED = 402
|
42
|
+
FORBIDDEN = 403
|
43
|
+
NOT_FOUND = 404
|
44
|
+
METHOD_NOT_ALLOWED = 405
|
45
|
+
NOT_ACCEPTABLE = 406
|
46
|
+
PROXY_AUTHENTICATION = 407
|
47
|
+
REQUEST_TIMEOUT = 408
|
48
|
+
CONFLICT = 409
|
49
|
+
GONE = 410
|
50
|
+
LENGTH_REQUIRED = 411
|
51
|
+
PRECONDITION_FAILED = 412
|
52
|
+
REQUEST_ENTITY_TOO_LARGE = 413
|
53
|
+
REQUEST_URI_TOO_LONG = 414
|
54
|
+
UNSUPPORTED_MEDIA_TYPE = 415
|
55
|
+
REQUESTED_RANGE_NOT_SATISFIED = 416
|
56
|
+
EXPECTATION_FAILED = 417
|
57
|
+
UNPROCESSABLE_ENTITY = 422
|
58
|
+
LOCKED = 423
|
59
|
+
FAILED_DEPENDENCY = 424
|
60
|
+
INTERNAL_SERVER_ERROR = 500
|
61
|
+
NOT_IMPLEMENTED = 501
|
62
|
+
BAD_GATEWAY = 502
|
63
|
+
SERVICE_UNAVAILABLE = 503
|
64
|
+
GATEWAY_TIMEOUT = 504
|
65
|
+
INSUFFICIENT_STORAGE = 506
|
66
|
+
VALUE_MAP = {100 => "CONT", 101 => "SWITCHING_PROTOCOLS", 200 => "OK", 201 => "CREATED", 202 => "ACCEPTED", 203 => "NON_AUTHORITATIVE_INFORMATION", 204 => "NO_CONTENT", 205 => "RESET_CONTENT", 206 => "PARTIAL_CONTENT", 207 => "MULTI_STATUS", 300 => "MULTIPLE_CHOICES", 301 => "MOVED_PERMANENTLY", 302 => "FOUND", 303 => "SEE_OTHER", 304 => "NOT_MODIFIED", 305 => "USE_PROXY", 307 => "TEMPORARY_REDIRECT", 400 => "BAD_REQUEST", 401 => "UNAUTHORIZED", 402 => "PAYMENT_REQUIRED", 403 => "FORBIDDEN", 404 => "NOT_FOUND", 405 => "METHOD_NOT_ALLOWED", 406 => "NOT_ACCEPTABLE", 407 => "PROXY_AUTHENTICATION", 408 => "REQUEST_TIMEOUT", 409 => "CONFLICT", 410 => "GONE", 411 => "LENGTH_REQUIRED", 412 => "PRECONDITION_FAILED", 413 => "REQUEST_ENTITY_TOO_LARGE", 414 => "REQUEST_URI_TOO_LONG", 415 => "UNSUPPORTED_MEDIA_TYPE", 416 => "REQUESTED_RANGE_NOT_SATISFIED", 417 => "EXPECTATION_FAILED", 422 => "UNPROCESSABLE_ENTITY", 423 => "LOCKED", 424 => "FAILED_DEPENDENCY", 500 => "INTERNAL_SERVER_ERROR", 501 => "NOT_IMPLEMENTED", 502 => "BAD_GATEWAY", 503 => "SERVICE_UNAVAILABLE", 504 => "GATEWAY_TIMEOUT", 506 => "INSUFFICIENT_STORAGE"}
|
67
|
+
VALID_VALUES = Set.new([CONT, SWITCHING_PROTOCOLS, OK, CREATED, ACCEPTED, NON_AUTHORITATIVE_INFORMATION, NO_CONTENT, RESET_CONTENT, PARTIAL_CONTENT, MULTI_STATUS, MULTIPLE_CHOICES, MOVED_PERMANENTLY, FOUND, SEE_OTHER, NOT_MODIFIED, USE_PROXY, TEMPORARY_REDIRECT, BAD_REQUEST, UNAUTHORIZED, PAYMENT_REQUIRED, FORBIDDEN, NOT_FOUND, METHOD_NOT_ALLOWED, NOT_ACCEPTABLE, PROXY_AUTHENTICATION, REQUEST_TIMEOUT, CONFLICT, GONE, LENGTH_REQUIRED, PRECONDITION_FAILED, REQUEST_ENTITY_TOO_LARGE, REQUEST_URI_TOO_LONG, UNSUPPORTED_MEDIA_TYPE, REQUESTED_RANGE_NOT_SATISFIED, EXPECTATION_FAILED, UNPROCESSABLE_ENTITY, LOCKED, FAILED_DEPENDENCY, INTERNAL_SERVER_ERROR, NOT_IMPLEMENTED, BAD_GATEWAY, SERVICE_UNAVAILABLE, GATEWAY_TIMEOUT, INSUFFICIENT_STORAGE]).freeze
|
68
|
+
end
|
69
|
+
|
70
|
+
class RestRequest
|
71
|
+
include ::Thrift::Struct, ::Thrift::Struct_Union
|
72
|
+
METHOD = 1
|
73
|
+
URI = 2
|
74
|
+
PARAMETERS = 3
|
75
|
+
HEADERS = 4
|
76
|
+
BODY = 5
|
77
|
+
|
78
|
+
FIELDS = {
|
79
|
+
METHOD => {:type => ::Thrift::Types::I32, :name => 'method', :enum_class => ElasticSearch::Thrift::Method},
|
80
|
+
URI => {:type => ::Thrift::Types::STRING, :name => 'uri'},
|
81
|
+
PARAMETERS => {:type => ::Thrift::Types::MAP, :name => 'parameters', :key => {:type => ::Thrift::Types::STRING}, :value => {:type => ::Thrift::Types::STRING}, :optional => true},
|
82
|
+
HEADERS => {:type => ::Thrift::Types::MAP, :name => 'headers', :key => {:type => ::Thrift::Types::STRING}, :value => {:type => ::Thrift::Types::STRING}, :optional => true},
|
83
|
+
BODY => {:type => ::Thrift::Types::STRING, :name => 'body', :binary => true, :optional => true}
|
84
|
+
}
|
85
|
+
|
86
|
+
def struct_fields; FIELDS; end
|
87
|
+
|
88
|
+
def validate
|
89
|
+
raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field method is unset!') unless @method
|
90
|
+
raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field uri is unset!') unless @uri
|
91
|
+
unless @method.nil? || ElasticSearch::Thrift::Method::VALID_VALUES.include?(@method)
|
92
|
+
raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Invalid value of field method!')
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
::Thrift::Struct.generate_accessors self
|
97
|
+
end
|
98
|
+
|
99
|
+
class RestResponse
|
100
|
+
include ::Thrift::Struct, ::Thrift::Struct_Union
|
101
|
+
STATUS = 1
|
102
|
+
HEADERS = 2
|
103
|
+
BODY = 3
|
104
|
+
|
105
|
+
FIELDS = {
|
106
|
+
STATUS => {:type => ::Thrift::Types::I32, :name => 'status', :enum_class => ElasticSearch::Thrift::Status},
|
107
|
+
HEADERS => {:type => ::Thrift::Types::MAP, :name => 'headers', :key => {:type => ::Thrift::Types::STRING}, :value => {:type => ::Thrift::Types::STRING}, :optional => true},
|
108
|
+
BODY => {:type => ::Thrift::Types::STRING, :name => 'body', :binary => true, :optional => true}
|
109
|
+
}
|
110
|
+
|
111
|
+
def struct_fields; FIELDS; end
|
112
|
+
|
113
|
+
def validate
|
114
|
+
raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field status is unset!') unless @status
|
115
|
+
unless @status.nil? || ElasticSearch::Thrift::Status::VALID_VALUES.include?(@status)
|
116
|
+
raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Invalid value of field status!')
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
::Thrift::Struct.generate_accessors self
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
#
|
2
|
+
# Autogenerated by Thrift
|
3
|
+
#
|
4
|
+
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
|
5
|
+
#
|
6
|
+
|
7
|
+
require 'thrift'
|
8
|
+
require 'elasticsearch_types'
|
9
|
+
|
10
|
+
module ElasticSearch
|
11
|
+
module Thrift
|
12
|
+
module Rest
|
13
|
+
class Client
|
14
|
+
include ::Thrift::Client
|
15
|
+
|
16
|
+
def execute(request)
|
17
|
+
send_execute(request)
|
18
|
+
return recv_execute()
|
19
|
+
end
|
20
|
+
|
21
|
+
def send_execute(request)
|
22
|
+
send_message('execute', Execute_args, :request => request)
|
23
|
+
end
|
24
|
+
|
25
|
+
def recv_execute()
|
26
|
+
result = receive_message(Execute_result)
|
27
|
+
return result.success unless result.success.nil?
|
28
|
+
raise ::Thrift::ApplicationException.new(::Thrift::ApplicationException::MISSING_RESULT, 'execute failed: unknown result')
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
class Processor
|
34
|
+
include ::Thrift::Processor
|
35
|
+
|
36
|
+
def process_execute(seqid, iprot, oprot)
|
37
|
+
args = read_args(iprot, Execute_args)
|
38
|
+
result = Execute_result.new()
|
39
|
+
result.success = @handler.execute(args.request)
|
40
|
+
write_result(result, oprot, 'execute', seqid)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
# HELPER FUNCTIONS AND STRUCTURES
|
46
|
+
|
47
|
+
class Execute_args
|
48
|
+
include ::Thrift::Struct, ::Thrift::Struct_Union
|
49
|
+
REQUEST = 1
|
50
|
+
|
51
|
+
FIELDS = {
|
52
|
+
REQUEST => {:type => ::Thrift::Types::STRUCT, :name => 'request', :class => ElasticSearch::Thrift::RestRequest}
|
53
|
+
}
|
54
|
+
|
55
|
+
def struct_fields; FIELDS; end
|
56
|
+
|
57
|
+
def validate
|
58
|
+
raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field request is unset!') unless @request
|
59
|
+
end
|
60
|
+
|
61
|
+
::Thrift::Struct.generate_accessors self
|
62
|
+
end
|
63
|
+
|
64
|
+
class Execute_result
|
65
|
+
include ::Thrift::Struct, ::Thrift::Struct_Union
|
66
|
+
SUCCESS = 0
|
67
|
+
|
68
|
+
FIELDS = {
|
69
|
+
SUCCESS => {:type => ::Thrift::Types::STRUCT, :name => 'success', :class => ElasticSearch::Thrift::RestResponse}
|
70
|
+
}
|
71
|
+
|
72
|
+
def struct_fields; FIELDS; end
|
73
|
+
|
74
|
+
def validate
|
75
|
+
end
|
76
|
+
|
77
|
+
::Thrift::Struct.generate_accessors self
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
data/lib/rubberband.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'elasticsearch'
|
data/rubberband.gemspec
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{rubberband}
|
8
|
+
s.version = "0.0.4"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["grantr"]
|
12
|
+
s.date = %q{2010-12-06}
|
13
|
+
s.description = %q{An ElasticSearch Client with ThriftClient-like failover handling.}
|
14
|
+
s.email = %q{grantr@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc",
|
18
|
+
"TODO"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
"LICENSE",
|
22
|
+
"README.rdoc",
|
23
|
+
"Rakefile",
|
24
|
+
"TODO",
|
25
|
+
"VERSION",
|
26
|
+
"lib/elasticsearch.rb",
|
27
|
+
"lib/elasticsearch/client.rb",
|
28
|
+
"lib/elasticsearch/client/abstract_client.rb",
|
29
|
+
"lib/elasticsearch/client/admin_cluster.rb",
|
30
|
+
"lib/elasticsearch/client/admin_index.rb",
|
31
|
+
"lib/elasticsearch/client/auto_discovering_client.rb",
|
32
|
+
"lib/elasticsearch/client/default_scope.rb",
|
33
|
+
"lib/elasticsearch/client/hits.rb",
|
34
|
+
"lib/elasticsearch/client/index.rb",
|
35
|
+
"lib/elasticsearch/client/retrying_client.rb",
|
36
|
+
"lib/elasticsearch/encoding.rb",
|
37
|
+
"lib/elasticsearch/encoding/base.rb",
|
38
|
+
"lib/elasticsearch/encoding/json.rb",
|
39
|
+
"lib/elasticsearch/transport.rb",
|
40
|
+
"lib/elasticsearch/transport/base.rb",
|
41
|
+
"lib/elasticsearch/transport/base_protocol.rb",
|
42
|
+
"lib/elasticsearch/transport/http.rb",
|
43
|
+
"lib/elasticsearch/transport/thrift.rb",
|
44
|
+
"lib/elasticsearch/transport/thrift/elasticsearch_constants.rb",
|
45
|
+
"lib/elasticsearch/transport/thrift/elasticsearch_types.rb",
|
46
|
+
"lib/elasticsearch/transport/thrift/rest.rb",
|
47
|
+
"lib/rubberband.rb",
|
48
|
+
"rubberband.gemspec",
|
49
|
+
"test/elasticsearch_test.rb",
|
50
|
+
"test/hits_test.rb",
|
51
|
+
"test/test_helper.rb",
|
52
|
+
"vendor/elasticsearch/elasticsearch.thrift"
|
53
|
+
]
|
54
|
+
s.homepage = %q{http://github.com/grantr/rubberband}
|
55
|
+
s.require_paths = ["lib"]
|
56
|
+
s.rubygems_version = %q{1.3.7}
|
57
|
+
s.summary = %q{An ElasticSearch client.}
|
58
|
+
s.test_files = [
|
59
|
+
"test/elasticsearch_test.rb",
|
60
|
+
"test/hits_test.rb",
|
61
|
+
"test/test_helper.rb"
|
62
|
+
]
|
63
|
+
|
64
|
+
if s.respond_to? :specification_version then
|
65
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
66
|
+
s.specification_version = 3
|
67
|
+
|
68
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
69
|
+
s.add_runtime_dependency(%q<patron>, [">= 0"])
|
70
|
+
s.add_runtime_dependency(%q<yajl-ruby>, [">= 0"])
|
71
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
72
|
+
else
|
73
|
+
s.add_dependency(%q<patron>, [">= 0"])
|
74
|
+
s.add_dependency(%q<yajl-ruby>, [">= 0"])
|
75
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
76
|
+
end
|
77
|
+
else
|
78
|
+
s.add_dependency(%q<patron>, [">= 0"])
|
79
|
+
s.add_dependency(%q<yajl-ruby>, [">= 0"])
|
80
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
data/test/elasticsearch_test.rb
CHANGED
@@ -2,6 +2,6 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class ElasticSearchTest < Test::Unit::TestCase
|
4
4
|
should "probably rename this file and start testing for real" do
|
5
|
-
flunk "hey buddy, you should probably rename this file and start testing for real"
|
5
|
+
#flunk "hey buddy, you should probably rename this file and start testing for real"
|
6
6
|
end
|
7
7
|
end
|
data/test/hits_test.rb
CHANGED
@@ -19,16 +19,83 @@ class HitsTest < Test::Unit::TestCase
|
|
19
19
|
assert @hit.attributes.frozen?
|
20
20
|
end
|
21
21
|
|
22
|
-
|
23
22
|
end
|
24
23
|
|
25
24
|
context "A Hits instance" do
|
26
25
|
setup do
|
27
|
-
@
|
28
|
-
|
29
|
-
|
26
|
+
@response = {
|
27
|
+
"_shards"=>{"total"=>30, "successful"=>30, "failed"=>0},
|
28
|
+
"hits"=>{"total"=>2, "max_score"=>1.0, "hits"=>[
|
29
|
+
{"_index"=>"test_index", "_type"=>"test_type", "_id"=>"1", "_score"=>1.0, "_source"=>{"foo" => "bar"}},
|
30
|
+
{"_index"=>"test_index", "_type"=>"test_type", "_id"=>"2", "_score"=>1.0, "_source"=>{"foo" => "baz"}}
|
31
|
+
]}}
|
32
|
+
@hits = ElasticSearch::Api::Hits.new(@response)
|
33
|
+
end
|
34
|
+
|
35
|
+
should "set response" do
|
36
|
+
assert_equal @response, @hits.response
|
37
|
+
end
|
38
|
+
|
39
|
+
should "set total_entries" do
|
40
|
+
assert_equal @response["hits"]["hits"].size, @hits.total_entries
|
41
|
+
end
|
42
|
+
|
43
|
+
should "instantiate hits in order" do
|
44
|
+
@response["hits"]["hits"].each_with_index do |hit, i|
|
45
|
+
assert_equal ElasticSearch::Api::Hit.new(hit), @hits.hits[i]
|
46
|
+
end
|
30
47
|
end
|
31
48
|
|
32
|
-
should "
|
49
|
+
should "freeze hits" do
|
50
|
+
assert @hits.hits.all? { |h| h.frozen? }
|
51
|
+
end
|
52
|
+
|
53
|
+
should "freeze hits array when frozen" do
|
54
|
+
@hits.freeze
|
55
|
+
assert @hits.hits.frozen?
|
56
|
+
end
|
57
|
+
|
58
|
+
should "respond to to_a" do
|
59
|
+
assert_equal @hits.hits, @hits.to_a
|
60
|
+
end
|
61
|
+
|
62
|
+
should "respond to array methods" do
|
63
|
+
assert @hits.respond_to?(:collect)
|
64
|
+
assert_equal @response["hits"]["hits"].collect { |h| h["_id"] }, @hits.collect { |h| h.id }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context "a paginated hits instance" do
|
69
|
+
setup do
|
70
|
+
@response = {
|
71
|
+
"_shards"=>{"total"=>30, "successful"=>30, "failed"=>0},
|
72
|
+
"hits"=>{"total"=>6, "max_score"=>1.0, "hits"=>[
|
73
|
+
{"_index"=>"test_index", "_type"=>"test_type", "_id"=>"3", "_score"=>1.0, "_source"=>{"foo" => "bar"}},
|
74
|
+
{"_index"=>"test_index", "_type"=>"test_type", "_id"=>"4", "_score"=>1.0, "_source"=>{"foo" => "baz"}}
|
75
|
+
]}}
|
76
|
+
@per_page = 2
|
77
|
+
@page = 2
|
78
|
+
@hits = ElasticSearch::Api::Hits.new(@response, {:page => @page, :per_page => @per_page})
|
79
|
+
end
|
80
|
+
|
81
|
+
should "respond to total_pages" do
|
82
|
+
assert_equal (@response["hits"]["total"] / @per_page.to_f).ceil, @hits.total_pages
|
83
|
+
end
|
84
|
+
|
85
|
+
should "respond to next_page" do
|
86
|
+
assert_equal @page + 1, @hits.next_page
|
87
|
+
end
|
88
|
+
|
89
|
+
should "respond to previous_page" do
|
90
|
+
assert_equal @page - 1, @hits.previous_page
|
91
|
+
end
|
92
|
+
|
93
|
+
should "respond to current_page" do
|
94
|
+
assert_equal @page, @hits.current_page
|
95
|
+
end
|
96
|
+
|
97
|
+
should "respond to per page" do
|
98
|
+
assert_equal @per_page, @hits.per_page
|
99
|
+
end
|
33
100
|
end
|
34
101
|
end
|