primedia-endeca 0.12.0 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -13,6 +13,8 @@ rescue LoadError
13
13
  end
14
14
  end
15
15
 
16
+ begin; require 'metric_fu'; rescue LoadError; end
17
+
16
18
  ensure_in_path 'lib'
17
19
  require 'endeca'
18
20
 
data/endeca.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{endeca}
5
- s.version = "0.12.0"
5
+ s.version = "0.14.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Rein Henrichs", "Andy Stone"]
@@ -1,7 +1,7 @@
1
1
  module Endeca
2
2
 
3
3
  class Breadcrumb
4
- extend Readers
4
+ include Readers
5
5
 
6
6
  def self.create(raw)
7
7
  name = raw['Type']
@@ -1,8 +1,8 @@
1
1
  module Endeca
2
2
  class Dimension
3
3
  include Comparable
4
+ include Readers
4
5
  extend ClassToProc
5
- extend Readers
6
6
 
7
7
  reader \
8
8
  "DimValueName" => :name,
@@ -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 = request(query_options)
97
- if response['AggrRecords']
98
- record = response['AggrRecords'].first['Records'].first
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
- record = response['Records'].first
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)
@@ -2,78 +2,92 @@ module Endeca
2
2
  class ReaderError < ::StandardError; end
3
3
 
4
4
  module Readers
5
- def add_reader(name, &block)
6
- meta = (class << self; self; end)
7
- meta.instance_eval do
8
- define_method(name) { |*attrs| reader(*attrs, &block) }
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
- # Maps key/value pairs from the data structure used to initialize a
13
- # Endeca object. Allows attribute renaming. Use a block to perform data
14
- # injunction on the value as it is set.
15
- #
16
- # ==== Examples
17
- #
18
- # # Specify basic attributes
19
- # reader :title
20
- #
21
- # # Attribute renaming
22
- # reader :long_desc => :description
23
- #
24
- # # Data injunction
25
- # reader(:title => :upcased_title) { |title| title.upcase }
26
- def reader(*attrs,&block)
27
- hash = {}
28
- block ||= lambda {|x| x}
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
- hash.update(attrs.pop) if Hash === attrs.last
31
+ hash.update(attrs.pop) if Hash === attrs.last
31
32
 
32
- attrs.each{ |attr| hash[attr] = attr }
33
+ attrs.each{ |attr| hash[attr] = attr }
33
34
 
34
- hash.each do |variable, method|
35
- reader_names << method if respond_to?(:reader_names)
36
- define_method(method) do
37
- begin
38
- block.call(attributes[variable.to_s])
39
- rescue StandardError => e
40
- raise Endeca::ReaderError, e.message
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
- # Typecasts attributes as integers.
47
- #
48
- # ==== Examples
49
- # integer_reader :id, :rating
50
- def integer_reader(*attrs)
51
- reader(*attrs) { |value| Integer(value) }
52
- end
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
- # Typecasts attributes as BigDecimal
55
- #
56
- # ==== Examples
57
- # decimal_reader :price
58
- def decimal_reader(*attrs)
59
- require 'bigdecimal' unless defined?(BigDecimal)
60
- reader(*attrs) { |value| BigDecimal(value.to_s) }
61
- end
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
- # Typecasts attributes as a Perly boolean ("0" == false, "1" == true")
72
- #
73
- # ==== Examples
74
- # boolean_reader :price
75
- def boolean_reader(*attrs)
76
- reader(*attrs) { |value| value == "1" ? true : false }
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
@@ -1,7 +1,7 @@
1
1
  module Endeca
2
2
  class Refinement
3
+ include Readers
3
4
  extend ClassToProc
4
- extend Readers
5
5
 
6
6
  reader 'DimensionName' => :name,
7
7
  'ExpansionLink' => :expansion_link,
@@ -1,8 +1,8 @@
1
1
  module Endeca
2
2
  class RefinementDimension
3
3
  include Comparable
4
+ include Readers
4
5
  extend ClassToProc
5
- extend Readers
6
6
 
7
7
  reader \
8
8
  "DimensionName" => :name,
@@ -15,25 +15,29 @@ module Endeca
15
15
  end
16
16
 
17
17
  def perform
18
- response = handle_response(get_response)
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(response)
37
+ def endeca_error
34
38
  method_response = response["methodResponse"]
35
- fault = method_response && response["methodResponse"]["fault"]
36
- values = fault && response["methodResponse"]["fault"]["value"]
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?(response)
45
- !endeca_error(response).nil?
48
+ def endeca_error?
49
+ !endeca_error.nil?
46
50
  end
47
51
 
48
52
  def get_response #:nodoc:
data/lib/endeca.rb CHANGED
@@ -26,7 +26,7 @@ module Endeca
26
26
  extend Logging
27
27
 
28
28
  # :stopdoc:
29
- VERSION = '0.12.0'
29
+ VERSION = '0.11.0'
30
30
  # :startdoc:
31
31
 
32
32
  # Returns the version string for the library.
@@ -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
@@ -71,12 +71,26 @@ describe Endeca::Request do
71
71
 
72
72
  end
73
73
 
74
- describe '#uri'
75
- describe "with a hash of query options" do
76
- it "should append the query options onto the url" do
77
- query = {:foo => :bar}
78
- Endeca::Request.new(@path, query).uri.query.should == query.to_endeca_params
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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: primedia-endeca
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rein Henrichs