solo-rails 0.0.2 → 0.0.3
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/lib/solo-rails/version.rb +1 -1
- data/lib/solo-rails.rb +138 -93
- metadata +7 -7
data/lib/solo-rails/version.rb
CHANGED
data/lib/solo-rails.rb
CHANGED
@@ -15,18 +15,18 @@ module SoloRails
|
|
15
15
|
end
|
16
16
|
|
17
17
|
class Catalogue
|
18
|
-
|
18
|
+
|
19
19
|
def initialize
|
20
|
+
# @site = "http://iser-training.soutron.net/Library/WebServices/SoutronApi.svc/"
|
20
21
|
@site = "http://library.iser.essex.ac.uk/Library/WebServices/SoutronApi.svc/"
|
21
22
|
end
|
22
23
|
|
23
24
|
# returns SoloHash of values for individual catalogue record
|
24
25
|
def show(id)
|
25
|
-
id = id.to_i
|
26
26
|
response = SoloHash.new
|
27
|
-
url = "#{@site}getcatalogue?id=#{id}"
|
27
|
+
url = "#{@site}getcatalogue?id=#{CGI.escape(id)}"
|
28
28
|
begin
|
29
|
-
soutron_data = Nokogiri::XML(open(url
|
29
|
+
soutron_data = Nokogiri::XML(open(url))
|
30
30
|
response[:id] = soutron_data.xpath("/soutron/catalogs_view/ct/cat").attribute("id").text
|
31
31
|
# response[:request_url] = url - removed for security/speed purposes - PG 2011-02-17
|
32
32
|
response[:content_type] = soutron_data.xpath("/soutron/catalogs_view/ct").attribute("name").text
|
@@ -36,99 +36,153 @@ module SoloRails
|
|
36
36
|
response[uscore(f.attribute("name").text).to_sym] = parse_values(f.attribute("ft").text, f.xpath("./vs/v"))
|
37
37
|
end
|
38
38
|
end
|
39
|
+
|
39
40
|
# related records - PG 2011-03-01
|
40
41
|
if soutron_data.xpath("count(/soutron/catalogs_view/ct/cat/related_catalogs)") > 0
|
41
42
|
@related_records = []
|
42
43
|
soutron_data.xpath("/soutron/catalogs_view/ct/cat/related_catalogs/ct").each do |related_ct|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
44
|
+
related_record = SoloHash.new
|
45
|
+
related_record.merge!( { "content_type".to_sym => related_ct.attribute("name").text } )
|
46
|
+
related_ct.xpath('ctlgs/cat').each do |r|
|
47
|
+
related_record.merge!( {"cid".to_sym => r.attribute("id").text } )
|
48
|
+
end
|
49
|
+
@related_records << related_record
|
49
50
|
end
|
50
51
|
response[:related_records] = @related_records
|
51
52
|
end
|
53
|
+
|
52
54
|
rescue
|
53
|
-
response =
|
55
|
+
response = "Record #{id} not found"
|
54
56
|
end
|
55
57
|
return response
|
56
58
|
end
|
57
59
|
|
58
60
|
# returns nested hash record for given search - PG 2011-01-21
|
59
61
|
def search(*args)
|
60
|
-
|
62
|
+
options = args.pop
|
63
|
+
q, ctrt, select, sort, page, material, search_id, per_page, ignore_is_website_feature = iser_solo_parse_options(options)
|
64
|
+
|
65
|
+
# If we have a value of search_id, then should only also pass: search_id, select, sort, page, per_page & material
|
66
|
+
url = "#{@site}searchcatalogues?"
|
67
|
+
query_string = []
|
68
|
+
|
69
|
+
if search_id.present?
|
70
|
+
query_string << "searchid=#{search_id}"
|
71
|
+
else
|
72
|
+
query_string << "q=#{q}"
|
73
|
+
query_string << "ctrt=#{ctrt}" if ctrt.present?
|
74
|
+
end
|
75
|
+
|
76
|
+
query_string << "page=#{page}" if page.present?
|
77
|
+
query_string << "pageSize=#{per_page}" if per_page.present?
|
78
|
+
query_string << "sort=#{sort}" if sort.present?
|
79
|
+
query_string << "fields=#{select}" if select.present?
|
80
|
+
query_string << "material=#{material}" if material.present?
|
81
|
+
|
82
|
+
url += query_string.join("&")
|
83
|
+
|
84
|
+
p "Fetching SOLO data from: #{url}"
|
85
|
+
|
61
86
|
begin
|
62
|
-
|
87
|
+
soutron_data = Nokogiri::XML(open(url, :read_timeout => 180))
|
63
88
|
rescue Exception => e
|
64
89
|
Rails.logger.info("SOLO Error in URL: " + url)
|
65
90
|
end
|
66
|
-
end
|
67
91
|
|
68
|
-
|
92
|
+
response = SoloHash.new
|
93
|
+
Rails.logger.info("#{soutron_data.xpath("/soutron/search_info").attribute("id").text}")
|
94
|
+
meta = {:id => soutron_data.xpath("/soutron/search_info").attribute("id").text}
|
95
|
+
meta["total_items".to_sym] = soutron_data.xpath("/soutron/search_info").attribute("totalItems").text
|
96
|
+
meta["page".to_sym] = page
|
97
|
+
meta["per_page".to_sym] = per_page
|
98
|
+
meta["select".to_sym] = select
|
69
99
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
# If we have a value of search_id, then should only also pass: search_id, select, sort, page, per_page & material
|
75
|
-
if search_id.present?
|
76
|
-
query_string << "searchid=#{search_id}"
|
77
|
-
else
|
78
|
-
query_string << "q=#{q}"
|
79
|
-
query_string << "ctrt=#{ctrt}" if ctrt.present?
|
100
|
+
if soutron_data.xpath("count(//ct)") > 0
|
101
|
+
unless soutron_data.xpath("/soutron/search_info/catalogs_view/ct[*]").first.nil?
|
102
|
+
meta["active_content_type".to_sym] = soutron_data.xpath("/soutron/search_info/catalogs_view/ct[*]").first.attribute("name").text
|
103
|
+
meta["active_content_type_count".to_sym] = soutron_data.xpath("/soutron/search_info/catalogs_view/ct[*]").first.attribute("count").text
|
80
104
|
end
|
81
|
-
query_string << "page=#{page}" if page.present?
|
82
|
-
query_string << "pageSize=#{per_page}" if per_page.present?
|
83
|
-
query_string << "sort=#{sort}" if sort.present?
|
84
|
-
query_string << "fields=#{select}" if select.present?
|
85
|
-
query_string << "material=#{material}" if material.present?
|
86
|
-
url += query_string.join("&")
|
87
105
|
end
|
88
106
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
107
|
+
# meta["request_url".to_sym] = url
|
108
|
+
response.merge!("search_info".to_sym => meta)
|
109
|
+
|
110
|
+
@content_types = []
|
111
|
+
soutron_data.xpath("/soutron/search_info/catalogs_view/ct").each do |ct|
|
112
|
+
|
113
|
+
content_type = SoloHash.new
|
114
|
+
content_type.merge!( { "content_type".to_sym => ct.attribute("name").text } )
|
115
|
+
content_type.merge!( { "size".to_sym => ct.attribute("count").text } )
|
116
|
+
|
117
|
+
@records = []
|
118
|
+
ct.xpath("./ctlgs/cat").each do |cat|
|
119
|
+
|
120
|
+
record = SoloHash.new
|
121
|
+
record.merge!( {:id => cat.attribute("id").text, :record_type => cat.xpath("./rt").attribute("name").text} )
|
122
|
+
|
123
|
+
cat.xpath("./fs/f").each do |f|
|
124
|
+
if f.xpath("count(./vs/v)") > 0 # only include field if it has a value
|
125
|
+
record[uscore(f.attribute("name").text).to_sym] = parse_values(f.attribute("ft").text, f.xpath("./vs/v"))
|
126
|
+
end # / if has value
|
127
|
+
end # /f
|
128
|
+
|
129
|
+
@records << record
|
130
|
+
|
131
|
+
end # /cat
|
132
|
+
|
133
|
+
content_type.merge!({"records".to_sym => @records })
|
134
|
+
@content_types << content_type
|
135
|
+
|
136
|
+
end # /ct
|
137
|
+
|
138
|
+
response.merge!(:content_types => @content_types)
|
139
|
+
|
140
|
+
return response
|
141
|
+
end
|
142
|
+
|
143
|
+
def self.published_years(record_type, limit=nil, q=nil)
|
144
|
+
q.nil? ? q = "Is Website Feature:Y" : q << ";Is Website Feature:Y"
|
145
|
+
newest_record = IserSolo.new.search :q => q,
|
146
|
+
:per_page => 1,
|
147
|
+
:sort => "Publication Date:d",
|
148
|
+
:select => "Publication Date",
|
149
|
+
:ctrt => ":#{record_type}"
|
150
|
+
d = newest_record.content_types.first.records.first.publication_date
|
151
|
+
if (d.to_s =~ /(20|19)\d{2}/) != 0
|
152
|
+
newest_year = Chronic.parse("#{d}").year
|
153
|
+
else
|
154
|
+
newest_year = Chronic.parse("01 Jan #{d}").year
|
155
|
+
end
|
156
|
+
|
157
|
+
oldest_record = IserSolo.new.search :q => q,
|
158
|
+
:per_page => 1,
|
159
|
+
:sort => "Publication Date:a",
|
160
|
+
:select => "Publication Date",
|
161
|
+
:ctrt => ":#{record_type}"
|
162
|
+
d = oldest_record.content_types.first.records.first.publication_date
|
163
|
+
if (d.to_s =~ /(20|19)\d{2}/) != 0
|
164
|
+
oldest_year = Chronic.parse("#{d}").year
|
165
|
+
else
|
166
|
+
oldest_year = Chronic.parse("01 Jan #{d}").year
|
124
167
|
end
|
168
|
+
if limit.nil?
|
169
|
+
newest_year.downto(oldest_year)
|
170
|
+
else
|
171
|
+
Range.new(oldest_year, newest_year).to_a.reverse[0..limit]
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
private
|
125
176
|
|
126
177
|
# returns array of URL safe variables from options
|
127
178
|
def iser_solo_parse_options(options)
|
128
179
|
q = options[:q]
|
129
180
|
unless options[:ignore_is_website_feature] == true
|
130
|
-
q.nil? ? nil : q << ";Is
|
181
|
+
q.nil? ? nil : q << ";Is ISER Staff Publication:Y"
|
131
182
|
end
|
183
|
+
# unless options[:ignore_is_website_feature] == true
|
184
|
+
# q.nil? ? nil : q << ";Is Website Feature:Y"
|
185
|
+
# end
|
132
186
|
ctrt = options[:ctrt]
|
133
187
|
select = options[:select]
|
134
188
|
sort = options[:sort]
|
@@ -171,20 +225,18 @@ module SoloRails
|
|
171
225
|
def parse_value(field_type, element)
|
172
226
|
field_type = field_type.to_i
|
173
227
|
case field_type
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
element
|
185
|
-
|
186
|
-
when 8 then parse_complex_date(element)
|
187
|
-
else field_type
|
228
|
+
when 1, 4, 5, 6, 11, 12 then element.text.to_s
|
229
|
+
when 2 then element.text.to_i
|
230
|
+
when 3 then Date.parse(element.text.to_s)
|
231
|
+
# when 3 then element.text.to_s
|
232
|
+
when 7 then element.text.to_s
|
233
|
+
# if element.attribute("desc").value.size > 0 && !element.attribute("desc").value.eql?(element.text.to_s)
|
234
|
+
# "#{element.attribute("desc")} - #{ActionController::Base.helpers.auto_link(element.text.to_s)}"
|
235
|
+
# else
|
236
|
+
# ActionController::Base.helpers.auto_link(element.text.to_s)
|
237
|
+
# end
|
238
|
+
when 8 then parse_complex_date(element)
|
239
|
+
else field_type
|
188
240
|
end
|
189
241
|
end
|
190
242
|
|
@@ -197,28 +249,21 @@ module SoloRails
|
|
197
249
|
date << d[0] unless d[0].nil?
|
198
250
|
circa = "circa " if element.attribute("circa").to_s == "1"
|
199
251
|
nodate = "forthcoming " if element.attribute("nodate").to_s == "1"
|
200
|
-
ongoing = "ongoing" if element.attribute("ongoing").to_s == "1"
|
252
|
+
ongoing = "ongoing" if element.attribute("ongoing").to_s == "1"
|
201
253
|
begin
|
202
254
|
ret = Date.parse("#{date[0]}-#{date[1]}-#{date[2]}")
|
203
255
|
rescue
|
204
|
-
ret = "#{circa}#{nodate}#{date.join("-")} #{ongoing}".capitalize
|
256
|
+
ret = "#{circa}#{nodate}#{date.join("-")} #{ongoing}".capitalize
|
205
257
|
end
|
206
258
|
ret
|
207
259
|
end
|
208
260
|
|
209
|
-
# removes spaces from 'str' and then
|
261
|
+
# removes spaces from 'str' and then applies rails underscore method
|
210
262
|
# converts strings like "Publication Date" into "publication_date"
|
211
263
|
def uscore(str)
|
212
|
-
|
213
|
-
word = word.to_s.dup
|
214
|
-
word.gsub!(/::/, '/')
|
215
|
-
word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
216
|
-
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
217
|
-
word.tr!("-", "_")
|
218
|
-
word.downcase!
|
219
|
-
word
|
264
|
+
str.gsub(/\s*/,"").underscore
|
220
265
|
end
|
221
|
-
|
266
|
+
|
222
267
|
end
|
223
268
|
|
224
269
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solo-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-01-13 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70095837742940 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70095837742940
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: nokogiri
|
27
|
-
requirement: &
|
27
|
+
requirement: &70095837742140 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70095837742140
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: chronic
|
38
|
-
requirement: &
|
38
|
+
requirement: &70095837741340 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70095837741340
|
47
47
|
description: Provides methods to query Soutron Solo catalog from Ruby
|
48
48
|
email:
|
49
49
|
- github@modagoo.co.uk
|