openlibrary 2.1.2 → 2.1.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.rdoc +28 -7
- data/lib/openlibrary.rb +1 -0
- data/lib/openlibrary/details.rb +53 -0
- data/lib/openlibrary/errors.rb +1 -0
- data/lib/openlibrary/request.rb +40 -62
- data/lib/openlibrary/version.rb +1 -1
- data/spec/client_spec.rb +8 -8
- data/spec/openlibrary_spec.rb +16 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f339172bc4d24e372b7413f8ce04f2fcc96a3dff
|
4
|
+
data.tar.gz: 821e0818118023cf063562060b82bba2417f7e24
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 291516ab8c9c71e98e1d645e7ccc8eb5b4fba7231a73e683169570c2da373597b6e653728531ff3c6e4df80aa92ebd382c917b1a2998cc3d6a03d52f5099141d
|
7
|
+
data.tar.gz: 3761380fe93b763c17d105c9c439cae8f03208bb6ae9b90d6f7cc16c75853595f238b832609a18002221da86e9ef76eb0e3f75b6f4fe5d5d58d016df783d3425
|
data/.gitignore
CHANGED
data/README.rdoc
CHANGED
@@ -146,7 +146,7 @@ NOTICE: Before you can actually save changes to Open Library, you need to regist
|
|
146
146
|
|
147
147
|
== Books Client
|
148
148
|
|
149
|
-
There are
|
149
|
+
There are three classes in the openlibrary gem you can use to access the {Books API}[http://openlibrary.org/dev/docs/api/books]. Use Openlibrary::View to look up Open Library listing information, Openlibrary::Data to get a book's full metadata details, and Openlibrary::Details to get book details in addition to what the Openlibrary::View class provides.
|
150
150
|
|
151
151
|
=== Openlibrary::View
|
152
152
|
|
@@ -183,16 +183,35 @@ Instantiate the class:
|
|
183
183
|
|
184
184
|
Look up a book by its ISBN-10 or ISBN-13:
|
185
185
|
|
186
|
-
|
186
|
+
book_data = data.find_by_isbn("0451526538")
|
187
187
|
|
188
|
-
|
189
|
-
|
188
|
+
book_data.title # book's title
|
189
|
+
book_data.authors # array of authors
|
190
190
|
|
191
191
|
Other built-in finder methods:
|
192
192
|
|
193
|
-
|
194
|
-
|
195
|
-
|
193
|
+
data.find_by_lccn # Library of Congress catalog number
|
194
|
+
data.find_by_oclc # Worldcat Control Number
|
195
|
+
data.find_by_olid # Open Library ID
|
196
|
+
|
197
|
+
=== Openlibrary::Details
|
198
|
+
|
199
|
+
Instantiate the class:
|
200
|
+
|
201
|
+
details = Openlibrary::Details
|
202
|
+
|
203
|
+
Look up a book by its ISBN-10 or ISBN-13:
|
204
|
+
|
205
|
+
book_details = details.find_by_isbn("0451526538")
|
206
|
+
|
207
|
+
book_details.info_url # book's URL on Open Library
|
208
|
+
book_details.details # additional details, such as description
|
209
|
+
|
210
|
+
Other built-in finder methods:
|
211
|
+
|
212
|
+
details.find_by_lccn # Library of Congress catalog number
|
213
|
+
details.find_by_oclc # Worldcat Control Number
|
214
|
+
details.find_by_olid # Open Library ID
|
196
215
|
|
197
216
|
== CONTRIBUTORS
|
198
217
|
|
@@ -204,6 +223,8 @@ Other built-in finder methods:
|
|
204
223
|
* Alex Grant https://github.com/grantovich
|
205
224
|
* Bryan L. Fordham https://github.com/bfordham
|
206
225
|
* Kyle Corbitt https://github.com/kcorbitt
|
226
|
+
* Matt Dressel https://github.com/dresselm
|
227
|
+
* Scott Lesser https://github.com/okcscott
|
207
228
|
|
208
229
|
== LICENSE
|
209
230
|
|
data/lib/openlibrary.rb
CHANGED
data/lib/openlibrary/details.rb
CHANGED
@@ -0,0 +1,53 @@
|
|
1
|
+
module Openlibrary
|
2
|
+
|
3
|
+
class Details
|
4
|
+
attr_accessor :info_url
|
5
|
+
attr_accessor :bib_key
|
6
|
+
attr_accessor :preview_url
|
7
|
+
attr_accessor :thumbnail_url
|
8
|
+
attr_accessor :details
|
9
|
+
|
10
|
+
def self.find_by_isbn(key)
|
11
|
+
find("ISBN",key)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.find_by_lccn(key)
|
15
|
+
find("LCCN",key)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.find_by_oclc(key)
|
19
|
+
find("OCLC",key)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.find_by_olid(key)
|
23
|
+
find("OLID",key)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.find(type,key)
|
27
|
+
type_for_uri = URI.encode_www_form_component(type)
|
28
|
+
key_for_uri = URI.encode_www_form_component(key)
|
29
|
+
|
30
|
+
response = RestClient.get "http://openlibrary.org/api/books" +
|
31
|
+
"?bibkeys=#{type_for_uri}:#{key_for_uri}&format=json&jscmd=data"
|
32
|
+
response_data = JSON.parse(response)
|
33
|
+
book = response_data["#{type}:#{key}"]
|
34
|
+
|
35
|
+
if book
|
36
|
+
book_meta = new
|
37
|
+
|
38
|
+
book_meta.info_url = book["info_url"]
|
39
|
+
book_meta.bib_key = book["bib_key"]
|
40
|
+
book_meta.preview_url = book["preview_url"]
|
41
|
+
book_meta.thumbnail_url = book["thumbnail_url"]
|
42
|
+
book_meta.details = book["details"]
|
43
|
+
|
44
|
+
book_meta
|
45
|
+
else
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
end
|
53
|
+
|
data/lib/openlibrary/errors.rb
CHANGED
data/lib/openlibrary/request.rb
CHANGED
@@ -6,51 +6,40 @@ require 'hashie'
|
|
6
6
|
|
7
7
|
module Openlibrary
|
8
8
|
module Request
|
9
|
-
API_URL = '
|
9
|
+
API_URL = 'https://openlibrary.org'
|
10
10
|
|
11
11
|
protected
|
12
12
|
|
13
|
+
HANDLE_REST_CLIENT_RESPONSE = lambda do |response, request, result, &block|
|
14
|
+
case response.code
|
15
|
+
when 200
|
16
|
+
response.return!(request, result, &block)
|
17
|
+
when 401
|
18
|
+
raise Openlibrary::Unauthorized
|
19
|
+
when 404
|
20
|
+
raise Openlibrary::NotFound
|
21
|
+
when 302
|
22
|
+
raise Openlibrary::Redirect
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
13
26
|
# Perform a GET request
|
14
27
|
#
|
15
28
|
# path - Request path
|
16
29
|
#
|
17
30
|
def request(path, params={})
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
resp = RestClient.get(url, params) do |response, request, result, &block|
|
22
|
-
case response.code
|
23
|
-
when 200
|
24
|
-
response.return!(request, result, &block)
|
25
|
-
when 401
|
26
|
-
raise Openlibrary::Unauthorized
|
27
|
-
when 404
|
28
|
-
raise Openlibrary::NotFound
|
29
|
-
end
|
30
|
-
end
|
31
|
-
parse(resp)
|
31
|
+
request_url = "#{API_URL}#{path}"
|
32
|
+
perform_get_request(request_url, params)
|
32
33
|
end
|
33
34
|
|
34
35
|
|
35
36
|
# Get the history of an object in Open Library
|
36
|
-
#
|
37
|
+
#
|
37
38
|
# object - Object key, e.g., '/books/OL1M'
|
38
39
|
#
|
39
40
|
def history(object, params={})
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
resp = RestClient.get(url, params) do |response, request, result, &block|
|
44
|
-
case response.code
|
45
|
-
when 200
|
46
|
-
response.return!(request, result, &block)
|
47
|
-
when 401
|
48
|
-
raise Openlibrary::Unauthorized
|
49
|
-
when 404
|
50
|
-
raise Openlibrary::NotFound
|
51
|
-
end
|
52
|
-
end
|
53
|
-
parse(resp)
|
41
|
+
history_url = "#{API_URL}#{object}.json?m=history"
|
42
|
+
perform_get_request(history_url, params)
|
54
43
|
end
|
55
44
|
|
56
45
|
# Perform a query using the Query API
|
@@ -58,24 +47,13 @@ module Openlibrary
|
|
58
47
|
# query - Query path, e.g. "type=/type/edition&isbn_10=XXXXXXXXXX"
|
59
48
|
#
|
60
49
|
def query(query, params={})
|
61
|
-
|
62
|
-
|
63
|
-
resp = RestClient.get(url, params) do |response, request, result, &block|
|
64
|
-
case response.code
|
65
|
-
when 200
|
66
|
-
response.return!(request, result, &block)
|
67
|
-
when 401
|
68
|
-
raise Openlibrary::Unauthorized
|
69
|
-
when 404
|
70
|
-
raise Openlibrary::NotFound
|
71
|
-
end
|
72
|
-
end
|
73
|
-
parse(resp)
|
50
|
+
query_url = "#{API_URL}/query.json?#{query}"
|
51
|
+
perform_get_request(query_url, params)
|
74
52
|
end
|
75
53
|
|
76
54
|
def protected_login(username, password, params={})
|
77
55
|
params.merge!(content_type: :json, accept: :json)
|
78
|
-
url
|
56
|
+
url = "#{API_URL}/account/login"
|
79
57
|
login = { 'username' => username, 'password' => password }.to_json
|
80
58
|
|
81
59
|
resp = RestClient.post(url, login, params) do |response|
|
@@ -87,11 +65,13 @@ module Openlibrary
|
|
87
65
|
raise Openlibrary::Unauthorized
|
88
66
|
when 404
|
89
67
|
raise Openlibrary::NotFound
|
68
|
+
when 302
|
69
|
+
raise Openlibrary::Redirect
|
90
70
|
end
|
91
71
|
end
|
92
72
|
end
|
93
73
|
|
94
|
-
# Update an Open Library object
|
74
|
+
# Update an Open Library object
|
95
75
|
#
|
96
76
|
# key - Object key the Open Library resource
|
97
77
|
# cookie - Cookie retrieved by the login method
|
@@ -100,31 +80,29 @@ module Openlibrary
|
|
100
80
|
#
|
101
81
|
def update(key, cookie, update, comment, params={})
|
102
82
|
cookie_header = { 'Cookie' => cookie }
|
103
|
-
comment_header = {
|
83
|
+
comment_header = {
|
104
84
|
'Opt' => '"http://openlibrary.org/dev/docs/api"; ns=42',
|
105
|
-
'42-comment' => comment
|
85
|
+
'42-comment' => comment
|
106
86
|
}
|
107
87
|
params.merge!(cookie_header)
|
108
88
|
params.merge!(comment_header)
|
109
89
|
params.merge!(content_type: :json, accept: :json)
|
110
|
-
|
90
|
+
update_url = "#{API_URL}#{key}"
|
111
91
|
|
112
|
-
|
113
|
-
|
114
|
-
when 200
|
115
|
-
response.return!(request, result, &block)
|
116
|
-
when 401
|
117
|
-
raise Openlibrary::Unauthorized
|
118
|
-
when 404
|
119
|
-
raise Openlibrary::NotFound
|
120
|
-
end
|
121
|
-
end
|
122
|
-
parse(resp)
|
92
|
+
response = RestClient.put(update_url, update, params, &HANDLE_REST_CLIENT_RESPONSE)
|
93
|
+
parse(response)
|
123
94
|
end
|
124
95
|
|
125
|
-
def parse(
|
126
|
-
|
127
|
-
|
96
|
+
def parse(response)
|
97
|
+
JSON.parse(response.body)
|
98
|
+
end
|
99
|
+
private :parse
|
100
|
+
|
101
|
+
def perform_get_request(url, params)
|
102
|
+
params.merge!(accept: :json)
|
103
|
+
response = RestClient.get(url, params, &HANDLE_REST_CLIENT_RESPONSE)
|
104
|
+
parse(response)
|
128
105
|
end
|
106
|
+
private :perform_get_request
|
129
107
|
end
|
130
108
|
end
|
data/lib/openlibrary/version.rb
CHANGED
data/spec/client_spec.rb
CHANGED
@@ -44,8 +44,8 @@ describe 'Client' do
|
|
44
44
|
book.subjects[1].should eq 'First loves -- Fiction'
|
45
45
|
book.subjects[0].should eq 'Traffic accidents -- Fiction'
|
46
46
|
|
47
|
-
# Because of a conflict with the internal `key?` method of
|
48
|
-
# Hashie::Mash, any key actually named 'key' must be referenced
|
47
|
+
# Because of a conflict with the internal `key?` method of
|
48
|
+
# Hashie::Mash, any key actually named 'key' must be referenced
|
49
49
|
# with a bang (!) to get the value.
|
50
50
|
book.key!.should eq '/books/OL23109860M'
|
51
51
|
book.languages[0].key!.should eq '/languages/eng'
|
@@ -56,7 +56,7 @@ describe 'Client' do
|
|
56
56
|
before do
|
57
57
|
isbn_10 = '046503912X'
|
58
58
|
type = '/type/edition'
|
59
|
-
stub_get("/query.json?type=#{type}&isbn_10=#{isbn_10}",
|
59
|
+
stub_get("/query.json?type=#{type}&isbn_10=#{isbn_10}",
|
60
60
|
'book_by_isbn.json')
|
61
61
|
end
|
62
62
|
it 'returns array of books' do
|
@@ -66,7 +66,7 @@ describe 'Client' do
|
|
66
66
|
|
67
67
|
books = client.book_by_isbn('046503912X')
|
68
68
|
|
69
|
-
books.should be_a Array
|
69
|
+
books.should be_a Array
|
70
70
|
books[0].should be_a Hash
|
71
71
|
|
72
72
|
books[0]['key'].should eq '/books/OL6807502M'
|
@@ -115,7 +115,7 @@ describe 'Client' do
|
|
115
115
|
|
116
116
|
it 'returns author details' do
|
117
117
|
expect { client.author('OL1A') }.not_to raise_error
|
118
|
-
|
118
|
+
|
119
119
|
author = client.author('OL1A')
|
120
120
|
|
121
121
|
author.should be_a Hashie::Mash
|
@@ -128,8 +128,8 @@ describe 'Client' do
|
|
128
128
|
author.id.should eq 97
|
129
129
|
author.revision.should eq 6
|
130
130
|
|
131
|
-
# Because of a conflict with the internal `key?` method of
|
132
|
-
# Hashie::Mash, any key actually named 'key' must be referenced
|
131
|
+
# Because of a conflict with the internal `key?` method of
|
132
|
+
# Hashie::Mash, any key actually named 'key' must be referenced
|
133
133
|
# with a bang (!) to get the value.
|
134
134
|
author.key!.should eq '/authors/OL1A'
|
135
135
|
end
|
@@ -219,7 +219,7 @@ describe 'Client' do
|
|
219
219
|
|
220
220
|
describe '#login' do
|
221
221
|
before do
|
222
|
-
stub_http_request(:post, "openlibrary.org/account/login").
|
222
|
+
stub_http_request(:post, "https://openlibrary.org/account/login").
|
223
223
|
with( body: "{\"username\":\"username\",\"password\":\"password\"}" ).
|
224
224
|
to_return( status: 200, headers: {'Set-Cookie' => 'session=cookie'} )
|
225
225
|
end
|
data/spec/openlibrary_spec.rb
CHANGED
@@ -51,3 +51,19 @@ describe 'Openlibrary::Data' do
|
|
51
51
|
it { should respond_to(:pages) }
|
52
52
|
it { should respond_to(:weight) }
|
53
53
|
end
|
54
|
+
|
55
|
+
describe 'Openlibrary::Details' do
|
56
|
+
before do
|
57
|
+
@book_details = Openlibrary::Details.new
|
58
|
+
end
|
59
|
+
|
60
|
+
subject { @book_details }
|
61
|
+
|
62
|
+
it { should_not respond_to(:some_random_thing) }
|
63
|
+
|
64
|
+
it { should respond_to(:info_url) }
|
65
|
+
it { should respond_to(:bib_key) }
|
66
|
+
it { should respond_to(:preview_url) }
|
67
|
+
it { should respond_to(:thumbnail_url) }
|
68
|
+
it { should respond_to(:details) }
|
69
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openlibrary
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jay Fajardo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -158,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
158
158
|
version: '0'
|
159
159
|
requirements: []
|
160
160
|
rubyforge_project: openlibrary
|
161
|
-
rubygems_version: 2.
|
161
|
+
rubygems_version: 2.2.2
|
162
162
|
signing_key:
|
163
163
|
specification_version: 4
|
164
164
|
summary: Ruby Interface for the Openlibrary.org API
|