barnie 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/barnie.gemspec +15 -18
- data/lib/barnie/helpers.rb +12 -11
- data/lib/barnie/request.rb +34 -0
- data/lib/barnie/response.rb +43 -0
- data/lib/barnie/version.rb +1 -1
- data/lib/barnie.rb +3 -13
- data/spec/{unit/barnie → barnie}/helpers_spec.rb +13 -7
- data/spec/barnie/request_spec.rb +48 -0
- data/spec/barnie/response_spec.rb +91 -0
- data/spec/fixtures/barnie.yml +1215 -0
- data/spec/fixtures/isbns.txt +1000 -0
- data/spec/spec_helper.rb +4 -4
- data/spec/support/isbns.rb +5 -8
- data/spec/support/show_me_the_page.rb +2 -2
- data/spec/support/vcr.rb +1 -1
- metadata +27 -54
- data/.rspec +0 -1
- data/benchmarks/bm_helper.rb +0 -5
- data/benchmarks/stress_test.rb +0 -28
- data/lib/barnie/client.rb +0 -57
- data/lib/barnie/error.rb +0 -7
- data/spec/acceptance/availability_spec.rb +0 -43
- data/spec/acceptance/smokescreen_spec.rb +0 -18
- data/spec/fixtures/asins.txt +0 -10000
- data/spec/fixtures/barnie_availability.yml +0 -507
- data/spec/fixtures/barnie_client.yml +0 -347
- data/spec/fixtures/barnie_helpers.yml +0 -231
- data/spec/fixtures/barnie_smokescreen.yml +0 -112
- data/spec/fixtures/bug.yml +0 -248
- data/spec/unit/barnie/client_spec.rb +0 -122
- data/spec/unit/barnie_spec.rb +0 -9
data/spec/spec_helper.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'rspec'
|
4
4
|
|
5
|
-
require File.expand_path(
|
5
|
+
require File.expand_path('../../lib/barnie', __FILE__)
|
6
6
|
|
7
7
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
data/spec/support/isbns.rb
CHANGED
@@ -1,12 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
def isbns_fixture
|
4
|
-
isbns = File.new(File.expand_path("../../fixtures/asins.txt", __FILE__), "r").
|
5
|
-
map { |line| Bookland::ISBN.to_13 line.chomp }
|
1
|
+
def isbns
|
2
|
+
file = File.new(File.expand_path("../../fixtures/isbns.txt", __FILE__), 'r')
|
6
3
|
|
7
4
|
if block_given?
|
8
|
-
|
5
|
+
file.each { |line| yield line.chomp }
|
6
|
+
else
|
7
|
+
file.map { |line| line.chomp }
|
9
8
|
end
|
10
|
-
|
11
|
-
isbns
|
12
9
|
end
|
@@ -2,9 +2,9 @@ require "launchy"
|
|
2
2
|
|
3
3
|
class Mechanize
|
4
4
|
def show_me_the_page
|
5
|
-
file_path = ::File.expand_path("../
|
5
|
+
file_path = ::File.expand_path("../mechanize-#{Time.now.to_i}.html", __FILE__)
|
6
6
|
|
7
|
-
file = ::File.new(file_path,
|
7
|
+
file = ::File.new(file_path, 'w')
|
8
8
|
file.write(current_page.body)
|
9
9
|
file.close
|
10
10
|
|
data/spec/support/vcr.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'vcr'
|
2
2
|
|
3
3
|
VCR.config do |c|
|
4
|
-
c.cassette_library_dir = File.expand_path(
|
4
|
+
c.cassette_library_dir = File.expand_path('../../fixtures', __FILE__)
|
5
5
|
c.stub_with :webmock
|
6
6
|
c.ignore_localhost = true
|
7
7
|
c.default_cassette_options = { :record => :new_episodes }
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: barnie
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.2.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Paper Cavalier
|
@@ -10,30 +10,30 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-03-10 00:00:00 +00:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
|
-
name:
|
17
|
+
name: kosher
|
18
18
|
prerelease: false
|
19
19
|
requirement: &id001 !ruby/object:Gem::Requirement
|
20
20
|
none: false
|
21
21
|
requirements:
|
22
22
|
- - ~>
|
23
23
|
- !ruby/object:Gem::Version
|
24
|
-
version:
|
24
|
+
version: 0.2.10
|
25
25
|
type: :runtime
|
26
26
|
version_requirements: *id001
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: mechanize
|
29
29
|
prerelease: false
|
30
30
|
requirement: &id002 !ruby/object:Gem::Requirement
|
31
31
|
none: false
|
32
32
|
requirements:
|
33
|
-
- -
|
33
|
+
- - ~>
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: 0.
|
36
|
-
type: :
|
35
|
+
version: 1.0.0
|
36
|
+
type: :runtime
|
37
37
|
version_requirements: *id002
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
39
|
name: launchy
|
@@ -54,18 +54,18 @@ dependencies:
|
|
54
54
|
requirements:
|
55
55
|
- - ~>
|
56
56
|
- !ruby/object:Gem::Version
|
57
|
-
version: 2.
|
57
|
+
version: 2.5.0
|
58
58
|
type: :development
|
59
59
|
version_requirements: *id004
|
60
60
|
- !ruby/object:Gem::Dependency
|
61
|
-
name:
|
61
|
+
name: ruby-debug19
|
62
62
|
prerelease: false
|
63
63
|
requirement: &id005 !ruby/object:Gem::Requirement
|
64
64
|
none: false
|
65
65
|
requirements:
|
66
66
|
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.
|
68
|
+
version: 0.11.0
|
69
69
|
type: :development
|
70
70
|
version_requirements: *id005
|
71
71
|
- !ruby/object:Gem::Dependency
|
@@ -76,7 +76,7 @@ dependencies:
|
|
76
76
|
requirements:
|
77
77
|
- - ~>
|
78
78
|
- !ruby/object:Gem::Version
|
79
|
-
version: 1.
|
79
|
+
version: 1.7.0
|
80
80
|
type: :development
|
81
81
|
version_requirements: *id006
|
82
82
|
- !ruby/object:Gem::Dependency
|
@@ -87,23 +87,11 @@ dependencies:
|
|
87
87
|
requirements:
|
88
88
|
- - ~>
|
89
89
|
- !ruby/object:Gem::Version
|
90
|
-
version: 1.6.
|
90
|
+
version: 1.6.2
|
91
91
|
type: :development
|
92
92
|
version_requirements: *id007
|
93
|
-
- !ruby/object:Gem::Dependency
|
94
|
-
name: ruby-debug19
|
95
|
-
prerelease: false
|
96
|
-
requirement: &id008 !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
|
-
requirements:
|
99
|
-
- - ~>
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
version: 0.11.0
|
102
|
-
type: :development
|
103
|
-
version_requirements: *id008
|
104
93
|
description: A fake API to a well-known bookstore
|
105
|
-
email:
|
106
|
-
- code@papercavalier.com
|
94
|
+
email: code@papercavalier.com
|
107
95
|
executables: []
|
108
96
|
|
109
97
|
extensions: []
|
@@ -112,35 +100,26 @@ extra_rdoc_files: []
|
|
112
100
|
|
113
101
|
files:
|
114
102
|
- .gitignore
|
115
|
-
- .rspec
|
116
103
|
- Gemfile
|
117
104
|
- LICENSE
|
118
105
|
- README.md
|
119
106
|
- Rakefile
|
120
107
|
- barnie.gemspec
|
121
|
-
- benchmarks/bm_helper.rb
|
122
|
-
- benchmarks/stress_test.rb
|
123
108
|
- lib/barnie.rb
|
124
|
-
- lib/barnie/client.rb
|
125
|
-
- lib/barnie/error.rb
|
126
109
|
- lib/barnie/helpers.rb
|
110
|
+
- lib/barnie/request.rb
|
111
|
+
- lib/barnie/response.rb
|
127
112
|
- lib/barnie/version.rb
|
128
113
|
- rvmrc.example
|
129
|
-
- spec/
|
130
|
-
- spec/
|
131
|
-
- spec/
|
132
|
-
- spec/fixtures/
|
133
|
-
- spec/fixtures/
|
134
|
-
- spec/fixtures/barnie_helpers.yml
|
135
|
-
- spec/fixtures/barnie_smokescreen.yml
|
136
|
-
- spec/fixtures/bug.yml
|
114
|
+
- spec/barnie/helpers_spec.rb
|
115
|
+
- spec/barnie/request_spec.rb
|
116
|
+
- spec/barnie/response_spec.rb
|
117
|
+
- spec/fixtures/barnie.yml
|
118
|
+
- spec/fixtures/isbns.txt
|
137
119
|
- spec/spec_helper.rb
|
138
120
|
- spec/support/isbns.rb
|
139
121
|
- spec/support/show_me_the_page.rb
|
140
122
|
- spec/support/vcr.rb
|
141
|
-
- spec/unit/barnie/client_spec.rb
|
142
|
-
- spec/unit/barnie/helpers_spec.rb
|
143
|
-
- spec/unit/barnie_spec.rb
|
144
123
|
has_rdoc: true
|
145
124
|
homepage: http://gloss.papercavalier.com/barnie
|
146
125
|
licenses: []
|
@@ -165,23 +144,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
165
144
|
requirements: []
|
166
145
|
|
167
146
|
rubyforge_project: barnie
|
168
|
-
rubygems_version: 1.5.
|
147
|
+
rubygems_version: 1.5.2
|
169
148
|
signing_key:
|
170
149
|
specification_version: 3
|
171
150
|
summary: A fake API to a well-known bookstore
|
172
151
|
test_files:
|
173
|
-
- spec/
|
174
|
-
- spec/
|
175
|
-
- spec/
|
176
|
-
- spec/fixtures/
|
177
|
-
- spec/fixtures/
|
178
|
-
- spec/fixtures/barnie_helpers.yml
|
179
|
-
- spec/fixtures/barnie_smokescreen.yml
|
180
|
-
- spec/fixtures/bug.yml
|
152
|
+
- spec/barnie/helpers_spec.rb
|
153
|
+
- spec/barnie/request_spec.rb
|
154
|
+
- spec/barnie/response_spec.rb
|
155
|
+
- spec/fixtures/barnie.yml
|
156
|
+
- spec/fixtures/isbns.txt
|
181
157
|
- spec/spec_helper.rb
|
182
158
|
- spec/support/isbns.rb
|
183
159
|
- spec/support/show_me_the_page.rb
|
184
160
|
- spec/support/vcr.rb
|
185
|
-
- spec/unit/barnie/client_spec.rb
|
186
|
-
- spec/unit/barnie/helpers_spec.rb
|
187
|
-
- spec/unit/barnie_spec.rb
|
data/.rspec
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
-cfd
|
data/benchmarks/bm_helper.rb
DELETED
data/benchmarks/stress_test.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
require File.expand_path("../bm_helper", __FILE__)
|
2
|
-
require "throttler"
|
3
|
-
|
4
|
-
include Throttler
|
5
|
-
|
6
|
-
print "Enter batch size: "
|
7
|
-
batch_size = STDIN.gets.to_i
|
8
|
-
printed_at = Time.now
|
9
|
-
timestamps = []
|
10
|
-
found = 0
|
11
|
-
|
12
|
-
client = Barnie.new('Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-HK) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5')
|
13
|
-
|
14
|
-
isbns_fixture.each_slice(batch_size) do |isbns|
|
15
|
-
client.isbns = isbns
|
16
|
-
throttle("bm") { found += client.books.size }
|
17
|
-
timestamps << Time.now
|
18
|
-
|
19
|
-
if Time.now - printed_at > 5.0
|
20
|
-
puts Time.now.strftime("%H:%M:%S").center(38, '-')
|
21
|
-
printed_at = Time.now
|
22
|
-
average = (timestamps.
|
23
|
-
select { |ts| printed_at - ts < 60.0 }.size / 60.0).
|
24
|
-
round(3)
|
25
|
-
puts [timestamps.size, average, found].
|
26
|
-
map { |w| w.to_s.center(8) }.join(' | ')
|
27
|
-
end
|
28
|
-
end
|
data/lib/barnie/client.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
module Barnie
|
2
|
-
|
3
|
-
# A wrapper around the API request
|
4
|
-
class Client
|
5
|
-
include Helpers
|
6
|
-
|
7
|
-
HOST = "productsearch.barnesandnoble.com"
|
8
|
-
PATH = "/search/results.aspx"
|
9
|
-
|
10
|
-
attr_accessor :isbns,
|
11
|
-
:agent
|
12
|
-
|
13
|
-
def initialize(user_agent)
|
14
|
-
self.agent = Mechanize.new { |a| a.user_agent = "iPhone #{user_agent}" }
|
15
|
-
end
|
16
|
-
|
17
|
-
def request
|
18
|
-
agent.get(uri)
|
19
|
-
end
|
20
|
-
|
21
|
-
def books
|
22
|
-
begin
|
23
|
-
page = request
|
24
|
-
container = page.search("#prod-container")
|
25
|
-
container.map do |html|
|
26
|
-
title = title(html)
|
27
|
-
|
28
|
-
book = {
|
29
|
-
:title => extract_title(title),
|
30
|
-
:authors => extract_authors(html),
|
31
|
-
:binding => extract_binding(html.search(".format").text),
|
32
|
-
:ships_in => extract_ships_in(html.search(".availability").text),
|
33
|
-
:price => extract_price(html.search(".price strong").text),
|
34
|
-
:link => extract_link(title)
|
35
|
-
}
|
36
|
-
book[:isbn] = extract_isbn(book[:link])
|
37
|
-
book
|
38
|
-
end
|
39
|
-
rescue NoMethodError => e
|
40
|
-
raise Barnie::Error.new(e.message + page.inspect)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def build_query
|
47
|
-
"ISBNLIST=#{self.isbns[0, 50].join(',')}"
|
48
|
-
end
|
49
|
-
|
50
|
-
def uri
|
51
|
-
URI::HTTP.build(
|
52
|
-
:host => HOST,
|
53
|
-
:path => PATH,
|
54
|
-
:query => build_query)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
data/lib/barnie/error.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe "Availability" do
|
4
|
-
before do
|
5
|
-
VCR.insert_cassette('barnie_availability')
|
6
|
-
@client = Barnie.new("company details")
|
7
|
-
end
|
8
|
-
|
9
|
-
after do
|
10
|
-
VCR.eject_cassette
|
11
|
-
end
|
12
|
-
|
13
|
-
it "returns a book that is available for sale" do
|
14
|
-
@client.isbns = ["9780816614028"]
|
15
|
-
book = @client.books.first
|
16
|
-
book[:price].should be_an_instance_of Fixnum
|
17
|
-
book[:ships_in].should be_an_instance_of Fixnum
|
18
|
-
end
|
19
|
-
|
20
|
-
it "returns an ebook" do
|
21
|
-
# these are available as ebooks only
|
22
|
-
# VCR should ensure it stays that way even if this changes in the future
|
23
|
-
@client.isbns = ["9781400826094", "9780203029923"]
|
24
|
-
@client.books.each do |book|
|
25
|
-
book[:title].should be_an_instance_of String
|
26
|
-
book[:isbn].should be_an_instance_of String
|
27
|
-
book[:price].should be_an_instance_of Fixnum
|
28
|
-
book[:ships_in].should eql nil
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
it "returns a book that is not available for sale" do
|
33
|
-
@client.isbns = ["9780002189347"]
|
34
|
-
book = @client.books.first
|
35
|
-
book[:price].should eql 0
|
36
|
-
book[:ships_in].should be_nil
|
37
|
-
end
|
38
|
-
|
39
|
-
it "does not return a book that is not in the Barnes & Noble catalogue" do
|
40
|
-
@client.isbns = ["9780002196642"]
|
41
|
-
@client.books.should be_empty
|
42
|
-
end
|
43
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe "Barnie" do
|
4
|
-
before do
|
5
|
-
VCR.insert_cassette('barnie_smokescreen')
|
6
|
-
@client = Barnie.new("company details")
|
7
|
-
end
|
8
|
-
|
9
|
-
after do
|
10
|
-
VCR.eject_cassette
|
11
|
-
end
|
12
|
-
|
13
|
-
it "finds a book" do
|
14
|
-
@client.isbns = ["9780486272351"]
|
15
|
-
book = @client.books.first
|
16
|
-
pp book
|
17
|
-
end
|
18
|
-
end
|