slingshot-rb 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/README.markdown +4 -3
- data/examples/dsl.rb +1 -1
- data/lib/slingshot/results/collection.rb +5 -1
- data/lib/slingshot/results/item.rb +36 -0
- data/lib/slingshot/rubyext/hash.rb +1 -1
- data/lib/slingshot/version.rb +1 -1
- data/lib/{slingshot/slingshot-rb.rb → slingshot-rb.rb} +0 -0
- data/lib/slingshot.rb +1 -0
- data/slingshot.png +0 -0
- data/test/integration/results_test.rb +28 -0
- data/test/unit/results_collection_test.rb +22 -4
- data/test/unit/results_item_test.rb +50 -0
- metadata +12 -6
data/README.markdown
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
Slingshot
|
2
2
|
=========
|
3
3
|
|
4
|
+

|
5
|
+
|
4
6
|
_Slingshot_ aims to provide a rich Ruby API and DSL for the
|
5
7
|
[ElasticSearch](http://www.elasticsearch.org/) search engine/database.
|
6
8
|
|
@@ -25,7 +27,7 @@ First, you need a running _ElasticSearch_ server. Thankfully, it's easy. Let's d
|
|
25
27
|
|
26
28
|
OK, easy. Now, install the gem via Rubygems:
|
27
29
|
|
28
|
-
$ gem install slingshot
|
30
|
+
$ gem install slingshot-rb
|
29
31
|
|
30
32
|
or from source:
|
31
33
|
|
@@ -86,7 +88,7 @@ from the database:
|
|
86
88
|
Let's display the results:
|
87
89
|
|
88
90
|
s.results.each do |document|
|
89
|
-
puts "* #{ document
|
91
|
+
puts "* #{ document.title }"
|
90
92
|
end
|
91
93
|
|
92
94
|
# * Two
|
@@ -135,7 +137,6 @@ Todo & Plans
|
|
135
137
|
|
136
138
|
In order of importance:
|
137
139
|
|
138
|
-
* Basic wrapper class for _hits_ in results, so we could write `results.first.document.title` instead of using the raw Hash
|
139
140
|
* Getting document [by ID](http://www.elasticsearch.org/guide/reference/api/get.html)
|
140
141
|
* Seamless _ActiveModel_ compatibility for easy usage in _Rails_ applications (this also means nearly full _ActiveRecord_ compatibility)
|
141
142
|
* Allowing to set custom non-ActiveModel wrapper class (your own)
|
data/examples/dsl.rb
CHANGED
@@ -56,7 +56,7 @@ puts s.to_curl
|
|
56
56
|
|
57
57
|
puts "", "Results:", "-"*80
|
58
58
|
s.results.each_with_index do |document, i|
|
59
|
-
puts "#{i+1}. #{ document
|
59
|
+
puts "#{i+1}. #{ document.title.ljust(20) } [id] #{document._id}"
|
60
60
|
end
|
61
61
|
|
62
62
|
puts "", "Facets: tags distribution across the whole database:", "-"*80
|
@@ -8,7 +8,11 @@ module Slingshot
|
|
8
8
|
def initialize(response)
|
9
9
|
@time = response['took']
|
10
10
|
@total = response['hits']['total']
|
11
|
-
@results = response['hits']['hits']
|
11
|
+
@results = response['hits']['hits'].map do |h|
|
12
|
+
document = h['_source'] ? h['_source'] : h['fields']
|
13
|
+
h.update document if document
|
14
|
+
Item.new h
|
15
|
+
end
|
12
16
|
@facets = response['facets']
|
13
17
|
end
|
14
18
|
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Slingshot
|
2
|
+
module Results
|
3
|
+
|
4
|
+
class Item < Hash
|
5
|
+
|
6
|
+
# Create new instance, recursively converting all Hashes to Item
|
7
|
+
# and leaving everything else alone.
|
8
|
+
#
|
9
|
+
def initialize(args={})
|
10
|
+
if args.is_a? Hash
|
11
|
+
args.each_pair do |key, value|
|
12
|
+
self[key.to_sym] = value.is_a?(Hash) ? self.class.new(value) : value
|
13
|
+
end
|
14
|
+
super.replace self
|
15
|
+
else
|
16
|
+
super()
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Delegate method to a key in underlying hash, if present,
|
21
|
+
# otherwise return +nil+.
|
22
|
+
#
|
23
|
+
def method_missing(method_name, *arguments)
|
24
|
+
self.has_key?(method_name.to_sym) ? self[method_name.to_sym] : nil
|
25
|
+
end
|
26
|
+
|
27
|
+
def inspect
|
28
|
+
s = []; self.each { |k,v| s << ":#{k} => #{v.inspect}" }
|
29
|
+
%Q|<Item #{s.join(', ')}>|
|
30
|
+
end
|
31
|
+
|
32
|
+
alias_method :to_indexed_json, :to_json
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
data/lib/slingshot/version.rb
CHANGED
File without changes
|
data/lib/slingshot.rb
CHANGED
data/slingshot.png
ADDED
Binary file
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Slingshot
|
4
|
+
|
5
|
+
class ResultsIntegrationTest < Test::Unit::TestCase
|
6
|
+
include Test::Integration
|
7
|
+
|
8
|
+
context "Query results" do
|
9
|
+
|
10
|
+
should "allow easy access to returned documents" do
|
11
|
+
q = 'title:one'
|
12
|
+
s = Slingshot.search('articles-test') { query { string q } }
|
13
|
+
assert_equal 'One', s.results.first.title
|
14
|
+
assert_equal 'ruby', s.results.first.tags[0]
|
15
|
+
end
|
16
|
+
|
17
|
+
should "allow easy access to returned documents with limited fields" do
|
18
|
+
q = 'title:one'
|
19
|
+
s = Slingshot.search('articles-test') { query { string q }.fields :title }
|
20
|
+
assert_equal 'One', s.results.first.title
|
21
|
+
assert_nil s.results.first.tags
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -6,24 +6,42 @@ module Slingshot
|
|
6
6
|
|
7
7
|
context "Collection" do
|
8
8
|
setup do
|
9
|
-
@default_response = { 'hits' => { 'hits' => [1, 2, 3] } }
|
9
|
+
@default_response = { 'hits' => { 'hits' => [{:_id => 1}, {:_id => 2}, {:_id => 3}] } }
|
10
10
|
end
|
11
11
|
|
12
12
|
should "be iterable" do
|
13
13
|
assert_respond_to Results::Collection.new(@default_response), :each
|
14
14
|
assert_nothing_raised do
|
15
|
-
Results::Collection.new(@default_response).each { |item| item + 1 }
|
16
|
-
Results::Collection.new(@default_response).map
|
15
|
+
Results::Collection.new(@default_response).each { |item| item[:_id] + 1 }
|
16
|
+
Results::Collection.new(@default_response).map { |item| item[:_id] + 1 }
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
20
|
should "be initialized with parsed json" do
|
21
21
|
assert_nothing_raised do
|
22
22
|
collection = Results::Collection.new( @default_response )
|
23
|
-
assert_equal
|
23
|
+
assert_equal 3, collection.results.count
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
+
context "wrapping results" do
|
28
|
+
|
29
|
+
should "wrap hits in Item" do
|
30
|
+
response = { 'hits' => { 'hits' => [ { '_id' => 1, '_source' => { :title => 'Test', :body => 'Lorem' } } ] } }
|
31
|
+
document = Results::Collection.new(response).first
|
32
|
+
assert_kind_of Results::Item, document
|
33
|
+
assert_equal 'Test', document.title
|
34
|
+
end
|
35
|
+
|
36
|
+
should "allow access to raw underlying Hash" do
|
37
|
+
response = { 'hits' => { 'hits' => [ { '_id' => 1, '_source' => { :title => 'Test', :body => 'Lorem' } } ] } }
|
38
|
+
document = Results::Collection.new(response).first
|
39
|
+
assert_not_nil document[:_source][:title]
|
40
|
+
assert_equal 'Test', document[:_source][:title]
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
27
45
|
end
|
28
46
|
|
29
47
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Slingshot
|
4
|
+
|
5
|
+
class ResultsItemTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
context "Item" do
|
8
|
+
|
9
|
+
setup do
|
10
|
+
@document = Results::Item.new :title => 'Test', :author => { :name => 'Kafka' }
|
11
|
+
end
|
12
|
+
|
13
|
+
should "respond to :to_indexed_json" do
|
14
|
+
assert_respond_to Results::Item.new, :to_indexed_json
|
15
|
+
end
|
16
|
+
|
17
|
+
should "retrieve the values from underlying hash" do
|
18
|
+
assert_equal 'Test', @document[:title]
|
19
|
+
end
|
20
|
+
|
21
|
+
should "allow to retrieve the values by methods" do
|
22
|
+
assert_not_nil @document.title
|
23
|
+
assert_equal 'Test', @document.title
|
24
|
+
end
|
25
|
+
|
26
|
+
should "return nil for non-existing keys/methods" do
|
27
|
+
assert_nothing_raised { @document.whatever }
|
28
|
+
assert_nil @document.whatever
|
29
|
+
end
|
30
|
+
|
31
|
+
should "not care about symbols or strings in keys" do
|
32
|
+
@document = Results::Item.new 'title' => 'Test'
|
33
|
+
assert_not_nil @document.title
|
34
|
+
assert_equal 'Test', @document.title
|
35
|
+
end
|
36
|
+
|
37
|
+
should "allow to retrieve hashes" do
|
38
|
+
assert_equal 'Kafka', @document.author[:name]
|
39
|
+
end
|
40
|
+
|
41
|
+
should "allow to retrieve values from nested hashes" do
|
42
|
+
assert_not_nil @document.author.name
|
43
|
+
assert_equal 'Kafka', @document.author.name
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slingshot-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Karel Minarik
|
@@ -152,20 +152,22 @@ files:
|
|
152
152
|
- README.markdown
|
153
153
|
- Rakefile
|
154
154
|
- examples/dsl.rb
|
155
|
+
- lib/slingshot-rb.rb
|
155
156
|
- lib/slingshot.rb
|
156
157
|
- lib/slingshot/client.rb
|
157
158
|
- lib/slingshot/configuration.rb
|
158
159
|
- lib/slingshot/dsl.rb
|
159
160
|
- lib/slingshot/index.rb
|
160
161
|
- lib/slingshot/results/collection.rb
|
162
|
+
- lib/slingshot/results/item.rb
|
161
163
|
- lib/slingshot/rubyext/hash.rb
|
162
164
|
- lib/slingshot/search.rb
|
163
165
|
- lib/slingshot/search/facet.rb
|
164
166
|
- lib/slingshot/search/query.rb
|
165
167
|
- lib/slingshot/search/sort.rb
|
166
|
-
- lib/slingshot/slingshot-rb.rb
|
167
168
|
- lib/slingshot/version.rb
|
168
169
|
- slingshot.gemspec
|
170
|
+
- slingshot.png
|
169
171
|
- test/fixtures/articles/1.json
|
170
172
|
- test/fixtures/articles/2.json
|
171
173
|
- test/fixtures/articles/3.json
|
@@ -173,12 +175,14 @@ files:
|
|
173
175
|
- test/fixtures/articles/5.json
|
174
176
|
- test/integration/facets_test.rb
|
175
177
|
- test/integration/query_string_test.rb
|
178
|
+
- test/integration/results_test.rb
|
176
179
|
- test/integration/sort_test.rb
|
177
180
|
- test/test_helper.rb
|
178
181
|
- test/unit/client_test.rb
|
179
182
|
- test/unit/configuration_test.rb
|
180
183
|
- test/unit/index_test.rb
|
181
184
|
- test/unit/results_collection_test.rb
|
185
|
+
- test/unit/results_item_test.rb
|
182
186
|
- test/unit/search_facet_test.rb
|
183
187
|
- test/unit/search_query_test.rb
|
184
188
|
- test/unit/search_sort_test.rb
|
@@ -216,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
216
220
|
requirements: []
|
217
221
|
|
218
222
|
rubyforge_project: slingshot
|
219
|
-
rubygems_version: 1.
|
223
|
+
rubygems_version: 1.5.0
|
220
224
|
signing_key:
|
221
225
|
specification_version: 3
|
222
226
|
summary: Ruby API for ElasticSearch
|
@@ -228,12 +232,14 @@ test_files:
|
|
228
232
|
- test/fixtures/articles/5.json
|
229
233
|
- test/integration/facets_test.rb
|
230
234
|
- test/integration/query_string_test.rb
|
235
|
+
- test/integration/results_test.rb
|
231
236
|
- test/integration/sort_test.rb
|
232
237
|
- test/test_helper.rb
|
233
238
|
- test/unit/client_test.rb
|
234
239
|
- test/unit/configuration_test.rb
|
235
240
|
- test/unit/index_test.rb
|
236
241
|
- test/unit/results_collection_test.rb
|
242
|
+
- test/unit/results_item_test.rb
|
237
243
|
- test/unit/search_facet_test.rb
|
238
244
|
- test/unit/search_query_test.rb
|
239
245
|
- test/unit/search_sort_test.rb
|