worldcatapi 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MTdhZjEzN2E4YTNlZDNmYmU4YTU0NGNlNzgwZGRiOTkzMjczMzU1OQ==
5
+ data.tar.gz: !binary |-
6
+ OTdjMWVmOGRkNzk1MmNkY2QxOGQyNmE5MGY4MzZjYmI4OGY5MmM3Ng==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ OGMyOGJmNDJlZDZmOGI2NGE4Nzk4MTNhYWFiMDcwOTVlZDRiZjUwNDM3NDZk
10
+ NWU5NGYzOGNmMjQ5YmJlZmM5MTU1NTkwZmYyZjhmNWExNTkwZGZmNmYwMzUy
11
+ NDE3Y2IwNTAyMWY1OTAwYjcxMjI0Yjk3ODcxMGI5MTM2YWMyN2M=
12
+ data.tar.gz: !binary |-
13
+ ODk5OWQ3ZGEwNGQ5ZTRiODdmZmRlZWJiM2E2ZWU5YTBhZDY5ZjRiMDg4MjA1
14
+ OTRlY2U5YTMzNWRiZjE5Y2QwMWMzYTE4MTA3NWIyYmFhZTNlOTExZmRmMTNi
15
+ NzZjNWRkMzc3NTVmZTAxZGFmYzMyMmQzZDY0ZTQ0MGQ1MWI3MjQ=
data/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
19
+
20
+ york-key.txt
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in worldcatapi.gemspec
4
+ gemspec
5
+
6
+
7
+
8
+ group :development do
9
+ gem 'guard-test'
10
+ gem "shoulda"
11
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,69 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ worldcatapi (1.0.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ activesupport (4.0.1)
10
+ i18n (~> 0.6, >= 0.6.4)
11
+ minitest (~> 4.2)
12
+ multi_json (~> 1.3)
13
+ thread_safe (~> 0.1)
14
+ tzinfo (~> 0.3.37)
15
+ atomic (1.1.14)
16
+ celluloid (0.15.2)
17
+ timers (~> 1.1.0)
18
+ coderay (1.1.0)
19
+ ffi (1.9.3)
20
+ formatador (0.2.4)
21
+ guard (2.2.4)
22
+ formatador (>= 0.2.4)
23
+ listen (~> 2.1)
24
+ lumberjack (~> 1.0)
25
+ pry (>= 0.9.12)
26
+ thor (>= 0.18.1)
27
+ guard-test (2.0.3)
28
+ guard (~> 2.0)
29
+ test-unit (~> 2.2)
30
+ i18n (0.6.5)
31
+ listen (2.3.1)
32
+ celluloid (>= 0.15.2)
33
+ rb-fsevent (>= 0.9.3)
34
+ rb-inotify (>= 0.9)
35
+ lumberjack (1.0.4)
36
+ method_source (0.8.2)
37
+ minitest (4.7.5)
38
+ multi_json (1.8.2)
39
+ pry (0.9.12.4)
40
+ coderay (~> 1.0)
41
+ method_source (~> 0.8)
42
+ slop (~> 3.4)
43
+ rake (10.1.0)
44
+ rb-fsevent (0.9.3)
45
+ rb-inotify (0.9.2)
46
+ ffi (>= 0.5.0)
47
+ shoulda (3.5.0)
48
+ shoulda-context (~> 1.0, >= 1.0.1)
49
+ shoulda-matchers (>= 1.4.1, < 3.0)
50
+ shoulda-context (1.1.6)
51
+ shoulda-matchers (2.4.0)
52
+ activesupport (>= 3.0.0)
53
+ slop (3.4.7)
54
+ test-unit (2.5.5)
55
+ thor (0.18.1)
56
+ thread_safe (0.1.3)
57
+ atomic
58
+ timers (1.1.0)
59
+ tzinfo (0.3.38)
60
+
61
+ PLATFORMS
62
+ ruby
63
+
64
+ DEPENDENCIES
65
+ bundler (~> 1.3)
66
+ guard-test
67
+ rake
68
+ shoulda
69
+ worldcatapi!
data/Guardfile ADDED
@@ -0,0 +1,9 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :test do
5
+ watch(%r{^test/.+_test\.rb$})
6
+
7
+ # Non-rails
8
+ watch(%r{^lib/(.+)\.rb$}) { |m| "test/lib/#{m[1]}_test.rb" }
9
+ end
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013 tdak
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,35 @@
1
+ worldcat-api
2
+ ============
3
+
4
+ The RUBY API to access WorldCat.org webservices. Inspired by original wcapi implementation
5
+
6
+
7
+ # Worldcatapi
8
+
9
+ Forked from RubyForge WCAPI project.
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ gem 'worldcatapi'
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install worldcatapi
24
+
25
+ ## Usage
26
+
27
+ TODO: Write usage instructions here
28
+
29
+ ## Contributing
30
+
31
+ 1. Fork it
32
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
33
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
34
+ 4. Push to the branch (`git push origin my-new-feature`)
35
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.libs << "test"
7
+ t.test_files = FileList['test/*/*_test.rb']
8
+ t.verbose = true
9
+ end
data/example.rb ADDED
@@ -0,0 +1,56 @@
1
+ require 'rubygems'
2
+ require 'worldcatapi'
3
+
4
+ @key = ENV["WORLDCAT_KEY"]
5
+
6
+ puts "KEY=#{@key}"
7
+
8
+ client = WORLDCATAPI::Client.new(key: @key, debug: true)
9
+
10
+ response = client.OpenSearch(:q=>'building digital libraries', :format=>'atom', :start => '1', :count => '25', :cformat => 'all')
11
+
12
+ puts "Total Results: " + response.header["totalResults"]
13
+ response.records.each {|rec|
14
+ puts "Title: " + rec[:title] + "\n"
15
+ puts "URL: " + rec[:link] + "\n"
16
+ puts "Authors: " + rec[:author].join(" ") + "\n"
17
+ puts "OCLC #: " + rec[:id] + "\n"
18
+ puts "Description: " + rec[:summary] + "\n"
19
+ puts "citation: " + rec[:citation] + "\n"
20
+
21
+ }
22
+
23
+ puts "\n\n\n"
24
+
25
+ puts "Get Record Test: " + "\n\n"
26
+ record = client.GetRecord(:type => "oclc", :id => "15550774")
27
+
28
+ puts record.record[:title] + "\n"
29
+ puts record.record[:link] + "\n"
30
+
31
+ puts "\n\n\n"
32
+ puts "Get Location Test: " + "\n\n"
33
+ info = client.GetLocations(:type=>"oclc", :id => "15550774")
34
+
35
+ info.institutions.each {|info|
36
+ puts "Institutional Identifier: " + info[:institutionIdentifier] + "\n"
37
+ puts "OPAC Link: " + info[:link] + "\n"
38
+ puts "Copies: " + info[:copies] + "\n\n\n"
39
+ }
40
+
41
+ puts "\n\n\n"
42
+ puts "Citation Example: " + "\n\n"
43
+
44
+ citation = client.GetCitation(:type=>"oclc", :id=>"15550774", :cformat => 'all')
45
+ puts citation
46
+ puts "\n\n"
47
+
48
+
49
+ puts "\n\n\n"
50
+ puts "SRU Search Example: " + "\n\n"
51
+ records = client.SRUSearch(:query => '"civil war"')
52
+ puts "Total Records: " + records.header["numberOfRecords"] + "\n"
53
+ records.records.each {|rec|
54
+ puts "Title: " + rec[:title] + "\n"
55
+ puts "URL: " + rec[:link] + "\n\n\n"
56
+ }
@@ -0,0 +1,131 @@
1
+ require 'uri'
2
+ require 'net/http'
3
+ require 'cgi'
4
+
5
+ module WORLDCATAPI
6
+
7
+ # The WOLDCATAPI::Client object provides a public facing interface to interacting
8
+ # with the various WorldCat API Grid Services.
9
+ #
10
+ # client = WORLDCATAPI::Client.new :query => 'query', :format => [atom|rss], :start => [position], :count => [max records], :cformat => [mla|apa], :wskey => [your world cat key
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[:key]
29
+ end
30
+
31
+ # Equivalent to a Identify request. You'll get back a OAI::IdentifyResponse
32
+ # object which is essentially just a wrapper around a REXML::Document
33
+ # for the response.
34
+
35
+ def OpenSearch(opts={})
36
+ @base = URI.parse WORLDCAT_OPENSEARCH
37
+ opts["wskey"] = @wskey
38
+ xml = do_request(opts)
39
+ return OpenSearchResponse.new(xml)
40
+ end
41
+
42
+ def GetRecord(opts={})
43
+ if opts[:type] == 'oclc'
44
+ @base = URI.parse "http://www.worldcat.org/webservices/catalog/content/" + opts[:id]
45
+ else
46
+ @base = URI.parse 'http://www.worldcat.org/webservices/catalog/content/isbn/' + opts[:id]
47
+ end
48
+ opts.delete("type")
49
+ opts["wskey"] = @wskey
50
+ xml = do_request(opts)
51
+ return GetRecordResponse.new(xml)
52
+ end
53
+
54
+
55
+ def GetLocations(opts={})
56
+ if opts[:type] == 'oclc'
57
+ @base = URI.parse "http://www.worldcat.org/webservices/catalog/content/libraries/" + opts[:id]
58
+ else
59
+ @base = URI.parse 'http://www.worldcat.org/webservices/catalog/content/libraries/isbn/' + opts[:id]
60
+ end
61
+ opts.delete("type")
62
+ opts["wskey"] = @wskey
63
+ xml = do_request(opts)
64
+ return GetLocationResponse.new(xml)
65
+ end
66
+
67
+ def GetCitation(opts = {})
68
+ if opts[:type] == 'oclc'
69
+ @base = URI.parse "http://www.worldcat.org/webservices/catalog/content/citations/" + opts[:id]
70
+ else
71
+ @base = URI.parse 'http://www.worldcat.org/webservices/catalog/content/citations/isbn/' + opts[:id]
72
+ end
73
+ opts.delete("type")
74
+ opts["wskey"] = @wskey
75
+ xml = do_request(opts)
76
+ #Returns an HTML representation
77
+ return xml
78
+ end
79
+
80
+ def SRUSearch(opts={})
81
+ @base = URI.parse WORLDCAT_SRU
82
+ opts["wskey"] = @wskey
83
+ xml = do_request(opts)
84
+ return SruSearchResponse.new(xml)
85
+ end
86
+
87
+
88
+ private
89
+
90
+ def do_request(hash)
91
+ uri = @base.clone
92
+
93
+ # build up the query string
94
+ parts = hash.entries.map do |entry|
95
+ key = studly(entry[0].to_s)
96
+ value = entry[1]
97
+ value = CGI.escape(entry[1].to_s)
98
+ "#{key}=#{value}"
99
+ end
100
+ uri.query = parts.join('&')
101
+ debug("doing request: #{uri.to_s}")
102
+
103
+ # fire off the request and return an REXML::Document object
104
+ begin
105
+ xml = Net::HTTP.get(uri)
106
+ debug("got response: #{xml}")
107
+ return xml
108
+ rescue SystemCallError=> e
109
+ #raise WCAPI::Exception, 'HTTP level error during WCAPI request: '+e, caller
110
+ end
111
+ end
112
+
113
+ # convert foo_bar to fooBar thus allowing our ruby code to use
114
+ # the typical underscore idiom
115
+ def studly(s)
116
+ s.gsub(/_(\w)/) do |match|
117
+ match.sub! '_', ''
118
+ match.upcase
119
+ end
120
+ end
121
+
122
+ def debug(msg)
123
+ $stderr.print("#{msg}\n") if @debug
124
+ end
125
+
126
+ def to_h(default=nil)
127
+ Hash[ *inject([]) { |a, value| a.push value, default || yield(value) } ]
128
+ end
129
+
130
+ end
131
+ end
@@ -0,0 +1,43 @@
1
+ module WORLDCATAPI
2
+ class GetLocationResponse
3
+
4
+ attr_accessor :institutions, :raw
5
+
6
+ def initialize(doc)
7
+ #super doc
8
+ @raw = doc
9
+ parse_holdings(doc)
10
+ end
11
+
12
+ def parse_holdings(xml)
13
+ _oclc_symbol = ""
14
+ _link = ""
15
+ _copies = ""
16
+ _xml = xml
17
+ _instchash = {}
18
+ _records = Array.new()
19
+ _x = 0
20
+
21
+ doc = Nokogiri::XML(xml)
22
+ nodes = doc.xpath("//holding")
23
+ nodes.each { |item |
24
+ _oclc_symbol = item.xpath("institutionIdentifier/value[position()=1]").text
25
+
26
+ if item.xpath("electronicAddress/text") != nil
27
+ _link = item.xpath("electronicAddress/text[position()=1]").text
28
+ end
29
+
30
+ if item.xpath("holdingSimple/copiesSummary/copiesCount") != nil
31
+ _copies = item.xpath("holdingSimple/copiesSummary/copiesCount[position()=1]").text
32
+ end
33
+
34
+
35
+ _instchash = {:institutionIdentifier => _oclc_symbol, :link => _link, :copies => _copies ,
36
+ :xml => item.to_s}
37
+ _records.push(_instchash)
38
+ }
39
+ @institutions = _records
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,63 @@
1
+ module WORLDCATAPI
2
+ class GetRecordResponse
3
+
4
+ attr_accessor :record, :raw
5
+
6
+ def initialize(doc)
7
+ #super doc
8
+ @raw = doc
9
+ parse_marcxml(doc)
10
+ end
11
+
12
+ def parse_marcxml(xml)
13
+ _title = ""
14
+ #this is an array
15
+ _author = Array.new()
16
+ _link = ""
17
+ _id = ""
18
+ _citation = ""
19
+ _summary = ""
20
+ _xml = xml
21
+ _rechash = {}
22
+ _x = 0
23
+
24
+ doc = Nokogiri::XML(xml)
25
+ doc.remove_namespaces!
26
+ nodes = doc.xpath("/record")
27
+ puts "NODE Count: " + nodes.length.to_s
28
+ nodes.each { |item |
29
+ _title = item.xpath("datafield[@tag='245']/subfield[@code='a'][position()=1]").text
30
+
31
+ if item.xpath("datafield[@tag='1*']") != nil
32
+ item.xpath("datafield[@tag='1*']").each {|i|
33
+ _author.push(i.xpath("subfield[@code='a']").text)
34
+ }
35
+ end
36
+
37
+ if item.xpath("datafield[@tag='7*']") != nil
38
+ item.xpath("datafield[@tag='7*']").each {|i|
39
+ _author.push(i.xpath("subfield[@code='a']").text)
40
+ }
41
+ end
42
+
43
+ if item.xpath("controlfield[@tag='001']") != nil
44
+ _id = item.xpath("controlfield[@tag='001']").text
45
+ _link = 'http://www.worldcat.org/oclc/' + _id.to_s
46
+ end
47
+
48
+ if item.xpath("datafield[@tag='520']") != nil
49
+ _summary = item.xpath("datafield[@tag='520']/subfield[@code='a'][position()=1]").text
50
+ else
51
+ if item.xpath("datafield[@tag='500']") != nil
52
+ _summary = item.xpath("datafield[@tag='500']/subfield[@code='a'][position()=1]").text
53
+ end
54
+ end
55
+
56
+ _rechash = {:title => _title, :author => _author, :link => _link, :id => _id, :citation => _citation,
57
+ :summary => _summary, :xml => item.to_s}
58
+ }
59
+ @record = _rechash
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,130 @@
1
+ module WORLDCATAPI
2
+ class OpenSearchResponse
3
+
4
+ attr_accessor :header, :records, :raw
5
+
6
+ def initialize(doc)
7
+ #super doc
8
+ @raw = doc
9
+ if doc.index('rss')
10
+ parse_rss(doc)
11
+ else
12
+ parse_atom(doc)
13
+ end
14
+ end
15
+
16
+ def parse_rss(xml)
17
+ _title = ""
18
+ #this is an array
19
+ _author = Array.new()
20
+ _link = ""
21
+ _id = ""
22
+ _citation = ""
23
+ _summary = ""
24
+ _xml = xml
25
+ _record = Array.new()
26
+ _x = 0
27
+
28
+ doc = Nokogiri::XML(xml)
29
+
30
+ namespaces = {'content' => 'http://purl.org/rss/1.0/modules/content/',
31
+ 'atom' => 'http://www.w3.org/2005/Atom',
32
+ 'opensearch' => 'http://a9.com/-/spec/opensearch/1.1/',
33
+ 'srw' => 'http://www.loc.gov/zing/srw/'
34
+ }
35
+
36
+
37
+ @header = {}
38
+ @header["totalResults"] = doc.xpath("//opensearch:totalResults").text
39
+ @header["startIndex"] = doc.xpath("//opensearch:startIndex").text
40
+ @header["itemsPerPage"] = doc.xpath("//opensearch:itemsPerPage").text
41
+
42
+ nodes = doc.xpath("//item", namespaces)
43
+ nodes.each { |item |
44
+ _title = item.xpath("title[position()=1]", namespaces).text
45
+ if item.xpath("author/name[position()=1]", namespaces) != nil
46
+ item.xpath("author/name", namespaces).each { |i|
47
+ _author.push(i.text)
48
+ }
49
+ end
50
+ if item.xpath("link[position()=1]") != nil
51
+ _link = item.xpath("link[position()=1]", namespaces).text
52
+ end
53
+
54
+ if _link != ''
55
+ _id = _link.slice(_link.rindex("/")+1, _link.length-_link.rindex("/"))
56
+ end
57
+ if item.xpath("content:encoded[position()=1]", namespaces) != nil
58
+ _citation = item.xpath("content:encoded[position()=1]", namespaces).text
59
+ end
60
+
61
+ if item.xpath("description[position()=1]", namespaces) != nil
62
+ _summary = item.xpath("description[position()=1]", namespaces).text
63
+ end
64
+ _rechash = {:title => _title, :author => _author, :link => _link, :id => _id, :citation => _citation,
65
+ :summary => _summary, :xml => item.to_s}
66
+ _record.push(_rechash)
67
+ }
68
+ @records = _record
69
+ end
70
+
71
+ def parse_atom(xml)
72
+ _title = ""
73
+ #this is an array
74
+ _author = Array.new()
75
+ _link = ""
76
+ _id = ""
77
+ _citation = ""
78
+ _summary = ""
79
+ _xml = xml
80
+ _record = Array.new()
81
+ _x = 0
82
+
83
+ doc = Nokogiri::XML(xml)
84
+ namespaces = {'n0' => 'http://www.w3.org/2005/Atom',
85
+ 'opensearch' => 'http://a9.com/-/spec/opensearch/1.1/'
86
+ }
87
+
88
+
89
+ @header = {}
90
+ @header["totalResults"] = doc.xpath("//opensearch:totalResults").text
91
+ @header["startIndex"] = doc.xpath("//opensearch:startIndex").text
92
+ @header["itemsPerPage"] = doc.xpath("//opensearch:itemsPerPage").text
93
+
94
+ nodes = doc.xpath("//*[local-name()='entry']")
95
+ nodes.each { |item |
96
+ _author = []
97
+ _title = item.xpath("*[local-name() = 'title'][position()=1]").text
98
+ _tmpauthor = item.xpath("*[local-name() = 'author'][position()=1]")
99
+
100
+ if _tmpauthor != nil
101
+ if item.xpath("*[local-name() = 'author']/*[local-name() = 'name']") != nil
102
+ item.xpath("*[local-name() = 'author']/*[local-name() = 'name']").each { |i|
103
+ _author.push(i.text)
104
+ }
105
+ end
106
+ end
107
+
108
+ if item.xpath("*[local-name() = 'id']") != nil
109
+ _link = item.xpath("*[local-name() = 'id']").text
110
+ end
111
+
112
+ if _link != ''
113
+ _id = _link.slice(_link.rindex("/")+1, _link.length-_link.rindex("/"))
114
+ end
115
+ if item.xpath("*[local-name() = 'content']") != nil
116
+ _citation = item.xpath("*[local-name() = 'content'][position()=1]").text
117
+ end
118
+
119
+ if item.xpath("*[local-name() = 'summary']") != nil
120
+ _summary = item.xpath("*[local-name() = 'summary'][position()=1]").text
121
+ end
122
+ _rechash = {:title => _title, :author => _author, :link => _link, :id => _id, :citation => _citation,
123
+ :summary => _summary, :xml => item.to_s}
124
+ _record.push(_rechash)
125
+ }
126
+ @records = _record
127
+ end
128
+
129
+ end
130
+ end
@@ -0,0 +1,11 @@
1
+ module WORLDCATAPI
2
+
3
+ class Record
4
+
5
+ attr_accessor :title, :author, :link, :id, :citation, :summary, :xml
6
+
7
+ def initialize(pxml)
8
+ #Setup a document
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,71 @@
1
+ module WORLDCATAPI
2
+ class SruSearchResponse
3
+
4
+ attr_accessor :header, :records, :raw
5
+
6
+ def initialize(doc)
7
+ #super doc
8
+ @raw = doc
9
+ parse_marcxml(doc)
10
+ end
11
+
12
+ def parse_marcxml(xml)
13
+ @header = {}
14
+ _title = ""
15
+ #this is an array
16
+ _author = Array.new()
17
+ _link = ""
18
+ _id = ""
19
+ _citation = ""
20
+ _summary = ""
21
+ _xml = xml
22
+ _rechash = {}
23
+ _records = Array.new()
24
+ _x = 0
25
+
26
+ xml = xml.gsub('<?xml-stylesheet type="text/xsl" href="/webservices/catalog/xsl/searchRetrieveResponse.xsl"?>', "")
27
+
28
+ doc = Nokogiri::XML(xml)
29
+ doc.remove_namespaces!
30
+ @header["numberOfRecords"] = doc.xpath("//numberOfRecords").text
31
+ @header["recordSchema"] = doc.xpath("//recordSchema").text
32
+ @header["nextRecordPosition"] = doc.xpath("//nextRecordPosition").text
33
+ @header["maxiumumRecords"] = doc.xpath("//maximumRecords").text
34
+ @header["startRecord"] = doc.xpath("//startRecord").text
35
+
36
+ nodes = doc.xpath("//records/record/recordData/record")
37
+ nodes.each { |item |
38
+ _title = item.xpath("datafield[@tag='245']/subfield[@code='a'][position()=1]").text
39
+ if item.xpath("datafield[@tag='1*']") != nil
40
+ item.xpath("datafield[@tag='1*']/sufield[@code='a']").each { |i|
41
+ _author.push(i.text)
42
+ }
43
+ end
44
+ if item.xpath("datafield[@tag='7*']") != nil
45
+ item.xpath("datafield[@tag='7*']/sufield[@code='a']").each { |i|
46
+ _author.push(i.text)
47
+ }
48
+ end
49
+
50
+ if item.xpath("controlfield[@tag='001']") != nil
51
+ _id = item.xpath("controlfield[@tag='001'][position()=1]").text
52
+ _link = 'http://www.worldcat.org/oclc/' + _id.to_s
53
+ end
54
+
55
+ if item.xpath("datafield[@tag='520']") != nil
56
+ _summary = item.xpath("datafield[@tag='520']/subfield[@code='a'][position()=1]").text
57
+ else
58
+ if item.xpath("datafield[@tag='500']") != nil
59
+ _summary = item.xpath("datafield[@tag='500']/subfield[@code='a'][position()=1]").text
60
+ end
61
+ end
62
+
63
+ _rechash = {:title => _title, :author => _author, :link => _link, :id => _id, :citation => _citation,
64
+ :summary => _summary, :xml => item.to_s}
65
+ _records.push(_rechash)
66
+ }
67
+ @records = _records
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,3 @@
1
+ module WORLDCATAPI
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,15 @@
1
+ require "worldcatapi/version"
2
+ require 'worldcatapi/client'
3
+ require 'worldcatapi/open_search_response'
4
+ require 'worldcatapi/get_record_response'
5
+ require 'worldcatapi/get_location_response'
6
+ require 'worldcatapi/sru_search_response'
7
+ require 'nokogiri'
8
+
9
+ WORLDCAT_OPENSEARCH = 'http://www.worldcat.org/webservices/catalog/search/opensearch'
10
+ WORLDCAT_SRU = 'http://www.worldcat.org/webservices/catalog/search/sru'
11
+
12
+
13
+ module WOLDCATAPI
14
+ # Your code goes here...
15
+ end
@@ -0,0 +1,9 @@
1
+ require "test_helper"
2
+
3
+
4
+ class TestWorldcatApi < Test::Unit::TestCase
5
+
6
+ should "test worlcatapi settings" do
7
+ assert true, "Something happens"
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ require "WOLDCATAPI"
2
+ require "test/unit"
3
+ require "shoulda"
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'worldcatapi/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "worldcatapi"
8
+ spec.version = WORLDCATAPI::VERSION
9
+ spec.authors = ["Taras Danylak", "Terry Reese"]
10
+ spec.email = ["taras@danylak.com", 'terry.reese@oregonstate.edu']
11
+ spec.description = %q{Ruby API to access WorldCat Open Search webservice. Based on WCAPI Gem.}
12
+ spec.summary = %q{Ruby API to access WorldCat Open Search webserbice. Based on WCAPI Gem.}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+
22
+ spec.add_runtime_dependency "nokogiri", "~>1.5.7"
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.3"
25
+ spec.add_development_dependency "rake"
26
+ end
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: worldcatapi
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Taras Danylak
8
+ - Terry Reese
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-02-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: nokogiri
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: 1.5.7
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ version: 1.5.7
28
+ - !ruby/object:Gem::Dependency
29
+ name: bundler
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: '1.3'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ version: '1.3'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rake
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ description: Ruby API to access WorldCat Open Search webservice. Based on WCAPI Gem.
57
+ email:
58
+ - taras@danylak.com
59
+ - terry.reese@oregonstate.edu
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - .gitignore
65
+ - Gemfile
66
+ - Gemfile.lock
67
+ - Guardfile
68
+ - LICENSE
69
+ - README.md
70
+ - Rakefile
71
+ - example.rb
72
+ - lib/worldcatapi.rb
73
+ - lib/worldcatapi/client.rb
74
+ - lib/worldcatapi/get_location_response.rb
75
+ - lib/worldcatapi/get_record_response.rb
76
+ - lib/worldcatapi/open_search_response.rb
77
+ - lib/worldcatapi/record.rb
78
+ - lib/worldcatapi/sru_search_response.rb
79
+ - lib/worldcatapi/version.rb
80
+ - test/lib/worldcatapi_test.rb
81
+ - test/test_helper.rb
82
+ - worldcatapi.gemspec
83
+ homepage: ''
84
+ licenses:
85
+ - MIT
86
+ metadata: {}
87
+ post_install_message:
88
+ rdoc_options: []
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ! '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ requirements: []
102
+ rubyforge_project:
103
+ rubygems_version: 2.1.5
104
+ signing_key:
105
+ specification_version: 4
106
+ summary: Ruby API to access WorldCat Open Search webserbice. Based on WCAPI Gem.
107
+ test_files:
108
+ - test/lib/worldcatapi_test.rb
109
+ - test/test_helper.rb