vrbo 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +9 -1
- data/lib/vrbo/availability.rb +17 -6
- data/lib/vrbo/calendar.rb +19 -12
- data/lib/vrbo/version.rb +1 -1
- data/lib/vrbo.rb +4 -0
- data/test/support/calendar_dates.rb +45 -0
- data/test/vrbo/availability_test.rb +23 -0
- data/test/vrbo/calendar_test.rb +70 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72cf31755f44dfcc866e18686ed537ff8c18a007
|
4
|
+
data.tar.gz: ff2eb37a978de9dbc58e7acc9d500adae7a23ffe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e9e470bb51bb3fbb8c89664b4a1a386cd33a5d648f325dd28450d2e773e72b101ad8f1fa91423a074cca0a1bf5b0774f4929b7627c735460bdd9ebfaec554e0
|
7
|
+
data.tar.gz: df400f306a153603eb0ee3d7787ed9b238637bddb16812e7fbf9c86dbbd6590169cb1380dffe752faa260e2afcfe0b9fcfea73f69474ea7911a41fd56b813942
|
data/Rakefile
CHANGED
data/lib/vrbo/availability.rb
CHANGED
@@ -1,21 +1,32 @@
|
|
1
1
|
module VRBO
|
2
2
|
class Availability
|
3
3
|
|
4
|
-
attr_accessor :start_at, :duration, :error
|
4
|
+
attr_accessor :start_at, :duration, :error, :dates
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
# assumes dates are in ascending order
|
7
|
+
def initialize(the_dates = nil)
|
8
|
+
@dates = the_dates || []
|
8
9
|
if dates.any?
|
9
10
|
@start_at = Date.parse(dates.shift)
|
10
11
|
else
|
11
12
|
@start_at = Date.today
|
12
13
|
@error = 'Maybe... But likely there was an error.'
|
13
14
|
end
|
14
|
-
@duration =
|
15
|
+
@duration = count_continuous_dates
|
15
16
|
end
|
16
17
|
|
17
|
-
def
|
18
|
-
|
18
|
+
def count_continuous_dates
|
19
|
+
i = -1
|
20
|
+
count = 1
|
21
|
+
dates.each do |the_date|
|
22
|
+
diff = Date.parse(the_date) - (start_at + (i += 1))
|
23
|
+
if diff.to_i == 1
|
24
|
+
count += 1
|
25
|
+
else
|
26
|
+
break
|
27
|
+
end
|
28
|
+
end
|
29
|
+
count
|
19
30
|
end
|
20
31
|
end
|
21
32
|
end
|
data/lib/vrbo/calendar.rb
CHANGED
@@ -4,11 +4,11 @@ module VRBO
|
|
4
4
|
class Calendar
|
5
5
|
extend ClassMethods
|
6
6
|
|
7
|
-
attr_accessor :id, :available_dates, :
|
7
|
+
attr_accessor :id, :available_dates, :days
|
8
8
|
|
9
9
|
def initialize(calendar_id = nil)
|
10
10
|
@id = calendar_id || VRBO.config.calendar_id
|
11
|
-
@
|
11
|
+
@days = {}
|
12
12
|
@available_dates = []
|
13
13
|
end
|
14
14
|
|
@@ -23,32 +23,39 @@ module VRBO
|
|
23
23
|
|
24
24
|
def find_all_available_dates
|
25
25
|
today = Date.today
|
26
|
-
@available_dates = today.upto(today + 365).map { |date|
|
26
|
+
@available_dates = today.upto(today + 365).map { |date| date_if_available(date) }.compact
|
27
27
|
end
|
28
28
|
|
29
|
-
def
|
29
|
+
def date_if_available(date)
|
30
30
|
m = date.month.to_s
|
31
|
-
|
31
|
+
days[m] ||= collect_days_for_month(date)
|
32
|
+
date.to_s if days[m].include?(date.day.to_s)
|
33
|
+
end
|
32
34
|
|
33
|
-
|
34
|
-
|
35
|
-
else
|
36
|
-
nil
|
37
|
-
end
|
35
|
+
def collect_days_for_month(date)
|
36
|
+
scrape_table_for(date).map { |cell| cell.children.to_s.strip }
|
38
37
|
end
|
39
38
|
|
40
|
-
def
|
39
|
+
def scrape_table_for(date)
|
41
40
|
calendar.search('.cal-month').at(table_xpath(date)).search('td:not(.strike)')
|
42
41
|
end
|
43
42
|
|
44
43
|
def calendar
|
45
|
-
@calendar ||= agent.get(
|
44
|
+
@calendar ||= agent.get(calendar_url)
|
46
45
|
end
|
47
46
|
|
48
47
|
def agent
|
49
48
|
@agent ||= Mechanize.new
|
50
49
|
end
|
51
50
|
|
51
|
+
def calendar_url
|
52
|
+
if id
|
53
|
+
"http://www.vrbo.com/#{id}/calendar"
|
54
|
+
else
|
55
|
+
raise ArgumentError, 'You must provide a calendar id'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
52
59
|
# March 2014
|
53
60
|
def table_xpath(date)
|
54
61
|
"//b[contains(text(), '#{date.strftime('%B %Y')}')]/following-sibling::table"
|
data/lib/vrbo/version.rb
CHANGED
data/lib/vrbo.rb
CHANGED
@@ -0,0 +1,45 @@
|
|
1
|
+
module CalendarDates
|
2
|
+
|
3
|
+
module Stubs
|
4
|
+
def collect_days_for_month(date)
|
5
|
+
dates = date.upto(date.next_month).to_a
|
6
|
+
dates.map(&:day).map(&:to_s).take(3)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def available?(list, a = today, b = tomorrow)
|
11
|
+
vrbo_calendar.available?(a, b, list)
|
12
|
+
end
|
13
|
+
|
14
|
+
def all
|
15
|
+
prep [today, tomorrow]
|
16
|
+
end
|
17
|
+
|
18
|
+
def random
|
19
|
+
prep all.shuffle
|
20
|
+
end
|
21
|
+
|
22
|
+
def arrival_only
|
23
|
+
prep [today]
|
24
|
+
end
|
25
|
+
|
26
|
+
def depart_only
|
27
|
+
prep [tomorrow]
|
28
|
+
end
|
29
|
+
|
30
|
+
def prep(list)
|
31
|
+
list.map(&:to_s)
|
32
|
+
end
|
33
|
+
|
34
|
+
def today
|
35
|
+
@today ||= Date.today
|
36
|
+
end
|
37
|
+
|
38
|
+
def tomorrow
|
39
|
+
@tomorrow ||= today + 1
|
40
|
+
end
|
41
|
+
|
42
|
+
def vrbo_calendar
|
43
|
+
@vrbo_calendar ||= VRBO::Calendar.prepend(Stubs).new
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
$: << 'test'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'vrbo'
|
4
|
+
require 'support/calendar_dates'
|
5
|
+
|
6
|
+
class AvailabilityTest < MiniTest::Unit::TestCase
|
7
|
+
include CalendarDates
|
8
|
+
|
9
|
+
def test_new_with_params
|
10
|
+
availability = VRBO::Availability.new(all << (tomorrow + 2).to_s)
|
11
|
+
assert_equal today, availability.start_at
|
12
|
+
assert_equal 2, availability.duration
|
13
|
+
assert_nil availability.error
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_new_without_params
|
17
|
+
availability = VRBO::Availability.new
|
18
|
+
assert_equal today, availability.start_at
|
19
|
+
assert_equal 1, availability.duration
|
20
|
+
assert_includes availability.error, 'error'
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
$: << 'test'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'vrbo'
|
4
|
+
require 'support/calendar_dates'
|
5
|
+
|
6
|
+
class CalendarTest < MiniTest::Unit::TestCase
|
7
|
+
include CalendarDates
|
8
|
+
|
9
|
+
def calendar_id
|
10
|
+
212121
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_available_with_all
|
14
|
+
assert_equal true, available?(all)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_available_with_random
|
18
|
+
assert_equal true, available?(random)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_available_with_arrival
|
22
|
+
assert_equal true, available?(arrival_only)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_available_with_depart
|
26
|
+
assert_equal false, available?(depart_only)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_available_with_empty
|
30
|
+
assert_equal false, available?([])
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_available_with_edge
|
34
|
+
assert_equal true, available?(all, today, tomorrow + 1)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_available_with_exceeding
|
38
|
+
assert_equal false, available?(all, today, tomorrow + 2)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_find_all_available_dates
|
42
|
+
# 3 days taken for each month (36) + 1 day padding
|
43
|
+
assert_equal 37, vrbo_calendar.find_all_available_dates.length
|
44
|
+
assert_equal today.to_s, vrbo_calendar.available_dates.first
|
45
|
+
assert_equal (today + 365).to_s, vrbo_calendar.available_dates.last
|
46
|
+
assert_equal vrbo_calendar.days.length, 12
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_passing_calendar_id
|
50
|
+
cal = VRBO::Calendar.new(calendar_id)
|
51
|
+
assert_equal calendar_id, cal.id
|
52
|
+
assert_equal "http://www.vrbo.com/#{calendar_id}/calendar", cal.calendar_url
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_no_calendar_id_given
|
56
|
+
assert_raises ArgumentError do
|
57
|
+
VRBO::Calendar.new.calendar_url
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_calendar_id_from_config
|
62
|
+
VRBO.configure do |config|
|
63
|
+
config.calendar_id = calendar_id
|
64
|
+
end
|
65
|
+
cal = VRBO::Calendar.new
|
66
|
+
VRBO.reset_config
|
67
|
+
assert_equal calendar_id, cal.id
|
68
|
+
assert_equal "http://www.vrbo.com/#{calendar_id}/calendar", cal.calendar_url
|
69
|
+
end
|
70
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vrbo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Buckley
|
@@ -84,6 +84,9 @@ files:
|
|
84
84
|
- lib/vrbo/class_methods.rb
|
85
85
|
- lib/vrbo/configuration.rb
|
86
86
|
- lib/vrbo/version.rb
|
87
|
+
- test/support/calendar_dates.rb
|
88
|
+
- test/vrbo/availability_test.rb
|
89
|
+
- test/vrbo/calendar_test.rb
|
87
90
|
- vrbo.gemspec
|
88
91
|
homepage: ''
|
89
92
|
licenses:
|
@@ -109,4 +112,7 @@ rubygems_version: 2.1.11
|
|
109
112
|
signing_key:
|
110
113
|
specification_version: 4
|
111
114
|
summary: Scrapes a VRBO calendar using Mechanize
|
112
|
-
test_files:
|
115
|
+
test_files:
|
116
|
+
- test/support/calendar_dates.rb
|
117
|
+
- test/vrbo/availability_test.rb
|
118
|
+
- test/vrbo/calendar_test.rb
|