wckbapi 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/wckbapi/client.rb +245 -0
- data/lib/wckbapi/collection.rb +33 -0
- data/lib/wckbapi/entry.rb +30 -0
- data/lib/wckbapi/provider.rb +18 -0
- data/lib/wckbapi/result.rb +9 -0
- data/lib/wckbapi.rb +10 -0
- data/test.rb +112 -0
- metadata +53 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f19f15da5b7cbb71977b93bb5870013f0d648642
|
4
|
+
data.tar.gz: 34f775ae14fca34bed053bf09f245c3eddb24e81
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 293512bdbd709cd94462d511db5de885177c43740b56440db0662b1ff7c51fcd92bfd6f3f6390755e879292b9ba252173906d241fd6173e97bfdb4b1b46df7e2
|
7
|
+
data.tar.gz: b835b0462aece2a77d9ddd95c3ebbdd8de743fb1f48dfc0a0ddffc99c9f369d0e0992563857ec29e52cbd256a8a4341c22b4bcf2a8b32378aa1880dbb66a5338
|
@@ -0,0 +1,245 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'net/http'
|
3
|
+
require 'cgi'
|
4
|
+
|
5
|
+
module WCKBAPI
|
6
|
+
|
7
|
+
# The WCKBAPI::Client object provides a public facing interface to interacting
|
8
|
+
# with the WorldCat Knowledgebank API
|
9
|
+
#
|
10
|
+
# client = WCKBAPI::Client.new :wskey => [your world cat key], :debug => true|false, :institution_id => [your institution id]
|
11
|
+
# options:
|
12
|
+
# wskey
|
13
|
+
#
|
14
|
+
#
|
15
|
+
# More information can be found at:
|
16
|
+
# http://worldcat.org/devnet/wiki/SearchAPIDetails
|
17
|
+
|
18
|
+
class Client
|
19
|
+
|
20
|
+
# The constructor which must be passed a valid base url for an oai
|
21
|
+
# service:
|
22
|
+
#
|
23
|
+
# If you want to see debugging messages on STDERR use:
|
24
|
+
# :debug => true
|
25
|
+
|
26
|
+
def initialize(options={})
|
27
|
+
@debug = options[:debug]
|
28
|
+
@wskey = options[:wskey]
|
29
|
+
@institution_id = options[:institution_id]
|
30
|
+
end
|
31
|
+
|
32
|
+
# Equivalent to a Identify request. You'll get back a OAI::IdentifyResponse
|
33
|
+
# object which is essentially just a wrapper around a REXML::Document
|
34
|
+
# for the response.
|
35
|
+
|
36
|
+
#def OpenSearch(opts={})
|
37
|
+
# @base = URI.parse WORLDCAT_OPENSEARCH
|
38
|
+
# opts["wskey"] = @wskey
|
39
|
+
# xml = do_request(opts)
|
40
|
+
# return OpenSearchResponse.new(xml)
|
41
|
+
#end
|
42
|
+
|
43
|
+
def GetEntry(opts = {})
|
44
|
+
opts[:wskey] = @wskey
|
45
|
+
opts[:alt] = 'json'
|
46
|
+
if opts[:id] == nil
|
47
|
+
@base = URI.parse WORLDCAT_KB_URL + "entries/" + opts[:collection_uid] + "," + opts[:entry_uid]
|
48
|
+
opts.delete(:collection_uid)
|
49
|
+
opts.delete(:entry_uid)
|
50
|
+
else
|
51
|
+
@base = URI.parse opts[:id]
|
52
|
+
opts.delete(:id)
|
53
|
+
end
|
54
|
+
|
55
|
+
data = do_request(opts)
|
56
|
+
json = JSON.parse(data)
|
57
|
+
objResult = Result.new()
|
58
|
+
objResult.query = ""
|
59
|
+
objResult.startIndex = 1
|
60
|
+
objResult.totalResults = 1
|
61
|
+
objResult.itemsPerPage = 1
|
62
|
+
objE = Entry.new()
|
63
|
+
objE.load(json)
|
64
|
+
return objResult, Array(objE)
|
65
|
+
end
|
66
|
+
|
67
|
+
def SearchEntries(opts={})
|
68
|
+
opts[:wskey] = @wskey
|
69
|
+
opts[:alt] = 'json'
|
70
|
+
@base = URI.parse WORLDCAT_KB_URL + "entries/search"
|
71
|
+
data = do_request(opts)
|
72
|
+
json = JSON.parse(data)
|
73
|
+
objArray = Array.new()
|
74
|
+
objResult = Result.new()
|
75
|
+
objResult.query = json['os:Query']
|
76
|
+
objResult.startIndex = json['os:startIndex']
|
77
|
+
objResult.totalResults = json['os:totalResults']
|
78
|
+
objResult.itemsPerPage = json['os:itemsPerPage']
|
79
|
+
json['entries'].each {|item|
|
80
|
+
objE = Entry.new()
|
81
|
+
objE.load(item)
|
82
|
+
objArray.push(objE)
|
83
|
+
}
|
84
|
+
return objResult, objArray
|
85
|
+
end
|
86
|
+
|
87
|
+
def SearchProviders(opts={})
|
88
|
+
opts[:type] = 'search'
|
89
|
+
return GetProviderInfo(opts)
|
90
|
+
end
|
91
|
+
|
92
|
+
def GetProviderInfo(opts={})
|
93
|
+
if opts == nil
|
94
|
+
opts = Hash.new()
|
95
|
+
end
|
96
|
+
|
97
|
+
opts[:wskey] = @wskey
|
98
|
+
opts[:alt] = 'json'
|
99
|
+
if opts[:type] == nil
|
100
|
+
if opts[:collection_uid] == nil
|
101
|
+
@base = URI.parse WORLDCAT_KB_URL + "providers"
|
102
|
+
else
|
103
|
+
@base = URI.parse WORLDCAT_KB_URL + "providers/" + opts[:title]
|
104
|
+
end
|
105
|
+
opts.delete(:collection_uid)
|
106
|
+
data = do_request(opts)
|
107
|
+
json = JSON.parse(data)
|
108
|
+
objResult = Result.new()
|
109
|
+
if json['entries'] != nil
|
110
|
+
objResult.query =json['os:Query']
|
111
|
+
objResult.startIndex =json['os:startIndex']
|
112
|
+
objResult.totalResults = json['os:totalResults']
|
113
|
+
objResult.itemsPerPage = json['os:itemsPerPage']
|
114
|
+
|
115
|
+
objArray = Array.new()
|
116
|
+
json['entries'].each {|item|
|
117
|
+
objP = Provider.new()
|
118
|
+
objP.load(item)
|
119
|
+
objArray.push(objP)
|
120
|
+
}
|
121
|
+
return objResult, objArray
|
122
|
+
else
|
123
|
+
objResult.query = ""
|
124
|
+
objResult.startIndex = 1
|
125
|
+
objResult.totalResults = 1
|
126
|
+
objResult.itemsPerPage = 1
|
127
|
+
|
128
|
+
objP = Provider.new()
|
129
|
+
objP.load(json)
|
130
|
+
return objResult, Array(objP)
|
131
|
+
end
|
132
|
+
else
|
133
|
+
opts.delete(:type)
|
134
|
+
@base = URI.parse WORLDCAT_KB_URL + "providers/search"
|
135
|
+
data = do_request(opts)
|
136
|
+
json = JSON.parse(data)
|
137
|
+
objResult = Result.new()
|
138
|
+
objResult.query = json['os:Query']
|
139
|
+
objResult.startIndex = json['os:startIndex']
|
140
|
+
objResult.totalResults = json['os:totalResults']
|
141
|
+
objResult.itemsPerPage = json['os:itemsPerPage']
|
142
|
+
|
143
|
+
objArray = Array.new()
|
144
|
+
json['entries'].each {|item|
|
145
|
+
objP = Provider.new()
|
146
|
+
objP.load(item)
|
147
|
+
objArray.push(objP)
|
148
|
+
}
|
149
|
+
return objResult, objArray
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def GetCollectionInfo(opts={})
|
154
|
+
opts[:wskey] = @wskey
|
155
|
+
opts[:alt] = 'json'
|
156
|
+
if opts[:type] == nil
|
157
|
+
if opts[:institution_id] != nil
|
158
|
+
@base = URI.parse WORLDCAT_KB_URL + "collections/" + opts[:collection_uid] + "," + opts[:institution_id]
|
159
|
+
else
|
160
|
+
@base = URI.parse WORLDCAT_KB_URL + "collections/" + opts[:collection_uid]
|
161
|
+
end
|
162
|
+
opts.delete(:institution_id)
|
163
|
+
opts.delete(:collection_uid)
|
164
|
+
data = do_request(opts)
|
165
|
+
json = JSON.parse(data)
|
166
|
+
objResult = Result.new()
|
167
|
+
objResult.query = ""
|
168
|
+
objResult.startIndex = 1
|
169
|
+
objResult.totalResults = 1
|
170
|
+
objResult.itemsPerPage = 1
|
171
|
+
|
172
|
+
objC = Collection.new()
|
173
|
+
objC.load(json)
|
174
|
+
return objResult, Array(objC)
|
175
|
+
else
|
176
|
+
opts.delete(:type)
|
177
|
+
@base = URI.parse WORLDCAT_KB_URL + "collections/search"
|
178
|
+
data = do_request(opts)
|
179
|
+
json = JSON.parse(data)
|
180
|
+
objResult = Result.new()
|
181
|
+
objResult.query = json['os:Query']
|
182
|
+
objResult.startIndex = json['os:startIndex']
|
183
|
+
objResult.totalResults = json['os:totalResults']
|
184
|
+
objResult.itemsPerPage = json['os:itemsPerPage']
|
185
|
+
|
186
|
+
objArray = Array.new()
|
187
|
+
json['entries'].each {|item|
|
188
|
+
objC = Collection.new()
|
189
|
+
objC.load(item)
|
190
|
+
objArray.push(objC)
|
191
|
+
}
|
192
|
+
return objResult, objArray
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def SearchCollections(opts={})
|
197
|
+
opts[:type] = 'search'
|
198
|
+
return GetCollectionInfo(opts)
|
199
|
+
end
|
200
|
+
|
201
|
+
|
202
|
+
private
|
203
|
+
|
204
|
+
def do_request(hash)
|
205
|
+
uri = @base.clone
|
206
|
+
|
207
|
+
# build up the query string
|
208
|
+
parts = hash.entries.map do |entry|
|
209
|
+
#key = studly(entry[0].to_s)
|
210
|
+
key = entry[0].to_s
|
211
|
+
value = entry[1]
|
212
|
+
value = CGI.escape(entry[1].to_s)
|
213
|
+
"#{key}=#{value}"
|
214
|
+
end
|
215
|
+
uri.query = parts.join('&')
|
216
|
+
debug("doing request: #{uri.to_s}")
|
217
|
+
puts uri.to_s
|
218
|
+
begin
|
219
|
+
data = Net::HTTP.get(uri)
|
220
|
+
debug("got response: #{data}")
|
221
|
+
return data
|
222
|
+
rescue SystemCallError=> e
|
223
|
+
#raise WCKBAPI::Exception, 'HTTP level error during WCKBAPI request: '+e, caller
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
# convert foo_bar to fooBar thus allowing our ruby code to use
|
228
|
+
# the typical underscore idiom
|
229
|
+
def studly(s)
|
230
|
+
s.gsub(/_(\w)/) do |match|
|
231
|
+
match.sub! '_', ''
|
232
|
+
match.upcase
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
def debug(msg)
|
237
|
+
$stderr.print("#{msg}\n") if @debug
|
238
|
+
end
|
239
|
+
|
240
|
+
def to_h(default=nil)
|
241
|
+
Hash[ *inject([]) { |a, value| a.push value, default || yield(value) } ]
|
242
|
+
end
|
243
|
+
|
244
|
+
end
|
245
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module WCKBAPI
|
2
|
+
|
3
|
+
class Collection
|
4
|
+
attr_accessor :id, :title, :provider_uid, :provider_name, :avaiable_entries, :selected_entries, :collection_name, :collection_uid, :owner_institution, :source_institution, :status, :dbkey, :source, :open, :collection_type, :uri
|
5
|
+
|
6
|
+
def initialize()
|
7
|
+
end
|
8
|
+
def load(item)
|
9
|
+
@id = item['id']
|
10
|
+
@title = item['title']
|
11
|
+
@provider_uid = item['kb:provider_uid']
|
12
|
+
@provider_name = item['kb:provider_name']
|
13
|
+
@available_entries = item['kb:available_entries']
|
14
|
+
@selected_entries = item['kb:selected_entries']
|
15
|
+
@collection_name = item['kb:collection_name']
|
16
|
+
@collection_uid = item['kb:collection_uid']
|
17
|
+
@owner_institution = item['kb:owner_institution']
|
18
|
+
@source_institution = item['kb:source_institution']
|
19
|
+
@status = item['kb:status']
|
20
|
+
@dbkey = item['kb:dbkey']
|
21
|
+
@source = item['kb:source']
|
22
|
+
@open = item['kb:open']
|
23
|
+
@collection_type = item['kb:collection_type']
|
24
|
+
|
25
|
+
item['links'].each {|t|
|
26
|
+
if t['rel'] == 'via'
|
27
|
+
@uri = t['href']
|
28
|
+
break
|
29
|
+
end
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module WCKBAPI
|
2
|
+
|
3
|
+
class Entry
|
4
|
+
attr_accessor :id, :title, :entry_uid, :entry_status, :bkey, :collection_name, :collection_uid, :provider_uid, :provider_name, :oclcnum, :author, :isbn, :publisher, :coverage, :uri
|
5
|
+
|
6
|
+
def initialize()
|
7
|
+
end
|
8
|
+
def load(item)
|
9
|
+
@id = item['id']
|
10
|
+
@title = item['title']
|
11
|
+
@entry_uid = item['entry_uid']
|
12
|
+
@entry_status = item['entry_status']
|
13
|
+
@bkey = item['bkey']
|
14
|
+
@collection_name = item['kb:collection_name']
|
15
|
+
@collection_uid = item['kb:collection_uid']
|
16
|
+
@provider_uid = item['kb:provider_uid']
|
17
|
+
@provider_name = item['kb:provider_name']
|
18
|
+
@oclcnum = item['kb:oclcnum']
|
19
|
+
@author = item['kb:author']
|
20
|
+
@isbn = item['kb:isbn']
|
21
|
+
@publisher = item['kb:publisher']
|
22
|
+
@coverage = item['kb:coverage']
|
23
|
+
item['links'].each {|t|
|
24
|
+
if t['rel'] == 'via'
|
25
|
+
@uri = t['href']
|
26
|
+
end
|
27
|
+
}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module WCKBAPI
|
2
|
+
|
3
|
+
class Provider
|
4
|
+
attr_accessor :id, :title, :provider_uid, :provider_name, :avaiable_entries, :selected_entries, :available_collections
|
5
|
+
|
6
|
+
def initialize()
|
7
|
+
end
|
8
|
+
def load(item)
|
9
|
+
@id = item['id']
|
10
|
+
@title = item['title']
|
11
|
+
@provider_uid = item['kb:provider_uid']
|
12
|
+
@provider_name = item['kb:provider_name']
|
13
|
+
@available_entries = item['kb:available_entries']
|
14
|
+
@selected_entries = item['kb:selected_entries']
|
15
|
+
@available_collections = item['kb:available_collections']
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/wckbapi.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'wckbapi/client'
|
2
|
+
require 'wckbapi/collection'
|
3
|
+
require 'wckbapi/provider'
|
4
|
+
require 'wckbapi/entry'
|
5
|
+
require 'wckbapi/result'
|
6
|
+
require 'nokogiri'
|
7
|
+
require 'json'
|
8
|
+
|
9
|
+
WORLDCAT_OPENSEARCH = 'http://www.worldcat.org/webservices/catalog/search/opensearch'
|
10
|
+
WORLDCAT_KB_URL = 'http://www.worldcat.org/webservices/kb/rest/'
|
data/test.rb
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'wckbapi'
|
3
|
+
|
4
|
+
client = WCKBAPI::Client.new :wskey => 'WUg1y65bNZbtvxa6E8ieROEKf2Hy7fjNDZatpRVViG4cUAyBaPsI18fPSR0SBQk8torAxvR3dxsw5uwe'
|
5
|
+
|
6
|
+
objR, objc = client.GetCollectionInfo(:collection_uid => 'NPG.journals')
|
7
|
+
puts "Collection Info: \n"
|
8
|
+
puts "Title: " + objc[0].title
|
9
|
+
puts "Collection_uid: " + objc[0].collection_uid
|
10
|
+
|
11
|
+
|
12
|
+
puts "\n"
|
13
|
+
puts "******************* Collection Info ******************"
|
14
|
+
objR, objc = client.GetCollectionInfo(:collection_uid => 'BMC.openAccess',
|
15
|
+
:institution_id => '128807',
|
16
|
+
:type => 'search')
|
17
|
+
|
18
|
+
puts "Collection Info (enum):\n"
|
19
|
+
puts "Number of results: " + objR.totalResults.to_s + "\n"
|
20
|
+
objc.each {|i|
|
21
|
+
puts "Title: " + i.title + "\n"
|
22
|
+
puts "Collection_uid: " + i.collection_uid + "\n"
|
23
|
+
puts "\n"
|
24
|
+
}
|
25
|
+
|
26
|
+
puts "\n"
|
27
|
+
puts "******************* Collection Info Search **************"
|
28
|
+
objR, objc = client.GetCollectionInfo(:institution_id => '128807',
|
29
|
+
:title => 'S%',
|
30
|
+
:type => 'search')
|
31
|
+
|
32
|
+
puts "Collection Info Search (enum):\n"
|
33
|
+
puts "Number of Results: " + objR.totalResults.to_s + "\n"
|
34
|
+
objc.each {|i|
|
35
|
+
puts "Title: " + i.title + "\n"
|
36
|
+
puts "Collection_uid: " + i.collection_uid + "\n"
|
37
|
+
puts "\n"
|
38
|
+
}
|
39
|
+
|
40
|
+
puts "\n"
|
41
|
+
puts "********************** SearchCollections ***************"
|
42
|
+
objR, objc = client.SearchCollections(:institution_id => "128807",
|
43
|
+
:title => 'S%')
|
44
|
+
|
45
|
+
puts "Search Collection (enum):\n"
|
46
|
+
puts "Number of Results: " + objR.totalResults.to_s + "\n"
|
47
|
+
objc.each {|i|
|
48
|
+
puts "Title: " + i.title + "\n"
|
49
|
+
puts "Collection_uid: " + i.collection_uid + "\n"
|
50
|
+
puts "\n"
|
51
|
+
}
|
52
|
+
|
53
|
+
puts "\n"
|
54
|
+
puts "*********************** Retrieve Providers *************"
|
55
|
+
objR, objP = client.GetProviderInfo()
|
56
|
+
objP.each {|i|
|
57
|
+
puts "Title: " + i.title + "\n"
|
58
|
+
puts "id: " + i.id + "\n"
|
59
|
+
}
|
60
|
+
|
61
|
+
puts "\n"
|
62
|
+
puts "********************** Retrieve Providers **"
|
63
|
+
objR, objP = client.GetProviderInfo(:title => 'BioOne')
|
64
|
+
objP.each {|i|
|
65
|
+
puts "Title: " + i.title + "\n"
|
66
|
+
puts "id: " + i.id + "\n"
|
67
|
+
}
|
68
|
+
|
69
|
+
puts "\n"
|
70
|
+
puts "********************** Retrieve Providers Search ********"
|
71
|
+
objR, objP = client.SearchProviders(:institution_id => 128807)
|
72
|
+
puts "Number of Results: " + objR.totalResults.to_s + "\n"
|
73
|
+
objP.each {|i|
|
74
|
+
puts "Title: " + i.title + "\n"
|
75
|
+
puts "id: " + i.id + "\n"
|
76
|
+
}
|
77
|
+
|
78
|
+
puts "\n"
|
79
|
+
puts "********************** Return and entry *****************"
|
80
|
+
objR, objE = client.GetEntry(:collection_uid => 'ebrary.humanities',
|
81
|
+
:entry_uid => '5639208')
|
82
|
+
|
83
|
+
objE.each {|i|
|
84
|
+
puts "Title: " + i.title + "\n"
|
85
|
+
puts "id: " + i.id + "\n"
|
86
|
+
}
|
87
|
+
|
88
|
+
puts "\n"
|
89
|
+
puts "********************* Return entry with entry id *******"
|
90
|
+
|
91
|
+
objR, objE = client.GetEntry(:id => 'http://worldcat.org/webservices/kb/rest/entries/ebrary.humanities,5639208')
|
92
|
+
objE.each {|i|
|
93
|
+
puts "Title: " + i.title + "\n"
|
94
|
+
puts "id: " + i.id + "\n"
|
95
|
+
}
|
96
|
+
|
97
|
+
puts "\n"
|
98
|
+
|
99
|
+
puts "\n"
|
100
|
+
puts "********************* Search Entries *******************"
|
101
|
+
objR, objE = client.SearchEntries(:institution_id => '128807',
|
102
|
+
:title => '"B%"')
|
103
|
+
|
104
|
+
puts "Number of Results: " + objR.totalResults.to_s + "\n"
|
105
|
+
objE.each {|i|
|
106
|
+
puts "Title: " + i.title + "\n"
|
107
|
+
puts "id: " + i.id + "\n"
|
108
|
+
}
|
109
|
+
|
110
|
+
puts "\n\n"
|
111
|
+
|
112
|
+
puts "finished with tests"
|
metadata
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wckbapi
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Terry Reese
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-02-05 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: This component provides a ruby component for processing the Knowledge
|
14
|
+
Base API provided by OCLC. Users interested in using this component will need to
|
15
|
+
have an API key available from OCLC.
|
16
|
+
email: reese.2179@osu.edu
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- lib/wckbapi.rb
|
22
|
+
- lib/wckbapi/client.rb
|
23
|
+
- lib/wckbapi/collection.rb
|
24
|
+
- lib/wckbapi/entry.rb
|
25
|
+
- lib/wckbapi/provider.rb
|
26
|
+
- lib/wckbapi/result.rb
|
27
|
+
- test.rb
|
28
|
+
homepage:
|
29
|
+
licenses:
|
30
|
+
- Public Domain
|
31
|
+
metadata: {}
|
32
|
+
post_install_message:
|
33
|
+
rdoc_options: []
|
34
|
+
require_paths:
|
35
|
+
- lib
|
36
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
requirements: []
|
47
|
+
rubyforge_project:
|
48
|
+
rubygems_version: 2.2.1
|
49
|
+
signing_key:
|
50
|
+
specification_version: 4
|
51
|
+
summary: Ruby component for processing the WorldCat KB API
|
52
|
+
test_files:
|
53
|
+
- test.rb
|