hostelify 0.3.7 → 0.3.8

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/Manifest CHANGED
@@ -2,29 +2,24 @@ Manifest
2
2
  README.rdoc
3
3
  Rakefile
4
4
  hostelify.gemspec
5
+ lib/hostel.rb
6
+ lib/hostel/gomio.rb
7
+ lib/hostel/hostel.rb
8
+ lib/hostel/hostel_available.rb
9
+ lib/hostel/hostelbookers.rb
10
+ lib/hostel/hostelworld.rb
5
11
  lib/hostelify.rb
6
12
  lib/hostelify/gomio.rb
13
+ lib/hostelify/hostel.rb
7
14
  lib/hostelify/hostelbookers.rb
8
15
  lib/hostelify/hostelify.rb
9
16
  lib/hostelify/hostelworld.rb
10
- pkg/hostelify-0.3.6.gem
11
- pkg/hostelify-0.3.6.tar.gz
12
- pkg/hostelify-0.3.6/Manifest
13
- pkg/hostelify-0.3.6/README.rdoc
14
- pkg/hostelify-0.3.6/Rakefile
15
- pkg/hostelify-0.3.6/hostelify.gemspec
16
- pkg/hostelify-0.3.6/lib/hostelify.rb
17
- pkg/hostelify-0.3.6/lib/hostelify/gomio.rb
18
- pkg/hostelify-0.3.6/lib/hostelify/hostelbookers.rb
19
- pkg/hostelify-0.3.6/lib/hostelify/hostelify.rb
20
- pkg/hostelify-0.3.6/lib/hostelify/hostelworld.rb
21
- pkg/hostelify-0.3.6/spec/_helper.rb
22
- pkg/hostelify-0.3.6/spec/hb_find_by_hostel.spec
23
- pkg/hostelify-0.3.6/spec/hb_find_hostels.spec
24
- pkg/hostelify-0.3.6/spec/hw_find_by_hostel.spec
25
- pkg/hostelify-0.3.6/spec/hw_find_hostels.spec
17
+ lib/hostelify/hostelworldmonkey.rb
18
+ lib/items.rb
19
+ lib/test.rb
26
20
  spec/_helper.rb
27
21
  spec/hb_find_by_hostel.spec
28
22
  spec/hb_find_hostels.spec
23
+ spec/helper.rb
29
24
  spec/hw_find_by_hostel.spec
30
25
  spec/hw_find_hostels.spec
data/Rakefile CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'rake'
3
3
  require 'echoe'
4
4
 
5
- Echoe.new('hostelify', '0.3.7') do |p|
5
+ Echoe.new('hostelify', '0.3.8') do |p|
6
6
  p.description = "Simple Hostel Webscrapper."
7
7
  p.url = "http://github.com/holden/hostelify"
8
8
  p.author = "Holden Thomas"
data/hostelify.gemspec CHANGED
@@ -2,15 +2,15 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{hostelify}
5
- s.version = "0.3.7"
5
+ s.version = "0.3.8"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Holden Thomas"]
9
- s.date = %q{2009-10-19}
9
+ s.date = %q{2010-01-26}
10
10
  s.description = %q{Simple Hostel Webscrapper.}
11
11
  s.email = %q{holden.thomas@gmail.com}
