googlebooks 0.0.1
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/Gemfile +4 -0
- data/Rakefile +13 -0
- data/googlebooks.gemspec +29 -0
- data/lib/book/item.rb +49 -0
- data/lib/book/response.rb +27 -0
- data/lib/googlebooks.rb +58 -0
- data/lib/version.rb +3 -0
- metadata +78 -0
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# require "bundler/gem_tasks"
|
2
|
+
|
3
|
+
require 'bundler'
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
|
6
|
+
Bundler::GemHelper.install_tasks
|
7
|
+
|
8
|
+
desc 'Run all specs in spec directory'
|
9
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
10
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
11
|
+
end
|
12
|
+
|
13
|
+
task :default => :spec
|
data/googlebooks.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "googlebooks"
|
7
|
+
s.version = GoogleBooks::VERSION
|
8
|
+
s.authors = ["Zean Tsoi"]
|
9
|
+
s.email = ["zean.tsoi@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/zeantsoi/googlebooks"
|
11
|
+
s.summary = %q{GoogleBooks is a lightweight Ruby wrapper that queries the Google API to search for publications in the Google Books repository.}
|
12
|
+
|
13
|
+
s.description = %q{GoogleBooks is a lightweight Ruby wrapper that queries the Google API to search for publications in the Google Books repository. It is inspired by the google-book gem which relies on the deprecated Google GData Books API, but is updated to hook into the current Google API.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "googlebooks"
|
16
|
+
|
17
|
+
s.add_dependency('httparty')
|
18
|
+
s.add_development_dependency('rspec')
|
19
|
+
|
20
|
+
#s.files = `git ls-files`.split("\n")
|
21
|
+
s.files = Dir["{lib}/**/*", "googlebooks.gemspec", "Gemfile", "Rakefile"]
|
22
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
23
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
24
|
+
s.require_paths = ["lib"]
|
25
|
+
|
26
|
+
# specify any dependencies here; for example:
|
27
|
+
# s.add_development_dependency "rspec"
|
28
|
+
# s.add_runtime_dependency "rest-client"
|
29
|
+
end
|
data/lib/book/item.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
module GoogleBooks
|
2
|
+
|
3
|
+
class Item
|
4
|
+
attr_reader :kind, :id, :title, :authors, :publisher, :published_date, :description, :isbn, :isbn_10, :isbn_13, :page_count, :print_type, :categories, :average_rating, :ratings_count, :language, :preview_link, :info_link
|
5
|
+
|
6
|
+
def initialize(item)
|
7
|
+
@item = item
|
8
|
+
@volume_info = @item['volumeInfo']
|
9
|
+
retrieve_attribute
|
10
|
+
end
|
11
|
+
|
12
|
+
# Enables image_link attribute to be customized via passing
|
13
|
+
# optional zoom and edge arguments as a hash
|
14
|
+
def image_link(opts = {})
|
15
|
+
opts[:zoom] ||= 1
|
16
|
+
opts[:curl] ||= false
|
17
|
+
@volume_info['imageLinks']['thumbnail'].gsub('zoom=1', "zoom=#{opts[:zoom]}").gsub('&edge=curl', "&edge=#{opts[:curl] ? 'curl' : 'none'}") rescue nil
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def retrieve_attribute
|
23
|
+
@kind = @item['kind']
|
24
|
+
@id = @item['id']
|
25
|
+
@title = build_title
|
26
|
+
@authors = [@volume_info['authors']].flatten.join(', ')
|
27
|
+
@publisher = @volume_info['publisher']
|
28
|
+
@published_date = @volume_info['publishedDate']
|
29
|
+
@description = @volume_info['description']
|
30
|
+
@isbn = @volume_info['industryIdentifiers'][1]['identifier'] rescue nil
|
31
|
+
@isbn_10 = @volume_info['industryIdentifiers'][0]['identifier'] rescue nil
|
32
|
+
@isbn_13 = @isbn
|
33
|
+
@page_count = @volume_info['pageCount']
|
34
|
+
@print_type = @volume_info['printType']
|
35
|
+
@categories = [@volume_info['categories']].flatten.join(', ')
|
36
|
+
@average_rating = @volume_info['averageRating']
|
37
|
+
@ratings_count = @volume_info['ratingsCount']
|
38
|
+
@language = @volume_info['language']
|
39
|
+
@preview_link = @volume_info['previewLink']
|
40
|
+
@info_link = @volume_info['infoLink']
|
41
|
+
end
|
42
|
+
|
43
|
+
def build_title
|
44
|
+
title = [@volume_info['title']].flatten.join(': ')
|
45
|
+
@volume_info['subtitle'].nil? ? title : title + ": " + @volume_info['subtitle']
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'book/item'
|
2
|
+
|
3
|
+
module GoogleBooks
|
4
|
+
class Response
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
def initialize(response)
|
8
|
+
@response = response
|
9
|
+
end
|
10
|
+
|
11
|
+
# Returns nil if no records are returned. Otherwise, response returns
|
12
|
+
# hash of generally unusable Google API specific data.
|
13
|
+
def each(&block)
|
14
|
+
return [] if total_items == 0
|
15
|
+
@response['items'].each do |item|
|
16
|
+
block.call(Item.new(item))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Total items returnable based on query, not total items in response
|
21
|
+
# (which is throttled by maxResults)
|
22
|
+
def total_items
|
23
|
+
@response['totalItems'].to_i
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
data/lib/googlebooks.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'version'
|
2
|
+
require 'book/response'
|
3
|
+
|
4
|
+
require 'httparty'
|
5
|
+
require 'cgi'
|
6
|
+
|
7
|
+
module GoogleBooks
|
8
|
+
|
9
|
+
include HTTParty
|
10
|
+
format :json
|
11
|
+
|
12
|
+
class << self
|
13
|
+
|
14
|
+
attr_accessor :parameters
|
15
|
+
|
16
|
+
# Submits query to the current Google API for Books.
|
17
|
+
#
|
18
|
+
# 1st param passes all varieties of acceptable query strings
|
19
|
+
#
|
20
|
+
# 2nd param passes options hash:
|
21
|
+
# * :count passes number of results to display per page (default=5)
|
22
|
+
# * :page passes the page number (default=1)
|
23
|
+
#
|
24
|
+
# 3rd parameter optionally passes user's IP address
|
25
|
+
# * User IP may be require in order for request to be made to the
|
26
|
+
# Google API from applications residing on decentralized cloud servers
|
27
|
+
# See http://www.google.com/support/forum/p/booksearch-apis/thread?tid=2034bed9a98c15cb&hl=en
|
28
|
+
|
29
|
+
def search(query, opts = {}, remote_ip = nil)
|
30
|
+
(headers 'X-Forwarded-For' => remote_ip.to_s) unless remote_ip.nil?
|
31
|
+
self.parameters = { 'q' => query }
|
32
|
+
opts[:page] ||= 1
|
33
|
+
opts[:count] ||= 5
|
34
|
+
parameters['startIndex'] = opts[:count] * (opts[:page] - 1)
|
35
|
+
parameters['maxResults'] = opts[:count]
|
36
|
+
|
37
|
+
Response.new(get(url.to_s))
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def query
|
43
|
+
parameters.
|
44
|
+
map { |k, v| "#{k}=#{CGI.escape(v.to_s)}" }.
|
45
|
+
join('&')
|
46
|
+
end
|
47
|
+
|
48
|
+
# Queries the new Google API. The former Google Book Search API is deprecated
|
49
|
+
# http://code.google.com/apis/books/docs/gdata/developers_guide_protocol.html
|
50
|
+
def url
|
51
|
+
URI::HTTPS.build(:host => 'www.googleapis.com',
|
52
|
+
:path => '/books/v1/volumes',
|
53
|
+
:query => query)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
|
data/lib/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: googlebooks
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Zean Tsoi
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-12-07 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: httparty
|
16
|
+
requirement: &16098280 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *16098280
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &16097780 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *16097780
|
36
|
+
description: GoogleBooks is a lightweight Ruby wrapper that queries the Google API
|
37
|
+
to search for publications in the Google Books repository. It is inspired by the
|
38
|
+
google-book gem which relies on the deprecated Google GData Books API, but is updated
|
39
|
+
to hook into the current Google API.
|
40
|
+
email:
|
41
|
+
- zean.tsoi@gmail.com
|
42
|
+
executables: []
|
43
|
+
extensions: []
|
44
|
+
extra_rdoc_files: []
|
45
|
+
files:
|
46
|
+
- lib/book/response.rb
|
47
|
+
- lib/book/item.rb
|
48
|
+
- lib/version.rb
|
49
|
+
- lib/googlebooks.rb
|
50
|
+
- googlebooks.gemspec
|
51
|
+
- Gemfile
|
52
|
+
- Rakefile
|
53
|
+
homepage: https://github.com/zeantsoi/googlebooks
|
54
|
+
licenses: []
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options: []
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
requirements: []
|
72
|
+
rubyforge_project: googlebooks
|
73
|
+
rubygems_version: 1.8.10
|
74
|
+
signing_key:
|
75
|
+
specification_version: 3
|
76
|
+
summary: GoogleBooks is a lightweight Ruby wrapper that queries the Google API to
|
77
|
+
search for publications in the Google Books repository.
|
78
|
+
test_files: []
|