inquisitio 0.0.1 → 0.0.11
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.
- checksums.yaml +13 -5
- data/.gitignore +1 -0
- data/CHANGELOG.md +41 -0
- data/Gemfile +2 -0
- data/Rakefile +11 -0
- data/bin/boolean_query +24 -0
- data/bin/facet_query +31 -0
- data/bin/index +29 -0
- data/bin/search +26 -0
- data/inquisitio.gemspec +5 -0
- data/lib/inquisitio/configuration.rb +34 -0
- data/lib/inquisitio/document.rb +24 -0
- data/lib/inquisitio/indexer.rb +36 -0
- data/lib/inquisitio/inquisitio_error.rb +7 -0
- data/lib/inquisitio/logger.rb +19 -0
- data/lib/inquisitio/search_url_builder.rb +59 -0
- data/lib/inquisitio/searcher.rb +49 -0
- data/lib/inquisitio/version.rb +1 -1
- data/lib/inquisitio.rb +46 -1
- data/test/configuration_test.rb +59 -0
- data/test/document_test.rb +48 -0
- data/test/indexer_test.rb +74 -0
- data/test/logger_test.rb +35 -0
- data/test/search_url_builder_test.rb +67 -0
- data/test/searcher_test.rb +90 -0
- data/test/test_helper.rb +24 -0
- metadata +94 -8
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZjA2YTc0ZDY2MWMwODRhODBlZGNjOWYzYzE3MzRkYjgwOGFiNjRkNg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MDBmN2I1ZjMwMzEwZDk4MGQ4ZjZkZjEzNGY2ODZlYWEwNjBmYmY4NA==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MzJkN2U4OGE0ZmY4YWVlMjUxYmE3YjBmY2M0MmMzYTg0NmY4YjNlOGMyNTk3
|
10
|
+
YzUxNmVhZGM5ODk5Yzk4MGVhNWZjODBlM2I4NDk4OGZkNGUwM2Q2ZTUwZDNi
|
11
|
+
YWE4M2JlNjRhMzhhMTEzMWZmMDljYWYwZGU1ZDY1YTVmY2M0MzE=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NWVlYWQzYWJlNmM3MmI5NGM3ZGViNTNhODA3MmU4NTU0ZDlmYzUwMTYxMzE4
|
14
|
+
M2M4NGQ5ZDYxNWVjZTA5MzE5MDlhYmQ3ODVkYTM3M2EzZDNhN2Y2OWNkZjBh
|
15
|
+
Y2VmYjczNzhjMjg1YjBlMmVjMjhhMWU3OGU5ZDUwZTIzOTFjYzQ=
|
data/.gitignore
CHANGED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
0.0.11 / Unreleased
|
2
|
+
|
3
|
+
[FEATURE] Searcher now has default size read from configuration.
|
4
|
+
[FEATURE] Searcher now performs simple sanatization of search queries.
|
5
|
+
|
6
|
+
0.0.9 / Unreleased
|
7
|
+
|
8
|
+
[FEATURE] Searcher now has id, records and results.
|
9
|
+
[FEATURE] Refactor SearchUrlBuilder out of Searcher.
|
10
|
+
|
11
|
+
0.0.8 / 2013-10-23
|
12
|
+
|
13
|
+
[FEATURE] Extended searcher to handle arguments (for example, facet arguments).
|
14
|
+
|
15
|
+
0.0.7 / 2013-10-23
|
16
|
+
|
17
|
+
[FEATURE] Extended searcher to handle boolean queries.
|
18
|
+
|
19
|
+
0.0.6 / 2013-10-23
|
20
|
+
|
21
|
+
[FEATURE] Changed version of excon
|
22
|
+
|
23
|
+
0.0.5 / 2013-10-22
|
24
|
+
|
25
|
+
[FEATURE] Initial indexer created.
|
26
|
+
|
27
|
+
0.0.4 / 2013-10-22
|
28
|
+
|
29
|
+
[FEATURE] Return_fields is now optional in search call.
|
30
|
+
|
31
|
+
0.0.3 / 2013-10-21
|
32
|
+
|
33
|
+
[FEATURE] Added ability to perform search using Searcher class.
|
34
|
+
|
35
|
+
0.0.2 / 2013-10-21
|
36
|
+
|
37
|
+
[FEATURE] Added Document class representing AWS SDF document.
|
38
|
+
|
39
|
+
0.0.1 / 2013-10-21
|
40
|
+
|
41
|
+
[FEATURE] Added configuration, logger and error classes.
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
data/bin/boolean_query
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
lib = File.expand_path('../../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
require "inquisitio"
|
7
|
+
|
8
|
+
# Perform a search containing a boolean query against AWS CloudSearch
|
9
|
+
#
|
10
|
+
# example usage:
|
11
|
+
#
|
12
|
+
# ruby ./bin/search <enddpoint> "Star Wars" "genre" "Animation" "title"
|
13
|
+
|
14
|
+
endpoint = ARGV[0]
|
15
|
+
query = ARGV[1]
|
16
|
+
filter_name = ARGV[2]
|
17
|
+
filter_value = ARGV[3]
|
18
|
+
return_fields = [ ARGV[4] ]
|
19
|
+
|
20
|
+
Inquisitio.config do |config|
|
21
|
+
config.search_endpoint = endpoint
|
22
|
+
end
|
23
|
+
|
24
|
+
puts Inquisitio.search(query, { filter_name.to_sym => filter_value.to_sym, :return_fields => return_fields} )
|
data/bin/facet_query
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
lib = File.expand_path('../../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
require "inquisitio"
|
7
|
+
|
8
|
+
# Perform a search containing a boolean query against AWS CloudSearch
|
9
|
+
#
|
10
|
+
# example usage:
|
11
|
+
#
|
12
|
+
# ruby ./bin/search <enddpoint> "Star Wars" "genre" "Animation" "title"
|
13
|
+
|
14
|
+
endpoint = ARGV[0]
|
15
|
+
query = ARGV[1]
|
16
|
+
filter_name = ARGV[2]
|
17
|
+
filter_value = ARGV[3]
|
18
|
+
return_fields = [ ARGV[4] ]
|
19
|
+
|
20
|
+
Inquisitio.config do |config|
|
21
|
+
config.search_endpoint = endpoint
|
22
|
+
end
|
23
|
+
|
24
|
+
puts Inquisitio.search(query,
|
25
|
+
{ filter_name.to_sym => filter_value.to_sym,
|
26
|
+
:arguments => { :facet => 'genre',
|
27
|
+
'facet-genre-constraints' => 'Animation',
|
28
|
+
'facet-genre-top-n' => '5'
|
29
|
+
},
|
30
|
+
:return_fields => return_fields
|
31
|
+
} )
|
data/bin/index
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
lib = File.expand_path('../../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
require "inquisitio"
|
7
|
+
|
8
|
+
# Index a spdf file in AWS CloudSearch
|
9
|
+
#
|
10
|
+
# example usage:
|
11
|
+
#
|
12
|
+
# ruby ./bin/index <document_endpoint> "id" "version" "field_name" "field_value"
|
13
|
+
|
14
|
+
endpoint = ARGV[0]
|
15
|
+
id = ARGV[1]
|
16
|
+
|
17
|
+
version = Time.now.to_i
|
18
|
+
|
19
|
+
Inquisitio.config do |config|
|
20
|
+
config.document_endpoint = endpoint
|
21
|
+
end
|
22
|
+
|
23
|
+
fields = { :title => 'The Title',
|
24
|
+
:author => 'The Author' }
|
25
|
+
document = Inquisitio::Document.new("add",
|
26
|
+
id,
|
27
|
+
version,
|
28
|
+
fields)
|
29
|
+
Inquisitio.index(document)
|
data/bin/search
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
lib = File.expand_path('../../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
require "inquisitio"
|
7
|
+
|
8
|
+
# Perform a search against AWS CloudSearch
|
9
|
+
#
|
10
|
+
# example usage:
|
11
|
+
#
|
12
|
+
# ruby ./bin/search <enddpoint> "Star Wars" "title"
|
13
|
+
|
14
|
+
endpoint = ARGV[0]
|
15
|
+
query = ARGV[1]
|
16
|
+
return_fields = [ ARGV[2] ]
|
17
|
+
|
18
|
+
Inquisitio.config do |config|
|
19
|
+
config.search_endpoint = endpoint
|
20
|
+
end
|
21
|
+
|
22
|
+
if return_fields.nil?
|
23
|
+
puts Inquisitio.search(query)
|
24
|
+
else
|
25
|
+
puts Inquisitio.search(query, { "return_fields" => return_fields} )
|
26
|
+
end
|
data/inquisitio.gemspec
CHANGED
@@ -18,6 +18,11 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
+
spec.add_dependency "excon", "~> 0.25.0"
|
22
|
+
|
21
23
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
24
|
spec.add_development_dependency "rake"
|
25
|
+
spec.add_development_dependency "mocha"
|
26
|
+
spec.add_development_dependency "yard"
|
27
|
+
spec.add_development_dependency "minitest", "~> 5.0.8"
|
23
28
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Inquisitio
|
2
|
+
|
3
|
+
class InquisitioConfigurationError < InquisitioError
|
4
|
+
end
|
5
|
+
|
6
|
+
class Configuration
|
7
|
+
|
8
|
+
SETTINGS = [
|
9
|
+
:search_endpoint,
|
10
|
+
:document_endpoint,
|
11
|
+
:default_search_size,
|
12
|
+
:logger
|
13
|
+
]
|
14
|
+
attr_writer *SETTINGS
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
self.logger = Inquisitio::Logger.new
|
18
|
+
end
|
19
|
+
|
20
|
+
SETTINGS.each do |setting|
|
21
|
+
define_method setting do
|
22
|
+
get_or_raise(setting)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def get_or_raise(setting)
|
29
|
+
instance_variable_get("@#{setting.to_s}") ||
|
30
|
+
raise(InquisitioConfigurationError.new("Configuration for #{setting} is not set"))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'json'
|
2
|
+
module Inquisitio
|
3
|
+
class Document
|
4
|
+
|
5
|
+
attr_reader :type, :id, :version, :fields
|
6
|
+
def initialize(type, id, version, fields)
|
7
|
+
@type = type
|
8
|
+
@id = id
|
9
|
+
@version = version
|
10
|
+
@fields = fields
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_SDF
|
14
|
+
<<-EOS
|
15
|
+
{ "type": "#{type}",
|
16
|
+
"id": "#{id}",
|
17
|
+
"version": #{version},
|
18
|
+
"lang": "en",
|
19
|
+
"fields": #{fields.to_json}
|
20
|
+
}
|
21
|
+
EOS
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'excon'
|
2
|
+
|
3
|
+
module Inquisitio
|
4
|
+
class Indexer
|
5
|
+
|
6
|
+
def self.index(documents)
|
7
|
+
new(documents).index
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(documents)
|
11
|
+
raise InquisitioError.new("Document(s) is null") if documents.nil?
|
12
|
+
raise InquisitioError.new("Document(s) is empty") unless documents.any?
|
13
|
+
|
14
|
+
@documents = documents
|
15
|
+
end
|
16
|
+
|
17
|
+
def index
|
18
|
+
response = Excon.post(batch_index_url,
|
19
|
+
:body => body,
|
20
|
+
:headers => {"Content-Type" =>"application/json"})
|
21
|
+
raise InquisitioError.new("Index failed with status code: #{response.status} Message: #{response.body}") unless response.status == 200
|
22
|
+
response.body
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def body
|
28
|
+
body = @documents.map(&:to_SDF).join(", ")
|
29
|
+
"[#{body}]"
|
30
|
+
end
|
31
|
+
|
32
|
+
def batch_index_url
|
33
|
+
"#{Inquisitio.config.document_endpoint}/2011-02-01/documents/batch"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Inquisitio
|
2
|
+
class Logger
|
3
|
+
|
4
|
+
StdLevels = %W{debug info warn}
|
5
|
+
ErrorLevels = %W{error fatal}
|
6
|
+
|
7
|
+
StdLevels.each do |level|
|
8
|
+
define_method level do |*args|
|
9
|
+
$stdout.puts *args
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
ErrorLevels.each do |level|
|
14
|
+
define_method level do |*args|
|
15
|
+
$stderr.puts *args
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Inquisitio
|
2
|
+
class SearchUrlBuilder
|
3
|
+
|
4
|
+
def self.build(*args)
|
5
|
+
new(*args).build
|
6
|
+
end
|
7
|
+
|
8
|
+
def initialize(options = {})
|
9
|
+
@query = options[:query]
|
10
|
+
@filters = options[:filters] || {}
|
11
|
+
@arguments = options[:arguments]
|
12
|
+
@return_fields = options[:return_fields]
|
13
|
+
add_default_size if @arguments.nil? || @arguments[:size].nil?
|
14
|
+
end
|
15
|
+
|
16
|
+
def build
|
17
|
+
components = [url_root]
|
18
|
+
components << (@filters.empty?? simple_query : boolean_query)
|
19
|
+
components << return_fields_query_string
|
20
|
+
components << arguments
|
21
|
+
components.join("")
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def simple_query
|
26
|
+
"q=#{URI.encode(@query.gsub('\'',''))}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def boolean_query
|
30
|
+
filters = @filters.map{|key,value| "#{key.to_s.gsub('\'','')}:'#{value.to_s.gsub('\'','')}'"}
|
31
|
+
queries = filters.join(" ")
|
32
|
+
queries = "'#{@query.gsub('\'','')}' #{queries}" if @query
|
33
|
+
"bq=#{URI.encode("(and #{queries})")}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def return_fields_query_string
|
37
|
+
return "" if @return_fields.nil?
|
38
|
+
"&return-fields=#{URI::encode(@return_fields.join(',').gsub('\'',''))}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def arguments
|
42
|
+
return "" if @arguments.nil?
|
43
|
+
@arguments.map{|key,value| "&#{key.to_s.gsub('\'','')}=#{value.to_s.gsub('\'','')}"}.join("")
|
44
|
+
end
|
45
|
+
|
46
|
+
def url_root
|
47
|
+
"#{Inquisitio.config.search_endpoint}/2011-02-01/search?"
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_default_size
|
51
|
+
if @arguments.nil?
|
52
|
+
@arguments = {}
|
53
|
+
end
|
54
|
+
if @arguments[:size].nil?
|
55
|
+
@arguments = @arguments.merge(:size => Inquisitio.config.default_search_size)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'excon'
|
2
|
+
|
3
|
+
module Inquisitio
|
4
|
+
class Searcher
|
5
|
+
|
6
|
+
def self.search(*args)
|
7
|
+
searcher = new(*args)
|
8
|
+
searcher.search
|
9
|
+
searcher
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_reader :results
|
13
|
+
def initialize(query, filters = {})
|
14
|
+
raise InquisitioError.new("Query is null") if query.nil?
|
15
|
+
|
16
|
+
if query.is_a?(String)
|
17
|
+
@query = query
|
18
|
+
@filters = filters
|
19
|
+
else
|
20
|
+
@filters = query
|
21
|
+
end
|
22
|
+
|
23
|
+
@return_fields = @filters.delete(:return_fields)
|
24
|
+
@arguments = @filters.delete(:arguments)
|
25
|
+
end
|
26
|
+
|
27
|
+
def search
|
28
|
+
response = Excon.get(search_url)
|
29
|
+
raise InquisitioError.new("Search failed with status code: #{response.status} Message #{response.body}") unless response.status == 200
|
30
|
+
body = response.body
|
31
|
+
@results = JSON.parse(body)["hits"]["hit"]
|
32
|
+
end
|
33
|
+
|
34
|
+
def ids
|
35
|
+
@ids ||= @results.map{|result|result['id']}
|
36
|
+
end
|
37
|
+
|
38
|
+
def records
|
39
|
+
@records ||= @results.map do |result|
|
40
|
+
{result['type'] => result['id']}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
def search_url
|
46
|
+
@search_url ||= SearchUrlBuilder.build(query: @query, filters: @filters, arguments: @arguments, return_fields: @return_fields)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/inquisitio/version.rb
CHANGED
data/lib/inquisitio.rb
CHANGED
@@ -1,5 +1,50 @@
|
|
1
1
|
require "inquisitio/version"
|
2
|
+
require "inquisitio/inquisitio_error"
|
3
|
+
require "inquisitio/logger"
|
4
|
+
require "inquisitio/configuration"
|
5
|
+
require "inquisitio/document"
|
6
|
+
require "inquisitio/search_url_builder"
|
7
|
+
require "inquisitio/searcher"
|
8
|
+
require "inquisitio/indexer"
|
2
9
|
|
3
10
|
module Inquisitio
|
4
|
-
|
11
|
+
|
12
|
+
# Inquisitio configuration settings.
|
13
|
+
#
|
14
|
+
# Settings should be set in an initializer or using some
|
15
|
+
# other method that insures they are set before any
|
16
|
+
# Inquisitio code is used. They can be set as followed:
|
17
|
+
#
|
18
|
+
# Inquisitio.config.access_key = "my-access-key"
|
19
|
+
#
|
20
|
+
# The following settings are allowed:
|
21
|
+
#
|
22
|
+
# * <tt>:access_key</tt> - The AWS access key
|
23
|
+
# * <tt>:secret_key</tt> - The AWS secret key
|
24
|
+
# * <tt>:queue_region</tt> - The AWS region
|
25
|
+
# is included in.
|
26
|
+
# * <tt>:logger</tt> - A logger object that responds to puts.
|
27
|
+
def self.config
|
28
|
+
@config ||= Configuration.new
|
29
|
+
if block_given?
|
30
|
+
yield @config
|
31
|
+
else
|
32
|
+
@config
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Perform a search.
|
37
|
+
#
|
38
|
+
# @param [String] query The search query.
|
39
|
+
# @param [Hash] options. Optionaly specify return_fields. The fields to be returned in the search results.
|
40
|
+
def self.search(query, options = {})
|
41
|
+
Searcher.search(query, options)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Index a batch of documents.
|
45
|
+
#
|
46
|
+
# @param [Array] documents. A list of Documents to index.
|
47
|
+
def self.index(documents)
|
48
|
+
Indexer.index([documents])
|
49
|
+
end
|
5
50
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Inquisitio
|
4
|
+
class ConfigurationTest < Minitest::Test
|
5
|
+
|
6
|
+
def setup
|
7
|
+
Inquisitio.instance_variable_set("@config", nil)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_obtaining_singletion
|
11
|
+
refute Inquisitio.config.nil?
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_block_syntax
|
15
|
+
test_search_endpoint = "foobar-123-endpoint"
|
16
|
+
Inquisitio.config do |config|
|
17
|
+
config.search_endpoint = test_search_endpoint
|
18
|
+
end
|
19
|
+
assert_equal test_search_endpoint, Inquisitio.config.search_endpoint
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_search_endpoint
|
23
|
+
search_endpoint = "test-search-endpoint"
|
24
|
+
Inquisitio.config.search_endpoint = search_endpoint
|
25
|
+
assert_equal search_endpoint, Inquisitio.config.search_endpoint
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_missing_search_endpoint_throws_exception
|
29
|
+
assert_raises(InquisitioConfigurationError) do
|
30
|
+
Inquisitio.config.search_endpoint
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_document_endpoint
|
35
|
+
document_endpoint = "test-document-endpoint"
|
36
|
+
Inquisitio.config.document_endpoint = document_endpoint
|
37
|
+
assert_equal document_endpoint, Inquisitio.config.document_endpoint
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_missing_document_endpoint_throws_exception
|
41
|
+
assert_raises(InquisitioConfigurationError) do
|
42
|
+
Inquisitio.config.document_endpoint
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_default_search_size
|
47
|
+
default_search_size = "test-default_search_size"
|
48
|
+
Inquisitio.config.default_search_size = default_search_size
|
49
|
+
assert_equal default_search_size, Inquisitio.config.default_search_size
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_missing_default_search_size_throws_exception
|
53
|
+
assert_raises(InquisitioConfigurationError) do
|
54
|
+
Inquisitio.config.default_search_size
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Inquisitio
|
5
|
+
class DocumentTest < Minitest::Test
|
6
|
+
def setup
|
7
|
+
@type = 'add'
|
8
|
+
@id = '12345'
|
9
|
+
@version = 1
|
10
|
+
@fields = { :title => 'The Title', :author => 'The Author' }
|
11
|
+
@document = Document.new(@type, @id, @version, @fields)
|
12
|
+
|
13
|
+
@expected_SDF =
|
14
|
+
<<-EOS
|
15
|
+
{ "type": "add",
|
16
|
+
"id": "12345",
|
17
|
+
"version": 1,
|
18
|
+
"lang": "en",
|
19
|
+
"fields": {
|
20
|
+
"title": "The Title",
|
21
|
+
"author": "The Author"
|
22
|
+
}
|
23
|
+
}
|
24
|
+
EOS
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_initialization_sets_type
|
28
|
+
assert_equal @type, @document.type
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_initialization_sets_id
|
32
|
+
assert_equal @id, @document.id
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_initialization_sets_version
|
36
|
+
assert_equal @version, @document.version
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_initialization_sets_fields
|
40
|
+
assert_equal @fields, @document.fields
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_create_valid_SDF_json
|
44
|
+
assert_equal JSON.parse(@expected_SDF).to_json,
|
45
|
+
JSON.parse(@document.to_SDF).to_json
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Inquisitio
|
4
|
+
class IndexerTest < Minitest::Test
|
5
|
+
def setup
|
6
|
+
@document_endpoint = 'http://my.document-endpoint.com'
|
7
|
+
Inquisitio.config.document_endpoint = @document_endpoint
|
8
|
+
#def initialize(type, id, version, fields)
|
9
|
+
@documents = [Document.new("add", "12345", 1, {})]
|
10
|
+
end
|
11
|
+
|
12
|
+
def teardown
|
13
|
+
Excon.stubs.clear
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_initialization
|
17
|
+
indexer = Indexer.new(@documents)
|
18
|
+
refute indexer.nil?
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_indexer_should_raise_exception_if_documents_nil
|
22
|
+
assert_raises(InquisitioError, "Documents is nil") do
|
23
|
+
Indexer.index(nil)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_indexer_should_raise_exception_if_documents_empty
|
28
|
+
assert_raises(InquisitioError, "Documents is empty") do
|
29
|
+
Indexer.index([])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_create_correct_index_url
|
34
|
+
indexer = Indexer.new(@documents)
|
35
|
+
expected_url = 'http://my.document-endpoint.com/2011-02-01/documents/batch'
|
36
|
+
assert_equal expected_url, indexer.send(:batch_index_url)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_create_correct_body
|
40
|
+
doc1 = mock()
|
41
|
+
doc1.expects(:to_SDF).returns("sdf1")
|
42
|
+
doc2 = mock()
|
43
|
+
doc2.expects(:to_SDF).returns("sdf2")
|
44
|
+
doc3 = mock()
|
45
|
+
doc3.expects(:to_SDF).returns("sdf3")
|
46
|
+
|
47
|
+
documents = [ doc1, doc2, doc3 ]
|
48
|
+
indexer = Indexer.new(documents)
|
49
|
+
expected_body = '[sdf1, sdf2, sdf3]'
|
50
|
+
assert_equal expected_body, indexer.send(:body)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_index_raises_exception_when_response_not_200
|
54
|
+
Excon.defaults[:mock] = true
|
55
|
+
Excon.stub({}, {:body => 'Bad Happened', :status => 500})
|
56
|
+
|
57
|
+
indexer = Indexer.new(@documents)
|
58
|
+
|
59
|
+
assert_raises(InquisitioError, "Indexer failed with status code 500") do
|
60
|
+
indexer.index
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_index_returns_results
|
65
|
+
body = 'Some Body'
|
66
|
+
Excon.defaults[:mock] = true
|
67
|
+
Excon.stub({}, {:body => body, :status => 200})
|
68
|
+
|
69
|
+
indexer = Indexer.new(@documents)
|
70
|
+
response = indexer.index
|
71
|
+
assert_equal body, response
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/test/logger_test.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Inquisitio
|
4
|
+
class LoggerTest < Minitest::Test
|
5
|
+
def setup
|
6
|
+
super
|
7
|
+
@logger = Logger.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_debug
|
11
|
+
$stdout.expects(:puts).with("foobar")
|
12
|
+
@logger.debug "foobar"
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_info
|
16
|
+
$stdout.expects(:puts).with("foobar")
|
17
|
+
@logger.info "foobar"
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_warn
|
21
|
+
$stdout.expects(:puts).with("foobar")
|
22
|
+
@logger.warn "foobar"
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_error
|
26
|
+
$stderr.expects(:puts).with("foobar")
|
27
|
+
@logger.error "foobar"
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_fatal
|
31
|
+
$stderr.expects(:puts).with("foobar")
|
32
|
+
@logger.fatal "foobar"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Inquisitio
|
4
|
+
class SearchUrlBuilderTest < Minitest::Test
|
5
|
+
def setup
|
6
|
+
super
|
7
|
+
@search_endpoint = 'http://my.search-endpoint.com'
|
8
|
+
Inquisitio.config.search_endpoint = @search_endpoint
|
9
|
+
Inquisitio.config.default_search_size = '10'
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_create_correct_search_url_without_return_fields
|
13
|
+
url = SearchUrlBuilder.build(query: 'Star Wars')
|
14
|
+
expected_url = 'http://my.search-endpoint.com/2011-02-01/search?q=Star%20Wars&size=10'
|
15
|
+
assert_equal expected_url, url
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_create_correct_search_url_including_return_fields
|
19
|
+
url = SearchUrlBuilder.build(query: 'Star Wars', return_fields: [ 'title', 'year', '%' ] )
|
20
|
+
expected_url = 'http://my.search-endpoint.com/2011-02-01/search?q=Star%20Wars&return-fields=title,year,%25&size=10'
|
21
|
+
assert_equal expected_url, url
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_create_boolean_query_search_url_with_only_filters
|
25
|
+
url = SearchUrlBuilder.build(filters: {title: 'Star Wars'})
|
26
|
+
expected_url = 'http://my.search-endpoint.com/2011-02-01/search?bq=(and%20title:\'Star%20Wars\')&size=10'
|
27
|
+
assert_equal expected_url, url
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_create_boolean_query_search_url_with_query_and_filters
|
31
|
+
url = SearchUrlBuilder.build(query: 'Star Wars', filters: {genre: 'Animation'})
|
32
|
+
expected_url = 'http://my.search-endpoint.com/2011-02-01/search?bq=(and%20\'Star%20Wars\'%20genre:\'Animation\')&size=10'
|
33
|
+
assert_equal expected_url, url
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_create_boolean_query_search_url_with_query_and_filters_and_return_fields
|
37
|
+
url = SearchUrlBuilder.build(query: 'Star Wars', filters: {genre: 'Animation'}, return_fields: [ 'title', 'year', '%' ])
|
38
|
+
expected_url = 'http://my.search-endpoint.com/2011-02-01/search?bq=(and%20\'Star%20Wars\'%20genre:\'Animation\')&return-fields=title,year,%25&size=10'
|
39
|
+
assert_equal expected_url, url
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_create_search_url_with_added_arguments
|
43
|
+
url = SearchUrlBuilder.build(query: 'Star Wars', filters: {genre: 'Animation'}, :arguments => { facet: 'genre', 'facet-genre-constraints' => 'Animation', 'facet-genre-top-n' => '5'})
|
44
|
+
expected_url = 'http://my.search-endpoint.com/2011-02-01/search?bq=(and%20\'Star%20Wars\'%20genre:\'Animation\')&facet=genre&facet-genre-constraints=Animation&facet-genre-top-n=5&size=10'
|
45
|
+
assert_equal expected_url, url
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_create_search_url_with_default_size
|
49
|
+
url = SearchUrlBuilder.build(query: 'Star Wars')
|
50
|
+
expected_url = 'http://my.search-endpoint.com/2011-02-01/search?q=Star%20Wars&size=10'
|
51
|
+
assert_equal expected_url, url
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_create_search_url_overriding_default_size
|
55
|
+
url = SearchUrlBuilder.build(query: 'Star Wars', :arguments => { size: '200' })
|
56
|
+
expected_url = 'http://my.search-endpoint.com/2011-02-01/search?q=Star%20Wars&size=200'
|
57
|
+
assert_equal expected_url, url
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_create_correct_search_url_with_sanatised_query_string
|
61
|
+
url = SearchUrlBuilder.build(query: 'Star\' Wars', filters: {genre: 'Anim\'ation'}, :arguments => { facet: 'ge\'nre', 'facet-genr\'e-constraints' => 'Anim\'ation', 'facet-gen\'re-top-n' => '\'5'}, return_fields: [ 't\'itle', 'y\'ear' ])
|
62
|
+
expected_url = 'http://my.search-endpoint.com/2011-02-01/search?bq=(and%20\'Star%20Wars\'%20genre:\'Animation\')&return-fields=title,year&facet=genre&facet-genre-constraints=Animation&facet-genre-top-n=5&size=10'
|
63
|
+
assert_equal expected_url, url
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Inquisitio
|
4
|
+
class SearcherTest < Minitest::Test
|
5
|
+
def setup
|
6
|
+
super
|
7
|
+
@search_endpoint = 'http://my.search-endpoint.com'
|
8
|
+
Inquisitio.config.search_endpoint = @search_endpoint
|
9
|
+
@expected_result_1 = {'id' => 1, 'title' => "Foobar", 'type' => "cat"}
|
10
|
+
@expected_result_2 = {'id' => 2, 'title' => "Foobar2", 'type' => "dog"}
|
11
|
+
@expected_results = [@expected_result_1, @expected_result_2]
|
12
|
+
|
13
|
+
body = <<-EOS
|
14
|
+
{"rank":"-text_relevance","match-expr":"(label 'star wars')","hits":{"found":2,"start":0,"hit":#{@expected_results.to_json}},"info":{"rid":"9d3b24b0e3399866dd8d376a7b1e0f6e930d55830b33a474bfac11146e9ca1b3b8adf0141a93ecee","time-ms":3,"cpu-time-ms":0}}
|
15
|
+
EOS
|
16
|
+
|
17
|
+
Excon.defaults[:mock] = true
|
18
|
+
Excon.stub({}, {body: body, status: 200})
|
19
|
+
end
|
20
|
+
|
21
|
+
def teardown
|
22
|
+
super
|
23
|
+
Excon.stubs.clear
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_initialization_with_string
|
27
|
+
filters = { :genre => [ 'Animation' ] }
|
28
|
+
return_fields = [ 'title' ]
|
29
|
+
searcher = Searcher.new('Star Wars', filters.merge({return_fields: return_fields}))
|
30
|
+
assert_equal 'Star Wars', searcher.instance_variable_get("@query")
|
31
|
+
assert_equal filters, searcher.instance_variable_get("@filters")
|
32
|
+
assert_equal return_fields, searcher.instance_variable_get("@return_fields")
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_initialization_with_hash
|
36
|
+
filters = { :genre => [ 'Animation' ] }
|
37
|
+
return_fields = [ 'title' ]
|
38
|
+
searcher = Searcher.new(filters.merge({return_fields: return_fields}))
|
39
|
+
assert_equal nil, searcher.instance_variable_get("@query")
|
40
|
+
assert_equal filters, searcher.instance_variable_get("@filters")
|
41
|
+
assert_equal return_fields, searcher.instance_variable_get("@return_fields")
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_searcher_should_raise_exception_if_query_null
|
45
|
+
assert_raises(InquisitioError, "Query is nil") do
|
46
|
+
Searcher.search(nil)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
def test_search_raises_exception_when_response_not_200
|
52
|
+
Excon.stub({}, {:body => 'Bad Happened', :status => 500})
|
53
|
+
|
54
|
+
searcher = Searcher.new('Star Wars')
|
55
|
+
|
56
|
+
assert_raises(InquisitioError, "Search failed with status code 500") do
|
57
|
+
searcher.search
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_search_should_set_results
|
62
|
+
searcher = Searcher.new('Star Wars', { :return_fields => [ 'title', 'year', '%' ] } )
|
63
|
+
searcher.search
|
64
|
+
assert_equal @expected_results, searcher.instance_variable_get("@results")
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_search_should_set_ids
|
68
|
+
searcher = Searcher.new('Star Wars', { :return_fields => [ 'title', 'year', '%' ] } )
|
69
|
+
searcher.search
|
70
|
+
assert_equal @expected_results.map{|r|r['id']}, searcher.ids
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_search_should_set_records
|
74
|
+
searcher = Searcher.new('Star Wars', { :return_fields => [ 'title', 'year', '%' ] } )
|
75
|
+
searcher.search
|
76
|
+
|
77
|
+
# [{"MediaFile" => 1}, {...}]
|
78
|
+
records = []
|
79
|
+
records << {@expected_result_1['type'] => @expected_result_1['id']}
|
80
|
+
records << {@expected_result_2['type'] => @expected_result_2['id']}
|
81
|
+
assert_equal records, searcher.records
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_search_calls_search_url_builder
|
85
|
+
SearchUrlBuilder.any_instance.expects(build: "http://www.example.com")
|
86
|
+
searcher = Searcher.new('Star Wars')
|
87
|
+
searcher.search
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require "codeclimate-test-reporter"
|
2
|
+
CodeClimate::TestReporter.start
|
3
|
+
|
4
|
+
gem "minitest"
|
5
|
+
require "minitest/autorun"
|
6
|
+
require "minitest/pride"
|
7
|
+
require "minitest/mock"
|
8
|
+
require "mocha/setup"
|
9
|
+
|
10
|
+
lib = File.expand_path('../../lib', __FILE__)
|
11
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
12
|
+
|
13
|
+
require "inquisitio"
|
14
|
+
|
15
|
+
class Minitest::Test
|
16
|
+
def setup
|
17
|
+
Inquisitio.config do |config|
|
18
|
+
config.search_endpoint = "test-search-endpoint"
|
19
|
+
|
20
|
+
config.logger.stubs(:debug)
|
21
|
+
config.logger.stubs(:error)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: inquisitio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Walker
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: excon
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.25.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.25.0
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -28,32 +42,97 @@ dependencies:
|
|
28
42
|
name: rake
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
|
-
- - '>='
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: mocha
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
32
60
|
- !ruby/object:Gem::Version
|
33
61
|
version: '0'
|
34
62
|
type: :development
|
35
63
|
prerelease: false
|
36
64
|
version_requirements: !ruby/object:Gem::Requirement
|
37
65
|
requirements:
|
38
|
-
- - '>='
|
66
|
+
- - ! '>='
|
39
67
|
- !ruby/object:Gem::Version
|
40
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: yard
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: minitest
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 5.0.8
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 5.0.8
|
41
97
|
description: A Ruby Gem that wraps search for CloudSearch
|
42
98
|
email:
|
43
99
|
- jeremy@meducation.net
|
44
|
-
executables:
|
100
|
+
executables:
|
101
|
+
- boolean_query
|
102
|
+
- facet_query
|
103
|
+
- index
|
104
|
+
- search
|
45
105
|
extensions: []
|
46
106
|
extra_rdoc_files: []
|
47
107
|
files:
|
48
108
|
- .gitignore
|
109
|
+
- CHANGELOG.md
|
49
110
|
- CONTRIBUTING.md
|
50
111
|
- Gemfile
|
51
112
|
- LICENCE.md
|
52
113
|
- README.md
|
53
114
|
- Rakefile
|
115
|
+
- bin/boolean_query
|
116
|
+
- bin/facet_query
|
117
|
+
- bin/index
|
118
|
+
- bin/search
|
54
119
|
- inquisitio.gemspec
|
55
120
|
- lib/inquisitio.rb
|
121
|
+
- lib/inquisitio/configuration.rb
|
122
|
+
- lib/inquisitio/document.rb
|
123
|
+
- lib/inquisitio/indexer.rb
|
124
|
+
- lib/inquisitio/inquisitio_error.rb
|
125
|
+
- lib/inquisitio/logger.rb
|
126
|
+
- lib/inquisitio/search_url_builder.rb
|
127
|
+
- lib/inquisitio/searcher.rb
|
56
128
|
- lib/inquisitio/version.rb
|
129
|
+
- test/configuration_test.rb
|
130
|
+
- test/document_test.rb
|
131
|
+
- test/indexer_test.rb
|
132
|
+
- test/logger_test.rb
|
133
|
+
- test/search_url_builder_test.rb
|
134
|
+
- test/searcher_test.rb
|
135
|
+
- test/test_helper.rb
|
57
136
|
homepage: https://github.com/meducation/inquisition
|
58
137
|
licenses:
|
59
138
|
- AGPL3
|
@@ -64,12 +143,12 @@ require_paths:
|
|
64
143
|
- lib
|
65
144
|
required_ruby_version: !ruby/object:Gem::Requirement
|
66
145
|
requirements:
|
67
|
-
- - '>='
|
146
|
+
- - ! '>='
|
68
147
|
- !ruby/object:Gem::Version
|
69
148
|
version: '0'
|
70
149
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
150
|
requirements:
|
72
|
-
- - '>='
|
151
|
+
- - ! '>='
|
73
152
|
- !ruby/object:Gem::Version
|
74
153
|
version: '0'
|
75
154
|
requirements: []
|
@@ -78,5 +157,12 @@ rubygems_version: 2.1.9
|
|
78
157
|
signing_key:
|
79
158
|
specification_version: 4
|
80
159
|
summary: This wraps AWS CloudSearch in a Ruby Gem
|
81
|
-
test_files:
|
160
|
+
test_files:
|
161
|
+
- test/configuration_test.rb
|
162
|
+
- test/document_test.rb
|
163
|
+
- test/indexer_test.rb
|
164
|
+
- test/logger_test.rb
|
165
|
+
- test/search_url_builder_test.rb
|
166
|
+
- test/searcher_test.rb
|
167
|
+
- test/test_helper.rb
|
82
168
|
has_rdoc:
|