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 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