google-book 0.2.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/.gitignore +5 -0
- data/.rspec +1 -0
- data/Gemfile +2 -0
- data/LICENSE +13 -0
- data/README.md +4 -0
- data/Rakefile +11 -0
- data/google.gemspec +27 -0
- data/lib/google.rb +7 -0
- data/lib/google/book/cover.rb +37 -0
- data/lib/google/book/request.rb +42 -0
- data/lib/google/book/response.rb +30 -0
- data/lib/google/book/struct.rb +50 -0
- data/lib/google/book/version.rb +5 -0
- data/spec/google/book/cover_spec.rb +15 -0
- data/spec/google/book/request_spec.rb +24 -0
- data/spec/google/book/response_spec.rb +22 -0
- data/spec/google/book/struct_spec.rb +98 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/support/vcr.rb +11 -0
- metadata +134 -0
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
-cfd
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
2
|
+
Version 2, December 2004
|
3
|
+
|
4
|
+
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
5
|
+
|
6
|
+
Everyone is permitted to copy and distribute verbatim or modified
|
7
|
+
copies of this license document, and changing it is allowed as long
|
8
|
+
as the name is changed.
|
9
|
+
|
10
|
+
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
11
|
+
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
12
|
+
|
13
|
+
0. You just DO WHAT THE FUCK YOU WANT TO.
|
data/README.md
ADDED
data/Rakefile
ADDED
data/google.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path('../lib', __FILE__)
|
3
|
+
require 'google/book/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'google-book'
|
7
|
+
s.version = Google::Book::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ['Paper Cavalier']
|
10
|
+
s.email = ['code@papercavalier.com']
|
11
|
+
s.homepage = 'http://rubygems.org/gems/google-book'
|
12
|
+
s.summary = %q{A Ruby wrapper to the Google Book Search Data API}
|
13
|
+
s.description = %q{Google Book is a Ruby wrapper to the Google Book Search Data API.}
|
14
|
+
|
15
|
+
s.rubyforge_project = 'google-book'
|
16
|
+
|
17
|
+
s.add_dependency('bookland', ['~> 1.0.0'])
|
18
|
+
s.add_dependency('httparty', ['~> 0.7.4'])
|
19
|
+
s.add_development_dependency('rspec', ['~> 2.5.0'])
|
20
|
+
s.add_development_dependency('vcr', '~> 1.7.0')
|
21
|
+
s.add_development_dependency('webmock', '~> 1.6.2')
|
22
|
+
|
23
|
+
s.files = `git ls-files`.split("\n")
|
24
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
25
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
26
|
+
s.require_paths = ['lib']
|
27
|
+
end
|
data/lib/google.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
module Google
|
2
|
+
module Book
|
3
|
+
class Cover
|
4
|
+
def initialize(url)
|
5
|
+
@url = url
|
6
|
+
end
|
7
|
+
|
8
|
+
def thumbnail
|
9
|
+
cover_url(5)
|
10
|
+
end
|
11
|
+
|
12
|
+
def small
|
13
|
+
cover_url(1)
|
14
|
+
end
|
15
|
+
|
16
|
+
def medium
|
17
|
+
cover_url(2)
|
18
|
+
end
|
19
|
+
|
20
|
+
def large
|
21
|
+
cover_url(3)
|
22
|
+
end
|
23
|
+
|
24
|
+
def extra_large
|
25
|
+
cover_url(6)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def cover_url(zoom)
|
31
|
+
@url.
|
32
|
+
gsub('zoom=5', "zoom=#{zoom}").
|
33
|
+
gsub('&edge=curl', '')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
require 'httparty'
|
3
|
+
|
4
|
+
module Google
|
5
|
+
module Book
|
6
|
+
module Request
|
7
|
+
include HTTParty
|
8
|
+
format :xml
|
9
|
+
|
10
|
+
class << self
|
11
|
+
attr_accessor :parameters
|
12
|
+
|
13
|
+
# Queries the Google Book Search Data API.
|
14
|
+
#
|
15
|
+
# Optionally, specify a page and count to paginate through the
|
16
|
+
# result set.
|
17
|
+
#
|
18
|
+
# GoogleBook.find('deleuze', :page => 2, :count => 20)
|
19
|
+
#
|
20
|
+
def find(query, opts = {})
|
21
|
+
self.parameters = { 'q' => query }
|
22
|
+
parameters['start-index'] = opts[:page] if opts[:page]
|
23
|
+
parameters['max-results'] = opts[:count] if opts[:count]
|
24
|
+
|
25
|
+
Response.new(get(url.to_s))
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def query
|
31
|
+
parameters.map { |k, v| "#{k}=#{CGI.escape(v.to_s)}" }.join('&')
|
32
|
+
end
|
33
|
+
|
34
|
+
def url
|
35
|
+
URI::HTTP.build(:host => 'books.google.com',
|
36
|
+
:path => '/books/feeds/volumes',
|
37
|
+
:query => query)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Google
|
2
|
+
module Book
|
3
|
+
class Response
|
4
|
+
def initialize(hash)
|
5
|
+
@feed = hash['feed']
|
6
|
+
end
|
7
|
+
|
8
|
+
def to_books
|
9
|
+
@feed['entry'].map do |hash|
|
10
|
+
book = Struct.new(
|
11
|
+
Cover.new(hash['link'][0]['href']),
|
12
|
+
hash['link'][1]['href'],
|
13
|
+
hash['link'][2]['href'],
|
14
|
+
[hash['dc:creator']].flatten,
|
15
|
+
hash['dc:date'],
|
16
|
+
hash['dc:description'],
|
17
|
+
[hash['dc:format']].flatten,
|
18
|
+
hash['dc:identifier'],
|
19
|
+
hash['dc:publisher'],
|
20
|
+
hash['dc:subject'],
|
21
|
+
[hash['dc:title']].flatten)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def total_results
|
26
|
+
@feed['openSearch:totalResults'].to_i
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Google
|
2
|
+
module Book
|
3
|
+
class Struct< Struct.new :cover,
|
4
|
+
:info,
|
5
|
+
:preview,
|
6
|
+
:creators,
|
7
|
+
:date,
|
8
|
+
:description,
|
9
|
+
:formats,
|
10
|
+
:identifiers,
|
11
|
+
:publisher,
|
12
|
+
:subjects,
|
13
|
+
:titles
|
14
|
+
|
15
|
+
include Bookland
|
16
|
+
|
17
|
+
def formatted_creators
|
18
|
+
creators.join(', ')
|
19
|
+
end
|
20
|
+
|
21
|
+
def formatted_formats
|
22
|
+
formats.reject do |format|
|
23
|
+
format == 'book'
|
24
|
+
end.join(', ')
|
25
|
+
end
|
26
|
+
|
27
|
+
def formatted_publisher
|
28
|
+
publisher.
|
29
|
+
gsub(/[ ,]+Inc.?$/, '').
|
30
|
+
gsub(/Intl( |$)/) { "International#{$1}" }.
|
31
|
+
gsub(/Pr( |$)/) { "Press#{$1}" }.
|
32
|
+
gsub(/ Pub$/, ' Publishers').
|
33
|
+
gsub('Pub Group', 'Publishing Group').
|
34
|
+
gsub(/Univ( |$)/) { "University#{$1}" }
|
35
|
+
end
|
36
|
+
|
37
|
+
def formatted_title
|
38
|
+
titles.join(': ')
|
39
|
+
end
|
40
|
+
|
41
|
+
def isbn
|
42
|
+
identifiers.detect do |identifier|
|
43
|
+
identifier.match(/ISBN:([0-9X]{10,13})/)
|
44
|
+
end
|
45
|
+
|
46
|
+
ISBN.to_13($1) rescue nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Google
|
4
|
+
module Book
|
5
|
+
describe Cover do
|
6
|
+
use_vcr_cassette 'google'
|
7
|
+
|
8
|
+
subject { Request.find('deleuze').to_books.first.cover }
|
9
|
+
|
10
|
+
%w{thumbnail small medium large extra_large}.each do |attribute|
|
11
|
+
its(attribute) { should_not be_nil }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Google
|
4
|
+
module Book
|
5
|
+
describe Request do
|
6
|
+
use_vcr_cassette 'google'
|
7
|
+
|
8
|
+
it "should escape parameters" do
|
9
|
+
Request.find('foo bar')
|
10
|
+
Request.send(:query).should include 'foo+bar'
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should set page" do
|
14
|
+
Request.find('foo bar', :page => 2)
|
15
|
+
Request.send(:query).should include 'start-index=2'
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should set number of results per page" do
|
19
|
+
Request.find('foo bar', :count => 20)
|
20
|
+
Request.send(:query).should include 'max-results=20'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Google
|
4
|
+
module Book
|
5
|
+
describe Response do
|
6
|
+
use_vcr_cassette 'google'
|
7
|
+
|
8
|
+
let(:response) do
|
9
|
+
Request.find('deleuze')
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should set total results" do
|
13
|
+
response.total_results.should > 0
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should return books" do
|
17
|
+
books = response.to_books
|
18
|
+
books.first.should be_an_instance_of Struct
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Google
|
4
|
+
module Book
|
5
|
+
describe Struct do
|
6
|
+
use_vcr_cassette 'google'
|
7
|
+
|
8
|
+
let(:book) do
|
9
|
+
Struct.new
|
10
|
+
end
|
11
|
+
|
12
|
+
subject { Request.find('deleuze').to_books.first }
|
13
|
+
|
14
|
+
%w{cover info preview creators date description formats
|
15
|
+
identifiers isbn publisher subjects titles}.each do |attribute|
|
16
|
+
its(attribute) { should_not be_nil }
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#formatted_creators" do
|
20
|
+
it "should concatenate creators" do
|
21
|
+
book.creators = ['Deleuze', 'Guattari']
|
22
|
+
book.formatted_creators.should eql 'Deleuze, Guattari'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#formatted_formats" do
|
27
|
+
it "should concatenate formats" do
|
28
|
+
book.formats = ['foo', 'bar']
|
29
|
+
book.formatted_formats.should eql 'foo, bar'
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should drop the word book" do
|
33
|
+
book.formats = ['foo', 'book']
|
34
|
+
book.formatted_formats.should eql 'foo'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "#formatted_publisher" do
|
39
|
+
it "should drop Inc at the end of the word" do
|
40
|
+
book.publisher = 'Publisher Inc'
|
41
|
+
book.formatted_publisher.should eql 'Publisher'
|
42
|
+
|
43
|
+
book.publisher = 'Random House, Inc.'
|
44
|
+
book.formatted_publisher.should eql 'Random House'
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should format Intl" do
|
48
|
+
book.publisher = 'Continuum Intl'
|
49
|
+
book.formatted_publisher.should eql 'Continuum International'
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should format Pr" do
|
53
|
+
book.publisher = 'Polity Pr'
|
54
|
+
book.formatted_publisher.should eql 'Polity Press'
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should format Pub" do
|
58
|
+
book.publisher = 'Rowman & Littlefield Pub'
|
59
|
+
book.formatted_publisher.should eql 'Rowman & Littlefield Publishers'
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should format Pub Group" do
|
63
|
+
book.publisher = 'Continuum International Pub Group'
|
64
|
+
book.formatted_publisher.should eql 'Continuum International Publishing Group'
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should format Univ in the middle of the word" do
|
68
|
+
book.publisher = 'Columbia Univ Press'
|
69
|
+
book.formatted_publisher.should eql 'Columbia University Press'
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should format Univ at the end of the word" do
|
73
|
+
book.publisher = 'Columbia Univ'
|
74
|
+
book.formatted_publisher.should eql 'Columbia University'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "#formatted_title" do
|
79
|
+
it "should concatenate titles" do
|
80
|
+
book.titles = ['Thousand Plateaus', 'Capitalism and Schizophrenia']
|
81
|
+
book.formatted_title.should eql 'Thousand Plateaus: Capitalism and Schizophrenia'
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "#isbn" do
|
86
|
+
it "should return the ISBN" do
|
87
|
+
book.identifiers = ['8cp-Z_G42g4C','ISBN:0192802380']
|
88
|
+
book.isbn.should eql '9780192802385'
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should return nil if no ISBN is available" do
|
92
|
+
book.identifiers = []
|
93
|
+
book.isbn.should eql nil
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/spec/support/vcr.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'vcr'
|
2
|
+
|
3
|
+
VCR.config do |c|
|
4
|
+
c.cassette_library_dir = File.dirname(__FILE__) + '/../fixtures/cassette_library'
|
5
|
+
c.default_cassette_options = { :record => :new_episodes }
|
6
|
+
c.stub_with :webmock
|
7
|
+
end
|
8
|
+
|
9
|
+
RSpec.configure do |config|
|
10
|
+
config.extend VCR::RSpec::Macros
|
11
|
+
end
|
metadata
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: google-book
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.2.0
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Paper Cavalier
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-03-05 00:00:00 +00:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: bookland
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ~>
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 1.0.0
|
25
|
+
type: :runtime
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: httparty
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ~>
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 0.7.4
|
36
|
+
type: :runtime
|
37
|
+
version_requirements: *id002
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: rspec
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 2.5.0
|
47
|
+
type: :development
|
48
|
+
version_requirements: *id003
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: vcr
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ~>
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: 1.7.0
|
58
|
+
type: :development
|
59
|
+
version_requirements: *id004
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: webmock
|
62
|
+
prerelease: false
|
63
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.6.2
|
69
|
+
type: :development
|
70
|
+
version_requirements: *id005
|
71
|
+
description: Google Book is a Ruby wrapper to the Google Book Search Data API.
|
72
|
+
email:
|
73
|
+
- code@papercavalier.com
|
74
|
+
executables: []
|
75
|
+
|
76
|
+
extensions: []
|
77
|
+
|
78
|
+
extra_rdoc_files: []
|
79
|
+
|
80
|
+
files:
|
81
|
+
- .gitignore
|
82
|
+
- .rspec
|
83
|
+
- Gemfile
|
84
|
+
- LICENSE
|
85
|
+
- README.md
|
86
|
+
- Rakefile
|
87
|
+
- google.gemspec
|
88
|
+
- lib/google.rb
|
89
|
+
- lib/google/book/cover.rb
|
90
|
+
- lib/google/book/request.rb
|
91
|
+
- lib/google/book/response.rb
|
92
|
+
- lib/google/book/struct.rb
|
93
|
+
- lib/google/book/version.rb
|
94
|
+
- spec/google/book/cover_spec.rb
|
95
|
+
- spec/google/book/request_spec.rb
|
96
|
+
- spec/google/book/response_spec.rb
|
97
|
+
- spec/google/book/struct_spec.rb
|
98
|
+
- spec/spec_helper.rb
|
99
|
+
- spec/support/vcr.rb
|
100
|
+
has_rdoc: true
|
101
|
+
homepage: http://rubygems.org/gems/google-book
|
102
|
+
licenses: []
|
103
|
+
|
104
|
+
post_install_message:
|
105
|
+
rdoc_options: []
|
106
|
+
|
107
|
+
require_paths:
|
108
|
+
- lib
|
109
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
+
none: false
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: "0"
|
115
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: "0"
|
121
|
+
requirements: []
|
122
|
+
|
123
|
+
rubyforge_project: google-book
|
124
|
+
rubygems_version: 1.5.2
|
125
|
+
signing_key:
|
126
|
+
specification_version: 3
|
127
|
+
summary: A Ruby wrapper to the Google Book Search Data API
|
128
|
+
test_files:
|
129
|
+
- spec/google/book/cover_spec.rb
|
130
|
+
- spec/google/book/request_spec.rb
|
131
|
+
- spec/google/book/response_spec.rb
|
132
|
+
- spec/google/book/struct_spec.rb
|
133
|
+
- spec/spec_helper.rb
|
134
|
+
- spec/support/vcr.rb
|