openlibrary 1.0.2 → 2.0.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/README.rdoc CHANGED
@@ -1,4 +1,4 @@
1
- == Openlibrary 1.0.1
1
+ == Openlibrary 2.0.0
2
2
 
3
3
  The openlibrary gem provides Ruby clients for the {Open Library REST API}[http://openlibrary.org/dev/docs/restful_api] and {Books API}[http://openlibrary.org/dev/docs/api/books].
4
4
 
@@ -15,17 +15,18 @@ or in your Gemfile:
15
15
 
16
16
  gem 'openlibrary'
17
17
 
18
-
19
18
  == Usage
20
19
 
21
- You can use the Books client to retrieve a book's Open Library listing information, and the REST client to make broader queries.
20
+ You can use the Books client to retrieve a book's Open Library listing information, and the REST client to perform more advanced queries and save changes to Open Library.
22
21
 
23
22
  # just require
24
23
  require 'openlibrary'
25
24
 
26
25
  == REST Client
27
26
 
28
- You can use the REST client to look up books, authors, the revision history of any Open Library object, and recent changes to Open Library.
27
+ You can use the REST client to look up books, authors, the revision history of any Open Library object, and recent changes to Open Library.
28
+
29
+ You can also use the REST client to log in and save changes to Open Library, after you register your profile (or your bot's profile) with the {API Usergroup}[http://openlibrary.org/usergroup/api]. Send a message to the {ol-tech mailing list}[http://mail.archive.org/cgi-bin/mailman/listinfo/ol-tech] to learn how!
29
30
 
30
31
  === Getting Started
31
32
 
@@ -35,7 +36,7 @@ Before anything else, create a new client:
35
36
 
36
37
  === Books
37
38
 
38
- Since Open Library has varying amounts of information about the books in its database, and returns data in a schemaless format, not every book will have the same properties. Some common properties include `title`, `works`, and `contributors`, but most books will have more.
39
+ Since Open Library has varying amounts of information about the books in its database, and returns data in a schemaless format, not every book will have the same properties. Common properties include `title`, `works`, and `contributors`, but most books will have more.
39
40
 
40
41
  Find a book by its OLID:
41
42
 
@@ -101,7 +102,7 @@ Get the revision history of any Open Library object:
101
102
 
102
103
  history = client.rev_history('key')
103
104
 
104
- The key should be in the format '/books/{OLID}', '/authors/{OLID}', '/works/{OLID}', etc.
105
+ The key should be in the format '/type/OLID'. E.g., '/books/OL9220552M', '/authors/OL27349A', or '/works/OL468516W'.
105
106
 
106
107
  === Recent Changes
107
108
 
@@ -109,6 +110,24 @@ Get an array of recent changes to Open Library:
109
110
 
110
111
  changes = client.recent
111
112
 
113
+ === Saving Changes
114
+
115
+ Use the login method to get a session cookie:
116
+
117
+ cookie = client.login('username', 'password')
118
+
119
+ Set the other parameters for the object you want to change:
120
+
121
+ key = '/type/OLID' # e.g., '/books/OL9220552M'
122
+ update = full_object_with_changes # must be JSON format
123
+ comment = 'changed X, Y, and Z'
124
+
125
+ Save your changes and receive the updated object as a response:
126
+
127
+ object = client.save(key, cookie, update, comment)
128
+
129
+ NOTICE: Before you can actually save changes to Open Library, you need to register your profile (or bot) with the {API Usergroup}[http://openlibrary.org/usergroup/api]. Send a message to the {ol-tech mailing list}[http://mail.archive.org/cgi-bin/mailman/listinfo/ol-tech] to learn how!
130
+
112
131
  == Books Client
113
132
 
114
133
  There are two 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, and Openlibrary::Data to get a book's full metadata details.
@@ -162,8 +181,8 @@ Other built-in finder methods:
162
181
  == CONTRIBUTORS
163
182
 
164
183
  * Jay Fajardo https://github.com/jayfajardo
184
+ * John Shutt https://github.com/pemulis
165
185
  * Robert Berry https://github.com/bdigital
166
186
  * Eric Larson https://github.com/ewlarson
167
187
  * Charles Horn https://github.com/hornc
168
- * John Shutt https://github.com/pemulis
169
188
  * Alex Grant https://github.com/grantovich
@@ -4,6 +4,8 @@ require 'openlibrary/client/authors'
4
4
  require 'openlibrary/client/history'
5
5
  require 'openlibrary/client/recent'
6
6
  require 'openlibrary/client/editions'
7
+ require 'openlibrary/client/login'
8
+ require 'openlibrary/client/save'
7
9
 
8
10
  module Openlibrary
9
11
  class Client
@@ -13,6 +15,8 @@ module Openlibrary
13
15
  include Openlibrary::History
14
16
  include Openlibrary::Recent
15
17
  include Openlibrary::Editions
18
+ include Openlibrary::Login
19
+ include Openlibrary::Save
16
20
 
17
21
  # Initialize an Openlibrary::Client instance
18
22
  #
@@ -20,9 +24,6 @@ module Openlibrary
20
24
  unless options.kind_of?(Hash)
21
25
  raise ArgumentError, "Options hash required."
22
26
  end
23
-
24
- # For future versions, options may include cookie information
25
- # and alternative Accept headers (e.g., RDF instead of JSON)
26
27
  end
27
28
  end
28
29
  end
@@ -0,0 +1,10 @@
1
+ module Openlibrary
2
+ module Login
3
+ # Log in to Open Library
4
+ #
5
+ def login(username, password)
6
+ response = protected_login("#{username}", "#{password}")
7
+ cookie = Hashie::Mash.new(response).session
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,18 @@
1
+ module Openlibrary
2
+ module Save
3
+ # Save changes to Open Library
4
+ #
5
+ # key - Open Library object key
6
+ # cookie - Cookie retrieved by login method
7
+ # update - Complete, updated Open Library JSON object
8
+ # comment - String comment describing the changes
9
+ #
10
+ # Note that 'update' can reference an external JSON file or
11
+ # a properly formatted Ruby object.
12
+ #
13
+ def save(key, cookie, update, comment)
14
+ response = update("#{key}", "#{cookie}", "#{update}", "#{comment}")
15
+ Hashie::Mash.new(response)
16
+ end
17
+ end
18
+ end
@@ -10,14 +10,15 @@ module Openlibrary
10
10
 
11
11
  protected
12
12
 
13
- # Perform an API request
13
+ # Perform a GET request
14
14
  #
15
15
  # path - Request path
16
16
  #
17
- def request(path)
17
+ def request(path, params={})
18
+ params.merge!(accept: :json)
18
19
  url = "#{API_URL}#{path}"
19
20
 
20
- resp = RestClient.get(url, { accept: :json }) do |response, request, result, &block|
21
+ resp = RestClient.get(url, params) do |response, request, result, &block|
21
22
  case response.code
22
23
  when 200
23
24
  response.return!(request, result, &block)
@@ -30,14 +31,16 @@ module Openlibrary
30
31
  parse(resp)
31
32
  end
32
33
 
34
+
33
35
  # Get the history of an object in Open Library
34
36
  #
35
- # object - object key, e.g., '/books/OL1M'
37
+ # object - Object key, e.g., '/books/OL1M'
36
38
  #
37
- def history(object)
39
+ def history(object, params={})
40
+ params.merge!(accept: :json)
38
41
  url = "#{API_URL}#{object}.json?m=history"
39
42
 
40
- resp = RestClient.get(url, { accept: :json }) do |response, request, result, &block|
43
+ resp = RestClient.get(url, params) do |response, request, result, &block|
41
44
  case response.code
42
45
  when 200
43
46
  response.return!(request, result, &block)
@@ -52,12 +55,62 @@ module Openlibrary
52
55
 
53
56
  # Perform a query using the Query API
54
57
  #
55
- # path - Request path
58
+ # query - Query path, e.g. "type=/type/edition&isbn_10=XXXXXXXXXX"
56
59
  #
57
- def query(query)
60
+ def query(query, params={})
61
+ params.merge!(accept: :json)
58
62
  url = "#{API_URL}/query.json?#{query}"
59
63
 
60
- resp = RestClient.get(url, { accept: :json }) do |response, request, result, &block|
64
+ resp = RestClient.get(url, params) do |response, request, result, &block|
65
+ case response.code
66
+ when 200
67
+ response.return!(request, result, &block)
68
+ when 401
69
+ raise Openlibrary::Unauthorized
70
+ when 404
71
+ raise Openlibrary::NotFound
72
+ end
73
+ end
74
+ parse(resp)
75
+ end
76
+
77
+ def protected_login(username, password, params={})
78
+ params.merge!(content_type: :json, accept: :json)
79
+ url = "#{API_URL}/account/login"
80
+ login = { 'username' => username, 'password' => password }.to_json
81
+
82
+ resp = RestClient.post(url, login, params) do |response|
83
+ case response.code
84
+ when 200
85
+ session = response.cookies
86
+ session
87
+ when 401
88
+ raise Openlibrary::Unauthorized
89
+ when 404
90
+ raise Openlibrary::NotFound
91
+ end
92
+ end
93
+ end
94
+
95
+ # Update an Open Library object
96
+ #
97
+ # key - Object key the Open Library resource
98
+ # cookie - Cookie retrieved by the login method
99
+ # update - Complete updated Open Library object in JSON format
100
+ # comment - Comment describing the change(s) to the object
101
+ #
102
+ def update(key, cookie, update, comment, params={})
103
+ cookie_header = { 'Cookie' => cookie }
104
+ comment_header = {
105
+ 'Opt' => '"http://openlibrary.org/dev/docs/api"; ns=42',
106
+ '42-comment' => comment
107
+ }
108
+ params.merge!(cookie_header)
109
+ params.merge!(comment_header)
110
+ params.merge!(content_type: :json, accept: :json)
111
+ url = "#{API_URL}#{key}"
112
+
113
+ resp = RestClient.put(url, update, params) do |response, request, result, &block|
61
114
  case response.code
62
115
  when 200
63
116
  response.return!(request, result, &block)
@@ -1,3 +1,3 @@
1
1
  module Openlibrary
2
- VERSION = "1.0.2"
2
+ VERSION = "2.0.0"
3
3
  end
data/openlibrary.gemspec CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.require_paths = ["lib"]
20
20
 
21
21
  s.add_development_dependency 'rspec', '~> 2.13'
22
- s.add_development_dependency 'webmock', '~> 1.6'
22
+ s.add_development_dependency 'webmock', '~> 1.11'
23
23
 
24
24
  s.add_runtime_dependency 'json', '~> 1.7.7'
25
25
  s.add_runtime_dependency 'rest-client', '~> 1.6'
data/spec/client_spec.rb CHANGED
@@ -191,4 +191,41 @@ describe 'Client' do
191
191
  # editions.entries[0].number_of_pages.should eq 322
192
192
  end
193
193
  end
194
+
195
+ describe '#login' do
196
+ before do
197
+ stub_http_request(:post, "www.openlibrary.org/account/login").
198
+ with( body: "{\"username\":\"username\",\"password\":\"password\"}" ).
199
+ to_return( status: 200, headers: {'Set-Cookie' => 'session=cookie'} )
200
+ end
201
+
202
+ it 'logs in to Open Library' do
203
+ expect { client.login('username', 'password') }.not_to raise_error
204
+
205
+ cookie = client.login('username', 'password')
206
+ cookie.should eq "cookie"
207
+ end
208
+ end
209
+
210
+ describe '#after_save' do
211
+ before do
212
+ key = "/books/OL9674499M"
213
+ comment = 'update weight and number of pages'
214
+ stub_put(key, 'save_after_change.json', comment)
215
+ end
216
+
217
+ it 'PUTs the updated object, and receives the updated object as a response' do
218
+ key = "/books/OL9674499M"
219
+ cookie = 'cookie'
220
+ update = fixture('save_after_change.json')
221
+ comment = 'update weight and number of pages'
222
+
223
+ expect { client.save(key, cookie, update, comment) }.not_to raise_error
224
+
225
+ object = client.save(key, cookie, update, comment)
226
+
227
+ object.weight.should eq '1.5 pounds'
228
+ object.number_of_pages.should eq 1103
229
+ end
230
+ end
194
231
  end
@@ -0,0 +1,42 @@
1
+ { "authors" : [ { "key" : "/authors/OL448939A" } ],
2
+ "covers" : [ 187816 ],
3
+ "created" : { "type" : "/type/datetime",
4
+ "value" : "2008-04-30T09:38:13.731961"
5
+ },
6
+ "edition_name" : "10 Anv edition",
7
+ "first_sentence" : { "type" : "/type/text",
8
+ "value" : "I am seated in an office, surrounded by heads and bodies."
9
+ },
10
+ "ia_box_id" : [ "IA138916" ],
11
+ "identifiers" : { "goodreads" : [ "75786" ],
12
+ "librarything" : [ "903" ]
13
+ },
14
+ "isbn_10" : [ "0316066524" ],
15
+ "isbn_13" : [ "9780316066525" ],
16
+ "key" : "/books/OL9674499M",
17
+ "languages" : [ { "key" : "/languages/eng" } ],
18
+ "last_modified" : { "type" : "/type/datetime",
19
+ "value" : "2012-02-19T03:27:30.858827"
20
+ },
21
+ "latest_revision" : 8,
22
+ "number_of_pages" : 1103,
23
+ "ocaid" : "infinitejestnove00wall",
24
+ "physical_dimensions" : "8.9 x 5.9 x 1.8 inches",
25
+ "physical_format" : "Paperback",
26
+ "publish_date" : "November 13, 2006",
27
+ "publishers" : [ "Back Bay Books" ],
28
+ "revision" : 8,
29
+ "source_records" : [ "ia:infinitejestnove00wall" ],
30
+ "subjects" : [ "Popular American Fiction",
31
+ "Fiction",
32
+ "Fiction - General",
33
+ "General",
34
+ "Fiction / General",
35
+ "Addicts",
36
+ "Compulsive behavior"
37
+ ],
38
+ "title" : "Infinite Jest",
39
+ "type" : { "key" : "/type/edition" },
40
+ "weight" : "1.5 pounds",
41
+ "works" : [ { "key" : "/works/OL2943602W" } ]
42
+ }
@@ -0,0 +1,42 @@
1
+ { "authors" : [ { "key" : "/authors/OL448939A" } ],
2
+ "covers" : [ 187816 ],
3
+ "created" : { "type" : "/type/datetime",
4
+ "value" : "2008-04-30T09:38:13.731961"
5
+ },
6
+ "edition_name" : "10 Anv edition",
7
+ "first_sentence" : { "type" : "/type/text",
8
+ "value" : "I am seated in an office, surrounded by heads and bodies."
9
+ },
10
+ "ia_box_id" : [ "IA138916" ],
11
+ "identifiers" : { "goodreads" : [ "75786" ],
12
+ "librarything" : [ "903" ]
13
+ },
14
+ "isbn_10" : [ "0316066524" ],
15
+ "isbn_13" : [ "9780316066525" ],
16
+ "key" : "/books/OL9674499M",
17
+ "languages" : [ { "key" : "/languages/eng" } ],
18
+ "last_modified" : { "type" : "/type/datetime",
19
+ "value" : "2012-02-19T03:27:30.858827"
20
+ },
21
+ "latest_revision" : 8,
22
+ "number_of_pages" : 1104,
23
+ "ocaid" : "infinitejestnove00wall",
24
+ "physical_dimensions" : "8.9 x 5.9 x 1.8 inches",
25
+ "physical_format" : "Paperback",
26
+ "publish_date" : "November 13, 2006",
27
+ "publishers" : [ "Back Bay Books" ],
28
+ "revision" : 8,
29
+ "source_records" : [ "ia:infinitejestnove00wall" ],
30
+ "subjects" : [ "Popular American Fiction",
31
+ "Fiction",
32
+ "Fiction - General",
33
+ "General",
34
+ "Fiction / General",
35
+ "Addicts",
36
+ "Compulsive behavior"
37
+ ],
38
+ "title" : "Infinite Jest",
39
+ "type" : { "key" : "/type/edition" },
40
+ "weight" : "1.4 pounds",
41
+ "works" : [ { "key" : "/works/OL2943602W" } ]
42
+ }
data/spec/spec_helper.rb CHANGED
@@ -13,11 +13,32 @@ end
13
13
 
14
14
  def stub_get(path, fixture_name)
15
15
  stub_request(:get, api_url(path)).
16
- with(:headers => {'Accept'=>'application/json'}).
16
+ with(headers: {
17
+ 'Accept'=>'application/json'
18
+ }).
17
19
  to_return(
18
- :status => 200,
19
- :body => fixture(fixture_name),
20
- :headers => {}
20
+ status: 200,
21
+ body: fixture(fixture_name),
22
+ headers: {}
23
+ )
24
+ end
25
+
26
+ def stub_put(path, fixture_name, comment)
27
+ stub_request(:put, api_url(path)).
28
+ with(
29
+ body: fixture(fixture_name),
30
+ headers: {
31
+ 'Accept' => 'application/json',
32
+ 'Content-Type' => 'application/json',
33
+ 'Opt' => '"http://openlibrary.org/dev/docs/api"; ns=42',
34
+ '42-comment' => comment,
35
+ 'Cookie' => 'cookie',
36
+ 'User-Agent' => 'Ruby'
37
+ }).
38
+ to_return(
39
+ status: 200,
40
+ body: fixture(fixture_name),
41
+ headers: {}
21
42
  )
22
43
  end
23
44
 
metadata CHANGED
@@ -1,93 +1,119 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: openlibrary
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0
4
5
  prerelease:
5
- version: 1.0.2
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Jay Fajardo
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2013-03-05 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2013-04-02 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: rspec
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
19
17
  none: false
20
- requirements:
18
+ requirements:
21
19
  - - ~>
22
- - !ruby/object:Gem::Version
23
- version: "2.13"
20
+ - !ruby/object:Gem::Version
21
+ version: '2.13'
24
22
  type: :development
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
27
- name: webmock
28
23
  prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
30
25
  none: false
31
- requirements:
26
+ requirements:
32
27
  - - ~>
33
- - !ruby/object:Gem::Version
34
- version: "1.6"
28
+ - !ruby/object:Gem::Version
29
+ version: '2.13'
30
+ - !ruby/object:Gem::Dependency
31
+ name: webmock
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '1.11'
35
38
  type: :development
36
- version_requirements: *id002
37
- - !ruby/object:Gem::Dependency
38
- name: json
39
39
  prerelease: false
40
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
41
41
  none: false
42
- requirements:
42
+ requirements:
43
43
  - - ~>
44
- - !ruby/object:Gem::Version
44
+ - !ruby/object:Gem::Version
45
+ version: '1.11'
46
+ - !ruby/object:Gem::Dependency
47
+ name: json
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
45
53
  version: 1.7.7
46
54
  type: :runtime
47
- version_requirements: *id003
48
- - !ruby/object:Gem::Dependency
49
- name: rest-client
50
55
  prerelease: false
51
- requirement: &id004 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.7.7
62
+ - !ruby/object:Gem::Dependency
63
+ name: rest-client
64
+ requirement: !ruby/object:Gem::Requirement
52
65
  none: false
53
- requirements:
66
+ requirements:
54
67
  - - ~>
55
- - !ruby/object:Gem::Version
56
- version: "1.6"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.6'
57
70
  type: :runtime
58
- version_requirements: *id004
59
- - !ruby/object:Gem::Dependency
60
- name: hashie
61
71
  prerelease: false
62
- requirement: &id005 !ruby/object:Gem::Requirement
72
+ version_requirements: !ruby/object:Gem::Requirement
63
73
  none: false
64
- requirements:
74
+ requirements:
65
75
  - - ~>
66
- - !ruby/object:Gem::Version
76
+ - !ruby/object:Gem::Version
77
+ version: '1.6'
78
+ - !ruby/object:Gem::Dependency
79
+ name: hashie
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
67
85
  version: 2.0.2
68
86
  type: :runtime
69
- version_requirements: *id005
70
- - !ruby/object:Gem::Dependency
71
- name: activesupport
72
87
  prerelease: false
73
- requirement: &id006 !ruby/object:Gem::Requirement
88
+ version_requirements: !ruby/object:Gem::Requirement
74
89
  none: false
75
- requirements:
90
+ requirements:
76
91
  - - ~>
77
- - !ruby/object:Gem::Version
78
- version: "3"
92
+ - !ruby/object:Gem::Version
93
+ version: 2.0.2
94
+ - !ruby/object:Gem::Dependency
95
+ name: activesupport
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: '3'
79
102
  type: :runtime
80
- version_requirements: *id006
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: '3'
81
110
  description: Openlibrary.org API Interface
82
- email:
111
+ email:
83
112
  - jmrfajardo@gmail.com
84
113
  executables: []
85
-
86
114
  extensions: []
87
-
88
115
  extra_rdoc_files: []
89
-
90
- files:
116
+ files:
91
117
  - .gitignore
92
118
  - Gemfile
93
119
  - README.rdoc
@@ -98,7 +124,9 @@ files:
98
124
  - lib/openlibrary/client/books.rb
99
125
  - lib/openlibrary/client/editions.rb
100
126
  - lib/openlibrary/client/history.rb
127
+ - lib/openlibrary/client/login.rb
101
128
  - lib/openlibrary/client/recent.rb
129
+ - lib/openlibrary/client/save.rb
102
130
  - lib/openlibrary/data.rb
103
131
  - lib/openlibrary/details.rb
104
132
  - lib/openlibrary/errors.rb
@@ -115,36 +143,35 @@ files:
115
143
  - spec/fixtures/editions.json
116
144
  - spec/fixtures/history.json
117
145
  - spec/fixtures/recent.json
146
+ - spec/fixtures/save_after_change.json
147
+ - spec/fixtures/save_before_change.json
118
148
  - spec/openlibrary_spec.rb
119
149
  - spec/spec_helper.rb
120
150
  homepage: http://www.proudcloud.net
121
151
  licenses: []
122
-
123
152
  post_install_message:
124
153
  rdoc_options: []
125
-
126
- require_paths:
154
+ require_paths:
127
155
  - lib
128
- required_ruby_version: !ruby/object:Gem::Requirement
156
+ required_ruby_version: !ruby/object:Gem::Requirement
129
157
  none: false
130
- requirements:
131
- - - ">="
132
- - !ruby/object:Gem::Version
133
- version: "0"
134
- required_rubygems_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ! '>='
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
163
  none: false
136
- requirements:
137
- - - ">="
138
- - !ruby/object:Gem::Version
139
- version: "0"
164
+ requirements:
165
+ - - ! '>='
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
140
168
  requirements: []
141
-
142
169
  rubyforge_project: openlibrary
143
- rubygems_version: 1.8.22
170
+ rubygems_version: 1.8.23
144
171
  signing_key:
145
172
  specification_version: 3
146
173
  summary: Ruby Interface for the Openlibrary.org API
147
- test_files:
174
+ test_files:
148
175
  - spec/client_spec.rb
149
176
  - spec/fixtures/author.json
150
177
  - spec/fixtures/book.json
@@ -154,5 +181,7 @@ test_files:
154
181
  - spec/fixtures/editions.json
155
182
  - spec/fixtures/history.json
156
183
  - spec/fixtures/recent.json
184
+ - spec/fixtures/save_after_change.json
185
+ - spec/fixtures/save_before_change.json
157
186
  - spec/openlibrary_spec.rb
158
187
  - spec/spec_helper.rb