idol-search 0.3.0 → 0.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.
- data/VERSION +1 -1
- data/idol-search.gemspec +2 -2
- data/lib/idol-search.rb +87 -5
- data/test/test_idol-search.rb +42 -0
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/idol-search.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "idol-search"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.4.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Shane Sherman"]
|
12
|
-
s.date = "2013-01-
|
12
|
+
s.date = "2013-01-23"
|
13
13
|
s.description = "ruby client for autonomy idol search"
|
14
14
|
s.email = "shane.sherman@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/idol-search.rb
CHANGED
@@ -41,16 +41,23 @@ module Idol
|
|
41
41
|
module OptionalParams
|
42
42
|
def has_optional_params(*params)
|
43
43
|
params.flatten.each do |opt_param|
|
44
|
+
|
45
|
+
# reader
|
46
|
+
define_method("#{opt_param}") { @parameters[opt_param] }
|
47
|
+
|
48
|
+
# write the value to params
|
44
49
|
define_method :"#{opt_param}" do |value|
|
45
50
|
instance_variable_set("@#{opt_param}", value)
|
46
51
|
@parameters[opt_param.gsub("_", "")] = value
|
47
52
|
return self
|
48
53
|
end
|
54
|
+
|
49
55
|
end
|
50
56
|
end
|
51
|
-
|
52
57
|
end
|
53
58
|
|
59
|
+
|
60
|
+
|
54
61
|
module BasicIdolFunctionality
|
55
62
|
attr_accessor :url, :filters, :parameters, :raw_results
|
56
63
|
attr_reader :action
|
@@ -81,9 +88,11 @@ module Idol
|
|
81
88
|
end
|
82
89
|
|
83
90
|
request.http_post(*post_fields)
|
84
|
-
|
85
|
-
|
86
|
-
|
91
|
+
return body if @raw_results
|
92
|
+
results = if abridged
|
93
|
+
AbridgedResultsParser.new(body).parse
|
94
|
+
else
|
95
|
+
Hash.from_xml(body)
|
87
96
|
end
|
88
97
|
results
|
89
98
|
end
|
@@ -95,7 +104,6 @@ module Idol
|
|
95
104
|
post_fields << Curl::PostField.content("fieldtext", @filters.to_idol_syntax)
|
96
105
|
end
|
97
106
|
|
98
|
-
puts "@params: #{@parameters.inspect}"
|
99
107
|
@parameters.each do |name, values|
|
100
108
|
post_fields << Curl::PostField.content(name, values)
|
101
109
|
end
|
@@ -103,6 +111,80 @@ module Idol
|
|
103
111
|
end
|
104
112
|
end
|
105
113
|
|
114
|
+
class AbridgedResultsParser
|
115
|
+
attr_accessor :result, :parsed_result
|
116
|
+
def initialize(result)
|
117
|
+
@result = result
|
118
|
+
end
|
119
|
+
|
120
|
+
def parse
|
121
|
+
fields = []
|
122
|
+
autoparsed_result = Hash.from_xml(@result)
|
123
|
+
xml = Nokogiri::XML(@result)
|
124
|
+
|
125
|
+
autn_ids = xml.xpath('//autn:abrid').first.content.split(",")
|
126
|
+
weights = xml.xpath('//autn:abrweight')[0].content.split(',').map{|w|w.to_i}
|
127
|
+
|
128
|
+
# parse out the field meta data
|
129
|
+
xml.xpath('//autn:abrfield').each do |field_data|
|
130
|
+
name = field_data.xpath('autn:abrname')[0].content
|
131
|
+
lengths = field_data.xpath('autn:abrlength')[0].content.split(',').map{|l| l.to_i }
|
132
|
+
values = field_data.xpath('autn:abrvalue')[0].content.strip
|
133
|
+
array_size_of_values = field_data.xpath('autn:abrnumber')[0].content.split(',').map{|n| n.to_i }
|
134
|
+
|
135
|
+
current_values_position = 0
|
136
|
+
parsed_values = []
|
137
|
+
|
138
|
+
# the abridged results store everything in a big long string with the lengths to
|
139
|
+
# split on in a different comma seperated string. so it's parse out the values based
|
140
|
+
# on the value length
|
141
|
+
lengths.each do |length|
|
142
|
+
parsed_values << values[current_values_position, length]
|
143
|
+
current_values_position += length
|
144
|
+
end
|
145
|
+
|
146
|
+
# if the value is an array there's some additional magic that needs to be done to get the right array value
|
147
|
+
final_values = []
|
148
|
+
index = 0
|
149
|
+
array_size_of_values.each do |array_size|
|
150
|
+
if array_size == 1
|
151
|
+
final_values << parsed_values[index]
|
152
|
+
elsif array_size > 1
|
153
|
+
final_values << parsed_values[index, array_size]
|
154
|
+
end
|
155
|
+
index += 1
|
156
|
+
end
|
157
|
+
|
158
|
+
fields << {:name => name, :values => final_values}
|
159
|
+
end
|
160
|
+
|
161
|
+
normalized_results = []
|
162
|
+
index = 0
|
163
|
+
|
164
|
+
# build a hash that mimics the hash from the unabridged normal results
|
165
|
+
autn_ids.each do |id|
|
166
|
+
result = {:id => id, :weight => weights[index], :content => {}}
|
167
|
+
fields.each do |field|
|
168
|
+
section, name = field[:name].split("/")
|
169
|
+
unless result[:content].has_key?(section)
|
170
|
+
result[:content][section] = {}
|
171
|
+
end
|
172
|
+
result[:content][section][name] = field[:values][index]
|
173
|
+
end
|
174
|
+
normalized_results << result
|
175
|
+
index += 1
|
176
|
+
end
|
177
|
+
|
178
|
+
response_data = autoparsed_result[:autnresponse][:responsedata]
|
179
|
+
response_data[:hit] = normalized_results
|
180
|
+
response_data.delete(:abrid)
|
181
|
+
response_data.delete(:abrweight)
|
182
|
+
response_data.delete(:abrfield)
|
183
|
+
@parsed_result = autoparsed_result
|
184
|
+
@parsed_result
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
106
188
|
class Query
|
107
189
|
extend OptionalParams
|
108
190
|
include BasicIdolFunctionality
|
data/test/test_idol-search.rb
CHANGED
@@ -87,4 +87,46 @@ class TestIdolSearch < Test::Unit::TestCase
|
|
87
87
|
|
88
88
|
end
|
89
89
|
|
90
|
+
ABRIDGED_RESULTS_DATA = <<END_DATA
|
91
|
+
<autnresponse xmlns:autn="http://schemas.autonomy.com/aci/">
|
92
|
+
<action>QUERY</action>
|
93
|
+
<response>SUCCESS</response>
|
94
|
+
<responsedata>
|
95
|
+
<autn:numhits>6</autn:numhits>
|
96
|
+
<autn:abridged>1</autn:abridged>
|
97
|
+
<autn:abrid>6747,6731,6702,6676,6515,6511</autn:abrid>
|
98
|
+
<autn:abrweight>9683,9683,9683,9683,9683,9683</autn:abrweight>
|
99
|
+
<autn:abrfield>
|
100
|
+
<autn:abrname>DOCUMENT/NGEN_TYPE</autn:abrname>
|
101
|
+
<autn:abrnumber>1,1,1,1,2,2</autn:abrnumber>
|
102
|
+
<autn:abrlength>8,8,8,8,7,7,7,7</autn:abrlength>
|
103
|
+
<autn:abrvalue>
|
104
|
+
BlogPostBlogPostBlogPostBlogPostArticleArticleArticleArticle
|
105
|
+
</autn:abrvalue>
|
106
|
+
</autn:abrfield>
|
107
|
+
<autn:abrfield>
|
108
|
+
<autn:abrname>DOCUMENT/ID</autn:abrname>
|
109
|
+
<autn:abrnumber>1,1,1,1,0,0</autn:abrnumber>
|
110
|
+
<autn:abrlength>24,24,24,24</autn:abrlength>
|
111
|
+
<autn:abrvalue>
|
112
|
+
50fdf2401772be26af00010f50fdc80f1772be269c00010a50fd82631772be269c00008d50fd82601772be269c000056
|
113
|
+
</autn:abrvalue>
|
114
|
+
</autn:abrfield>
|
115
|
+
</responsedata>
|
116
|
+
</autnresponse>
|
117
|
+
END_DATA
|
118
|
+
|
119
|
+
context "Abridged results parser" do
|
120
|
+
setup do
|
121
|
+
@parser = Idol::AbridgedResultsParser.new(ABRIDGED_RESULTS_DATA)
|
122
|
+
@parsed_result = @parser.parse
|
123
|
+
end
|
124
|
+
|
125
|
+
should "parse the data correctly" do
|
126
|
+
assert_equal 6, @parsed_result[:autnresponse][:responsedata][:hit].count
|
127
|
+
end
|
128
|
+
|
129
|
+
|
130
|
+
end
|
131
|
+
|
90
132
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: idol-search
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: curb
|
@@ -159,7 +159,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
159
159
|
version: '0'
|
160
160
|
segments:
|
161
161
|
- 0
|
162
|
-
hash: -
|
162
|
+
hash: -3348675117184048522
|
163
163
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
164
164
|
none: false
|
165
165
|
requirements:
|