endeca 1.3.8 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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