gogoodreads 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +11 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +29 -0
- data/Rakefile +42 -0
- data/TODO +6 -0
- data/VERSION +1 -0
- data/gogoodreads.gemspec +98 -0
- data/lib/go_goodreads/attributes.rb +61 -0
- data/lib/go_goodreads/author.rb +18 -0
- data/lib/go_goodreads/book.rb +50 -0
- data/lib/go_goodreads/comment.rb +0 -0
- data/lib/go_goodreads/config.rb +8 -0
- data/lib/go_goodreads/event.rb +0 -0
- data/lib/go_goodreads/list.rb +0 -0
- data/lib/go_goodreads/owned_book.rb +0 -0
- data/lib/go_goodreads/quote.rb +0 -0
- data/lib/go_goodreads/request.rb +26 -0
- data/lib/go_goodreads/resource.rb +11 -0
- data/lib/go_goodreads/review.rb +36 -0
- data/lib/go_goodreads/shelf.rb +12 -0
- data/lib/go_goodreads/user.rb +16 -0
- data/lib/go_goodreads/user_status.rb +0 -0
- data/lib/go_goodreads.rb +15 -0
- data/lib/gogoodreads.rb +1 -0
- data/spec/attribute_spec.rb +32 -0
- data/spec/book_spec.rb +30 -0
- data/spec/config_spec.rb +13 -0
- data/spec/fixtures/vcr_cassettes/book_by_isbn.yml +109 -0
- data/spec/spec_helper.rb +21 -0
- metadata +181 -0
data/.document
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 Tim Medina
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
= GoGoodreads
|
2
|
+
|
3
|
+
Goodreads API Ruby Interface
|
4
|
+
|
5
|
+
== Basics (So Far)
|
6
|
+
|
7
|
+
require 'gogoodreads'
|
8
|
+
|
9
|
+
GoGoodreads.configure do |config|
|
10
|
+
config.api_key = "somesecretapi"
|
11
|
+
end
|
12
|
+
|
13
|
+
GoGoodreads::Book.show_by_isbn('isbnhere')
|
14
|
+
|
15
|
+
== Contributing to gogoodreads
|
16
|
+
|
17
|
+
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
18
|
+
* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
|
19
|
+
* Fork the project
|
20
|
+
* Start a feature/bugfix branch
|
21
|
+
* Commit and push until you are happy with your contribution
|
22
|
+
* Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
|
23
|
+
* Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
|
24
|
+
|
25
|
+
== Copyright
|
26
|
+
|
27
|
+
Copyright (c) 2011 Tim Medina. See LICENSE.txt for
|
28
|
+
further details.
|
29
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'rake'
|
11
|
+
|
12
|
+
require 'jeweler'
|
13
|
+
Jeweler::Tasks.new do |gem|
|
14
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
15
|
+
gem.name = "gogoodreads"
|
16
|
+
gem.homepage = "http://github.com/iamteem/gogoodreads"
|
17
|
+
gem.license = "MIT"
|
18
|
+
gem.summary = %Q{Goodreads API Ruby Interface}
|
19
|
+
gem.description = %Q{Allows you to progammatically pull book reviews from Goodreads using its API.}
|
20
|
+
gem.email = "iamteem@gmail.com"
|
21
|
+
gem.authors = ["Tim Medina"]
|
22
|
+
# Include your dependencies below. Runtime dependencies are required when using your gem,
|
23
|
+
# and development dependencies are only needed for development (ie running rake tasks, tests, etc)
|
24
|
+
gem.add_runtime_dependency 'nokogiri'
|
25
|
+
end
|
26
|
+
Jeweler::RubygemsDotOrgTasks.new
|
27
|
+
|
28
|
+
require 'rspec/core'
|
29
|
+
require 'rspec/core/rake_task'
|
30
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
31
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
32
|
+
end
|
33
|
+
|
34
|
+
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
35
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
36
|
+
spec.rcov = true
|
37
|
+
end
|
38
|
+
|
39
|
+
task :default => :spec
|
40
|
+
|
41
|
+
require 'yard'
|
42
|
+
YARD::Rake::YardocTask.new
|
data/TODO
ADDED
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.3
|
data/gogoodreads.gemspec
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{gogoodreads}
|
8
|
+
s.version = "0.0.3"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Tim Medina"]
|
12
|
+
s.date = %q{2011-03-24}
|
13
|
+
s.description = %q{Allows you to progammatically pull book reviews from Goodreads using its API.}
|
14
|
+
s.email = %q{iamteem@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.rdoc",
|
18
|
+
"TODO"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
".document",
|
22
|
+
".rspec",
|
23
|
+
"Gemfile",
|
24
|
+
"LICENSE.txt",
|
25
|
+
"README.rdoc",
|
26
|
+
"Rakefile",
|
27
|
+
"TODO",
|
28
|
+
"VERSION",
|
29
|
+
"gogoodreads.gemspec",
|
30
|
+
"lib/go_goodreads.rb",
|
31
|
+
"lib/go_goodreads/attributes.rb",
|
32
|
+
"lib/go_goodreads/author.rb",
|
33
|
+
"lib/go_goodreads/book.rb",
|
34
|
+
"lib/go_goodreads/comment.rb",
|
35
|
+
"lib/go_goodreads/config.rb",
|
36
|
+
"lib/go_goodreads/event.rb",
|
37
|
+
"lib/go_goodreads/list.rb",
|
38
|
+
"lib/go_goodreads/owned_book.rb",
|
39
|
+
"lib/go_goodreads/quote.rb",
|
40
|
+
"lib/go_goodreads/request.rb",
|
41
|
+
"lib/go_goodreads/resource.rb",
|
42
|
+
"lib/go_goodreads/review.rb",
|
43
|
+
"lib/go_goodreads/shelf.rb",
|
44
|
+
"lib/go_goodreads/user.rb",
|
45
|
+
"lib/go_goodreads/user_status.rb",
|
46
|
+
"lib/gogoodreads.rb",
|
47
|
+
"spec/attribute_spec.rb",
|
48
|
+
"spec/book_spec.rb",
|
49
|
+
"spec/config_spec.rb",
|
50
|
+
"spec/fixtures/vcr_cassettes/book_by_isbn.yml",
|
51
|
+
"spec/spec_helper.rb"
|
52
|
+
]
|
53
|
+
s.homepage = %q{http://github.com/iamteem/gogoodreads}
|
54
|
+
s.licenses = ["MIT"]
|
55
|
+
s.require_paths = ["lib"]
|
56
|
+
s.rubygems_version = %q{1.6.2}
|
57
|
+
s.summary = %q{Goodreads API Ruby Interface}
|
58
|
+
s.test_files = [
|
59
|
+
"spec/attribute_spec.rb",
|
60
|
+
"spec/book_spec.rb",
|
61
|
+
"spec/config_spec.rb",
|
62
|
+
"spec/spec_helper.rb"
|
63
|
+
]
|
64
|
+
|
65
|
+
if s.respond_to? :specification_version then
|
66
|
+
s.specification_version = 3
|
67
|
+
|
68
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
69
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
|
70
|
+
s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
|
71
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
72
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
73
|
+
s.add_development_dependency(%q<vcr>, [">= 0"])
|
74
|
+
s.add_development_dependency(%q<webmock>, [">= 0"])
|
75
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
76
|
+
s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
|
77
|
+
else
|
78
|
+
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
79
|
+
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
80
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
81
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
82
|
+
s.add_dependency(%q<vcr>, [">= 0"])
|
83
|
+
s.add_dependency(%q<webmock>, [">= 0"])
|
84
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
85
|
+
s.add_dependency(%q<nokogiri>, [">= 0"])
|
86
|
+
end
|
87
|
+
else
|
88
|
+
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
89
|
+
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
90
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
91
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
92
|
+
s.add_dependency(%q<vcr>, [">= 0"])
|
93
|
+
s.add_dependency(%q<webmock>, [">= 0"])
|
94
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
95
|
+
s.add_dependency(%q<nokogiri>, [">= 0"])
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module GoGoodreads
|
2
|
+
module Attributes
|
3
|
+
def self.included(base)
|
4
|
+
base.extend ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
|
9
|
+
# @param [Symbol] name the name of the attribute
|
10
|
+
# @param [Hash] options the options to configure the attribute
|
11
|
+
# @option option [Class] type the class of the parsed value of the attribute
|
12
|
+
# @option option [Proc] using a proc object to be used when finding the value in an xml node
|
13
|
+
# @option option [Symbol] map_from a symbol where the value is placed when calling to_attributes!
|
14
|
+
def attribute(name, options = {})
|
15
|
+
default_options = { :type => String, :map_from => name }
|
16
|
+
opts = default_options.merge(options)
|
17
|
+
opts[:using] ||= lambda {|xml, from| xml.at(from).text }
|
18
|
+
@attributes ||= {}
|
19
|
+
@attributes[name] = opts
|
20
|
+
attr name
|
21
|
+
end
|
22
|
+
|
23
|
+
# @param [Nokogiri::Node] xml the xml to be used in getting the attributes
|
24
|
+
# @param [Hash] options settings for overriding default attribute configuration (key is the name of the attribute, value is the options hash)
|
25
|
+
def to_attributes!(xml, options = {})
|
26
|
+
attrs = {}
|
27
|
+
|
28
|
+
@attributes.each do |attr, config|
|
29
|
+
opts = config.merge(options[attr] || {})
|
30
|
+
map_from = opts[:map_from]
|
31
|
+
callable = opts[:using]
|
32
|
+
val = callable.call(xml, map_from)
|
33
|
+
attrs[attr] = _convert(val, opts[:type]) rescue val
|
34
|
+
end
|
35
|
+
|
36
|
+
attrs
|
37
|
+
end
|
38
|
+
|
39
|
+
def Boolean(val)
|
40
|
+
{"true" => true, "false" => false}[val]
|
41
|
+
end
|
42
|
+
|
43
|
+
def _convert(val, type)
|
44
|
+
if type == ::GoGoodreads::Attributes::Boolean
|
45
|
+
Boolean(val)
|
46
|
+
elsif type == Time
|
47
|
+
Time.parse(val)
|
48
|
+
elsif type == Integer
|
49
|
+
Integer(val)
|
50
|
+
elsif type == Float
|
51
|
+
Float(val)
|
52
|
+
else
|
53
|
+
val
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class Boolean; end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module GoGoodreads
|
2
|
+
class Author
|
3
|
+
include GoGoodreads::Resource
|
4
|
+
|
5
|
+
attribute :author_id, :map_from => 'id'
|
6
|
+
attribute :name
|
7
|
+
attribute :image_url
|
8
|
+
attribute :small_image_url
|
9
|
+
attribute :link
|
10
|
+
attribute :average_rating, :type => Float
|
11
|
+
attribute :ratings_count, :type => Integer
|
12
|
+
attribute :text_reviews_count, :type => Integer
|
13
|
+
|
14
|
+
def self.initialize_with_node(xml)
|
15
|
+
new(to_attributes!(xml))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module GoGoodreads
|
2
|
+
class Book
|
3
|
+
include GoGoodreads::Resource
|
4
|
+
extend GoGoodreads::Request
|
5
|
+
|
6
|
+
attribute :title
|
7
|
+
attribute :isbn
|
8
|
+
attribute :isbn13
|
9
|
+
attribute :image_url
|
10
|
+
attribute :small_image_url
|
11
|
+
attribute :description
|
12
|
+
attribute :asin
|
13
|
+
attribute :url
|
14
|
+
attribute :link
|
15
|
+
attribute :num_pages, :type => Integer
|
16
|
+
attr :authors, :reviews
|
17
|
+
|
18
|
+
attr_accessor :current_page
|
19
|
+
|
20
|
+
def self.show_by_isbn(isbn, options = {})
|
21
|
+
params = { :isbn => isbn }
|
22
|
+
params.merge!(options)
|
23
|
+
|
24
|
+
request('/book/isbn', params) do |xml|
|
25
|
+
book = initialize_with_node(xml)
|
26
|
+
book.current_page = params[:page] || 1
|
27
|
+
book
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
def self.initialize_with_node(xml)
|
33
|
+
attrs = to_attributes!(xml)
|
34
|
+
attrs.delete_if { |k,v| v.respond_to?(:empty?) && v.empty? }
|
35
|
+
|
36
|
+
book = new(attrs)
|
37
|
+
book.initialize_authors_with_nodeset(xml.search('authors > author'))
|
38
|
+
book.initialize_reviews_with_nodeset(xml.search('reviews > review'))
|
39
|
+
book
|
40
|
+
end
|
41
|
+
|
42
|
+
def initialize_authors_with_nodeset(xml)
|
43
|
+
@authors = xml.map {|n| GoGoodreads::Author.initialize_with_node(n) }
|
44
|
+
end
|
45
|
+
|
46
|
+
def initialize_reviews_with_nodeset(xml)
|
47
|
+
@reviews = xml.map {|n| GoGoodreads::Review.initialize_with_node(n) }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'cgi'
|
3
|
+
require 'nokogiri'
|
4
|
+
|
5
|
+
module GoGoodreads
|
6
|
+
module Request
|
7
|
+
BASE_URL = "http://www.goodreads.com"
|
8
|
+
|
9
|
+
def request(path, params = {})
|
10
|
+
params.merge!(:key => GoGoodreads::Config.api_key)
|
11
|
+
|
12
|
+
uri = build_uri(path, to_querystring(params))
|
13
|
+
yield Nokogiri::XML(open(uri))
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_querystring(params)
|
17
|
+
params.map do |k, v|
|
18
|
+
"#{ k }=#{ CGI.escape(v) }"
|
19
|
+
end.join('&')
|
20
|
+
end
|
21
|
+
|
22
|
+
def build_uri(path, params)
|
23
|
+
[BASE_URL, path, '?', params].join
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module GoGoodreads
|
2
|
+
class Review
|
3
|
+
include GoGoodreads::Resource
|
4
|
+
|
5
|
+
attribute :review_id, :map_from => 'id'
|
6
|
+
attribute :votes, :type => Integer
|
7
|
+
attribute :spoiler_flag, :type => Boolean
|
8
|
+
attribute :date_added, :type => Time
|
9
|
+
attribute :date_updated, :type => Time
|
10
|
+
attribute :body
|
11
|
+
attribute :read_count, :type => Integer
|
12
|
+
attribute :comments_count, :type => Integer
|
13
|
+
attribute :url
|
14
|
+
attribute :link
|
15
|
+
|
16
|
+
attr :user, :shelves
|
17
|
+
|
18
|
+
def self.initialize_with_node(xml)
|
19
|
+
attrs = to_attributes!(xml)
|
20
|
+
review = new(attrs)
|
21
|
+
review.initialize_user_with_node(xml.at('user'))
|
22
|
+
review.initialize_shelves_with_nodes(xml.search('shelves > shelf'))
|
23
|
+
review
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize_user_with_node(xml)
|
27
|
+
@user = GoGoodreads::User.initialize_with_node(xml)
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize_shelves_with_nodes(shelves_xml)
|
31
|
+
@shelves = shelves_xml.map do |xml|
|
32
|
+
GoGoodreads::Shelf.initialize_with_node(xml)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module GoGoodreads
|
2
|
+
class User
|
3
|
+
include GoGoodreads::Resource
|
4
|
+
|
5
|
+
attribute :user_id, :map_from => 'id'
|
6
|
+
attribute :name
|
7
|
+
attribute :location
|
8
|
+
attribute :link
|
9
|
+
attribute :image_url
|
10
|
+
attribute :small_image_url
|
11
|
+
|
12
|
+
def self.initialize_with_node(xml)
|
13
|
+
new(to_attributes!(xml))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
File without changes
|
data/lib/go_goodreads.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
module GoGoodreads
|
2
|
+
autoload :Config, 'go_goodreads/config'
|
3
|
+
autoload :Request, 'go_goodreads/request'
|
4
|
+
autoload :Resource, 'go_goodreads/resource'
|
5
|
+
autoload :Book, 'go_goodreads/book'
|
6
|
+
autoload :Author, 'go_goodreads/author'
|
7
|
+
autoload :Shelf, 'go_goodreads/shelf'
|
8
|
+
autoload :Review, 'go_goodreads/review'
|
9
|
+
autoload :User, 'go_goodreads/user'
|
10
|
+
autoload :Attributes, 'go_goodreads/attributes'
|
11
|
+
|
12
|
+
def self.configure(&block)
|
13
|
+
yield GoGoodreads::Config
|
14
|
+
end
|
15
|
+
end
|
data/lib/gogoodreads.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'go_goodreads'
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GoGoodreads::Attributes do
|
4
|
+
before(:all) do
|
5
|
+
class Thing
|
6
|
+
include GoGoodreads::Resource
|
7
|
+
|
8
|
+
attribute :klazz_id, :map_from => 'id'
|
9
|
+
attribute :page_count, :type => Integer
|
10
|
+
attribute :simple
|
11
|
+
attribute :date_added, :type => Time
|
12
|
+
|
13
|
+
def self.initialize_with_node(xml)
|
14
|
+
new(to_attributes!(xml))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
before(:each) do
|
21
|
+
xml = "<xmlrootResponse><things><thing><id>123</id><page_count>523</page_count><simple><![CDATA[Hello, World!]]></simple><date_added>Fri Jun 01 19:11:54 -0700 2007</date_added></thing></things></xmlrootResponse>"
|
22
|
+
node = Nokogiri::XML(xml)
|
23
|
+
@thing = Thing.initialize_with_node(node.search('things > thing').first)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "parses the attributes from the xml node correctly" do
|
27
|
+
@thing.klazz_id.should == "123"
|
28
|
+
@thing.page_count.should == 523
|
29
|
+
@thing.simple.should == "Hello, World!"
|
30
|
+
@thing.date_added.should == Time.parse("Fri Jun 01 19:11:54 -0700 2007")
|
31
|
+
end
|
32
|
+
end
|
data/spec/book_spec.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GoGoodreads::Book do
|
4
|
+
use_vcr_cassette 'book_by_isbn'
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
GoGoodreads.configure do |config|
|
8
|
+
config.api_key = "1IlntIwcUm5CpTbQhu7Zg"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe ".show_by_isbn" do
|
13
|
+
context "isbn is 0441172717" do
|
14
|
+
subject { GoGoodreads::Book.show_by_isbn("0441172717") }
|
15
|
+
|
16
|
+
its(:title) { should == "Dune (Dune Chronicles, #1)" }
|
17
|
+
its(:isbn) { should == "0441172717" }
|
18
|
+
its(:isbn13) { should == "9780441172719" }
|
19
|
+
its(:asin) { should be_nil }
|
20
|
+
its(:image_url) { should == "http://photo.goodreads.com/books/1170430859m/53732.jpg" }
|
21
|
+
its(:small_image_url) { should == "http://photo.goodreads.com/books/1170430859s/53732.jpg" }
|
22
|
+
its(:description) { should == %(This Hugo and Nebula Award winner tells the sweeping tale of a desert planet called Arrakis, the focus of an intricate power struggle in a byzantine interstellar empire. Arrakis is the sole source of Melange, the "spice of spices." Melange is necessary for interstellar travel and grants psychic powers and longevity, so whoever controls it wields great influence. The troubles begin when stewardship of Arrakis is transferred by the Emperor from the Harkonnen Noble House to House Atreides. The Harkonnens don't want to give up their privilege, though, and through sabotage and treachery they cast young Duke Paul Atreides out into the planet's harsh environment to die. There he falls in with the Fremen, a tribe of desert dwellers who become the basis of the army with which he will reclaim what's rightfully his. Paul Atreides, though, is far more than just a usurped duke. He might be the end product of a very long-term genetic experiment designed to breed a super human; he might be a messiah. His struggle is at the center of a nexus of powerful people and events, and the repercussions will be felt throughout the Imperium. Dune is one of the most famous science fiction novels ever written, and deservedly so. The setting is elaborate and ornate, the plot labyrinthine, the adventures exciting. Five sequels follow. --Brooks Peck) }
|
23
|
+
its(:num_pages) { should == 535 }
|
24
|
+
its(:authors) { should have(1).items }
|
25
|
+
its(:url) { should == "http://www.goodreads.com/book/show/53732.Dune" }
|
26
|
+
its(:link) { should == "http://www.goodreads.com/book/show/53732.Dune" }
|
27
|
+
its(:reviews) { should have(28).items }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/spec/config_spec.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GoGoodreads, '.configure' do
|
4
|
+
it "should set up the api_key and the secret_key" do
|
5
|
+
GoGoodreads.configure do |config|
|
6
|
+
config.api_key = "someapikey"
|
7
|
+
config.secret = "secret"
|
8
|
+
end
|
9
|
+
|
10
|
+
GoGoodreads::Config.api_key.should == "someapikey"
|
11
|
+
GoGoodreads::Config.secret.should == "secret"
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
---
|
2
|
+
- !ruby/struct:VCR::HTTPInteraction
|
3
|
+
request: !ruby/struct:VCR::Request
|
4
|
+
method: :get
|
5
|
+
uri: http://www.goodreads.com:80/book/isbn?isbn=0441172717&key=1IlntIwcUm5CpTbQhu7Zg
|
6
|
+
body:
|
7
|
+
headers:
|
8
|
+
response: !ruby/struct:VCR::Response
|
9
|
+
status: !ruby/struct:VCR::ResponseStatus
|
10
|
+
code: 200
|
11
|
+
message: OK
|
12
|
+
headers:
|
13
|
+
content-type:
|
14
|
+
- application/xml; charset=utf-8
|
15
|
+
status:
|
16
|
+
- "200"
|
17
|
+
x-powered-by:
|
18
|
+
- Phusion Passenger (mod_rails/mod_rack) 3.0.0
|
19
|
+
etag:
|
20
|
+
- "\"38c8128410a791eda136304e542392ca\""
|
21
|
+
x-runtime:
|
22
|
+
- "245"
|
23
|
+
content-length:
|
24
|
+
- "52001"
|
25
|
+
set-cookie:
|
26
|
+
- _session_id=88e01ae88a5d8e352ae198cab36cdee0; domain=.goodreads.com; path=/; HttpOnly
|
27
|
+
cache-control:
|
28
|
+
- private, max-age=0, must-revalidate
|
29
|
+
server:
|
30
|
+
- nginx/0.8.52 + Phusion Passenger 3.0.0 (mod_rails/mod_rack)
|
31
|
+
body: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\
|
32
|
+
<GoodreadsResponse>\n\
|
33
|
+
\t<Request>\n\
|
34
|
+
\t\t<authentication>true</authentication>\n\
|
35
|
+
\t\t\t\t<key><![CDATA[1IlntIwcUm5CpTbQhu7Zg]]></key>\n\
|
36
|
+
\t\t <method><![CDATA[book_isbn]]></method>\n\
|
37
|
+
\t</Request>\n\
|
38
|
+
\t<book>\n <id>53732</id>\n <title><![CDATA[Dune (Dune Chronicles, #1)]]></title>\n <isbn><![CDATA[0441172717]]></isbn>\n <isbn13><![CDATA[9780441172719]]></isbn13>\n <asin><![CDATA[]]></asin>\n <image_url>http://photo.goodreads.com/books/1170430859m/53732.jpg</image_url>\n <small_image_url>http://photo.goodreads.com/books/1170430859s/53732.jpg</small_image_url>\n <publication_year></publication_year>\n <publication_month></publication_month>\n <publication_day></publication_day>\n <publisher></publisher>\n <language_code>eng</language_code>\n <description><![CDATA[This Hugo and Nebula Award winner tells the sweeping tale of a desert planet called Arrakis, the focus of an intricate power struggle in a byzantine interstellar empire. Arrakis is the sole source of Melange, the "spice of spices." Melange is necessary for interstellar travel and grants psychic powers and longevity, so whoever controls it wields great influence. The troubles begin when stewardship of Arrakis is transferred by the Emperor from the Harkonnen Noble House to House Atreides. The Harkonnens don't want to give up their privilege, though, and through sabotage and treachery they cast young Duke Paul Atreides out into the planet's harsh environment to die. There he falls in with the Fremen, a tribe of desert dwellers who become the basis of the army with which he will reclaim what's rightfully his. Paul Atreides, though, is far more than just a usurped duke. He might be the end product of a very long-term genetic experiment designed to breed a super human; he might be a messiah. His struggle is at the center of a nexus of powerful people and events, and the repercussions will be felt throughout the Imperium. Dune is one of the most famous science fiction novels ever written, and deservedly so. The setting is elaborate and ornate, the plot labyrinthine, the adventures exciting. Five sequels follow. --Brooks Peck]]></description>\n <work>\n <best_book_id type=\"integer\">234225</best_book_id>\n <books_count type=\"integer\">109</books_count>\n <desc_user_id type=\"integer\">-30</desc_user_id>\n <id type=\"integer\">3634639</id>\n <media_type>book</media_type>\n <original_language_id nil=\"true\" type=\"integer\"></original_language_id>\n <original_publication_day nil=\"true\" type=\"integer\"></original_publication_day>\n <original_publication_month nil=\"true\" type=\"integer\"></original_publication_month>\n <original_publication_year type=\"integer\">1965</original_publication_year>\n <original_title>Dune</original_title>\n <rating_dist>5:47023|4:31053|3:20374|2:7790|1:6405|total:112645</rating_dist>\n <ratings_count type=\"integer\">113248</ratings_count>\n <ratings_sum type=\"integer\">444715</ratings_sum>\n <reviews_count type=\"integer\">151388</reviews_count>\n <text_reviews_count type=\"integer\">3348</text_reviews_count>\n\
|
39
|
+
</work>\n\n <average_rating><![CDATA[3.93]]></average_rating>\n <num_pages><![CDATA[535]]></num_pages>\n <ratings_count><![CDATA[3474]]></ratings_count>\n <text_reviews_count><![CDATA[345]]></text_reviews_count>\n \n <url><![CDATA[http://www.goodreads.com/book/show/53732.Dune]]></url>\n <link><![CDATA[http://www.goodreads.com/book/show/53732.Dune]]></link>\n <authors>\n <author>\n <id>58</id>\n <name><![CDATA[Frank Herbert]]></name>\n <image_url><![CDATA[http://photo.goodreads.com/authors/1168661521p5/58.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/authors/1168661521p2/58.jpg]]></small_image_url>\n <link><![CDATA[http://www.goodreads.com/author/show/58.Frank_Herbert]]></link>\n <average_rating>3.83</average_rating>\n <ratings_count>179357</ratings_count>\n <text_reviews_count>5350</text_reviews_count>\n </author>\n </authors>\n <reviews start=\"1\" end=\"28\" total=\"151269\">\n \n <review>\n <id>38209515</id>\n <user>\n <id>1713956</id>\n <name><![CDATA[Manny]]></name>\n <location><![CDATA[Cambridge, C3, The United Kingdom]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/1713956-manny]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1227275844p3/1713956.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1227275844p2/1713956.jpg]]></small_image_url>\n\
|
40
|
+
</user>\n <rating>4</rating>\n <votes>109</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n <shelf name=\"science-fiction\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at>Thu Jan 01 00:00:00 -0800 1970</read_at>\n <date_added>Thu Nov 20 06:09:14 -0800 2008</date_added>\n <date_updated>Fri Mar 20 07:16:04 -0700 2009</date_updated>\n <read_count>5</read_count>\n <body>\n <![CDATA[There's a characteristically witty essay by Borges about a man who rewrites <em>Don Quixote</em>, many centuries after Cervantes. He publishes a novel with the same title, containing the same words in the same order. But, as Borges shows you, the different cultural context means it's a completely new book! W...\n <a href=\"http://www.goodreads.com/review/show/38209515\">more...</a>\n ]]>\n </body>\n <comments_count>17</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/38209515]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/38209515]]></link>\n\
|
41
|
+
</review>\n\n \n <review>\n <id>140124821</id>\n <user>\n <id>2863914</id>\n <name><![CDATA[Joel]]></name>\n <location><![CDATA[Oak Park, IL]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/2863914-joel]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1288885128p3/2863914.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1288885128p2/2863914.jpg]]></small_image_url>\n\
|
42
|
+
</user>\n <rating>4</rating>\n <votes>15</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n <shelf name=\"2011\" />\n <shelf name=\"book-club\" />\n <shelf name=\"classics\" />\n <shelf name=\"sci-fi-fantasy\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at>Fri Jan 28 00:00:00 -0800 2011</started_at>\n <read_at>Fri Mar 11 00:00:00 -0800 2011</read_at>\n <date_added>Tue Jan 11 20:52:44 -0800 2011</date_added>\n <date_updated>Sun Mar 13 12:46:18 -0700 2011</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[DBR to follow, at Ceridwen's request. She must have used one of her Bene Gesserit tricks on me.\r<br/>\r<br/>***\r<br/>Dune. Dune is a fascinating book. A classic of science-fiction, it plays equally as fantasy and allegory. It is deeply textured, richly layered. And if you want to read a sensible revi...\n <a href=\"http://www.goodreads.com/review/show/140124821\">more...</a>\n ]]>\n </body>\n <comments_count>25</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/140124821]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/140124821]]></link>\n\
|
43
|
+
</review>\n\n \n <review>\n <id>23505468</id>\n <user>\n <id>1205220</id>\n <name><![CDATA[Matt]]></name>\n <location><![CDATA[Columbus, OH]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/1205220-matt]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1216068593p3/1205220.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1216068593p2/1205220.jpg]]></small_image_url>\n\
|
44
|
+
</user>\n <rating>5</rating>\n <votes>33</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n <shelf name=\"fantasy\" />\n <shelf name=\"science-fiction\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at>Sun Jul 01 00:00:00 -0700 1984</read_at>\n <date_added>Mon Jun 02 06:54:06 -0700 2008</date_added>\n <date_updated>Thu Sep 04 09:13:08 -0700 2008</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[Like most of my five star books, I\xE2\x80\x99ve read Dune multiple times. In fact, I\xE2\x80\x99d say that what makes a book more than just enjoyable and instead truly amazing is that you want to read it more than once and are rewarded for doing so. I\xE2\x80\x99ve probably read Dune six times, and I\xE2\x80\x99ve never gotten tired of it ...\n <a href=\"http://www.goodreads.com/review/show/23505468\">more...</a>\n ]]>\n </body>\n <comments_count>6</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/23505468]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/23505468]]></link>\n\
|
45
|
+
</review>\n\n \n <review>\n <id>2348449</id>\n <user>\n <id>147818</id>\n <name><![CDATA[John]]></name>\n <location><![CDATA[The United States]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/147818-john]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1276202553p3/147818.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1276202553p2/147818.jpg]]></small_image_url>\n\
|
46
|
+
</user>\n <rating>2</rating>\n <votes>23</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n </shelves>\n <recommended_for><![CDATA[Science fiction readers, fantasy readers, speculative fiction readers]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at>Fri Dec 01 00:00:00 -0800 2006</read_at>\n <date_added>Sun Jun 24 23:28:28 -0700 2007</date_added>\n <date_updated>Wed Dec 16 22:36:40 -0800 2009</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[No one should argue the importance <em>Dune</em>. It laid the foundations for a great deal of the themes and constructs in modern science fiction. Frank Herbert was as important to the genre as Isaac Asimov and Arthur Clarke. Unfortunately, just like them, he's quite dated, and his books can be a labor to re...\n <a href=\"http://www.goodreads.com/review/show/2348449\">more...</a>\n ]]>\n </body>\n <comments_count>4</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/2348449]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/2348449]]></link>\n\
|
47
|
+
</review>\n\n \n <review>\n <id>1598115</id>\n <user>\n <id>84023</id>\n <name><![CDATA[Keely]]></name>\n <location><![CDATA[Belleville, NJ]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/84023-keely]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1274333636p3/84023.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1274333636p2/84023.jpg]]></small_image_url>\n\
|
48
|
+
</user>\n <rating>4</rating>\n <votes>12</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n <shelf name=\"american\" />\n <shelf name=\"childhood\" />\n <shelf name=\"novel\" />\n <shelf name=\"reviewed\" />\n <shelf name=\"sci-fi\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at></read_at>\n <date_added>Fri Jun 01 19:11:54 -0700 2007</date_added>\n <date_updated>Thu Dec 09 21:18:29 -0800 2010</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[People often forget that this series is what innovated our modern concept of science fiction (up until Neuromancer and The Martix, at least). Dune took the Space Opera and asked if it might be more than spandex, dildo-shaped rockets, and scantily-clad green women. Herbert created a vast and complex ...\n <a href=\"http://www.goodreads.com/review/show/1598115\">more...</a>\n ]]>\n </body>\n <comments_count>2</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/1598115]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/1598115]]></link>\n\
|
49
|
+
</review>\n\n \n <review>\n <id>20320</id>\n <user>\n <id>1994</id>\n <name><![CDATA[Banzai]]></name>\n <location><![CDATA[Villa Park, IL]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/1994-banzai]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1219416776p3/1994.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1219416776p2/1994.jpg]]></small_image_url>\n\
|
50
|
+
</user>\n <rating>5</rating>\n <votes>16</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at>Sat Jan 01 00:00:00 -0800 2000</read_at>\n <date_added>Mon Feb 05 09:38:13 -0800 2007</date_added>\n <date_updated>Wed Dec 16 15:55:53 -0800 2009</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[I guess I'm one of the few that bridge the gap between the Pride and Prejudice camp and the Dune camp. I loved both.\r<br/>\r<br/>Dune isn't a light, enjoyable read. At times it reads more like excerpts from geology, ecology, zoology, sociology, pscyhology, and political textbooks. The characters are ...\n <a href=\"http://www.goodreads.com/review/show/20320\">more...</a>\n ]]>\n </body>\n <comments_count>4</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/20320]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/20320]]></link>\n\
|
51
|
+
</review>\n\n \n <review>\n <id>6974116</id>\n <user>\n <id>368858</id>\n <name><![CDATA[Adam]]></name>\n <location><![CDATA[Ashland, OH]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/368858-adam]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1189456780p3/368858.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1189456780p2/368858.jpg]]></small_image_url>\n\
|
52
|
+
</user>\n <rating>5</rating>\n <votes>8</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at>Sat Apr 01 00:00:00 -0800 2000</read_at>\n <date_added>Fri Sep 28 20:08:34 -0700 2007</date_added>\n <date_updated>Sun Sep 14 09:22:12 -0700 2008</date_updated>\n <read_count>5-6</read_count>\n <body>\n <![CDATA[I've read and reread this novel across the years, and I'll continue to do so.\r<br/>\r<br/>Dune was Frank Herbert's imagination breathed into the pages of a single book. He wrote numerous others to follow it, all of which continue to explore and flesh out the world he introduced us to in this, the fi...\n <a href=\"http://www.goodreads.com/review/show/6974116\">more...</a>\n ]]>\n </body>\n <comments_count>3</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/6974116]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/6974116]]></link>\n\
|
53
|
+
</review>\n\n \n <review>\n <id>93981680</id>\n <user>\n <id>1376766</id>\n <name><![CDATA[Becky]]></name>\n <location><![CDATA[Wilkes Barre, PA]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/1376766-becky]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1284393199p3/1376766.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1284393199p2/1376766.jpg]]></small_image_url>\n\
|
54
|
+
</user>\n <rating>4</rating>\n <votes>7</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n <shelf name=\"--2010--\" />\n <shelf name=\"blog_reviews\" />\n <shelf name=\"classics\" />\n <shelf name=\"highly-recommended\" />\n <shelf name=\"owned\" />\n <shelf name=\"political\" />\n <shelf name=\"religion-related\" />\n <shelf name=\"reviewed\" />\n <shelf name=\"science-fiction\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at>Sat Apr 24 00:00:00 -0700 2010</started_at>\n <read_at>Sat May 01 00:00:00 -0700 2010</read_at>\n <date_added>Sat Mar 13 21:11:43 -0800 2010</date_added>\n <date_updated>Thu Aug 05 10:05:25 -0700 2010</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[This is one of those books that I've always thought that I should read, but never actually wanted to read, simply because I thought that it would have to be tedious and dry and, I hate to say it, boring. Which goes to show what a poor book-cover judge I am, because this book was anything but tedious...\n <a href=\"http://www.goodreads.com/review/show/93981680\">more...</a>\n ]]>\n </body>\n <comments_count>16</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/93981680]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/93981680]]></link>\n\
|
55
|
+
</review>\n\n \n <review>\n <id>23171867</id>\n <user>\n <id>1188122</id>\n <name><![CDATA[Ben]]></name>\n <location><![CDATA[Thunder Bay, ON, Canada]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/1188122-ben-babcock]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1211839871p3/1188122.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1211839871p2/1188122.jpg]]></small_image_url>\n\
|
56
|
+
</user>\n <rating>5</rating>\n <votes>6</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n <shelf name=\"2011-read\" />\n <shelf name=\"favourites\" />\n <shelf name=\"own\" />\n <shelf name=\"posthuman\" />\n <shelf name=\"religion-fiction\" />\n <shelf name=\"science-fiction\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at>Sat Feb 05 00:00:00 -0800 2011</started_at>\n <read_at>Sat Feb 12 00:00:00 -0800 2011</read_at>\n <date_added>Wed May 28 18:06:16 -0700 2008</date_added>\n <date_updated>Sat Feb 12 22:32:12 -0800 2011</date_updated>\n <read_count>3</read_count>\n <body>\n <![CDATA[<strong>Second review (Reviewed on February 12, 2011).</strong>\r<br/>\r<br/><em>Dune</em> is a classic because it tells a classic story well. It combines two plots that I love: a vast political intrigue with an intimate family conflict. The Atreides and Harkonnens are related by blood; their feud is a blood feud going back ge...\n <a href=\"http://www.goodreads.com/review/show/23171867\">more...</a>\n ]]>\n </body>\n <comments_count>0</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/23171867]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/23171867]]></link>\n\
|
57
|
+
</review>\n\n \n <review>\n <id>8240703</id>\n <user>\n <id>441385</id>\n <name><![CDATA[Donovan]]></name>\n <location><![CDATA[Chicago, IL]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/441385-donovan]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1298491418p3/441385.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1298491418p2/441385.jpg]]></small_image_url>\n\
|
58
|
+
</user>\n <rating>5</rating>\n <votes>9</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n </shelves>\n <recommended_for><![CDATA[anyone who thinks they love StarWars]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at>Thu Mar 01 00:00:00 -0800 2007</read_at>\n <date_added>Thu Oct 25 13:04:51 -0700 2007</date_added>\n <date_updated>Thu Oct 25 13:04:51 -0700 2007</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[I had never read <u>Dune</u>. I can\xE2\x80\x99t put my finger on exactly why I hadn\xE2\x80\x99t read it; although, I do have a nebulous memory of picking it up and not being able to get in to it. I know for a fact that I\xE2\x80\x99d read the closing line previously, which is something I never do prior to reading a book; so that is real...\n <a href=\"http://www.goodreads.com/review/show/8240703\">more...</a>\n ]]>\n </body>\n <comments_count>1</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/8240703]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/8240703]]></link>\n\
|
59
|
+
</review>\n\n \n <review>\n <id>20670476</id>\n <user>\n <id>667084</id>\n <name><![CDATA[Cassidy]]></name>\n <location><![CDATA[The United States]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/667084-cassidy]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1197253437p3/667084.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1197253437p2/667084.jpg]]></small_image_url>\n\
|
60
|
+
</user>\n <rating>5</rating>\n <votes>6</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n </shelves>\n <recommended_for><![CDATA[People with flexibly discerning taste, and who don't mind a lot of glossary checks..]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at>Fri May 02 00:00:00 -0700 2008</read_at>\n <date_added>Mon Apr 21 14:43:47 -0700 2008</date_added>\n <date_updated>Mon May 05 18:19:57 -0700 2008</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[Frank Herbert\r<br/>Dune\r<br/>Philadelphia: Chilton Book Company, 1965\r<br/>pp. 483 (without appendices and glossary), 539 (with app. and glos.), unpriced\r<br/>ISBN: N/A\r<br/>\r<br/> Commonly billed as the best-selling science fiction novel of all time, Dune, an expansive tale of intrigue, religio...\n <a href=\"http://www.goodreads.com/review/show/20670476\">more...</a>\n ]]>\n </body>\n <comments_count>1</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/20670476]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/20670476]]></link>\n\
|
61
|
+
</review>\n\n \n <review>\n <id>15306545</id>\n <user>\n <id>891651</id>\n <name><![CDATA[Karen]]></name>\n <location><![CDATA[San Diego, CA]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/891651-karen]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1208720825p3/891651.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1208720825p2/891651.jpg]]></small_image_url>\n\
|
62
|
+
</user>\n <rating>2</rating>\n <votes>4</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at>Thu Feb 28 00:00:00 -0800 2008</read_at>\n <date_added>Tue Feb 12 22:41:55 -0800 2008</date_added>\n <date_updated>Fri Feb 29 00:00:34 -0800 2008</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[I've read this before and liked it; several portions stick vividly in my mind but I never read the rest of the series. I still don't expect to read the rest of the series, but my friend just read it and has brought it up a few times in conversation so when they had it on the "Librarians' Picks"...\n <a href=\"http://www.goodreads.com/review/show/15306545\">more...</a>\n ]]>\n </body>\n <comments_count>1</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/15306545]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/15306545]]></link>\n\
|
63
|
+
</review>\n\n \n <review>\n <id>14597388</id>\n <user>\n <id>82278</id>\n <name><![CDATA[Jacob]]></name>\n <location><![CDATA[Hanoi, Viet Nam]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/82278-jacob]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1285757074p3/82278.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1285757074p2/82278.jpg]]></small_image_url>\n\
|
64
|
+
</user>\n <rating>0</rating>\n <votes>5</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at></read_at>\n <date_added>Tue Feb 05 00:21:07 -0800 2008</date_added>\n <date_updated>Sun Feb 10 18:14:25 -0800 2008</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[If this isn't a formative text, then I don't know what is. I figure evangelicals have the bible, and usually a regressive translation at that, while my family had weird science fiction novels. One that all ten of my brothers and sisters read was Dune. It's true. I grew up in a large family. A sprawl...\n <a href=\"http://www.goodreads.com/review/show/14597388\">more...</a>\n ]]>\n </body>\n <comments_count>3</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/14597388]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/14597388]]></link>\n\
|
65
|
+
</review>\n\n \n <review>\n <id>5005651</id>\n <user>\n <id>304412</id>\n <name><![CDATA[Matt]]></name>\n <location><![CDATA[Seattle, WA]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/304412-matt]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1192132393p3/304412.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1192132393p2/304412.jpg]]></small_image_url>\n\
|
66
|
+
</user>\n <rating>5</rating>\n <votes>6</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n </shelves>\n <recommended_for><![CDATA[Everybody]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at>Sun Jan 01 00:00:00 -0800 1984</read_at>\n <date_added>Thu Aug 23 09:56:11 -0700 2007</date_added>\n <date_updated>Thu Oct 11 12:09:44 -0700 2007</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[This is the best book ever written. Cerebrally stimulating for anyone. When we attempt to understand why entertainment of this caliber (Lord of the Rings, Star Wars) and mass appeal (Harry Potter) resonates so strongly with us, many are quick to utilize Jungian archetypes to support such effects. \r<br/>...\n <a href=\"http://www.goodreads.com/review/show/5005651\">more...</a>\n ]]>\n </body>\n <comments_count>2</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/5005651]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/5005651]]></link>\n\
|
67
|
+
</review>\n\n \n <review>\n <id>14145629</id>\n <user>\n <id>858949</id>\n <name><![CDATA[Chris]]></name>\n <location><![CDATA[Osaka, Japan]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/858949-chris]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1208350750p3/858949.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1208350750p2/858949.jpg]]></small_image_url>\n\
|
68
|
+
</user>\n <rating>4</rating>\n <votes>4</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n <shelf name=\"science-fiction\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at>Tue Jan 29 00:00:00 -0800 2008</read_at>\n <date_added>Thu Jan 31 06:36:48 -0800 2008</date_added>\n <date_updated>Thu Jan 31 06:47:15 -0800 2008</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[When I was a kid, I tried about a dozen times to get through this book. My mom loved it, so I figured I'd give it a try, but this book definitely has a high learning curve and I had low patience.\r<br/>\r<br/>Years later, of course, when I knew something more about politics, religion, science and life...\n <a href=\"http://www.goodreads.com/review/show/14145629\">more...</a>\n ]]>\n </body>\n <comments_count>0</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/14145629]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/14145629]]></link>\n\
|
69
|
+
</review>\n\n \n <review>\n <id>6591463</id>\n <user>\n <id>126262</id>\n <name><![CDATA[Brooke]]></name>\n <location><![CDATA[Hilliard, OH]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/126262-brooke]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1181591671p3/126262.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1181591671p2/126262.jpg]]></small_image_url>\n\
|
70
|
+
</user>\n <rating>4</rating>\n <votes>7</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n <shelf name=\"2008\" />\n <shelf name=\"science-fiction\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at>Sat Sep 13 00:00:00 -0700 2008</read_at>\n <date_added>Sat Sep 22 00:08:50 -0700 2007</date_added>\n <date_updated>Sat Sep 13 17:55:17 -0700 2008</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[I've never given a book 5 stars instantly upon finishing it. My 5-star favorites became favorites after they had time to stick around in my mind for a year or so while my devotion to them grew. It's entirely possible Dune will join them in the future, but right now it's hard to tell. If I could, I w...\n <a href=\"http://www.goodreads.com/review/show/6591463\">more...</a>\n ]]>\n </body>\n <comments_count>3</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/6591463]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/6591463]]></link>\n\
|
71
|
+
</review>\n\n \n <review>\n <id>48120743</id>\n <user>\n <id>1748656</id>\n <name><![CDATA[Beth]]></name>\n <location><![CDATA[The United States]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/1748656-beth]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1231095279p3/1748656.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1231095279p2/1748656.jpg]]></small_image_url>\n\
|
72
|
+
</user>\n <rating>4</rating>\n <votes>2</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n </shelves>\n <recommended_for><![CDATA[people with interests in vermiculture, genetic engineering, and people facing water rationing]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at></read_at>\n <date_added>Tue Mar 03 11:15:04 -0800 2009</date_added>\n <date_updated>Tue Mar 03 11:50:09 -0800 2009</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[Sitting here on the desert planet -- uh State, Arakkis -- I mean California, I'm staring in amazement as water actually falls from the sky. \r<br/>\r<br/>This grand sprawling book has a lot to offer: genetic engineer witches, religion as premeditated social engineering, amazing heroic islamists -- I m...\n <a href=\"http://www.goodreads.com/review/show/48120743\">more...</a>\n ]]>\n </body>\n <comments_count>7</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/48120743]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/48120743]]></link>\n\
|
73
|
+
</review>\n\n \n <review>\n <id>47266993</id>\n <user>\n <id>1019174</id>\n <name><![CDATA[Terence]]></name>\n <location><![CDATA[Covina, CA]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/1019174-terence]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1282879833p3/1019174.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1282879833p2/1019174.jpg]]></small_image_url>\n\
|
74
|
+
</user>\n <rating>3</rating>\n <votes>4</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n <shelf name=\"audio-books\" />\n <shelf name=\"sf-fantasy\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at>Mon Mar 09 09:12:31 -0700 2009</read_at>\n <date_added>Mon Feb 23 10:49:08 -0800 2009</date_added>\n <date_updated>Mon Mar 09 09:12:31 -0700 2009</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[Don't mistake me, <em>Dune</em>, the novel, retains its 4+ stars in my heavens. This audio version gets the lesser rating because of deficiencies in presentation.\r<br/>\r<br/>The good side of the CD is that, as happened while <em>listening</em> to Tolkien's <a href=\"http://www.goodreads.com/book/show/18512.The_Return_of_the_King_The_Lord_of_the_Rings_Part_3_\" title=\"The Return of the King (The Lord of the Rings, Part 3) by J.R.R. Tolkien\">The Silmarillion</a>, I heard a lot of things I had missed or glo...\n <a href=\"http://www.goodreads.com/review/show/47266993\">more...</a>\n ]]>\n </body>\n <comments_count>2</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/47266993]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/47266993]]></link>\n\
|
75
|
+
</review>\n\n \n <review>\n <id>91837233</id>\n <user>\n <id>2250020</id>\n <name><![CDATA[Tatiana]]></name>\n <location><![CDATA[Greensboro, NC]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/2250020-tatiana]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1249783659p3/2250020.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1249783659p2/2250020.jpg]]></small_image_url>\n\
|
76
|
+
</user>\n <rating>4</rating>\n <votes>6</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n <shelf name=\"2010\" />\n <shelf name=\"nebula\" />\n <shelf name=\"sci-fi\" />\n </shelves>\n <recommended_for><![CDATA[fans of sophisticated science fiction]]></recommended_for>\n <recommended_by><![CDATA[Ryan]]></recommended_by>\n <started_at>Mon Apr 05 00:00:00 -0700 2010</started_at>\n <read_at>Tue Apr 13 00:00:00 -0700 2010</read_at>\n <date_added>Sun Feb 28 13:28:32 -0800 2010</date_added>\n <date_updated>Thu Apr 15 13:36:39 -0700 2010</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[I like books for different reasons - characters, writing style, exciting plot. I will remember "Dune" for its remarkable world-building.\r<br/>\r<br/>Dune (or Arrakis) is a desert planet. It is barren, almost waterless, and it is the only source of melange - a spice with unique geriatric qua...\n <a href=\"http://www.goodreads.com/review/show/91837233\">more...</a>\n ]]>\n </body>\n <comments_count>9</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/91837233]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/91837233]]></link>\n\
|
77
|
+
</review>\n\n \n <review>\n <id>82035975</id>\n <user>\n <id>3074140</id>\n <name><![CDATA[David]]></name>\n <location><![CDATA[Cambridge, England., UT, The United Kingdom]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/3074140-david-menzies]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1261794078p3/3074140.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1261794078p2/3074140.jpg]]></small_image_url>\n\
|
78
|
+
</user>\n <rating>5</rating>\n <votes>2</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at></read_at>\n <date_added>Fri Dec 25 18:14:39 -0800 2009</date_added>\n <date_updated>Fri Mar 11 11:00:09 -0800 2011</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[Dune, by Frank Herbert, is by far one of the most thought provoking books that I have ever read. It has been described by critics as a \xE2\x80\x9Ctriumph of the imagination\xE2\x80\x9D, and is often cited as the best-selling science fiction novel ever to be written. It is set thousands of years in the future, in which m...\n <a href=\"http://www.goodreads.com/review/show/82035975\">more...</a>\n ]]>\n </body>\n <comments_count>2</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/82035975]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/82035975]]></link>\n\
|
79
|
+
</review>\n\n \n <review>\n <id>72081089</id>\n <user>\n <id>2763302</id>\n <name><![CDATA[Pavel]]></name>\n <location><![CDATA[Moscow, 48, Russian Federation]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/2763302-pavel]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1253598397p3/2763302.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1253598397p2/2763302.jpg]]></small_image_url>\n\
|
80
|
+
</user>\n <rating>4</rating>\n <votes>2</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at>Fri Jun 04 00:00:00 -0700 2010</started_at>\n <read_at>Fri Jun 11 00:00:00 -0700 2010</read_at>\n <date_added>Mon Sep 21 22:19:05 -0700 2009</date_added>\n <date_updated>Sun Jun 13 03:48:37 -0700 2010</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[Since majority of my goodreads friends have read this book, I see no reason to re-tell its plot etc. All I have to say is that it is incredibly fun read and probably second fantasy book I really ever liked after Lord of the Rings. Evil is rarely that vivid and hateable, Freemens are totally cool. I ...\n <a href=\"http://www.goodreads.com/review/show/72081089\">more...</a>\n ]]>\n </body>\n <comments_count>6</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/72081089]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/72081089]]></link>\n\
|
81
|
+
</review>\n\n \n <review>\n <id>27313922</id>\n <user>\n <id>931383</id>\n <name><![CDATA[TeraD]]></name>\n <location><![CDATA[Tacoma, WA]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/931383-terad]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1233789447p3/931383.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1233789447p2/931383.jpg]]></small_image_url>\n\
|
82
|
+
</user>\n <rating>5</rating>\n <votes>3</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n <shelf name=\"all-time-favorites\" />\n <shelf name=\"fantasy\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at>Fri Jul 18 00:00:00 -0700 2008</read_at>\n <date_added>Tue Jul 15 09:35:09 -0700 2008</date_added>\n <date_updated>Tue Jul 22 12:20:21 -0700 2008</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[Dune is a fantastic book. The confusion of the first few pages as you enter a new world quickly dissipates as you feel yourself drawn in and understanding begin to seep from the pages of the story. The imagery is amazing, the attention to detail enthralling and the characters deep and well-developed...\n <a href=\"http://www.goodreads.com/review/show/27313922\">more...</a>\n ]]>\n </body>\n <comments_count>0</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/27313922]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/27313922]]></link>\n\
|
83
|
+
</review>\n\n \n <review>\n <id>2866668</id>\n <user>\n <id>147289</id>\n <name><![CDATA[Jason]]></name>\n <location><![CDATA[Chicago, IL]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/147289-jason-pettus]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1283695594p3/147289.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1283695594p2/147289.jpg]]></small_image_url>\n\
|
84
|
+
</user>\n <rating>4</rating>\n <votes>3</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at></read_at>\n <date_added>Mon Jul 09 11:30:25 -0700 2007</date_added>\n <date_updated>Mon Jul 09 11:38:36 -0700 2007</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[Like many, my relationship with this science-fiction classic has changed as my life has progressed: too dense for me when first attempted as a young teen, by the time I was an undergraduate it was one of my all-time favorite novels; but then while reading it again near the age of 40, found a lot mor...\n <a href=\"http://www.goodreads.com/review/show/2866668\">more...</a>\n ]]>\n </body>\n <comments_count>0</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/2866668]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/2866668]]></link>\n\
|
85
|
+
</review>\n\n \n <review>\n <id>2616095</id>\n <user>\n <id>165364</id>\n <name><![CDATA[Beggs]]></name>\n <location><![CDATA[Singapore]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/165364-beggs]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1183368190p3/165364.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1183368190p2/165364.jpg]]></small_image_url>\n\
|
86
|
+
</user>\n <rating>5</rating>\n <votes>2</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at>Sun Jul 01 00:00:00 -0700 2007</read_at>\n <date_added>Mon Jul 02 00:32:03 -0700 2007</date_added>\n <date_updated>Tue Sep 07 18:16:38 -0700 2010</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[I first read <a href=\"http://www.goodreads.com/book/show/19501.Eat_Pray_Love\" title=\"Eat, Pray, Love by Elizabeth Gilbert\">Dune</a> one summer sitting in an old arm chair in the basement of my grandparents house in rural Minnesota. I found a copy of Dune on the book shelf next to <a href=\"http://www.goodreads.com/author/show/858.Louis_L_Amour\" title=\"Louis L'Amour\">Louis Lamour</a> western and Readers Digest Condensed Books when I was 14 or so. A battered musty original print run version that had bel...\n <a href=\"http://www.goodreads.com/review/show/2616095\">more...</a>\n ]]>\n </body>\n <comments_count>0</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/2616095]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/2616095]]></link>\n\
|
87
|
+
</review>\n\n \n <review>\n <id>646557</id>\n <user>\n <id>51289</id>\n <name><![CDATA[Katie]]></name>\n <location><![CDATA[Waterbury, VT]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/51289-katie]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1176685035p3/51289.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1176685035p2/51289.jpg]]></small_image_url>\n\
|
88
|
+
</user>\n <rating>2</rating>\n <votes>7</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at>Fri Dec 01 00:00:00 -0800 2006</read_at>\n <date_added>Mon Apr 09 10:01:43 -0700 2007</date_added>\n <date_updated>Mon Apr 09 10:13:38 -0700 2007</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[I've loved science fiction my whole life, but I was finally told that I couldn't call myself a SF fan if I hadn't read Dune. So I read it. I know Dune is worshipped as a paragon of groundbreaking SF, I can witness and acknowledge Herbert's genius, and I can understand that when it was written it w...\n <a href=\"http://www.goodreads.com/review/show/646557\">more...</a>\n ]]>\n </body>\n <comments_count>7</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/646557]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/646557]]></link>\n\
|
89
|
+
</review>\n\n \n <review>\n <id>5774950</id>\n <user>\n <id>354744</id>\n <name><![CDATA[Exparrot]]></name>\n <location><![CDATA[The United States]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/354744-exparrot]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1192152370p3/354744.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1192152370p2/354744.jpg]]></small_image_url>\n\
|
90
|
+
</user>\n <rating>4</rating>\n <votes>2</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n </shelves>\n <recommended_for><![CDATA[anyone who enjoys a good intense Scifi novel]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at>Wed Jan 01 00:00:00 -0800 2003</read_at>\n <date_added>Thu Sep 06 09:49:10 -0700 2007</date_added>\n <date_updated>Thu Sep 06 10:14:38 -0700 2007</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[To be honest, I only decided to read the series when I, by chance, saw the 1984 Dune movie on TV. Mayhap I was curious to see people riding on gigantic worms, so I went straight away to my local Borders to check out the book. It took me a few days to finish the first book, but I was defintely hooked...\n <a href=\"http://www.goodreads.com/review/show/5774950\">more...</a>\n ]]>\n </body>\n <comments_count>0</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/5774950]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/5774950]]></link>\n\
|
91
|
+
</review>\n\n \n <review>\n <id>22819854</id>\n <user>\n <id>811687</id>\n <name><![CDATA[Sandi]]></name>\n <location><![CDATA[Fountain Valley, CA]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/811687-sandi]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1211125085p3/811687.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1211125085p2/811687.jpg]]></small_image_url>\n\
|
92
|
+
</user>\n <rating>5</rating>\n <votes>2</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n <shelf name=\"sci-fi\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[September Book of the Month for Science Fiction/Fantasy Group]]></recommended_by>\n <started_at></started_at>\n <read_at></read_at>\n <date_added>Fri May 23 10:55:49 -0700 2008</date_added>\n <date_updated>Wed Aug 20 06:32:05 -0700 2008</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[I'm officially giving myself permission to not finish this book. I'm only a few chapters in, but I've read it two or three times already, albeit more than ten years ago. I just can't do it one more time.\r<br/>\r<br/>I'm not saying "Dune" is bad. I think it's an excellent choice for the S...\n <a href=\"http://www.goodreads.com/review/show/22819854\">more...</a>\n ]]>\n </body>\n <comments_count>5</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/22819854]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/22819854]]></link>\n\
|
93
|
+
</review>\n\n \n <review>\n <id>7609615</id>\n <user>\n <id>190396</id>\n <name><![CDATA[Vanessa]]></name>\n <location><![CDATA[Petaluma, CA]]></location>\n <link><![CDATA[http://www.goodreads.com/user/show/190396-vanessa]]></link>\n <image_url><![CDATA[http://photo.goodreads.com/users/1209310514p3/190396.jpg]]></image_url>\n <small_image_url><![CDATA[http://photo.goodreads.com/users/1209310514p2/190396.jpg]]></small_image_url>\n\
|
94
|
+
</user>\n <rating>3</rating>\n <votes>3</votes>\n\n \n <spoiler_flag>false</spoiler_flag>\n <shelves>\n <shelf name=\"read\" />\n </shelves>\n <recommended_for><![CDATA[]]></recommended_for>\n <recommended_by><![CDATA[]]></recommended_by>\n <started_at></started_at>\n <read_at></read_at>\n <date_added>Thu Oct 11 21:40:29 -0700 2007</date_added>\n <date_updated>Tue Jun 03 07:03:35 -0700 2008</date_updated>\n <read_count></read_count>\n <body>\n <![CDATA[This was (looks furtively over shoulder in case a hardcore Sci-Fi aficianado is lurking nearby with a baseball bat) just okay. Certainly, Herbert has created a richly detailed universe that has delighted legions of fans, but while I admired his construction I was not pulled in by it. The book was...\n <a href=\"http://www.goodreads.com/review/show/7609615\">more...</a>\n ]]>\n </body>\n <comments_count>1</comments_count>\n \n <url><![CDATA[http://www.goodreads.com/review/show/7609615]]></url>\n <link><![CDATA[http://www.goodreads.com/review/show/7609615]]></link>\n\
|
95
|
+
</review>\n\n </reviews>\n <popular_shelves>\n <shelf name=\"to-read\" count=\"32809\"/>\n <shelf name=\"sci-fi\" count=\"1675\"/>\n <shelf name=\"science-fiction\" count=\"1627\"/>\n <shelf name=\"currently-reading\" count=\"1002\"/>\n <shelf name=\"fiction\" count=\"910\"/>\n <shelf name=\"favorites\" count=\"434\"/>\n <shelf name=\"fantasy\" count=\"428\"/>\n <shelf name=\"scifi\" count=\"342\"/>\n <shelf name=\"sci-fi-fantasy\" count=\"253\"/>\n </popular_shelves>\n <book_links>\n <book_link>\n <id>1</id>\n <name><![CDATA[Amazon]]></name>\n <link>http://www.goodreads.com/book_link/follow/1?book_id=53732</link>\n\
|
96
|
+
</book_link><book_link>\n <id>3</id>\n <name><![CDATA[Barnes & Noble]]></name>\n <link>http://www.goodreads.com/book_link/follow/3?book_id=53732</link>\n\
|
97
|
+
</book_link><book_link>\n <id>8</id>\n <name><![CDATA[WorldCat]]></name>\n <link>http://www.goodreads.com/book_link/follow/8?book_id=53732</link>\n\
|
98
|
+
</book_link><book_link>\n <id>2</id>\n <name><![CDATA[Half.com]]></name>\n <link>http://www.goodreads.com/book_link/follow/2?book_id=53732</link>\n\
|
99
|
+
</book_link><book_link>\n <id>4</id>\n <name><![CDATA[Abebooks]]></name>\n <link>http://www.goodreads.com/book_link/follow/4?book_id=53732</link>\n\
|
100
|
+
</book_link><book_link>\n <id>5</id>\n <name><![CDATA[Alibris]]></name>\n <link>http://www.goodreads.com/book_link/follow/5?book_id=53732</link>\n\
|
101
|
+
</book_link><book_link>\n <id>6</id>\n <name><![CDATA[Powells]]></name>\n <link>http://www.goodreads.com/book_link/follow/6?book_id=53732</link>\n\
|
102
|
+
</book_link><book_link>\n <id>7</id>\n <name><![CDATA[IndieBound]]></name>\n <link>http://www.goodreads.com/book_link/follow/7?book_id=53732</link>\n\
|
103
|
+
</book_link><book_link>\n <id>9</id>\n <name><![CDATA[Indigo.ca]]></name>\n <link>http://www.goodreads.com/book_link/follow/9?book_id=53732</link>\n\
|
104
|
+
</book_link><book_link>\n <id>10</id>\n <name><![CDATA[Audible]]></name>\n <link>http://www.goodreads.com/book_link/follow/10?book_id=53732</link>\n\
|
105
|
+
</book_link><book_link>\n <id>1602</id>\n <name><![CDATA[Google eBooks]]></name>\n <link>http://www.goodreads.com/book_link/follow/1602?book_id=53732</link>\n\
|
106
|
+
</book_link>\n </book_links>\n \n \n \n\
|
107
|
+
</book>\n\n\
|
108
|
+
</GoodreadsResponse>"
|
109
|
+
http_version: "1.1"
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
require 'rspec'
|
4
|
+
require 'go_goodreads'
|
5
|
+
require 'vcr'
|
6
|
+
require 'webmock'
|
7
|
+
|
8
|
+
VCR.config do |c|
|
9
|
+
c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
|
10
|
+
c.stub_with :webmock
|
11
|
+
# c.default_cassette_options = { :record => :new_episodes }
|
12
|
+
end
|
13
|
+
|
14
|
+
# Requires supporting files with custom matchers and macros, etc,
|
15
|
+
# in ./support/ and its subdirectories.
|
16
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
17
|
+
|
18
|
+
RSpec.configure do |config|
|
19
|
+
config.extend VCR::RSpec::Macros
|
20
|
+
end
|
21
|
+
|
metadata
ADDED
@@ -0,0 +1,181 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gogoodreads
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.3
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Tim Medina
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-03-24 00:00:00 +08:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: rspec
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ~>
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 2.3.0
|
24
|
+
type: :development
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: yard
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
|
+
none: false
|
31
|
+
requirements:
|
32
|
+
- - ~>
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 0.6.0
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: *id002
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: bundler
|
40
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.0.0
|
46
|
+
type: :development
|
47
|
+
prerelease: false
|
48
|
+
version_requirements: *id003
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: jeweler
|
51
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ~>
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: 1.5.2
|
57
|
+
type: :development
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: *id004
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: vcr
|
62
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: "0"
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: *id005
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: webmock
|
73
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: "0"
|
79
|
+
type: :development
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: *id006
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
name: rcov
|
84
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: "0"
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: *id007
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: nokogiri
|
95
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: "0"
|
101
|
+
type: :runtime
|
102
|
+
prerelease: false
|
103
|
+
version_requirements: *id008
|
104
|
+
description: Allows you to progammatically pull book reviews from Goodreads using its API.
|
105
|
+
email: iamteem@gmail.com
|
106
|
+
executables: []
|
107
|
+
|
108
|
+
extensions: []
|
109
|
+
|
110
|
+
extra_rdoc_files:
|
111
|
+
- LICENSE.txt
|
112
|
+
- README.rdoc
|
113
|
+
- TODO
|
114
|
+
files:
|
115
|
+
- .document
|
116
|
+
- .rspec
|
117
|
+
- Gemfile
|
118
|
+
- LICENSE.txt
|
119
|
+
- README.rdoc
|
120
|
+
- Rakefile
|
121
|
+
- TODO
|
122
|
+
- VERSION
|
123
|
+
- gogoodreads.gemspec
|
124
|
+
- lib/go_goodreads.rb
|
125
|
+
- lib/go_goodreads/attributes.rb
|
126
|
+
- lib/go_goodreads/author.rb
|
127
|
+
- lib/go_goodreads/book.rb
|
128
|
+
- lib/go_goodreads/comment.rb
|
129
|
+
- lib/go_goodreads/config.rb
|
130
|
+
- lib/go_goodreads/event.rb
|
131
|
+
- lib/go_goodreads/list.rb
|
132
|
+
- lib/go_goodreads/owned_book.rb
|
133
|
+
- lib/go_goodreads/quote.rb
|
134
|
+
- lib/go_goodreads/request.rb
|
135
|
+
- lib/go_goodreads/resource.rb
|
136
|
+
- lib/go_goodreads/review.rb
|
137
|
+
- lib/go_goodreads/shelf.rb
|
138
|
+
- lib/go_goodreads/user.rb
|
139
|
+
- lib/go_goodreads/user_status.rb
|
140
|
+
- lib/gogoodreads.rb
|
141
|
+
- spec/attribute_spec.rb
|
142
|
+
- spec/book_spec.rb
|
143
|
+
- spec/config_spec.rb
|
144
|
+
- spec/fixtures/vcr_cassettes/book_by_isbn.yml
|
145
|
+
- spec/spec_helper.rb
|
146
|
+
has_rdoc: true
|
147
|
+
homepage: http://github.com/iamteem/gogoodreads
|
148
|
+
licenses:
|
149
|
+
- MIT
|
150
|
+
post_install_message:
|
151
|
+
rdoc_options: []
|
152
|
+
|
153
|
+
require_paths:
|
154
|
+
- lib
|
155
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
156
|
+
none: false
|
157
|
+
requirements:
|
158
|
+
- - ">="
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
hash: -184150397033762058
|
161
|
+
segments:
|
162
|
+
- 0
|
163
|
+
version: "0"
|
164
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
165
|
+
none: false
|
166
|
+
requirements:
|
167
|
+
- - ">="
|
168
|
+
- !ruby/object:Gem::Version
|
169
|
+
version: "0"
|
170
|
+
requirements: []
|
171
|
+
|
172
|
+
rubyforge_project:
|
173
|
+
rubygems_version: 1.6.2
|
174
|
+
signing_key:
|
175
|
+
specification_version: 3
|
176
|
+
summary: Goodreads API Ruby Interface
|
177
|
+
test_files:
|
178
|
+
- spec/attribute_spec.rb
|
179
|
+
- spec/book_spec.rb
|
180
|
+
- spec/config_spec.rb
|
181
|
+
- spec/spec_helper.rb
|