12
- s.extra_rdoc_files = ["README.rdoc", "lib/hostelify.rb", "lib/hostelify/gomio.rb", "lib/hostelify/hostelbookers.rb", "lib/hostelify/hostelify.rb", "lib/hostelify/hostelworld.rb"]
13
- s.files = ["Manifest", "README.rdoc", "Rakefile", "hostelify.gemspec", "lib/hostelify.rb", "lib/hostelify/gomio.rb", "lib/hostelify/hostelbookers.rb", "lib/hostelify/hostelify.rb", "lib/hostelify/hostelworld.rb", "pkg/hostelify-0.3.6.gem", "pkg/hostelify-0.3.6.tar.gz", "pkg/hostelify-0.3.6/Manifest", "pkg/hostelify-0.3.6/README.rdoc", "pkg/hostelify-0.3.6/Rakefile", "pkg/hostelify-0.3.6/hostelify.gemspec", "pkg/hostelify-0.3.6/lib/hostelify.rb", "pkg/hostelify-0.3.6/lib/hostelify/gomio.rb", "pkg/hostelify-0.3.6/lib/hostelify/hostelbookers.rb", "pkg/hostelify-0.3.6/lib/hostelify/hostelify.rb", "pkg/hostelify-0.3.6/lib/hostelify/hostelworld.rb", "pkg/hostelify-0.3.6/spec/_helper.rb", "pkg/hostelify-0.3.6/spec/hb_find_by_hostel.spec", "pkg/hostelify-0.3.6/spec/hb_find_hostels.spec", "pkg/hostelify-0.3.6/spec/hw_find_by_hostel.spec", "pkg/hostelify-0.3.6/spec/hw_find_hostels.spec", "spec/_helper.rb", "spec/hb_find_by_hostel.spec", "spec/hb_find_hostels.spec", "spec/hw_find_by_hostel.spec", "spec/hw_find_hostels.spec"]
12
+ s.extra_rdoc_files = ["README.rdoc", "lib/hostel.rb", "lib/hostel/gomio.rb", "lib/hostel/hostel.rb", "lib/hostel/hostel_available.rb", "lib/hostel/hostelbookers.rb", "lib/hostel/hostelworld.rb", "lib/hostelify.rb", "lib/hostelify/gomio.rb", "lib/hostelify/hostel.rb", "lib/hostelify/hostelbookers.rb", "lib/hostelify/hostelify.rb", "lib/hostelify/hostelworld.rb", "lib/hostelify/hostelworldmonkey.rb", "lib/items.rb", "lib/test.rb"]
13
+ s.files = ["Manifest", "README.rdoc", "Rakefile", "hostelify.gemspec", "lib/hostel.rb", "lib/hostel/gomio.rb", "lib/hostel/hostel.rb", "lib/hostel/hostel_available.rb", "lib/hostel/hostelbookers.rb", "lib/hostel/hostelworld.rb", "lib/hostelify.rb", "lib/hostelify/gomio.rb", "lib/hostelify/hostel.rb", "lib/hostelify/hostelbookers.rb", "lib/hostelify/hostelify.rb", "lib/hostelify/hostelworld.rb", "lib/hostelify/hostelworldmonkey.rb", "lib/items.rb", "lib/test.rb", "spec/_helper.rb", "spec/hb_find_by_hostel.spec", "spec/hb_find_hostels.spec", "spec/helper.rb", "spec/hw_find_by_hostel.spec", "spec/hw_find_hostels.spec"]
14
14
  s.homepage = %q{http://github.com/holden/hostelify}
15
15
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Hostelify", "--main", "README.rdoc"]
16
16
  s.require_paths = ["lib"]
@@ -0,0 +1,11 @@
1
+ class HostelAvailable
2
+ attr_accessor :name, :price, :spots, :bookdate
3
+
4
+ def initialize(name, price, spots, bookdate)
5
+ @name = name
6
+ @price = price
7
+ @spots = spots
8
+ @bookdate = bookdate
9
+ end
10
+
11
+ end
@@ -8,9 +8,9 @@ class Hostelbookers
8
8
  @default_options = { :date => date=(Date.today+4).to_s, :no_days => "7", :live => true }
9
9
 
10
10
  def self.find_hostels_by_location(options) #location
11
- city = options[:location].split(',').first.rstrip.lstrip.gsub(' ','-').squeeze("-")
12
- country = options[:location].split(',').last.rstrip.lstrip.gsub(' ','-').squeeze("-")
13
-
11
+
12
+ city = options[:location].split(',').first.gsub(' ','')
13
+ country = options[:location].split(',').last.gsub(' ','')
14
14
  url = HB_PLURAL_HOSTELS_URL + "#{country}/#{city}"
15
15
 
16
16
  if options[:date]
@@ -0,0 +1,205 @@
1
+ class Hostelworld
2
+
3
+ #constants
4
+ #location list includes/indexjs.js
5
+ HW_SINGULAR_DETAIL_URL = "http://www.hostelworld.com/hosteldetails.php?HostelNumber="
6
+ HW_SINGULAR_IMAGE_URL = "http://www.hostelworld.com/hostelpictures.php?HostelNumber="
7
+ HW_SINGULAR_AVAILABILITY = "http://www.hostelworld.com/availability.php/"
8
+ HW_SINGULAR_YOUTUBE_URL = "http://www.hostelworld.com/youtubevideo.php?HostelNumber="
9
+ HW_PLURAL_HOSTELS_URL = "http://www.hostelworld.com/findabed.php/"
10
+
11
+ #options
12
+ @default_options = { :date => date=(Date.today+4).to_s, :no_days => "7", :no_ppl => "2" }
13
+
14
+ def self.parse_html(url)
15
+ f = open(url)
16
+ f.rewind
17
+ Retryable.try 3 do
18
+ data = Hpricot(Iconv.conv('utf-8', f.charset, f.readlines.join("\n")))
19
+ end
20
+ end
21
+
22
+ def self.find_hostel_by_id(options)
23
+ opts = { :directions => false, :images => false, :all => false }.merge options
24
+ id = options[:id].to_s
25
+ url = HW_SINGULAR_DETAIL_URL + id
26
+
27
+ #coder = HTMLEntities.new
28
+ hostel = Hostelify.new
29
+ hostel.hostel_id = id
30
+
31
+ if options[:date]
32
+ options = @default_options.merge(options)
33
+ date = Date.strptime(options[:date])
34
+ data = setSearch(url, options[:date], options[:no_ppl], options[:no_days])
35
+ else
36
+ data = parse_html(url)
37
+ end
38
+
39
+ data = data.search("//div[@id='content']")
40
+ data.search("h3").remove #get rid of header
41
+
42
+ #title, address, desc, facilities, ratings
43
+ hostel.name = data.at("h2").inner_text.gsub(/( in ).*$/,'')
44
+ hostel.address = data.at('div[@style="padding-top: 5px"]').inner_text.lstrip
45
+
46
+ if options[:date]
47
+ hostel.availability = parse_availables(data)
48
+ else
49
+ hostel.description = data.at('div[@id="microDescription2]').inner_text
50
+ end
51
+
52
+ #optional
53
+ no_photos = data.at('span/a[@id="picLink"]').inner_text.to_i
54
+ video = data.at('div[@id="microVideo"]')
55
+
56
+ facilities = []
57
+ (data/"li.microFacilitiesBoomLi").each do |item|
58
+ facilities << item.inner_text
59
+ end
60
+
61
+ ratings = []
62
+ (data/'div[@id="ratingsBar2"]').each do |item|
63
+ ratings << item.inner_text.to_i
64
+ end
65
+
66
+ hostel.facilities = facilities
67
+ hostel.ratings = ratings
68
+
69
+ if video #exists
70
+ data = parse_html(HW_SINGULAR_YOUTUBE_URL + id)
71
+ video_url = data.at('param[@name="movie"]')['value']
72
+ hostel.video = video_url
73
+ #video_url = data.at('tag')
74
+ end
75
+
76
+ if options[:directions] or options[:all]
77
+ data = parse_html(HW_SINGULAR_DETAIL_URL + id + "/directions/")
78
+
79
+ #directions, geo
80
+ hostel.directions = data.at('div[@id="content"]').inner_text.gsub(/^[\d\D\n]*(DIRECTIONS)/,'')
81
+ hostel.geo = data.to_s.scan(/-{0,1}\d{1,3}\.\d{7}/).uniq!
82
+ end
83
+
84
+ if no_photos and (options[:images] or options[:all])
85
+ images = []
86
+ (1..no_photos).each do |i|
87
+ data = parse_html(HW_SINGULAR_IMAGE_URL + id + '&PicNO=' + i.to_s)
88
+ images << (data/"img").first[:src].to_s
89
+ end
90
+ hostel.images = images
91
+ end
92
+ hostel # return
93
+ end
94
+
95
+ def self.find_hostels_by_location(options) #location
96
+
97
+ city = options[:location].split(',').first.gsub(' ','')
98
+ country = options[:location].split(',').last.gsub(' ','')
99
+ url = HW_PLURAL_HOSTELS_URL + "ChosenCity.#{city}/ChosenCountry.#{country}"
100
+
101
+ if options[:date]
102
+ options = @default_options.merge(options)
103
+ date = Date.strptime(options[:date])
104
+ data = setSearch(url, options[:date], options[:no_ppl], options[:no_days])
105
+ else
106
+ data = parse_html(url)
107
+ end
108
+
109
+ data = data.search("//div[@id='content']")
110
+ @results = HostelifyCollection.new
111
+
112
+ (data/"div.hostelListing").each do |row|
113
+ name = row.at("h3").inner_text
114
+ desc = row.at("div.hostelEntry/p").inner_text.to_s.chop.gsub('more info','').squeeze('.')
115
+ url = row.at("h3/a")['href']
116
+ rating = row.at("h4/text()")
117
+ rating = rating.to_s.to_i unless rating.nil?
118
+ type = row.at("div.hostelListingImage/span").inner_text
119
+ hostel_id = url.match(/[\d]*$/).to_s
120
+
121
+ if options[:date]
122
+ #price_USD = row.at("span.blueBeds").inner_text #need to fix float
123
+ dorm = (row.at("p.hostelListingRate/span.blueBeds/text()")).to_s.gsub(/[A-Z$]*/,'')
124
+ single = row.at("p.hostelListingPrivateRate/span.blueBeds/text()").to_s.gsub(/[A-Z$]*/,'')
125
+ available = row/"ul.hostelListingDates/li.noAvail/text()"
126
+ available = available.to_a.join(',').split(',')
127
+ @results << Hostelify.new(:hostel_id => hostel_id, :name => name, :description => desc, :rating => rating, :dorm => dorm, :single => single, :unavailable => available)
128
+ else
129
+ @results << Hostelify.new(:hostel_id => hostel_id, :name => name, :description => desc, :rating => rating)
130
+ end
131
+ end
132
+ return @results
133
+ end
134
+
135
+ private
136
+
137
+ def self.setSearch(url,date,no_ppl,no_days)
138
+
139
+ date = Date.strptime(date)
140
+ month = date.strftime("%m").to_i
141
+ day = date.strftime("%d").to_i
142
+ if Time.now.strftime("%y") == date.strftime("%y") then year = 0 else year = 1 end
143
+
144
+ agent = WWW::Mechanize.new
145
+ page = agent.get(url)
146
+
147
+ #the form name
148
+ form = page.forms.first # => WWW::Mechanize::Form
149
+
150
+ Retryable.try 3 do
151
+ page = agent.submit(form)
152
+ end
153
+
154
+ #form must be submitted twice because the people writing hostelworld are retards
155
+ form = page.forms.first # => WWW::Mechanize::Form
156
+ form.field_with(:name => 'selMonth').options[month-1].select
157
+ form.field_with(:name => 'selDay').options[day-1].select
158
+ form.field_with(:name => 'selYear').options[year].select
159
+ form.field_with(:name => 'NumNights').options[no_days.to_i-1].select
160
+ form.field_with(:name => 'Persons').options[no_ppl.to_i-1].select
161
+ form.field_with(:name => 'Currency').options[4].select #US Currency
162
+
163
+ Retryable.try 3 do
164
+ page = agent.submit(form)
165
+ end
166
+
167
+ data = page.search("//div[@id='content']")
168
+
169
+ return data
170
+ end
171
+
172
+ def self.parse_availables(info)
173
+
174
+ availability = info.at('table[@id="tableDatesSelected2"]')
175
+ availability.search("div").remove
176
+
177
+ availables = []
178
+
179
+ (availability/"tr").each do |row|
180
+ name = (row/"td").first
181
+ name = name.inner_text unless name.nil?
182
+
183
+ (row/"td").each do |td|
184
+ night = td.attributes['title']
185
+ if night
186
+ price = night.to_s.match(/([\d]{1,3}).([\d]{2})/).to_s
187
+ available = night.to_s.match(/(available: )([\d]*)/)
188
+ date = night.to_s.match(/(Date: ).*$/).to_s.gsub(/(Date: )|(th)|(nd)|(rd)|(st)/,'')
189
+ date = Date.strptime(date, "%a %d %b '%y")
190
+
191
+ if available
192
+ beds = available.to_s.match(/[\d]{1,2}/)[0]
193
+ availables << HostelifyAvailable.new(name,price,beds,date)
194
+ else
195
+ availables << HostelifyAvailable.new(name,price,0,date)
196
+ end
197
+ end
198
+ end
199
+ end
200
+ return availables
201
+
202
+ end
203
+
204
+
205
+ end
@@ -5,6 +5,6 @@ require 'open-uri'
5
5
  require 'date'
6
6
  require 'htmlentities'
7
7
  require 'iconv'
8
- require 'hostelify/hostelify'
9
- require 'hostelify/hostelworld'
10
- require 'hostelify/hostelbookers'
8
+ require 'hostel/hostel'
9
+ require 'hostel/hostelworld'
10
+ require 'hostel/hostelbookers'
@@ -0,0 +1,61 @@
1
+ class Hostelify
2
+ attr_accessor :hostel_id, :name, :address, :description, :facilities, :ratings, :directions, :geo, :images, :video, :availability
3
+ attr_accessor :rating, :dorm, :single, :unavailable
4
+
5
+ def initialize(options = {})
6
+ options.each {
7
+ |k,v|
8
+ self.send( "#{k.to_s}=".intern, v)
9
+ }
10
+ end
11
+
12
+ end
13
+
14
+ class HostelifyCollection < Array
15
+ # This collection does everything an Array does, plus
16
+ # you can add utility methods like names.
17
+
18
+ def ids
19
+ collect do |i|
20
+ i.hostel_id
21
+ end
22
+ end
23
+
24
+ def names
25
+ collect do |i|
26
+ i.name
27
+ end
28
+ end
29
+
30
+ def descs
31
+ collect do |i|
32
+ i.description
33
+ end
34
+ end
35
+
36
+ end
37
+
38
+ class HostelifyAvailable
39
+ attr_accessor :name, :price, :spots, :bookdate
40
+
41
+ def initialize(name, price, spots, bookdate)
42
+ @name = name
43
+ @price = price
44
+ @spots = spots
45
+ @bookdate = bookdate
46
+ end
47
+
48
+ end
49
+
50
+ module Retryable
51
+ extend self
52
+
53
+ def try times = 1, options = {}, &block
54
+ val = yield
55
+ rescue options[:on] || Exception
56
+ retry if (times -= 1) > 0
57
+ else
58
+ val
59
+ end
60
+ end
61
+
@@ -127,9 +127,9 @@ class Hostelworld
127
127
  @results = HostelifyCollection.new
128
128
 
129
129
  (data/"div.hostelListing").each do |row|
130
- name = row.at("h3").inner_text
130
+ name = row.at("h2").inner_text
131
131
  desc = row.at("div.hostelEntry/p").inner_text.to_s.chop.gsub('more info','').squeeze('.')
132
- url = row.at("h3/a")['href']
132
+ url = row.at("h2/a")['href']
133
133
  rating = row.at("h4/text()")
134
134
  rating = rating.to_s.to_i unless rating.nil?
135
135
  type = row.at("div.hostelListingImage/span").inner_text
@@ -0,0 +1,205 @@
1
+ class Hostelworldmonkey
2
+
3
+ #constants
4
+ #location list includes/indexjs.js
5
+ HW_SINGULAR_DETAIL_URL = "http://www.hostelworld.com/hosteldetails.php?HostelNumber="
6
+ HW_SINGULAR_IMAGE_URL = "http://www.hostelworld.com/hostelpictures.php?HostelNumber="
7
+ HW_SINGULAR_AVAILABILITY = "http://www.hostelworld.com/availability.php/"
8
+ HW_SINGULAR_YOUTUBE_URL = "http://www.hostelworld.com/youtubevideo.php?HostelNumber="
9
+ HW_PLURAL_HOSTELS_URL = "http://www.hostelworld.com/findabed.php/"
10
+
11
+ #options
12
+ @default_options = { :date => date=(Date.today+4).to_s, :no_days => "7", :no_ppl => "2" }
13
+
14
+ def self.parse_html(url)
15
+ f = open(url)
16
+ f.rewind
17
+ Retryable.try 3 do
18
+ data = Hpricot(Iconv.conv('utf-8', f.charset, f.readlines.join("\n")))
19
+ end
20
+ end
21
+
22
+ def self.find_hostel_by_id(options)
23
+ opts = { :directions => false, :images => false, :all => false }.merge options
24
+ id = options[:id].to_s
25
+ url = HW_SINGULAR_DETAIL_URL + id
26
+
27
+ #coder = HTMLEntities.new
28
+ hostel = Hostelify.new
29
+ hostel.hostel_id = id
30
+
31
+ if options[:date]
32
+ options = @default_options.merge(options)
33
+ date = Date.strptime(options[:date])
34
+ data = setSearch(url, options[:date], options[:no_ppl], options[:no_days])
35
+ else
36
+ data = parse_html(url)
37
+ end
38
+
39
+ data = data.search("//div[@id='content']")
40
+ data.search("h3").remove #get rid of header
41
+
42
+ #title, address, desc, facilities, ratings
43
+ hostel.name = data.at("h2").inner_text.gsub(/( in ).*$/,'')
44
+ hostel.address = data.at('div[@style="padding-top: 5px"]').inner_text.lstrip
45
+
46
+ if options[:date]
47
+ hostel.availability = parse_availables(data)
48
+ else
49
+ hostel.description = data.at('div[@id="microDescription2]').inner_text
50
+ end
51
+
52
+ #optional
53
+ no_photos = data.at('span/a[@id="picLink"]').inner_text.to_i
54
+ video = data.at('div[@id="microVideo"]')
55
+
56
+ facilities = []
57
+ (data/"li.microFacilitiesBoomLi").each do |item|
58
+ facilities << item.inner_text
59
+ end
60
+
61
+ ratings = []
62
+ (data/'div[@id="ratingsBar2"]').each do |item|
63
+ ratings << item.inner_text.to_i
64
+ end
65
+
66
+ hostel.facilities = facilities
67
+ hostel.ratings = ratings
68
+
69
+ if video #exists
70
+ data = parse_html(HW_SINGULAR_YOUTUBE_URL + id)
71
+ video_url = data.at('param[@name="movie"]')['value']
72
+ hostel.video = video_url
73
+ #video_url = data.at('tag')
74
+ end
75
+
76
+ if options[:directions] or options[:all]
77
+ data = parse_html(HW_SINGULAR_DETAIL_URL + id + "/directions/")
78
+
79
+ #directions, geo
80
+ hostel.directions = data.at('div[@id="content"]').inner_text.gsub(/^[\d\D\n]*(DIRECTIONS)/,'')
81
+ hostel.geo = data.to_s.scan(/-{0,1}\d{1,3}\.\d{7}/).uniq!
82
+ end
83
+
84
+ if no_photos and (options[:images] or options[:all])
85
+ images = []
86
+ (1..no_photos).each do |i|
87
+ data = parse_html(HW_SINGULAR_IMAGE_URL + id + '&PicNO=' + i.to_s)
88
+ images << (data/"img").first[:src].to_s
89
+ end
90
+ hostel.images = images
91
+ end
92
+ hostel # return
93
+ end
94
+
95
+ def self.find_hostels_by_location(options) #location
96
+
97
+ city = options[:location].split(',').first.gsub(' ','')
98
+ country = options[:location].split(',').last.gsub(' ','')
99
+ url = HW_PLURAL_HOSTELS_URL + "ChosenCity.#{city}/ChosenCountry.#{country}"
100
+
101
+ if options[:date]
102
+ options = @default_options.merge(options)
103
+ date = Date.strptime(options[:date])
104
+ data = setSearch(url, options[:date], options[:no_ppl], options[:no_days])
105
+ else
106
+ data = parse_html(url)
107
+ end
108
+
109
+ data = data.search("//div[@id='content']")
110
+ @results = HostelifyCollection.new
111
+
112
+ (data/"div.hostelListing").each do |row|
113
+ name = row.at("h3").inner_text
114
+ desc = row.at("div.hostelEntry/p").inner_text.to_s.chop.gsub('more info','').squeeze('.')
115
+ url = row.at("h3/a")['href']
116
+ rating = row.at("h4/text()")
117
+ rating = rating.to_s.to_i unless rating.nil?
118
+ type = row.at("div.hostelListingImage/span").inner_text
119
+ hostel_id = url.match(/[\d]*$/).to_s
120
+
121
+ if options[:date]
122
+ #price_USD = row.at("span.blueBeds").inner_text #need to fix float
123
+ dorm = (row.at("p.hostelListingRate/span.blueBeds/text()")).to_s.gsub(/[A-Z$]*/,'')
124
+ single = row.at("p.hostelListingPrivateRate/span.blueBeds/text()").to_s.gsub(/[A-Z$]*/,'')
125
+ available = row/"ul.hostelListingDates/li.noAvail/text()"
126
+ available = available.to_a.join(',').split(',')
127
+ @results << Hostelify.new(:hostel_id => hostel_id, :name => name, :description => desc, :rating => rating, :dorm => dorm, :single => single, :unavailable => available)
128
+ else
129
+ @results << Hostelify.new(:hostel_id => hostel_id, :name => name, :description => desc, :rating => rating)
130
+ end
131
+ end
132
+ return @results
133
+ end
134
+
135
+ private
136
+
137
+ def self.setSearch(url,date,no_ppl,no_days)
138
+
139
+ date = Date.strptime(date)
140
+ month = date.strftime("%m").to_i
141
+ day = date.strftime("%d").to_i
142
+ if Time.now.strftime("%y") == date.strftime("%y") then year = 0 else year = 1 end
143
+
144
+ agent = WWW::Mechanize.new
145
+ page = agent.get(url)
146
+
147
+ #the form name
148
+ form = page.forms.first # => WWW::Mechanize::Form
149
+
150
+ Retryable.try 3 do
151
+ page = agent.submit(form)
152
+ end
153
+
154
+ #form must be submitted twice because the people writing hostelworld are retards
155
+ form = page.forms.first # => WWW::Mechanize::Form
156
+ form.field_with(:name => 'selMonth').options[month-1].select
157
+ form.field_with(:name => 'selDay').options[day-1].select
158
+ form.field_with(:name => 'selYear').options[year].select
159
+ form.field_with(:name => 'NumNights').options[no_days.to_i-1].select
160
+ form.field_with(:name => 'Persons').options[no_ppl.to_i-1].select
161
+ form.field_with(:name => 'Currency').options[4].select #US Currency
162
+
163
+ Retryable.try 3 do
164
+ page = agent.submit(form)
165
+ end
166
+
167
+ data = page.search("//div[@id='content']")
168
+
169
+ return data
170
+ end
171
+
172
+ def self.parse_availables(info)
173
+
174
+ availability = info.at('table[@id="tableDatesSelected2"]')
175
+ availability.search("div").remove
176
+
177
+ availables = []
178
+
179
+ (availability/"tr").each do |row|
180
+ name = (row/"td").first
181
+ name = name.inner_text unless name.nil?
182
+
183
+ (row/"td").each do |td|
184
+ night = td.attributes['title']
185
+ if night
186
+ price = night.to_s.match(/([\d]{1,3}).([\d]{2})/).to_s
187
+ available = night.to_s.match(/(available: )([\d]*)/)
188
+ date = night.to_s.match(/(Date: ).*$/).to_s.gsub(/(Date: )|(th)|(nd)|(rd)|(st)/,'')
189
+ date = Date.strptime(date, "%a %d %b '%y")
190
+
191
+ if available
192
+ beds = available.to_s.match(/[\d]{1,2}/)[0]
193
+ availables << HostelifyAvailable.new(name,price,beds,date)
194
+ else
195
+ availables << HostelifyAvailable.new(name,price,0,date)
196
+ end
197
+ end
198
+ end
199
+ end
200
+ return availables
201
+
202
+ end
203
+
204
+
205
+ end
data/lib/items.rb ADDED
@@ -0,0 +1,23 @@
1
+ class Items
2
+ @items = []
3
+ class << self
4
+ attr_accessor :items
5
+ end
6
+ attr_accessor :name, :description
7
+ #def self.each(&args)
8
+ # @items.each(&args)
9
+ #end
10
+ def initialize(name, description)
11
+ @name, @description = name, description
12
+ Items.items << self
13
+ end
14
+ def each(&block)
15
+ yield name
16
+ yield description
17
+ end
18
+
19
+ def self.names
20
+ puts "hello"
21
+ end
22
+
23
+ end
data/lib/test.rb ADDED
@@ -0,0 +1,5 @@
1
+ require 'hostel'
2
+
3
+ c=Hostelbookers.find_hostels_by_location(:location => "paris,france")
4
+
5
+ puts c.last[:desc]
@@ -1,4 +1,7 @@
1
+ require 'rubygems'
2
+ require 'spec'
3
+
1
4
  $LOAD_PATH.unshift(File.dirname(__FILE__))
2
5
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
6
 
4
- require 'hostelify'
7
+ require 'hostel'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hostelify
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.7
4
+ version: 0.3.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Holden Thomas
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-19 00:00:00 +02:00
12
+ date: 2010-01-26 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -21,40 +21,45 @@ extensions: []
21
21
 
22
22
  extra_rdoc_files:
23
23
  - README.rdoc
24
+ - lib/hostel.rb
25
+ - lib/hostel/gomio.rb
26
+ - lib/hostel/hostel.rb
27
+ - lib/hostel/hostel_available.rb
28
+ - lib/hostel/hostelbookers.rb
29
+ - lib/hostel/hostelworld.rb
24
30
  - lib/hostelify.rb
25
31
  - lib/hostelify/gomio.rb
32
+ - lib/hostelify/hostel.rb
26
33
  - lib/hostelify/hostelbookers.rb
27
34
  - lib/hostelify/hostelify.rb
28
35
  - lib/hostelify/hostelworld.rb
36
+ - lib/hostelify/hostelworldmonkey.rb
37
+ - lib/items.rb
38
+ - lib/test.rb
29
39
  files:
30
40
  - Manifest
31
41
  - README.rdoc
32
42
  - Rakefile
33
43
  - hostelify.gemspec
44
+ - lib/hostel.rb
45
+ - lib/hostel/gomio.rb
46
+ - lib/hostel/hostel.rb
47
+ - lib/hostel/hostel_available.rb
48
+ - lib/hostel/hostelbookers.rb
49
+ - lib/hostel/hostelworld.rb
34
50
  - lib/hostelify.rb
35
51
  - lib/hostelify/gomio.rb
52
+ - lib/hostelify/hostel.rb
36
53
  - lib/hostelify/hostelbookers.rb
37
54
  - lib/hostelify/hostelify.rb
38
55
  - lib/hostelify/hostelworld.rb
39
- - pkg/hostelify-0.3.6.gem
40
- - pkg/hostelify-0.3.6.tar.gz
41
- - pkg/hostelify-0.3.6/Manifest
42
- - pkg/hostelify-0.3.6/README.rdoc
43
- - pkg/hostelify-0.3.6/Rakefile
44
- - pkg/hostelify-0.3.6/hostelify.gemspec
45
- - pkg/hostelify-0.3.6/lib/hostelify.rb
46
- - pkg/hostelify-0.3.6/lib/hostelify/gomio.rb
47
- - pkg/hostelify-0.3.6/lib/hostelify/hostelbookers.rb
48
- - pkg/hostelify-0.3.6/lib/hostelify/hostelify.rb
49
- - pkg/hostelify-0.3.6/lib/hostelify/hostelworld.rb
50
- - pkg/hostelify-0.3.6/spec/_helper.rb
51
- - pkg/hostelify-0.3.6/spec/hb_find_by_hostel.spec
52
- - pkg/hostelify-0.3.6/spec/hb_find_hostels.spec
53
- - pkg/hostelify-0.3.6/spec/hw_find_by_hostel.spec
54
- - pkg/hostelify-0.3.6/spec/hw_find_hostels.spec
56
+ - lib/hostelify/hostelworldmonkey.rb
57
+ - lib/items.rb
58
+ - lib/test.rb
55
59
  - spec/_helper.rb
56
60
  - spec/hb_find_by_hostel.spec
57
61
  - spec/hb_find_hostels.spec
62
+ - spec/helper.rb
58
63
  - spec/hw_find_by_hostel.spec
59
64
  - spec/hw_find_hostels.spec
60
65
  has_rdoc: true
@@ -1,30 +0,0 @@
1
- Manifest
2
- README.rdoc
3
- Rakefile
4
- hostelify.gemspec
5
- lib/hostelify.rb
6
- lib/hostelify/gomio.rb
7
- lib/hostelify/hostelbookers.rb
8
- lib/hostelify/hostelify.rb
9
- lib/hostelify/hostelworld.rb
10
- pkg/hostelify-0.3.6.gem
11
- pkg/hostelify-0.3.6.tar.gz
12
- pkg/hostelify-0.3.6/Manifest
13
- pkg/hostelify-0.3.6/README.rdoc
14
- pkg/hostelify-0.3.6/Rakefile
15
- pkg/hostelify-0.3.6/hostelify.gemspec
16
- pkg/hostelify-0.3.6/lib/hostelify.rb
17
- pkg/hostelify-0.3.6/lib/hostelify/gomio.rb
18
- pkg/hostelify-0.3.6/lib/hostelify/hostelbookers.rb
19
- pkg/hostelify-0.3.6/lib/hostelify/hostelify.rb
20
- pkg/hostelify-0.3.6/lib/hostelify/hostelworld.rb
21
- pkg/hostelify-0.3.6/spec/_helper.rb
22
- pkg/hostelify-0.3.6/spec/hb_find_by_hostel.spec
23
- pkg/hostelify-0.3.6/spec/hb_find_hostels.spec
24
- pkg/hostelify-0.3.6/spec/hw_find_by_hostel.spec
25
- pkg/hostelify-0.3.6/spec/hw_find_hostels.spec
26
- spec/_helper.rb
27
- spec/hb_find_by_hostel.spec
28
- spec/hb_find_hostels.spec
29
- spec/hw_find_by_hostel.spec
30
- spec/hw_find_hostels.spec
@@ -1 +0,0 @@
1
- Nothin yet... still...
@@ -1,14 +0,0 @@
1
- require 'rubygems'
2
- require 'rake'
3
- require 'echoe'
4
-
5
- Echoe.new('hostelify', '0.3.7') do |p|
6
- p.description = "Simple Hostel Webscrapper."
7
- p.url = "http://github.com/holden/hostelify"
8
- p.author = "Holden Thomas"
9
- p.email = "holden.thomas@gmail.com"
10
- p.ignore_pattern = ["tmp/*", "script/*"]
11
- p.development_dependencies = []
12
- end
13
-
14
- Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
@@ -1,31 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- Gem::Specification.new do |s|
4
- s.name = %q{hostelify}
5
- s.version = "0.3.6"
6
-
7
- s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
- s.authors = ["Holden Thomas"]
9
- s.date = %q{2009-09-23}
10
- s.description = %q{Simple Hostel Webscrapper.}
11
- s.email = %q{holden.thomas@gmail.com}
12
- s.extra_rdoc_files = ["README.rdoc", "lib/hostelify.rb", "lib/hostelify/gomio.rb", "lib/hostelify/hostelbookers.rb", "lib/hostelify/hostelify.rb", "lib/hostelify/hostelworld.rb"]
13
- s.files = ["Manifest", "README.rdoc", "Rakefile", "hostelify.gemspec", "lib/hostelify.rb", "lib/hostelify/gomio.rb", "lib/hostelify/hostelbookers.rb", "lib/hostelify/hostelify.rb", "lib/hostelify/hostelworld.rb", "spec/_helper.rb", "spec/hb_find_by_hostel.spec", "spec/hb_find_hostels.spec", "spec/hw_find_by_hostel.spec", "spec/hw_find_hostels.spec"]
14
- s.has_rdoc = true
15
- s.homepage = %q{http://github.com/holden/hostelify}
16
- s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Hostelify", "--main", "README.rdoc"]
17
- s.require_paths = ["lib"]
18
- s.rubyforge_project = %q{hostelify}
19
- s.rubygems_version = %q{1.3.1}
20
- s.summary = %q{Simple Hostel Webscrapper.}
21
-
22
- if s.respond_to? :specification_version then
23
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
24
- s.specification_version = 2
25
-
26
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
27
- else
28
- end
29
- else
30
- end
31
- end
@@ -1,265 +0,0 @@
1
- class Hostelworld
2
-
3
- #constants
4
- #location list includes/indexjs.js
5
- HW_SINGULAR_DETAIL_URL = "http://www.hostelworld.com/hosteldetails.php?HostelNumber="
6
- HW_SINGULAR_IMAGE_URL = "http://www.hostelworld.com/hostelpictures.php?HostelNumber="
7
- HW_SINGULAR_AVAILABILITY = "http://www.hostelworld.com/availability.php/"
8
- HW_SINGULAR_YOUTUBE_URL = "http://www.hostelworld.com/youtubevideo.php?HostelNumber="
9
- HW_PLURAL_HOSTELS_URL = "http://www.hostelworld.com/findabed.php/"
10
-
11
- #options
12
- @default_options = { :date => date=(Date.today+4).to_s, :no_days => "7", :no_ppl => "2" }
13
-
14
- def self.parse_html(url)
15
- f = open(url)
16
- f.rewind
17
- Retryable.try 3 do
18
- data = Hpricot(Iconv.conv('utf-8', f.charset, f.readlines.join("\n")))
19
- end
20
- end
21
-
22
- def self.find_hostel_by_id(options)
23
- opts = { :directions => false, :images => false, :all => false }.merge options
24
- id = options[:id].to_s
25
- url = HW_SINGULAR_DETAIL_URL + id
26
-
27
- #coder = HTMLEntities.new
28
- hostel = Hostelify.new
29
- hostel.hostel_id = id
30
-
31
- if options[:date]
32
- options = @default_options.merge(options)
33
- date = Date.strptime(options[:date])
34
- data = setSearch(url, options[:date], options[:no_ppl], options[:no_days])
35
- else
36
- data = parse_html(url)
37
- end
38
-
39
- unless data == "Full"
40
- data = data.search("//div[@id='content']")
41
- data.search("h3").remove #get rid of header
42
-
43
- #title, address, desc, facilities, ratings
44
- hostel.name = data.at("h2").inner_text.gsub(/( in ).*$/,'')
45
- hostel.address = data.at('div[@style="padding-top: 5px"]').inner_text.lstrip
46
-
47
- if options[:date]
48
- hostel.availability = parse_availables(data)
49
- else
50
- hostel.description = data.at('div[@id="microDescription2]').inner_text
51
- end
52
-
53
- #optional
54
- no_photos = data.at('div[@id="microPicScroll"]/span/a').inner_text.to_i
55
- #no_photos = data.at('span/a[@id="picLink"]').inner_text.to_i
56
- video = data.at('div[@id="microVideo"]')
57
-
58
- #facilities = []
59
- #(data/"li.microFacilitiesBoomLi").each do |item|
60
- # facilities << item.inner_text
61
- #end
62
-
63
- facilities = []
64
- index_count = 1
65
- (data/"ul.microFacilitiesBoomUl/li").each_with_index do |item,index|
66
- if item.attributes['class'] == "microFacilitiesBoomLiInner"
67
- facilities << "#{facilities[index-index_count]}: " + item.inner_text
68
- index_count += 1
69
- else
70
- index_count = 1
71
- facilities << item.inner_text
72
- end
73
- end
74
-
75
- ratings = []
76
- (data/'div[@id="ratingsBar2"]').each do |item|
77
- ratings << item.inner_text.to_i
78
- end
79
-
80
- hostel.facilities = facilities
81
- hostel.ratings = ratings
82
-
83
- if video #exists
84
- data = parse_html(HW_SINGULAR_YOUTUBE_URL + id)
85
- video_url = data.at('param[@name="movie"]')['value']
86
- hostel.video = video_url
87
- #video_url = data.at('tag')
88
- end
89
-
90
- if options[:directions] or options[:all]
91
- data = parse_html(HW_SINGULAR_DETAIL_URL + id + "/directions/")
92
-
93
- #directions, geo
94
- hostel.directions = data.at('div[@id="content"]').inner_text.gsub(/^[\d\D\n]*(DIRECTIONS)/,'')
95
- hostel.geo = data.to_s.scan(/-{0,1}\d{1,3}\.\d{7}/).uniq!
96
- end
97
-
98
- if no_photos and (options[:images] or options[:all])
99
- images = []
100
- (1..no_photos).each do |i|
101
- data = parse_html(HW_SINGULAR_IMAGE_URL + id + '&PicNO=' + i.to_s)
102
- images << (data/"img").first[:src].to_s
103
- end
104
- hostel.images = images
105
- end
106
- else
107
- hostel = nil
108
- end
109
- hostel # return
110
- end
111
-
112
- def self.find_hostels_by_location(options) #location
113
-
114
- city = options[:location].split(',').first.gsub(' ','')
115
- country = options[:location].split(',').last.gsub(' ','')
116
- url = HW_PLURAL_HOSTELS_URL + "ChosenCity.#{city}/ChosenCountry.#{country}"
117
-
118
- if options[:date]
119
- options = @default_options.merge(options)
120
- date = Date.strptime(options[:date])
121
- data = setSearch2(url, options[:date], options[:no_ppl], options[:no_days])
122
- else
123
- data = parse_html(url)
124
- end
125
-
126
- data = data.search("//div[@id='content']")
127
- @results = HostelifyCollection.new
128
-
129
- (data/"div.hostelListing").each do |row|
130
- name = row.at("h3").inner_text
131
- desc = row.at("div.hostelEntry/p").inner_text.to_s.chop.gsub('more info','').squeeze('.')
132
- url = row.at("h3/a")['href']
133
- rating = row.at("h4/text()")
134
- rating = rating.to_s.to_i unless rating.nil?
135
- type = row.at("div.hostelListingImage/span").inner_text
136
- hostel_id = url.match(/[\d]*$/).to_s
137
-
138
- if options[:date]
139
- #price_USD = row.at("span.blueBeds").inner_text #need to fix float
140
- dorm = (row.at("p.hostelListingRate/span.blueBeds/text()")).to_s.gsub(/[A-Z$]*/,'')
141
- single = row.at("p.hostelListingPrivateRate/span.blueBeds/text()").to_s.gsub(/[A-Z$]*/,'')
142
- available = row/"ul.hostelListingDates/li.noAvail/text()"
143
- available = available.to_a.join(',').split(',')
144
- @results << Hostelify.new(:hostel_id => hostel_id, :name => name, :description => desc, :rating => rating, :dorm => dorm, :single => single, :unavailable => available)
145
- else
146
- @results << Hostelify.new(:hostel_id => hostel_id, :name => name, :description => desc, :rating => rating)
147
- end
148
- end
149
- return @results
150
- end
151
-
152
- private
153
-
154
- def self.setSearch(url,date,no_ppl,no_days)
155
-
156
- date = Date.strptime(date)
157
- month = date.strftime("%m").to_i
158
- day = date.strftime("%d").to_i
159
- if Time.now.strftime("%y") == date.strftime("%y") then year = 0 else year = 1 end
160
-
161
- agent = WWW::Mechanize.new
162
- page = agent.get(url)
163
-
164
- #the form name
165
- #form = page.forms.first # => WWW::Mechanize::Form
166
- form = page.form_with(:name => 'theForm')
167
-
168
- #page = agent.submit(form)
169
-
170
- #form must be submitted twice because the people writing hostelworld are retards
171
- #form = page.forms.first # => WWW::Mechanize::Form
172
- #form = page.form_with(:name => 'theForm')
173
- form.field_with(:name => 'selMonth2').options[month-1].select
174
- form.field_with(:name => 'selDay2').options[day-1].select
175
- form.field_with(:name => 'selYear2').options[year].select
176
- #form.field_with(:name => { 0 => 'NumNights' }).options[no_days.to_i-1].select
177
- my_fields = form.fields.select {|f| f.name == "NumNights"}
178
- my_fields[1].value = no_days.to_i
179
- #form.my_fields[1].whatever = "value"
180
- #form.field_with(:name => 'Persons').options[no_ppl.to_i-1].select
181
- #form.field_with(:name => 'Currency').options[4].select #US Currency
182
-
183
-
184
- Retryable.try 3 do
185
- page = agent.submit(form, form.button_with(:name => 'DateSelect'))
186
- end
187
-
188
- error = page.search("div.microBookingError2")
189
-
190
- if error.to_s.length > 1
191
- data = "Full"
192
- else
193
- data = page.search("//div[@id='content']")
194
- end
195
-
196
- return data
197
- end
198
-
199
- def self.setSearch2(url,date,no_ppl,no_days)
200
-
201
- date = Date.strptime(date)
202
- month = date.strftime("%m").to_i
203
- day = date.strftime("%d").to_i
204
- if Time.now.strftime("%y") == date.strftime("%y") then year = 0 else year = 1 end
205
-
206
- agent = WWW::Mechanize.new
207
- page = agent.get(url)
208
-
209
- #the form name
210
- #form = page.forms.first # => WWW::Mechanize::Form
211
- form = page.form_with(:name => 'theForm')
212
-
213
- #page = agent.submit(form)
214
-
215
- #form must be submitted twice because the people writing hostelworld are retards
216
-
217
- form.field_with(:name => 'selMonth').options[month-1].select
218
- form.field_with(:name => 'selDay').options[day-1].select
219
- form.field_with(:name => 'selYear').options[year].select
220
- form.field_with(:name => 'NumNights').options[no_days.to_i-1].select
221
- form.field_with(:name => 'Persons').options[no_ppl.to_i-1].select
222
- form.field_with(:name => 'Currency').options[4].select #US Currency
223
-
224
- Retryable.try 3 do
225
- page = agent.submit(form)
226
- end
227
- data = page.search("//div[@id='content']")
228
- return data
229
- end
230
-
231
- def self.parse_availables(info)
232
-
233
- availability = info.at('table[@id="tableDatesSelected2"]')
234
- availability.search("div").remove
235
- availability.search("span.hwRoomTypeDesc").remove
236
-
237
- availables = []
238
-
239
- (availability/"tr").each do |row|
240
- name = (row/"td").first
241
- name = name.inner_text unless name.nil?
242
-
243
- (row/"td").each do |td|
244
- night = td.attributes['title']
245
- if night
246
- price = night.to_s.match(/([\d]{1,3}).([\d]{2})/).to_s
247
- available = night.to_s.match(/(available: )([\d]*)/)
248
- date = night.to_s.match(/(Date: ).*$/).to_s.gsub(/(Date: )|(th)|(nd)|(rd)|(st)/,'')
249
- date = Date.strptime(date, "%a %d %b '%y")
250
-
251
- if available
252
- beds = available.to_s.match(/[\d]{1,2}/)[0]
253
- availables << HostelifyAvailable.new(name,price,beds,date)
254
- else
255
- availables << HostelifyAvailable.new(name,price,0,date)
256
- end
257
- end
258
- end
259
- end
260
- return availables
261
-
262
- end
263
-
264
-
265
- end
@@ -1,72 +0,0 @@
1
- require 'spec/_helper'
2
-
3
- describe "should find individual hostel and get object with name etc." do
4
-
5
- before(:all) do
6
- @h = Hostelbookers.find_hostel_by_id(:location => "krakow,poland", :id => 9330)
7
- @h = Hostelbookers.find_hostel_by_id(:location => "lviv,ukraine", :id => 19606)
8
- end
9
-
10
- it "should query hostelbookers and return the correct name" do
11
- @h.name.should match(/^.*(Hostel).*$/)
12
- end
13
-
14
- it "address" do
15
- @h.address.should match(/^.*(Krakow|Lviv).*$/)
16
- end
17
-
18
- it "description" do
19
- @h.address.should_not be nil
20
- end
21
-
22
- it "facilities" do
23
- @h.should have_at_least(8).facilities
24
- end
25
-
26
- it "ratings" do
27
- @h.should have(8).ratings
28
- end
29
-
30
- it "images at least 6" do
31
- @h.should have_at_least(6).images
32
- end
33
-
34
- end
35
-
36
- describe "all options" do
37
- before(:all) do
38
- @h = Hostelbookers.find_hostel_by_id(:location => "krakow,poland", :id => 9330, :all => true)
39
- end
40
-
41
- it "directions should have a certain length <" do
42
- @h.directions.length.should be > 25
43
- end
44
-
45
- it "geo" do
46
- @h.geo[0].to_f.round.should eql 50
47
- end
48
- end
49
-
50
- describe "with dates to get availabilty and verify output!" do
51
- before(:all) do
52
- @h = Hostelbookers.find_hostel_by_id(:location => "krakow,poland", :id => 19831, :date => (Date.today+10).to_s)
53
- end
54
-
55
- it "get first availability and check it merit" do
56
- @h.availability.first.name =~ /bed/
57
- end
58
-
59
- it "check number of avail beds" do
60
- @h.availability.first.spots.to_i.should be > 1
61
- end
62
-
63
- it "last avail has a price > 5 US" do
64
- @h.availability.last.price.to_i.should be > 5
65
- end
66
-
67
- it "book date eq today + 10" do
68
- @h.availability.last.bookdate.should_not be nil
69
- end
70
-
71
-
72
- end
@@ -1,30 +0,0 @@
1
- require 'spec/_helper'
2
-
3
- describe "test hostelbookers hostel listings" do
4
-
5
- before(:all) do
6
- @h = Hostelbookers.find_hostels_by_location(:location => "krakow,poland")
7
- end
8
-
9
- it "should return a list of names" do
10
- names = []
11
- @h.each do |e|
12
- names << e.name
13
- end
14
- names.should include("Flamingo Hostel")
15
- names.should include("Mama's Hostel- Main Market Square")
16
- end
17
-
18
- it "rating should be high for first choices" do
19
- @h.first.rating.to_i.should be > 50
20
- end
21
-
22
- it "desc should have a certain length <" do
23
- @h.first.description.length.should be > 100
24
- end
25
-
26
- it "has a hostel number" do
27
- @h.first.hostel_id.to_i.should_not be nil
28
- end
29
-
30
- end
@@ -1,85 +0,0 @@
1
- require 'spec/_helper'
2
-
3
- describe "find hostel by id, no options" do
4
-
5
- before(:all) do
6
- @h = Hostelworld.find_hostel_by_id(:id => 7113)
7
- @h = Hostelworld.find_hostel_by_id(:id => 20763)
8
- end
9
-
10
- it "should query hostelworld and return the correct name" do
11
- @h.name.should match(/^.*(Hostel).*$/)
12
- end
13
-
14
- it "address" do
15
- @h.address.should match(/^.*(Krakow|Lviv).*$/)
16
- end
17
-
18
- it "description" do
19
- @h.address.should_not be nil
20
- end
21
-
22
- it "facilities" do
23
- @h.should have_at_least(15).facilities
24
- end
25
-
26
- it "ratings" do
27
- @h.should have(6).ratings
28
- end
29
-
30
- end
31
-
32
- describe "youtube" do
33
-
34
- before(:all) do
35
- @h3 = Hostelworld.find_hostel_by_id(:id => 7113)
36
- end
37
-
38
- it "video" do
39
- @h3.video.should match(/^.*(youtube.com).*$/)
40
- end
41
- end
42
-
43
- describe "find hostel with all options" do
44
- before(:all) do
45
- @h2 = Hostelworld.find_hostel_by_id(:id => 7113, :all => true)
46
- @h2 = Hostelworld.find_hostel_by_id(:id => 20763, :all => true)
47
- end
48
-
49
- it "geo" do
50
- @h2.geo[0].to_f.round.should eql 50
51
- end
52
-
53
- it "directions" do
54
- @h2.directions.should_not be nil
55
- end
56
-
57
- it "images at least 6" do
58
- @h2.should have_at_least(6).images
59
- end
60
- end
61
-
62
- describe "with dates to get availabilty and verify output!" do
63
- before(:all) do
64
- #@h = Hostelworld.find_hostel_by_id(:id => 20763, :date => (Date.today+20).to_s)
65
- @h = Hostelworld.find_hostel_by_id(:id => 7113, :date => (Date.today+20).to_s)
66
- end
67
-
68
- it "get first availability and check it merit" do
69
- @h.availability.first.name =~ /bed/
70
- end
71
-
72
- it "check number of avail beds" do
73
- @h.availability.last.spots.to_i.should be >= 1
74
- end
75
-
76
- it "last avail has a price > 5 US" do
77
- @h.availability.last.price.to_i.should be > 5
78
- end
79
-
80
- it "book date eq today + 10" do
81
- @h.availability.last.bookdate.should_not be nil
82
- end
83
-
84
-
85
- end
@@ -1,62 +0,0 @@
1
- require 'spec/_helper'
2
-
3
- describe "finds list of hostels" do
4
-
5
- before(:all) do
6
- @h = Hostelworld.find_hostels_by_location(:location => 'krakow,poland')
7
- end
8
-
9
- it "should get a list with name and brief desc" do
10
- names = []
11
- @h.each do |e|
12
- names << e.name
13
- end
14
- names.should include("Mama's Hostel Main Market Square")
15
- end
16
-
17
-
18
- it "rating should be high for first choices" do
19
- @h.first.rating.to_i.should be > 50
20
- end
21
-
22
- it "desc should have a certain length <" do
23
- @h.first.description.length.should be > 80
24
- end
25
-
26
- it "has a hostel number" do
27
- @h.first.hostel_id.to_i.should_not be nil
28
- end
29
-
30
- end
31
-
32
- describe "find hostels with dates" do
33
-
34
- before(:all) do
35
- @h = Hostelworld.find_hostels_by_location(:location => 'krakow,poland', :date => (Date.today + 10).to_s)
36
- end
37
-
38
- it "rating should be high for first choices" do
39
- @h.first.rating.to_i.should be > 50
40
- end
41
-
42
- it "desc should have a certain length <" do
43
- @h.first.description.length.should be > 90
44
- end
45
-
46
- it "has a hostel number" do
47
- @h.first.hostel_id.to_i.should_not be nil
48
- end
49
-
50
- it "has dorm rooms for greater than $5" do
51
- @h.first.dorm.to_i.should be > 5
52
- end
53
-
54
- it "has available rooms!" do
55
- @h.first.unavailable.first.should be nil
56
- end
57
-
58
- it "has unavailable rooms!" do
59
- @h.last.unavailable.first.should_not be nil
60
- end
61
-
62
- end
Binary file
Binary file