primedia-endeca 0.9.0
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/History.txt +4 -0
- data/Manifest.txt +31 -0
- data/README.rdoc +60 -0
- data/Rakefile +48 -0
- data/example/benchmark.rb +13 -0
- data/example/listing.rb +36 -0
- data/lib/class_to_proc.rb +5 -0
- data/lib/core_ext.rb +73 -0
- data/lib/endeca.rb +38 -0
- data/lib/endeca/dimension.rb +30 -0
- data/lib/endeca/document.rb +109 -0
- data/lib/endeca/document_collection.rb +93 -0
- data/lib/endeca/map.rb +119 -0
- data/lib/endeca/readers.rb +95 -0
- data/lib/endeca/refinement.rb +29 -0
- data/lib/endeca/request.rb +58 -0
- data/lib/endeca/transformer.rb +40 -0
- data/spec/core_ext_spec.rb +52 -0
- data/spec/endeca/dimension_spec.rb +65 -0
- data/spec/endeca/document_collection_spec.rb +116 -0
- data/spec/endeca/document_spec.rb +290 -0
- data/spec/endeca/map_spec.rb +81 -0
- data/spec/endeca/readers_spec.rb +112 -0
- data/spec/endeca/refinement_spec.rb +38 -0
- data/spec/endeca/request_spec.rb +65 -0
- data/spec/endeca/transformer_spec.rb +50 -0
- data/spec/endeca_spec.rb +12 -0
- data/spec/rcov.opts +5 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +1 -0
- metadata +93 -0
@@ -0,0 +1,65 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. spec_helper])
|
2
|
+
|
3
|
+
describe Endeca::Dimension do
|
4
|
+
describe ".new" do
|
5
|
+
it "should set the raw attribute" do
|
6
|
+
dimension = Endeca::Dimension.new(:raw)
|
7
|
+
|
8
|
+
dimension.raw.should == :raw
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#inspect" do
|
13
|
+
before do
|
14
|
+
@dimension = Endeca::Dimension.new
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should include the class" do
|
18
|
+
@dimension.inspect.should include(Endeca::Dimension.name)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should include the hex formatted object_id" do
|
22
|
+
id = 123
|
23
|
+
@dimension.stub!(:object_id).and_return(id)
|
24
|
+
@dimension.inspect.should include("0x#{id.to_s(16)}")
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should include the id" do
|
28
|
+
id = 123
|
29
|
+
@dimension.stub!(:id).and_return(id)
|
30
|
+
@dimension.inspect.should include("id=#{id}")
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should include the inspected name" do
|
34
|
+
name = 'name'
|
35
|
+
@dimension.stub!(:name).and_return(name)
|
36
|
+
@dimension.inspect.should include("name=#{name.inspect}")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#==" do
|
41
|
+
it "should compare ids" do
|
42
|
+
dim_1 = Endeca::Dimension.new
|
43
|
+
dim_2 = Endeca::Dimension.new
|
44
|
+
dim_2.stub!(:id).and_return(dim_1.id)
|
45
|
+
|
46
|
+
(dim_1 == dim_2).should be_true
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#<=>" do
|
51
|
+
it "should compare names" do
|
52
|
+
name = mock('name')
|
53
|
+
|
54
|
+
dim_1 = Endeca::Dimension.new
|
55
|
+
dim_2 = Endeca::Dimension.new
|
56
|
+
|
57
|
+
dim_1.stub!(:name).and_return(name)
|
58
|
+
dim_2.stub!(:name).and_return(name)
|
59
|
+
|
60
|
+
name.should_receive(:<=>).with(name)
|
61
|
+
|
62
|
+
dim_1 <=> dim_2
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. spec_helper])
|
2
|
+
|
3
|
+
describe Endeca::DocumentCollection do
|
4
|
+
before do
|
5
|
+
@metainfo = mock('MetaInfo', :[] => nil)
|
6
|
+
@document = mock('Document', :[] => nil)
|
7
|
+
@refinement = mock('Refinement', :[] => [])
|
8
|
+
@raw = {
|
9
|
+
'Records' => [@document],
|
10
|
+
'MetaInfo' => @metainfo,
|
11
|
+
'Refinements' => [@refinement]
|
12
|
+
}
|
13
|
+
@document_collection = Endeca::DocumentCollection.new(@raw)
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#new' do
|
17
|
+
it "should store the raw data" do
|
18
|
+
@document_collection.raw.should == @raw
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#attributes' do
|
23
|
+
it "should return the metainfo hash of the collection" do
|
24
|
+
@document_collection.attributes.should == @metainfo
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#documents' do
|
29
|
+
it "should return a collection of documents" do
|
30
|
+
@document_collection.documents.size.should == 1
|
31
|
+
@document_collection.documents.first.should == Endeca::Document.new(@document)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should return the correct document class for subclassees" do
|
35
|
+
class ConcreteDocument < Endeca::Document; end
|
36
|
+
collection = Endeca::DocumentCollection.new(@raw, ConcreteDocument)
|
37
|
+
collection.documents.first.class.should == ConcreteDocument
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "#previous_page" do
|
42
|
+
describe "when on the first page" do
|
43
|
+
before do
|
44
|
+
@document_collection.stub!(:current_page).and_return(0)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should be nil" do
|
48
|
+
@document_collection.previous_page.should be_nil
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "when on any other page" do
|
53
|
+
before do
|
54
|
+
@document_collection.stub!(:current_page).and_return(4)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should return the previous page" do
|
58
|
+
@document_collection.previous_page.should == 3
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "#next_page" do
|
64
|
+
before do
|
65
|
+
@document_collection.stub!(:total_pages).and_return(20)
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "when on the last page" do
|
69
|
+
before do
|
70
|
+
@document_collection.stub!(:current_page).and_return(20)
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should be nil" do
|
74
|
+
@document_collection.next_page.should be_nil
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "when on any other page" do
|
79
|
+
before do
|
80
|
+
@document_collection.stub!(:current_page).and_return(4)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should return the next page" do
|
84
|
+
@document_collection.next_page.should == 5
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '#refinements' do
|
90
|
+
it 'should return a collection of Refinement objects' do
|
91
|
+
@document_collection.refinements.should == [Endeca::Refinement.new(@refinement)]
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "#each" do
|
96
|
+
it "should yield to the documents" do
|
97
|
+
block = lambda{1}
|
98
|
+
@document_collection.documents.should_receive(:each).with(&block)
|
99
|
+
@document_collection.each(&block)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "#is_a?" do
|
104
|
+
it "should be true if the compared class is Array" do
|
105
|
+
@document_collection.is_a?(Array).should be_true
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should be true if the compared class is Endeca::DocumentCollection" do
|
109
|
+
@document_collection.is_a?(Endeca::DocumentCollection).should be_true
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should be false if the compared class is String" do
|
113
|
+
@document_collection.is_a?(String).should be_false
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,290 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. spec_helper])
|
2
|
+
|
3
|
+
describe Endeca::Document do
|
4
|
+
before do
|
5
|
+
Endeca::Document.path 'http://endeca.example.com'
|
6
|
+
@document = Endeca::Document.new
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '.map' do
|
10
|
+
after do
|
11
|
+
Endeca::Document.mappings = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "with a mapping value" do
|
15
|
+
it "should assign the mapping with a nil transformation" do
|
16
|
+
Endeca::Document.map(:id => :endecaID)
|
17
|
+
map = Endeca::Map.new :id, :endecaID
|
18
|
+
Endeca::Document.mappings.should include({:id => map})
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "with two maps that join on the same key in a parent hash" do
|
23
|
+
it "should join the key and value on the delimiter" do
|
24
|
+
Endeca::Document.map(:state => :propertystate).into(:ntk => :ntt)
|
25
|
+
Endeca::Document.map(:city => :propertycity).into(:ntk => :ntt)
|
26
|
+
[
|
27
|
+
{:ntk=>"propertycity|propertystate", :ntt=>"Atlanta|Georgia"},
|
28
|
+
{:ntk=>"propertystate|propertycity", :ntt=>"Georgia|Atlanta"}
|
29
|
+
].should include(Endeca::Document.transform_query_options(:city => 'Atlanta', :state => 'Georgia'))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "with two maps that join on the same key without mapping to a hash" do
|
34
|
+
it "should join on the delimiter" do
|
35
|
+
Endeca::Document.map(:limit => :recs_per_page).into(:M)
|
36
|
+
Endeca::Document.map(:expand_refinements => :expand_all_dims).into(:M)
|
37
|
+
|
38
|
+
# Hashes are not ordered and order is not important
|
39
|
+
[{:M => "recs_per_page:10|expand_all_dims:1"}, {:M => "expand_all_dims:1|recs_per_page:10"}].
|
40
|
+
should include(Endeca::Document.transform_query_options(:limit => 10, :expand_refinements => 1))
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '.find' do
|
46
|
+
before do
|
47
|
+
@query_options = {:foo => :bar}
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '#==' do
|
51
|
+
it "should compare documents by id" do
|
52
|
+
id = 1
|
53
|
+
doc_1 = Endeca::Document.new
|
54
|
+
doc_1.stub!(:id).and_return(id)
|
55
|
+
doc_2 = Endeca::Document.new
|
56
|
+
doc_2.stub!(:id).and_return(id)
|
57
|
+
|
58
|
+
(doc_1 == doc_2).should be_true
|
59
|
+
|
60
|
+
doc_2.stub!(:id).and_return(2)
|
61
|
+
|
62
|
+
(doc_1 == doc_2).should be_false
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe '#inspect' do
|
67
|
+
it "includes the class name" do
|
68
|
+
@document.inspect.should include(Endeca::Document.name)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "includes the hex string of the object id" do
|
72
|
+
@document.inspect.should include("0x#{@document.object_id.to_s(16)}")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "#dimensions" do
|
77
|
+
describe "with a nil Dimensions hash" do
|
78
|
+
it "should be empty" do
|
79
|
+
@document.stub!(:raw).and_return({})
|
80
|
+
@document.dimensions.should be_empty
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe 'with a raw Dimensions hash with a key "key" with one element' do
|
85
|
+
it 'should return a hash with that dimension at the key "key"' do
|
86
|
+
dimension_hash = mock('Dimension Hash')
|
87
|
+
dimension = mock(Endeca::Dimension)
|
88
|
+
|
89
|
+
@document.
|
90
|
+
stub!(:raw).
|
91
|
+
and_return({'Dimensions' => {"key" => dimension_hash}})
|
92
|
+
|
93
|
+
Endeca::Dimension.
|
94
|
+
should_receive(:new).
|
95
|
+
with(dimension_hash).
|
96
|
+
and_return(dimension)
|
97
|
+
|
98
|
+
@document.dimensions["key"].should == dimension
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe 'with :first' do
|
104
|
+
it 'should call .first and pass the query options' do
|
105
|
+
Endeca::Document.should_receive(:first).with(@query_options)
|
106
|
+
Endeca::Document.find(:first, @query_options)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe 'with :all' do
|
111
|
+
it "should call .all and pass the query options and self" do
|
112
|
+
Endeca::Document.should_receive(:all).with(@query_options)
|
113
|
+
Endeca::Document.find(:all, @query_options)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe 'with an Integer' do
|
118
|
+
it "should call .by_id with the argument and the query options" do
|
119
|
+
id = 5
|
120
|
+
Endeca::Document.should_receive(:by_id).with(id, @query_options)
|
121
|
+
Endeca::Document.find(id, @query_options)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe 'with an id string' do
|
126
|
+
it "should call .by_id with the argument and the query options" do
|
127
|
+
id = '5'
|
128
|
+
Endeca::Document.should_receive(:by_id).with(id, @query_options)
|
129
|
+
Endeca::Document.find(id, @query_options)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe 'with only query options' do
|
134
|
+
it 'should call .all with the query options' do
|
135
|
+
Endeca::Document.should_receive(:all).with(@query_options)
|
136
|
+
Endeca::Document.find(@query_options)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe ".first" do
|
142
|
+
it "should make a request with the correct query" do
|
143
|
+
Endeca::Request.
|
144
|
+
should_receive(:perform).
|
145
|
+
with('http://endeca.example.com', {:id => '1234'}).
|
146
|
+
and_return({'Records' => []})
|
147
|
+
|
148
|
+
Endeca::Document.first(:id => '1234')
|
149
|
+
end
|
150
|
+
|
151
|
+
it "should instantiate a new Endeca::Document from the first record in the response hash" do
|
152
|
+
hash = {'Records' => [:document]}
|
153
|
+
Endeca::Request.stub!(:perform).and_return(hash)
|
154
|
+
Endeca::Document.
|
155
|
+
should_receive(:new).
|
156
|
+
with(:document)
|
157
|
+
Endeca::Document.first(:id => '1234')
|
158
|
+
end
|
159
|
+
|
160
|
+
describe "when no matching record is returned" do
|
161
|
+
it "should be nil" do
|
162
|
+
Endeca::Request.stub!(:perform).and_return({'Records' => nil})
|
163
|
+
Endeca::Document.first(:id => '1234').should be_nil
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
describe '.by_id' do
|
169
|
+
it 'should merge the id into the query options and call .first' do
|
170
|
+
Endeca::Document.should_receive(:first).with(:id => '1234')
|
171
|
+
Endeca::Document.by_id('1234')
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
describe '.all' do
|
176
|
+
before do
|
177
|
+
@query_options = {:foo => :bar}
|
178
|
+
@records = mock('RecordArray')
|
179
|
+
@response = {'Records' => @records}
|
180
|
+
Endeca::Document.
|
181
|
+
stub!(:request).
|
182
|
+
and_return(@response)
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'should perform a request with the query options' do
|
186
|
+
Endeca::Document.
|
187
|
+
should_receive(:request).
|
188
|
+
with(@query_options).
|
189
|
+
and_return(@response)
|
190
|
+
|
191
|
+
Endeca::Document.all(@query_options)
|
192
|
+
end
|
193
|
+
|
194
|
+
it 'should create a new DocumentCollection from the full response and the document class' do
|
195
|
+
Endeca::DocumentCollection.should_receive(:new).with(@response, Endeca::Document)
|
196
|
+
Endeca::Document.all(@query_options)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
describe ".transform_query_options" do
|
201
|
+
before do
|
202
|
+
@query_options = {
|
203
|
+
:id => 5
|
204
|
+
}
|
205
|
+
end
|
206
|
+
|
207
|
+
after do
|
208
|
+
Endeca::Document.mappings = {}
|
209
|
+
end
|
210
|
+
|
211
|
+
describe "when there is no mapping for the given key" do
|
212
|
+
it "returns the query options without modification" do
|
213
|
+
Endeca::Document.transform_query_options(@query_options).
|
214
|
+
should == @query_options
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
describe "when there is a mapping with" do
|
219
|
+
describe "a new key" do
|
220
|
+
before do
|
221
|
+
Endeca::Document.map(:id => :new_id)
|
222
|
+
end
|
223
|
+
|
224
|
+
it "should replace the key with the new key" do
|
225
|
+
new_query_options = Endeca::Document.
|
226
|
+
transform_query_options(@query_options)
|
227
|
+
|
228
|
+
new_query_options.should == {:new_id => 5}
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
describe "a new key and a value transformation" do
|
233
|
+
before do
|
234
|
+
Endeca::Document.map(:id => :new_id).transform {|id| id.to_s}
|
235
|
+
end
|
236
|
+
|
237
|
+
it "should replace the value with the transformed value" do
|
238
|
+
Endeca::Document.transform_query_options(@query_options).
|
239
|
+
should == {:new_id => "5"}
|
240
|
+
end
|
241
|
+
|
242
|
+
describe "that includes the current value" do
|
243
|
+
before do
|
244
|
+
Endeca::Document.map(:name => :new_name) do |name, current|
|
245
|
+
[current,name].compact.join('|')
|
246
|
+
end
|
247
|
+
|
248
|
+
@current_query_options = {:name => 'bar', :new_name => 'foo'}
|
249
|
+
end
|
250
|
+
|
251
|
+
it "should transform the new value with the current value" do
|
252
|
+
pending("Not sure of the use case.") do
|
253
|
+
expected_name = "foo|bar"
|
254
|
+
Endeca::Document.transform_query_options(@current_query_options).
|
255
|
+
should == {:new_name => expected_name}
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
describe "with default query parameters" do
|
264
|
+
before do
|
265
|
+
Endeca::Document.default_params :foo => :bar
|
266
|
+
end
|
267
|
+
|
268
|
+
after do
|
269
|
+
Endeca::Document.default_params({})
|
270
|
+
end
|
271
|
+
|
272
|
+
it "should get the default params" do
|
273
|
+
Endeca::Document.get_default_params.should == {:foo => :bar}
|
274
|
+
end
|
275
|
+
|
276
|
+
it "should include the default parameters" do
|
277
|
+
Endeca::Request.should_receive(:perform).with(anything, {:foo => :bar})
|
278
|
+
Endeca::Document.request({})
|
279
|
+
end
|
280
|
+
|
281
|
+
describe "that are mapped" do
|
282
|
+
it "should map the default parameters" do
|
283
|
+
Endeca::Document.map(:foo => :new_foo)
|
284
|
+
Endeca::Request.should_receive(:perform).with(anything, {:new_foo => :bar})
|
285
|
+
Endeca::Document.request({})
|
286
|
+
end
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
end
|