endeca 1.3.8 → 1.4.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.
@@ -0,0 +1,7 @@
1
+ *.swp
2
+ .swn
3
+ .swp
4
+ .DS_Store
5
+ coverage/
6
+ pkg/
7
+ doc/
data/Rakefile CHANGED
@@ -1,22 +1,10 @@
1
- # Look in the tasks/setup.rb file for the various options that can be
2
- # configured in this Rakefile. The .rake files in the tasks directory
3
- # are where the options are used.
1
+ require 'rubygems'
4
2
 
5
- begin
6
- require 'bones'
7
- Bones.setup
8
- rescue LoadError
9
- begin
10
- load 'tasks/setup.rb'
11
- rescue LoadError
12
- raise RuntimeError, '### please install the "bones" gem ###'
13
- end
14
- end
15
-
16
- begin; require 'metric_fu'; rescue LoadError; end
3
+ require File.join(File.dirname(__FILE__),'lib', 'endeca')
17
4
 
18
- ensure_in_path 'lib'
19
- require 'endeca'
5
+ desire('rake')
6
+ desire('rcov')
7
+ desire('spec/rake/spectask')
20
8
 
21
9
  task :default => 'rcov'
22
10
 
@@ -39,14 +27,18 @@ Spec::Rake::SpecTask.new(:rcov) do |t|
39
27
  t.rcov_opts = IO.readlines("spec/rcov.opts").map {|l| l.chomp.split " "}.flatten
40
28
  end
41
29
 
42
- PROJ.name = 'endeca'
43
- PROJ.authors = ['Rein Henrichs', 'Andy Stone']
44
- PROJ.email = ''
45
- PROJ.url = 'http://github.com/primedia/endeca-ruby'
46
- PROJ.version = Endeca::VERSION
47
- PROJ.rubyforge.name = 'endeca'
48
- PROJ.readme_file = "README.rdoc"
49
- PROJ.exclude << '.swp'
50
- PROJ.exclude << '.gitignore'
51
-
52
- # EOF
30
+ begin
31
+ require 'jeweler'
32
+ Jeweler::Tasks.new do |gemspec|
33
+ gemspec.name = "endeca"
34
+ gemspec.version = Endeca.version
35
+ gemspec.summary = "Endeca adapter for use with the Endeca Bridge"
36
+ gemspec.email = ""
37
+ gemspec.homepage = 'http://github.com/primedia/endeca-ruby'
38
+ gemspec.authors = ["Primedia Team"]
39
+ gemspec.add_development_dependency('rspec')
40
+ end
41
+ Jeweler::GemcutterTasks.new
42
+ rescue LoadError
43
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
44
+ end
@@ -1,33 +1,92 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
1
4
  # -*- encoding: utf-8 -*-
2
5
 
3
6
  Gem::Specification.new do |s|
4
7
  s.name = %q{endeca}
5
- s.version = "1.3.8"
8
+ s.version = "1.4.0"
6
9
 
7
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
- s.authors = ["Rein Henrichs", "Andy Stone"]
9
- s.date = %q{2009-11-13}
10
- s.description = %q{An Endeca client library for Ruby.}
11
+ s.authors = ["Primedia Team"]
12
+ s.date = %q{2010-02-19}
11
13
  s.email = %q{}
