amzwish 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.autotest +1 -0
- data/.gitignore +6 -0
- data/.rvmrc +1 -0
- data/LICENSE +20 -0
- data/README.rdoc +24 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/amzwish.gemspec +86 -0
- data/autotest/discover.rb +3 -0
- data/bin/amzwish +6 -0
- data/lib/amzwish.rb +4 -0
- data/lib/amzwish/book.rb +19 -0
- data/lib/amzwish/services/website_wrapper.rb +51 -0
- data/lib/amzwish/wishlist.rb +51 -0
- data/samples/create_key_sample.rb +21 -0
- data/samples/uk/empty.html +1947 -0
- data/samples/uk/multipage-page1.html +3489 -0
- data/samples/uk/multipage-page2.html +3490 -0
- data/samples/uk/multipage-page3.html +3490 -0
- data/samples/uk/multipage-page4.html +2902 -0
- data/samples/uk/single-item.html +2103 -0
- data/samples/wishlist_scrape_sample.rb +16 -0
- data/spec/amzwish/book_spec.rb +20 -0
- data/spec/amzwish/page_spec.rb +49 -0
- data/spec/amzwish/services/website_wrapper_spec.rb +51 -0
- data/spec/amzwish/wishlist_spec.rb +51 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +6 -0
- metadata +143 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'open-uri'
|
3
|
+
load '../keys.rb'
|
4
|
+
|
5
|
+
SAMPLE_DIR="uk"
|
6
|
+
PAGE_1 = "34VGL4IX1RMYO?reveal=unpurchased&filter=all&sort=date-added&layout=compact"
|
7
|
+
PAGE_2 = "ref=cm_wl_sortbar_o_n_page_4?_encoding=UTF8&filter=all&sort=date-added&layout=compact&reveal=unpurchased&page=4"
|
8
|
+
PAGE_3 = "ref=cm_wl_sortbar_o_page_2?_encoding=UTF8&filter=all&sort=date-added&layout=compact&reveal=unpurchased&page=2"
|
9
|
+
PAGE_4 = "ref=cm_wl_sortbar_o_page_3?_encoding=UTF8&filter=all&sort=date-added&layout=compact&reveal=unpurchased&page=3"
|
10
|
+
|
11
|
+
doc = Nokogiri::HTML(open(File.join(SAMPLE_DIR, PAGE_1)))
|
12
|
+
doc.xpath('//tbody[@class="itemWrapper"]').each do |e|
|
13
|
+
name = e.xpath('.//a[1]/text()').to_s
|
14
|
+
ref_num = e.xpath("@name").to_s.split('.').last
|
15
|
+
p "#{ref_num} : #{name}"
|
16
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Amzwish
|
4
|
+
describe Book do
|
5
|
+
describe "equality" do
|
6
|
+
let(:fixture){ Book.new("Title", "123") }
|
7
|
+
describe "is based on asin number" do
|
8
|
+
example "books with the same asin number are equal" do
|
9
|
+
(fixture == Book.new("Title", "123")).should == true
|
10
|
+
end
|
11
|
+
example "books with different asin numbers are not equal" do
|
12
|
+
(fixture == Book.new("Title", "321")).should == false
|
13
|
+
end
|
14
|
+
example "books are not equal to things that are not books" do
|
15
|
+
(fixture == "Title").should == false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'open-uri'
|
3
|
+
|
4
|
+
module Amzwish
|
5
|
+
describe Wishlist::Page do
|
6
|
+
describe "an empty page" do
|
7
|
+
let(:fixture){ create_page_from("empty.html") }
|
8
|
+
it "should not have another page" do
|
9
|
+
fixture.should_not be_has_next
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should_not_have_any_books" do
|
13
|
+
fixture.books.should be_empty
|
14
|
+
end
|
15
|
+
end
|
16
|
+
describe "the first page of many" do
|
17
|
+
let(:fixture){ create_page_from("multipage-page1.html") }
|
18
|
+
it "should have another page" do
|
19
|
+
fixture.should be_has_next
|
20
|
+
end
|
21
|
+
it "should have books on it" do
|
22
|
+
fixture.books.should_not be_empty
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should have iterable books" do
|
26
|
+
books = fixture.books
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "the last page of many" do
|
31
|
+
let(:fixture){ create_page_from("multipage-page4.html") }
|
32
|
+
it "should not have another page" do
|
33
|
+
fixture.should_not be_has_next
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "a page with one item on it" do
|
38
|
+
let(:fixture){ create_page_from("single-item.html") }
|
39
|
+
it "should return the correct book" do
|
40
|
+
fixture.books.first.should == Book.new("Language Myths", "0140260234")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
def create_page_from(html_file)
|
46
|
+
Wishlist::Page.new(open(File.join(PROJECT_DIR, "samples", "uk", html_file)))
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Amzwish
|
4
|
+
module Services
|
5
|
+
PREVENT_WEB_REQUESTS = false
|
6
|
+
|
7
|
+
describe WebsiteWrapper do
|
8
|
+
|
9
|
+
let(:mock_client){ mock("rest_client")}
|
10
|
+
let(:fixture){ WebsiteWrapper.new(mock_client) }
|
11
|
+
|
12
|
+
describe "getting wishlist id" do
|
13
|
+
describe "wishlist not found" do
|
14
|
+
it "should return an empty array" do
|
15
|
+
mock_client.should_receive(:post).with("address@email.com").and_return({:code => 200})
|
16
|
+
fixture.find_for("address@email.com").should == []
|
17
|
+
end
|
18
|
+
end
|
19
|
+
describe "single wishlist found" do
|
20
|
+
it "should return an array with one hash" do
|
21
|
+
mock_client.should_receive(:post).with("address@email.com").and_return(
|
22
|
+
{ :code => 302,
|
23
|
+
:headers=> {
|
24
|
+
:location=>"http://www.amazon.co.uk/gp/registry/registry.html/276-3987950-0414363?ie=UTF8&type=wishlist&id=WISH_LIST_ID"}
|
25
|
+
})
|
26
|
+
fixture.find_for("address@email.com").should == [{:id=>"WISH_LIST_ID"}]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "getting wishlist content html" do
|
32
|
+
describe "getting page 1" do
|
33
|
+
it "should return the page as a string" do
|
34
|
+
mock_client.should_receive(:get).with("WISH_LIST_ID", 1).and_return("Page Content")
|
35
|
+
fixture.get_page("WISH_LIST_ID", 1).should == "Page Content"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "examples that make actual web requests" do
|
41
|
+
let(:fixture){ WebsiteWrapper.new() }
|
42
|
+
example "get wishlist html" do
|
43
|
+
fixture.get_page("34VGL4IX1RMYO", 1).should =~ /Chris Tinning/
|
44
|
+
end
|
45
|
+
example "get wishlist id" do
|
46
|
+
fixture.find_for("chris.tinning@gmail.com").should == [{:id=>"34VGL4IX1RMYO"}]
|
47
|
+
end
|
48
|
+
end unless PREVENT_WEB_REQUESTS
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'open-uri'
|
3
|
+
|
4
|
+
module Amzwish
|
5
|
+
describe Wishlist do
|
6
|
+
context "empty wishlist" do
|
7
|
+
let(:mock_wrapper){ mock_website_wrapper( %w{ empty.html } ) }
|
8
|
+
let(:fixture){ Wishlist.new("address@email.com", mock_wrapper) }
|
9
|
+
it "returns an empty list of books" do
|
10
|
+
fixture.books.size.should == 0
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context "single item wishlist" do
|
15
|
+
let(:mock_wrapper){ mock_website_wrapper( %w{ single-item.html } ) }
|
16
|
+
let(:fixture){ Wishlist.new("address@email.com", mock_wrapper) }
|
17
|
+
it "returns a list of books" do
|
18
|
+
books = fixture.books
|
19
|
+
books.size.should == 1
|
20
|
+
books[0].title.should == "Language Myths"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should be enumerable" do
|
24
|
+
books = []
|
25
|
+
fixture.each_book{|b| books << b}
|
26
|
+
books.size.should == 1
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "multipage wishlist" do
|
31
|
+
let(:mock_wrapper){ mock_website_wrapper(%w{ multipage-page1.html multipage-page2.html multipage-page3.html multipage-page4.html}) }
|
32
|
+
let(:fixture){ Wishlist.new("address@email.com", mock_wrapper) }
|
33
|
+
it "returns a list of books" do
|
34
|
+
fixture = Wishlist.new("address@email.com", mock_wrapper)
|
35
|
+
fixture.books.size.should be > 0
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def mock_website_wrapper(html_files, wishlist_id = "WISHLIST-ID", email = "address@email.com")
|
40
|
+
mock_wrapper = mock(Services::WebsiteWrapper)
|
41
|
+
mock_wrapper.should_receive(:find_for).with(email).and_return([{:id=>wishlist_id}])
|
42
|
+
html_files.each_with_index do |f, i|
|
43
|
+
page_num = i+1
|
44
|
+
page = open(File.join(PROJECT_DIR, "samples","uk", f )).read
|
45
|
+
mock_wrapper.should_receive(:get_page).with( wishlist_id, page_num).and_return(page)
|
46
|
+
end
|
47
|
+
mock_wrapper
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,143 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: amzwish
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
version: 0.0.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Chris Tinning
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-10-10 00:00:00 +01:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rspec
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
type: :development
|
31
|
+
version_requirements: *id001
|
32
|
+
- !ruby/object:Gem::Dependency
|
33
|
+
name: nokogiri
|
34
|
+
prerelease: false
|
35
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
segments:
|
40
|
+
- 0
|
41
|
+
version: "0"
|
42
|
+
type: :development
|
43
|
+
version_requirements: *id002
|
44
|
+
- !ruby/object:Gem::Dependency
|
45
|
+
name: nokogiri
|
46
|
+
prerelease: false
|
47
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
segments:
|
52
|
+
- 0
|
53
|
+
version: "0"
|
54
|
+
type: :runtime
|
55
|
+
version_requirements: *id003
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rest-client
|
58
|
+
prerelease: false
|
59
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
segments:
|
64
|
+
- 0
|
65
|
+
version: "0"
|
66
|
+
type: :runtime
|
67
|
+
version_requirements: *id004
|
68
|
+
description: Since you can no longer access wishlists through the Amazon api this gem aims to address this by combining some screen scraping with api calls.
|
69
|
+
email: chris.tinning@gmail.com
|
70
|
+
executables:
|
71
|
+
- amzwish
|
72
|
+
- amzwish
|
73
|
+
extensions: []
|
74
|
+
|
75
|
+
extra_rdoc_files:
|
76
|
+
- LICENSE
|
77
|
+
- README.rdoc
|
78
|
+
files:
|
79
|
+
- .autotest
|
80
|
+
- .gitignore
|
81
|
+
- .rvmrc
|
82
|
+
- LICENSE
|
83
|
+
- README.rdoc
|
84
|
+
- Rakefile
|
85
|
+
- VERSION
|
86
|
+
- amzwish.gemspec
|
87
|
+
- autotest/discover.rb
|
88
|
+
- bin/amzwish
|
89
|
+
- lib/amzwish.rb
|
90
|
+
- lib/amzwish/book.rb
|
91
|
+
- lib/amzwish/services/website_wrapper.rb
|
92
|
+
- lib/amzwish/wishlist.rb
|
93
|
+
- pkg/amzwish-0.0.0.gem
|
94
|
+
- samples/create_key_sample.rb
|
95
|
+
- samples/uk/empty.html
|
96
|
+
- samples/uk/multipage-page1.html
|
97
|
+
- samples/uk/multipage-page2.html
|
98
|
+
- samples/uk/multipage-page3.html
|
99
|
+
- samples/uk/multipage-page4.html
|
100
|
+
- samples/uk/single-item.html
|
101
|
+
- samples/wishlist_scrape_sample.rb
|
102
|
+
- spec/amzwish/book_spec.rb
|
103
|
+
- spec/amzwish/page_spec.rb
|
104
|
+
- spec/amzwish/services/website_wrapper_spec.rb
|
105
|
+
- spec/amzwish/wishlist_spec.rb
|
106
|
+
- spec/spec.opts
|
107
|
+
- spec/spec_helper.rb
|
108
|
+
has_rdoc: true
|
109
|
+
homepage: http://github.com/tinman/amzwish
|
110
|
+
licenses: []
|
111
|
+
|
112
|
+
post_install_message:
|
113
|
+
rdoc_options:
|
114
|
+
- --charset=UTF-8
|
115
|
+
require_paths:
|
116
|
+
- lib
|
117
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
segments:
|
122
|
+
- 0
|
123
|
+
version: "0"
|
124
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
|
+
requirements:
|
126
|
+
- - ">="
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
segments:
|
129
|
+
- 0
|
130
|
+
version: "0"
|
131
|
+
requirements: []
|
132
|
+
|
133
|
+
rubyforge_project:
|
134
|
+
rubygems_version: 1.3.6
|
135
|
+
signing_key:
|
136
|
+
specification_version: 3
|
137
|
+
summary: Get at Amazon wishlists combines scraping and the api
|
138
|
+
test_files:
|
139
|
+
- spec/amzwish/book_spec.rb
|
140
|
+
- spec/amzwish/page_spec.rb
|
141
|
+
- spec/amzwish/services/website_wrapper_spec.rb
|
142
|
+
- spec/amzwish/wishlist_spec.rb
|
143
|
+
- spec/spec_helper.rb
|