primedia-endeca 0.12.0 → 0.14.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/Rakefile +2 -0
- data/endeca.gemspec +1 -1
- data/lib/endeca/breadcrumb.rb +1 -1
- data/lib/endeca/dimension.rb +1 -1
- data/lib/endeca/document.rb +8 -8
- data/lib/endeca/document_collection.rb +1 -1
- data/lib/endeca/readers.rb +74 -60
- data/lib/endeca/refinement.rb +1 -1
- data/lib/endeca/refinement_dimension.rb +1 -1
- data/lib/endeca/request.rb +12 -8
- data/lib/endeca.rb +1 -1
- data/spec/endeca/document_spec.rb +7 -0
- data/spec/endeca/request_spec.rb +19 -5
- metadata +1 -1
data/Rakefile
CHANGED
data/endeca.gemspec
CHANGED
data/lib/endeca/breadcrumb.rb
CHANGED
data/lib/endeca/dimension.rb
CHANGED
data/lib/endeca/document.rb
CHANGED
@@ -6,8 +6,8 @@ module Endeca
|
|
6
6
|
# The +reader+ declaration provided by Readers can also handle basic data transformations (i.e.
|
7
7
|
# typecasting) and a few basic examples are provided (i.e. +integer_reader+).
|
8
8
|
class Document
|
9
|
+
include Readers
|
9
10
|
extend ClassToProc
|
10
|
-
extend Readers
|
11
11
|
extend Transformer
|
12
12
|
|
13
13
|
inherited_accessor :mappings, {}
|
@@ -93,15 +93,16 @@ module Endeca
|
|
93
93
|
|
94
94
|
# Returns the first Document matching the query options.
|
95
95
|
def self.first(query_options={})
|
96
|
-
response
|
97
|
-
if response['AggrRecords']
|
98
|
-
|
96
|
+
response = request(query_options)
|
97
|
+
record = if response['AggrRecords']
|
98
|
+
response['AggrRecords'].first['Records'].first
|
99
|
+
elsif response['Records']
|
100
|
+
response['Records'].first
|
99
101
|
else
|
100
|
-
|
102
|
+
nil
|
101
103
|
end
|
104
|
+
|
102
105
|
record && new(record)
|
103
|
-
rescue Exception
|
104
|
-
nil
|
105
106
|
end
|
106
107
|
|
107
108
|
# Returns all Documents matching the query options.
|
@@ -131,6 +132,5 @@ module Endeca
|
|
131
132
|
URI.unescape(query_options)
|
132
133
|
end
|
133
134
|
end
|
134
|
-
|
135
135
|
end
|
136
136
|
end
|
@@ -17,8 +17,8 @@ module Endeca
|
|
17
17
|
# as if it were an array of Document objects. (Array delegation pattern
|
18
18
|
# borrowed from Rake::FileList)
|
19
19
|
class DocumentCollection
|
20
|
+
include Readers
|
20
21
|
extend ClassToProc
|
21
|
-
extend Readers
|
22
22
|
|
23
23
|
attr_reader :raw
|
24
24
|
def initialize(raw, document_klass=Document)
|
data/lib/endeca/readers.rb
CHANGED
@@ -2,78 +2,92 @@ module Endeca
|
|
2
2
|
class ReaderError < ::StandardError; end
|
3
3
|
|
4
4
|
module Readers
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
module ClassMethods
|
6
|
+
def add_reader(name, &block)
|
7
|
+
meta = (class << self; self; end)
|
8
|
+
meta.instance_eval do
|
9
|
+
define_method(name) { |*attrs| reader(*attrs, &block) }
|
10
|
+
end
|
9
11
|
end
|
10
|
-
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
13
|
+
# Maps key/value pairs from the data structure used to initialize a
|
14
|
+
# Endeca object. Allows attribute renaming. Use a block to perform data
|
15
|
+
# injunction on the value as it is set.
|
16
|
+
#
|
17
|
+
# ==== Examples
|
18
|
+
#
|
19
|
+
# # Specify basic attributes
|
20
|
+
# reader :title
|
21
|
+
#
|
22
|
+
# # Attribute renaming
|
23
|
+
# reader :long_desc => :description
|
24
|
+
#
|
25
|
+
# # Data injunction
|
26
|
+
# reader(:title => :upcased_title) { |title| title.upcase }
|
27
|
+
def reader(*attrs,&block)
|
28
|
+
hash = {}
|
29
|
+
block ||= lambda {|x| x}
|
29
30
|
|
30
|
-
|
31
|
+
hash.update(attrs.pop) if Hash === attrs.last
|
31
32
|
|
32
|
-
|
33
|
+
attrs.each{ |attr| hash[attr] = attr }
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
35
|
+
hash.each do |variable, method|
|
36
|
+
reader_names << method if respond_to?(:reader_names)
|
37
|
+
define_method(method) do
|
38
|
+
begin
|
39
|
+
block.call(attributes[variable.to_s])
|
40
|
+
rescue StandardError => e
|
41
|
+
raise Endeca::ReaderError, e.message
|
42
|
+
end
|
41
43
|
end
|
42
44
|
end
|
43
45
|
end
|
44
|
-
end
|
45
46
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
47
|
+
# Typecasts attributes as integers.
|
48
|
+
#
|
49
|
+
# ==== Examples
|
50
|
+
# integer_reader :id, :rating
|
51
|
+
def integer_reader(*attrs)
|
52
|
+
reader(*attrs) { |value| Integer(value) }
|
53
|
+
end
|
53
54
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
55
|
+
# Typecasts attributes as BigDecimal
|
56
|
+
#
|
57
|
+
# ==== Examples
|
58
|
+
# decimal_reader :price
|
59
|
+
def decimal_reader(*attrs)
|
60
|
+
require 'bigdecimal' unless defined?(BigDecimal)
|
61
|
+
reader(*attrs) { |value| BigDecimal(value.to_s) }
|
62
|
+
end
|
63
|
+
|
64
|
+
# Typecasts attributes as floats
|
65
|
+
#
|
66
|
+
# ==== Examples
|
67
|
+
# float_reader :latitude, :longitude
|
68
|
+
def float_reader(*attrs)
|
69
|
+
reader(*attrs) { |value| Float(value) if value }
|
70
|
+
end
|
71
|
+
|
72
|
+
# Typecasts attributes as a Perly boolean ("0" == false, "1" == true")
|
73
|
+
#
|
74
|
+
# ==== Examples
|
75
|
+
# boolean_reader :price
|
76
|
+
def boolean_reader(*attrs)
|
77
|
+
reader(*attrs) { |value| value == "1" ? true : false }
|
78
|
+
end
|
62
79
|
|
63
|
-
# Typecasts attributes as floats
|
64
|
-
#
|
65
|
-
# ==== Examples
|
66
|
-
# float_reader :latitude, :longitude
|
67
|
-
def float_reader(*attrs)
|
68
|
-
reader(*attrs) { |value| Float(value) if value }
|
69
80
|
end
|
70
81
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
82
|
+
module InstanceMethods
|
83
|
+
def method_missing(method_id)
|
84
|
+
raise NoMethodError, "undefined method '#{method_id}' for #{self.inspect}. Do you need to add a reader for it?"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.included(receiver)
|
89
|
+
receiver.extend ClassMethods
|
90
|
+
receiver.send :include, InstanceMethods
|
77
91
|
end
|
78
92
|
end
|
79
|
-
end
|
93
|
+
end
|
data/lib/endeca/refinement.rb
CHANGED
data/lib/endeca/request.rb
CHANGED
@@ -15,25 +15,29 @@ module Endeca
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def perform
|
18
|
-
|
19
|
-
raise RequestError, endeca_error(response)[:message] if endeca_error?(response)
|
18
|
+
raise RequestError, endeca_error[:message] if endeca_error?
|
20
19
|
return response
|
21
20
|
end
|
21
|
+
|
22
|
+
def response
|
23
|
+
handle_response(get_response)
|
24
|
+
end
|
22
25
|
|
23
26
|
def uri
|
24
27
|
return @uri if @uri
|
25
28
|
|
26
29
|
@uri = URI.parse(@path)
|
27
|
-
@uri.query = query_string
|
30
|
+
@uri.query = query_string unless !@query || @query.include?("/_/")
|
31
|
+
@uri = URI.parse("#{@path}#{@query}") if @query && @query.include?("/_/")
|
28
32
|
@uri
|
29
33
|
end
|
30
34
|
|
31
35
|
private
|
32
36
|
|
33
|
-
def endeca_error
|
37
|
+
def endeca_error
|
34
38
|
method_response = response["methodResponse"]
|
35
|
-
fault = method_response &&
|
36
|
-
values = fault &&
|
39
|
+
fault = method_response && method_response["fault"]
|
40
|
+
values = fault && fault["value"]
|
37
41
|
return nil unless values
|
38
42
|
{
|
39
43
|
:code => values["faultCode"].to_i,
|
@@ -41,8 +45,8 @@ module Endeca
|
|
41
45
|
}
|
42
46
|
end
|
43
47
|
|
44
|
-
def endeca_error?
|
45
|
-
!endeca_error
|
48
|
+
def endeca_error?
|
49
|
+
!endeca_error.nil?
|
46
50
|
end
|
47
51
|
|
48
52
|
def get_response #:nodoc:
|
data/lib/endeca.rb
CHANGED
@@ -353,5 +353,12 @@ describe Endeca::Document do
|
|
353
353
|
end
|
354
354
|
end
|
355
355
|
end
|
356
|
+
|
357
|
+
describe "#method_missing" do
|
358
|
+
it "should include a suggestion to add a reader" do
|
359
|
+
lambda{ @document.missing_method }.
|
360
|
+
should raise_error(NoMethodError, "undefined method 'missing_method' for #{@document.inspect}. Do you need to add a reader for it?")
|
361
|
+
end
|
362
|
+
end
|
356
363
|
|
357
364
|
end
|
data/spec/endeca/request_spec.rb
CHANGED
@@ -71,12 +71,26 @@ describe Endeca::Request do
|
|
71
71
|
|
72
72
|
end
|
73
73
|
|
74
|
-
describe '#uri'
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
74
|
+
describe '#uri' do
|
75
|
+
|
76
|
+
describe "with a hash of query options" do
|
77
|
+
|
78
|
+
it "should append the query options onto the url" do
|
79
|
+
query = {:foo => :bar}
|
80
|
+
Endeca::Request.new(@path, query).uri.query.should == query.to_endeca_params
|
81
|
+
end
|
82
|
+
|
79
83
|
end
|
84
|
+
|
85
|
+
describe "with a query with '/_/' in it" do
|
86
|
+
|
87
|
+
it "should not insert the ? before the query" do
|
88
|
+
query = "/Beds-2/Baths-3/Dishwasher/_/N=324432/Ne=listing?test=true"
|
89
|
+
Endeca::Request.new(@path, query).uri.to_s.should == "#{@path}#{query}"
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
80
94
|
end
|
81
95
|
|
82
96
|
describe "with a string of query options" do
|