12
- s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.rdoc"]
13
- s.files = ["History.txt", "Manifest.txt", "README.rdoc", "Rakefile", "endeca.gemspec", "example/benchmark.rb", "example/listing.rb", "lib/class_to_proc.rb", "lib/core_ext.rb", "lib/endeca.rb", "lib/endeca/benchmarking.rb", "lib/endeca/breadcrumb.rb", "lib/endeca/breadcrumbs.rb", "lib/endeca/dimension.rb", "lib/endeca/document.rb", "lib/endeca/document_collection.rb", "lib/endeca/logging.rb", "lib/endeca/map.rb", "lib/endeca/readers.rb", "lib/endeca/refinement.rb", "lib/endeca/refinement_dimension.rb", "lib/endeca/request.rb", "lib/endeca/transformer.rb", "spec/core_ext_spec.rb", "spec/endeca/benchmarking_spec.rb", "spec/endeca/breadcrumb_spec.rb", "spec/endeca/dimension_spec.rb", "spec/endeca/document_collection_spec.rb", "spec/endeca/document_spec.rb", "spec/endeca/map_spec.rb", "spec/endeca/readers_spec.rb", "spec/endeca/refinement_dimension_spec.rb", "spec/endeca/refinement_spec.rb", "spec/endeca/request_spec.rb", "spec/endeca/transformer_spec.rb", "spec/endeca_spec.rb", "spec/rcov.opts", "spec/spec.opts", "spec/spec_helper.rb"]
14
+ s.extra_rdoc_files = [
15
+ "README.rdoc"
16
+ ]
17
+ s.files = [
18
+ ".gitignore",
19
+ "Manifest.txt",
20
+ "README.rdoc",
21
+ "Rakefile",
22
+ "endeca.gemspec",
23
+ "example/benchmark.rb",
24
+ "example/listing.rb",
25
+ "lib/core_ext.rb",
26
+ "lib/endeca.rb",
27
+ "lib/endeca/benchmarking.rb",
28
+ "lib/endeca/breadcrumb.rb",
29
+ "lib/endeca/breadcrumbs.rb",
30
+ "lib/endeca/dimension.rb",
31
+ "lib/endeca/document.rb",
32
+ "lib/endeca/document_collection.rb",
33
+ "lib/endeca/logging.rb",
34
+ "lib/endeca/map.rb",
35
+ "lib/endeca/readers.rb",
36
+ "lib/endeca/refinement.rb",
37
+ "lib/endeca/refinement_dimension.rb",
38
+ "lib/endeca/request.rb",
39
+ "lib/endeca/transformer.rb",
40
+ "spec/core_ext_spec.rb",
41
+ "spec/endeca/benchmarking_spec.rb",
42
+ "spec/endeca/breadcrumb_spec.rb",
43
+ "spec/endeca/dimension_spec.rb",
44
+ "spec/endeca/document_collection_spec.rb",
45
+ "spec/endeca/document_spec.rb",
46
+ "spec/endeca/map_spec.rb",
47
+ "spec/endeca/readers_spec.rb",
48
+ "spec/endeca/refinement_dimension_spec.rb",
49
+ "spec/endeca/refinement_spec.rb",
50
+ "spec/endeca/request_spec.rb",
51
+ "spec/endeca/transformer_spec.rb",
52
+ "spec/endeca_spec.rb",
53
+ "spec/rcov.opts",
54
+ "spec/spec.opts",
55
+ "spec/spec_helper.rb"
56
+ ]
14
57
  s.homepage = %q{http://github.com/primedia/endeca-ruby}
15
- s.rdoc_options = ["--main", "README.rdoc"]
58
+ s.rdoc_options = ["--charset=UTF-8"]
16
59
  s.require_paths = ["lib"]
17
- s.rubyforge_project = %q{endeca}
18
60
  s.rubygems_version = %q{1.3.5}
19
- s.summary = %q{An Endeca client library for Ruby}
61
+ s.summary = %q{Endeca adapter for use with the Endeca Bridge}
62
+ s.test_files = [
63
+ "spec/endeca_spec.rb",
64
+ "spec/core_ext_spec.rb",
65
+ "spec/endeca/document_collection_spec.rb",
66
+ "spec/endeca/readers_spec.rb",
67
+ "spec/endeca/request_spec.rb",
68
+ "spec/endeca/transformer_spec.rb",
69
+ "spec/endeca/breadcrumb_spec.rb",
70
+ "spec/endeca/document_spec.rb",
71
+ "spec/endeca/refinement_spec.rb",
72
+ "spec/endeca/map_spec.rb",
73
+ "spec/endeca/refinement_dimension_spec.rb",
74
+ "spec/endeca/dimension_spec.rb",
75
+ "spec/endeca/benchmarking_spec.rb",
76
+ "spec/spec_helper.rb"
77
+ ]
20
78
 
21
79
  if s.respond_to? :specification_version then
22
80
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
23
81
  s.specification_version = 3
24
82
 
25
83
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
26
- s.add_development_dependency(%q<bones>, [">= 2.4.0"])
84
+ s.add_development_dependency(%q<rspec>, [">= 0"])
27
85
  else
28
- s.add_dependency(%q<bones>, [">= 2.4.0"])
86
+ s.add_dependency(%q<rspec>, [">= 0"])
29
87
  end
30
88
  else
31
- s.add_dependency(%q<bones>, [">= 2.4.0"])
89
+ s.add_dependency(%q<rspec>, [">= 0"])
32
90
  end
33
91
  end
92
+
@@ -1,4 +1,18 @@
1
+ module Kernel
2
+ def desire(library)
3
+ require library
4
+ true
5
+ rescue LoadError
6
+ STDERR.puts "warning: #{library} gem desired but not found."
7
+ false
8
+ end
9
+ end
10
+
1
11
  class Object
12
+ def self.ruby_version
13
+ RUBY_VERSION
14
+ end
15
+
2
16
  def blank?
3
17
  respond_to?(:empty?) ? empty? : !self
4
18
  end
@@ -13,7 +27,7 @@ end
13
27
  require 'benchmark'
14
28
  class << Benchmark
15
29
  # Earlier Ruby had a slower implementation.
16
- if RUBY_VERSION < '1.8.7'
30
+ if ruby_version < '1.8.7'
17
31
  remove_method :realtime
18
32
 
19
33
  def realtime
@@ -1,11 +1,9 @@
1
- require 'rubygems'
2
- require 'net/http'
3
- require 'json'
1
+ require 'curb'
2
+ require 'yajl'
4
3
  require 'logger'
5
4
 
6
5
  $:.unshift(File.dirname(__FILE__))
7
6
  require 'core_ext'
8
- require 'class_to_proc'
9
7
  require 'endeca/logging'
10
8
  require 'endeca/benchmarking'
11
9
  require 'endeca/readers'
@@ -26,7 +24,7 @@ module Endeca
26
24
  extend Logging
27
25
 
28
26
  # :stopdoc:
29
- VERSION = '1.3.8'
27
+ VERSION = '1.4.0'
30
28
  # :startdoc:
31
29
 
32
30
  # Returns the version string for the library.
@@ -46,19 +44,6 @@ module Endeca
46
44
  debug && logger && benchmark
47
45
  end
48
46
 
49
- def timer
50
- @timer ||= get_timer
51
- end
52
-
53
- private
54
-
55
- def get_timer
56
- require 'system_timer'
57
- SystemTimer
58
- rescue LoadError
59
- require 'timeout'
60
- Timeout
61
- end
62
47
  end
63
48
 
64
49
  self.logger = Logger.new(STDOUT)
@@ -66,7 +51,6 @@ module Endeca
66
51
  self.benchmark = false
67
52
  self.timeout = 8
68
53
 
69
-
70
54
  # Endeca URIs require colons to be escaped
71
55
  def self.escape(str)
72
56
  URI.escape(str, /[^-_.!~*'()a-zA-Z\d;\/?@&=+$,\[\]]/n)
@@ -1,5 +1,3 @@
1
- require 'benchmark'
2
-
3
1
  module Endeca
4
2
  module Benchmarking
5
3
  # Log and benchmark the workings of a single block. Will only be called if
@@ -17,10 +17,6 @@ module Endeca
17
17
  breadcrumb_class.new(raw)
18
18
  end
19
19
 
20
- def self.to_proc
21
- proc(&method(:create))
22
- end
23
-
24
20
  attr_reader :raw
25
21
  def initialize(raw={})
26
22
  @raw = raw
@@ -2,7 +2,6 @@ module Endeca
2
2
  class Dimension
3
3
  include Comparable
4
4
  include Readers
5
- extend ClassToProc
6
5
 
7
6
  reader \
8
7
  "DimValueName" => :name,
@@ -7,7 +7,6 @@ module Endeca
7
7
  # typecasting) and a few basic examples are provided (i.e. +integer_reader+).
8
8
  class Document
9
9
  include Readers
10
- extend ClassToProc
11
10
  extend Transformer
12
11
 
13
12
  inherited_accessor :mappings, {}
@@ -52,7 +51,7 @@ DefaultParams:\n\t#{get_default_params.collect{|k,v| "#{k}: #{v.inspect}\n\t"}.t
52
51
  @dimensions = {}
53
52
  (raw['Dimensions'] || {}).each do |name, values|
54
53
  values = [values] unless Array === values
55
- @dimensions[name] = values.map(&Dimension)
54
+ @dimensions[name] = values.map{|value| Dimension.new(value)}
56
55
  end
57
56
  @dimensions
58
57
  end
@@ -87,7 +86,7 @@ DefaultParams:\n\t#{get_default_params.collect{|k,v| "#{k}: #{v.inspect}\n\t"}.t
87
86
  # Listing.find(:first, :available => true)
88
87
  def self.find(what, query_options={})
89
88
  case what
90
- when Integer, /^[A-Z\d]+$/
89
+ when Integer, /^[A-Za-z\d]+$/
91
90
  by_id(what, query_options)
92
91
  when String
93
92
  all(what)
@@ -18,7 +18,6 @@ module Endeca
18
18
  # borrowed from Rake::FileList)
19
19
  class DocumentCollection
20
20
  include Readers
21
- extend ClassToProc
22
21
 
23
22
  attr_reader :raw
24
23
  def initialize(raw, document_klass=Document)
@@ -59,9 +58,9 @@ module Endeca
59
58
  # The internal collection of Document objects. Array methods are delegated here.
60
59
  def documents
61
60
  if @raw['Records']
62
- @documents ||= @raw['Records'].map(&@document_klass)
61
+ @documents ||= @raw['Records'].map{|record| @document_klass.new(record)}
63
62
  elsif aggregate?
64
- @documents ||= @raw['AggrRecords'].map{|aggregate| aggregate['Records'].first}.map(&@document_klass)
63
+ @documents ||= @raw['AggrRecords'].map{|aggregate| aggregate['Records'].first}.map{|record| @document_klass.new(record)}
65
64
  else
66
65
  []
67
66
  end
@@ -73,12 +72,12 @@ module Endeca
73
72
 
74
73
  # The collection of Refinement objects for the collection.
75
74
  def refinements
76
- @refinements ||= (@raw['Refinements'] || []).map(&Refinement)
75
+ @refinements ||= (@raw['Refinements'] || []).map{|data| Refinement.new(data)}
77
76
  end
78
77
 
79
78
  # The collection of Breadcrumb objects for the collection.
80
79
  def breadcrumbs
81
- @breadcrumbs ||= (@raw['Breadcrumbs'] || []).map(&Breadcrumb)
80
+ @breadcrumbs ||= (@raw['Breadcrumbs'] || []).map{|data| Breadcrumb.create(data)}
82
81
  end
83
82
 
84
83
  # Return the refinement by name
@@ -1,7 +1,6 @@
1
1
  module Endeca
2
2
  class Refinement
3
3
  include Readers
4
- extend ClassToProc
5
4
 
6
5
  reader 'DimensionName' => :name,
7
6
  'ExpansionLink' => :expansion_link,
@@ -10,11 +9,11 @@ module Endeca
10
9
  integer_reader 'DimensionID' => :id
11
10
 
12
11
  reader('DimensionValues' => :dimension_values) do |values|
13
- values.map(&Dimension) if values
12
+ values.map{|value| Dimension.new(value)} if values
14
13
  end
15
14
 
16
15
  reader('Dimensions' => :dimensions) do |values|
17
- values.map(&RefinementDimension) if values
16
+ values.map{|value| RefinementDimension.new(value)} if values
18
17
  end
19
18
 
20
19
  attr_reader :raw
@@ -2,7 +2,6 @@ module Endeca
2
2
  class RefinementDimension
3
3
  include Comparable
4
4
  include Readers
5
- extend ClassToProc
6
5
 
7
6
  reader \
8
7
  "DimensionName" => :name,
@@ -1,4 +1,3 @@
1
- require 'uri'
2
1
 
3
2
  module Endeca
4
3
  class RequestError < ::StandardError; end
@@ -27,10 +26,8 @@ module Endeca
27
26
  def uri
28
27
  return @uri if @uri
29
28
 
30
- @uri = URI.parse(@path)
31
- @uri.query = query_string unless !@query || @query.include?("/_/")
32
- @uri = URI.parse("#{@path}#{@query}") if @query && @query.include?("/_/")
33
- @uri
29
+ path_query = query_string
30
+ @uri = path_query ? "#{@path}?#{path_query}" : @path
34
31
  end
35
32
 
36
33
  private
@@ -51,38 +48,43 @@ module Endeca
51
48
  end
52
49
 
53
50
  def get_response #:nodoc:
54
- Endeca.log "ENDECA ADAPTER REQUEST"
55
- Endeca.log " parameters => " + @query.inspect
56
- Endeca.log " uri => " + uri.to_s
57
- Endeca.bm(:request_time, "#{@path} #{@query.inspect}") do
58
- Endeca.timer.timeout(Endeca.timeout) do
59
- @response = Net::HTTP.get_response(uri)
60
- end
61
- end
51
+ Endeca.log "ENDECA ADAPTER REQUEST"
52
+ Endeca.log " parameters => " + @query.inspect
53
+ Endeca.log " uri => " + uri.to_s
54
+ Endeca.bm(:request_time, "#{@path} #{@query.inspect}") do
55
+ begin
56
+ @response = Curl::Easy.perform(uri.to_s) do |curl|
57
+ curl.timeout = Endeca.timeout
58
+ end
59
+ rescue => e
60
+ raise RequestError, e.message
61
+ end
62
+ end
62
63
 
63
- return @response
64
- end
65
-
66
- # Raises exception Net::XXX (http error code) if an http error occured
67
- def handle_response(response) #:nodoc:
68
- case response
69
- when Net::HTTPSuccess
70
- Endeca.bm :parse_time do
71
- @json = JSON.parse(response.body)
72
- end
73
- else
74
- response.error! # raises exception corresponding to http error Net::XXX
75
- end
64
+ return @response
65
+ end
76
66
 
77
- rescue => e
78
- raise RequestError, e.message
79
- end
67
+ def handle_response(response) #:nodoc:
68
+ case response.response_code.to_s
69
+ when "200"
70
+ Endeca.bm :parse_time do
71
+ begin
72
+ @json = Yajl::Parser.parse(response.body_str)
73
+ rescue Yajl::ParseError => e
74
+ raise RequestError, "JSON Parse error: #{e}"
75
+ end
76
+ end
77
+ else
78
+ raise RequestError, "#{response.response_code} HTTP Error"
79
+ end
80
+ end
80
81
 
81
- def query_string
82
- query_string_parts = [@uri.query, @query.to_endeca_params]
83
- query_string_parts.reject!{ |s| s.nil? || s.empty? }
82
+ def query_string
83
+ @path.match(/\?(.*)$/)
84
+ query_string_parts = [$1, @query.to_endeca_params]
85
+ query_string_parts.reject!{ |s| s.nil? || s.empty? }
84
86
 
85
- query_string_parts.empty? ? nil : query_string_parts.join('&')
86
- end
87
+ query_string_parts.empty? ? nil : query_string_parts.join('&')
88
+ end
87
89
  end
88
90
  end