hostelify 0.4.4 → 0.4.5

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
@@ -5,9 +5,11 @@ hostelify.gemspec
5
5
  lib/hostelify.rb
6
6
  lib/hostelify/gomio.rb
7
7
  lib/hostelify/hostel.rb
8
+ lib/hostelify/hostelbookers-old.rb
8
9
  lib/hostelify/hostelbookers.rb
9
10
  lib/hostelify/hostelify.rb
10
11
  lib/hostelify/hostelworld.rb
12
+ lib/hostelify/hostelworldmonkey.rb
11
13
  lib/items.rb
12
14
  lib/test.rb
13
15
  spec/_helper.rb
data/Rakefile CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'rake'
3
3
  require 'echoe'
4
4
 
5
- Echoe.new('hostelify', '0.4.4') do |p|
5
+ Echoe.new('hostelify', '0.4.5') 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.4.4"
5
+ s.version = "0.4.5"
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{2010-05-19}
9
+ s.date = %q{2010-05-20}
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/hostel.rb", "lib/hostelify/hostelbookers.rb", "lib/hostelify/hostelify.rb", "lib/hostelify/hostelworld.rb", "lib/items.rb", "lib/test.rb"]
13
- s.files = ["Manifest", "README.rdoc", "Rakefile", "hostelify.gemspec", "lib/hostelify.rb", "lib/hostelify/gomio.rb", "lib/hostelify/hostel.rb", "lib/hostelify/hostelbookers.rb", "lib/hostelify/hostelify.rb", "lib/hostelify/hostelworld.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"]
12
+ s.extra_rdoc_files = ["README.rdoc", "lib/hostelify.rb", "lib/hostelify/gomio.rb", "lib/hostelify/hostel.rb", "lib/hostelify/hostelbookers-old.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/hostelify.rb", "lib/hostelify/gomio.rb", "lib/hostelify/hostel.rb", "lib/hostelify/hostelbookers-old.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,194 @@
1
+ class Hostelbookers
2
+
3
+ #constants
4
+ HB_SINGULAR_DETAIL_URL = "http://www.hostelbookers.com/hostels/" #poland/krakow/
5
+ HB_PLURAL_HOSTELS_URL = "http://www.hostelbookers.com/hostels/" #poland/wroclaw/
6
+ HB_DYNAMIC_URL = "http://www.hostelbookers.com/property/index.cfm?fuseaction=accommodation.search&straccommodationtype=hostels"
7
+ #&intnights=2&intpeople=1&dtearrival=21/05/2010&fromPropertyNameSearch=0&intpropertyid=6281
8
+
9
+ #options
10
+ @default_options = { :date => date=(Date.today+4).to_s, :no_days => "7", :live => true }
11
+
12
+ def self.find_hostels_by_location(options) #location
13
+ city = options[:location].split(',').first.rstrip.lstrip.gsub(' ','-').squeeze("-")
14
+ country = options[:location].split(',').last.rstrip.lstrip.gsub(' ','-').squeeze("-")
15
+
16
+ url = HB_PLURAL_HOSTELS_URL + "#{country}/#{city}"
17
+
18
+
19
+ if options[:date]
20
+ options = @default_options.merge(options)
21
+ date = Date.strptime(options[:date])
22
+ data = setSearch(url,options[:date],options[:no_days])
23
+ else
24
+ Retryable.try 3 do
25
+ data = Hpricot(open(url))
26
+ end
27
+ end
28
+
29
+ data = data.search("//div[@id='propertyResultsList']")
30
+ #@results = []
31
+ @results = HostelifyCollection.new
32
+ #coder = HTMLEntities.new
33
+ (data/"tr.propertyRow").each do |row|
34
+ name = row.at("a.propertyTitle").inner_text
35
+ url = row.at("a.propertyTitle")['href']
36
+ desc = row.at("p.shortDescription").inner_text
37
+ rating = row.at("td.rating/text()")
38
+ rating = rating.to_s.to_i unless rating.nil?
39
+ dorm = row.at("td.shared/text()")
40
+ single = row.at("td.private/text()")
41
+ hb_id = url.match(/[\d]{2,5}.$/).to_s.to_i
42
+
43
+ #@results << Hostelify.new(:hostel_id => hb_id, :name => name, :description => desc, :rating => rating, :dorm => dorm, :single => single)
44
+ @results << Hostelify.new(:hostel_id => hb_id, :name => name, :description => desc, :rating => rating, :dorm => dorm, :single => single)
45
+ end
46
+ return @results
47
+ end
48
+
49
+ def self.find_hostel_by_id(options)
50
+ #city = options[:location].split(',').first.gsub(' ','')
51
+ #country = options[:location].split(',').last.gsub(' ','')
52
+ id = options[:id]
53
+
54
+ #url = HB_SINGULAR_DETAIL_URL + "#{country}/#{city}/#{id}"
55
+ url = HB_DYNAMIC_URL + "&intnights=#{options[:no_days]}&fromPropertyNameSearch=0&intpropertyid=#{options[:id]}"
56
+
57
+ hostel = Hostelify.new
58
+
59
+ if options[:date]
60
+ options = @default_options.merge(options)
61
+ else
62
+ options[:date] = (Date.today+4).to_s
63
+ end
64
+
65
+ date = Date.strptime(options[:date])
66
+ url2 = HB_DYNAMIC_URL + "&intnights=#{options[:no_days]}&intpeople=1&dtearrival=#{date.strftime('%d/%m/%Y')}&fromPropertyNameSearch=0&intpropertyid=6281"
67
+ data = Hpricot(open(url2))
68
+ #data = setSearch_id(url,options[:date],options[:no_days])
69
+ #url2 = HB_DYNAMIC_URL + "&intnights=#{options[:no_days]}&dtearrival=21/05/2010&fromPropertyNameSearch=0&intpropertyid=#{options[:id]}"
70
+
71
+ # else
72
+ # Retryable.try 3 do
73
+ # data = Hpricot(open(url))
74
+ # end
75
+ # end
76
+
77
+ hostel.hostel_id = id
78
+ hostel.name = data.at("h1").inner_text
79
+ hostel.address = data.at("p.address").inner_text
80
+ hostel.description = data.at('div[@id="overviewPane"]').inner_text
81
+ facilities_td = data.at("table.tableFacilities")
82
+
83
+ facilities = []
84
+ (facilities_td/"td").each do |row|
85
+ facilities << row.inner_text
86
+ end
87
+ hostel.facilities = facilities
88
+ extras = []
89
+ extras_td = data.at("table.tableFeatures")
90
+ (extras_td/"td.name").each do |row|
91
+ extras << "Free " + row.inner_text.to_s
92
+ end
93
+ facilities = facilities + extras
94
+
95
+ ratings = []
96
+ ratings_td = data.at('div[@id="overviewIndRtng"]/table')
97
+
98
+ (ratings_td/"tr").each do |row|
99
+ ratings << row.at("td").inner_text.to_s.to_f
100
+ end
101
+
102
+ hostel.ratings = ratings
103
+ images = []
104
+ image = data.at('div[@id="propMedia"]/table')
105
+ (image/"td").each do |row|
106
+ img = row.at("img")['onclick']
107
+ if img =~ /(http).*(jpg|gif|png|jpeg)/
108
+ images << img.match(/(http).*(jpg|gif|png|jpeg)/)[0]
109
+ else
110
+ #add youtube?
111
+ end
112
+ end
113
+ hostel.images = images
114
+
115
+ if options[:all]
116
+ data = Hpricot(open(url + "/map"))
117
+ data.search("h2").remove #get rid of header
118
+ hostel.directions = data.at('div[@id="directions"]').inner_text
119
+ hostel.geo = data.to_s.scan(/-{0,1}\d{1,3}\.\d{7}/).uniq!
120
+ end
121
+
122
+ if options[:date]
123
+ date = Date.strptime(options[:date])
124
+ @availables = []
125
+ available = data.at("div.tableAvailability/table")
126
+ if available
127
+ (available/"tr").each do |row|
128
+ name = row.at("td.roomType/label/text()")
129
+ people = row.at("td.people/select")
130
+ people = people.at("option:last-child").inner_text unless people.nil?
131
+ price = row.at("td.price")
132
+ price = price.inner_text.to_s.match(/[\d.]{1,5}/)[0] unless price.nil?
133
+ (0..(options[:no_days].to_i-1)).each do |x|
134
+ #@availables << { :name => name, :spots => people, :price => price, :bookdate => (date+x).to_s } unless price.nil?
135
+ @availables << HostelifyAvailable.new(name,price,people,(date+x).to_s) unless price.nil?
136
+ end
137
+ end
138
+ end
139
+ hostel.availability = @availables
140
+ end
141
+
142
+ return hostel
143
+ end
144
+
145
+ def self.setSearch(url,date,no_days)
146
+ date = Date.strptime(date).strftime("%d/%m/%Y")
147
+ agent = WWW::Mechanize.new
148
+ page = agent.get(url)
149
+ form = page.form_with(:name => 'searchForm') # => WWW::Mechanize::Form
150
+ form.field_with(:name => 'intnights').options[no_days.to_i-1].select
151
+ form.dtearrival = date #d/m/y
152
+
153
+ Retryable.try 3 do
154
+ page = agent.submit(form)
155
+ end
156
+
157
+ #to dollars!
158
+ form = page.forms[0]
159
+ form.field_with(:name => 'strSelectedCurrencyCode').options[5].select
160
+
161
+ Retryable.try 3 do
162
+ page = agent.submit(form)
163
+ end
164
+
165
+ data = page.search('//div[@id="content"]')
166
+
167
+ return data
168
+ end
169
+
170
+ def self.setSearch_id(url,date,no_days)
171
+ date = Date.strptime(date).strftime("%d/%m/%Y")
172
+ agent = WWW::Mechanize.new
173
+ page = agent.get(url)
174
+ form = page.form_with(:name => 'frmCheckAvailBook') # => WWW::Mechanize::Form
175
+ form.field_with(:name => 'intNights').options[no_days.to_i-1].select
176
+ form.dteArrival = date #d/m/y
177
+
178
+ Retryable.try 3 do
179
+ page = agent.submit(form)
180
+ end
181
+ #change currency to dollars
182
+ form = page.forms[1]
183
+ #puts form.name
184
+ form.field_with(:name => 'strSelectedCurrencyCode').options[5].select
185
+
186
+ Retryable.try 3 do
187
+ page = agent.submit(form)
188
+ end
189
+ data = page.search('//div[@id="content"]')
190
+
191
+ return data
192
+ end
193
+
194
+ end
@@ -1,35 +1,26 @@
1
1
  class Hostelbookers
2
2
 
3
- #constants
4
- HB_SINGULAR_DETAIL_URL = "http://www.hostelbookers.com/hostels/" #poland/krakow/
5
- HB_PLURAL_HOSTELS_URL = "http://www.hostelbookers.com/hostels/" #poland/wroclaw/
6
- HB_DYNAMIC_URL = "http://www.hostelbookers.com/property/index.cfm?fuseaction=accommodation.search&straccommodationtype=hostels"
7
- #&intnights=2&intpeople=1&dtearrival=21/05/2010&fromPropertyNameSearch=0&intpropertyid=6281
3
+ HB_SINGULAR_URL = "http://www.hostelbookers.com/property/index.cfm?fuseaction=accommodation.search&straccommodationtype=hostels&fromPropertyNameSearch=0"
4
+ HB_PLURAL_URL = "http://www.hostelbookers.com/results/index.cfm?straccommodationtype=hostels&strSearchType=freeText&fuseaction=accommodation.search"
8
5
 
9
- #options
10
- @default_options = { :date => date=(Date.today+4).to_s, :no_days => "7", :live => true }
6
+ @default_options = { :date => (Date.today+4).to_s, :no_days => "7", :live => true }
11
7
 
12
- def self.find_hostels_by_location(options) #location
8
+ def self.find_hostels_by_location(options)
9
+ options = @default_options.merge(options)
10
+ date = Date.strptime(options[:date])
13
11
  city = options[:location].split(',').first.rstrip.lstrip.gsub(' ','-').squeeze("-")
14
12
  country = options[:location].split(',').last.rstrip.lstrip.gsub(' ','-').squeeze("-")
15
-
16
- url = HB_PLURAL_HOSTELS_URL + "#{country}/#{city}"
17
-
18
13
 
19
- if options[:date]
20
- options = @default_options.merge(options)
21
- date = Date.strptime(options[:date])
22
- data = setSearch(url,options[:date],options[:no_days])
23
- else
24
- Retryable.try 3 do
25
- data = Hpricot(open(url))
26
- end
27
- end
14
+ url = HB_PLURAL_URL + "&strkeywords=#{city},+#{country}&dtearrival=#{date.strftime('%d/%m/%Y')}"
15
+
16
+ #Retryable.try 3 do
17
+ data = Hpricot(open(url))
18
+ #end
28
19
 
29
20
  data = data.search("//div[@id='propertyResultsList']")
30
- #@results = []
21
+
31
22
  @results = HostelifyCollection.new
32
- #coder = HTMLEntities.new
23
+
33
24
  (data/"tr.propertyRow").each do |row|
34
25
  name = row.at("a.propertyTitle").inner_text
35
26
  url = row.at("a.propertyTitle")['href']
@@ -40,39 +31,20 @@ class Hostelbookers
40
31
  single = row.at("td.private/text()")
41
32
  hb_id = url.match(/[\d]{2,5}.$/).to_s.to_i
42
33
 
43
- #@results << Hostelify.new(:hostel_id => hb_id, :name => name, :description => desc, :rating => rating, :dorm => dorm, :single => single)
44
34
  @results << Hostelify.new(:hostel_id => hb_id, :name => name, :description => desc, :rating => rating, :dorm => dorm, :single => single)
45
35
  end
46
36
  return @results
47
37
  end
48
-
38
+
49
39
  def self.find_hostel_by_id(options)
50
- #city = options[:location].split(',').first.gsub(' ','')
51
- #country = options[:location].split(',').last.gsub(' ','')
40
+ options = @default_options.merge(options)
41
+ date = Date.strptime(options[:date])
52
42
  id = options[:id]
53
-
54
- #url = HB_SINGULAR_DETAIL_URL + "#{country}/#{city}/#{id}"
55
- url = HB_DYNAMIC_URL + "&intnights=#{options[:no_days]}&fromPropertyNameSearch=0&intpropertyid=#{options[:id]}"
56
-
57
43
  hostel = Hostelify.new
58
-
59
- if options[:date]
60
- options = @default_options.merge(options)
61
- else
62
- options[:date] = (Date.today+4).to_s
63
- end
64
44
 
65
- date = Date.strptime(options[:date])
66
- url2 = HB_DYNAMIC_URL + "&intnights=#{options[:no_days]}&intpeople=1&dtearrival=#{date.strftime('%d/%m/%Y')}&fromPropertyNameSearch=0&intpropertyid=6281"
67
- data = Hpricot(open(url2))
68
- #data = setSearch_id(url,options[:date],options[:no_days])
69
- #url2 = HB_DYNAMIC_URL + "&intnights=#{options[:no_days]}&dtearrival=21/05/2010&fromPropertyNameSearch=0&intpropertyid=#{options[:id]}"
70
-
71
- # else
72
- # Retryable.try 3 do
73
- # data = Hpricot(open(url))
74
- # end
75
- # end
45
+ url = HB_SINGULAR_URL + "&intnights=#{options[:no_days]}&intpeople=1&dtearrival=#{date.strftime('%d/%m/%Y')}&intpropertyid=#{options[:id]}"
46
+
47
+ data = Hpricot(open(url))
76
48
 
77
49
  hostel.hostel_id = id
78
50
  hostel.name = data.at("h1").inner_text
@@ -119,76 +91,27 @@ class Hostelbookers
119
91
  hostel.geo = data.to_s.scan(/-{0,1}\d{1,3}\.\d{7}/).uniq!
120
92
  end
121
93
 
122
- if options[:date]
123
- date = Date.strptime(options[:date])
124
- @availables = []
125
- available = data.at("div.tableAvailability/table")
126
- if available
127
- (available/"tr").each do |row|
128
- name = row.at("td.roomType/label/text()")
129
- people = row.at("td.people/select")
130
- people = people.at("option:last-child").inner_text unless people.nil?
131
- price = row.at("td.price")
132
- price = price.inner_text.to_s.match(/[\d.]{1,5}/)[0] unless price.nil?
133
- (0..(options[:no_days].to_i-1)).each do |x|
134
- #@availables << { :name => name, :spots => people, :price => price, :bookdate => (date+x).to_s } unless price.nil?
135
- @availables << HostelifyAvailable.new(name,price,people,(date+x).to_s) unless price.nil?
136
- end
94
+ @availables = []
95
+ available = data.at("div.tableAvailability/table")
96
+ if available
97
+ (available/"tr").each do |row|
98
+ name = row.at("td.roomType/label/text()")
99
+ people = row.at("td.people/select")
100
+ people = people.at("option:last-child").inner_text unless people.nil?
101
+ price = row.at("td.price")
102
+ price = price.inner_text.to_s.match(/[\d.]{1,5}/)[0] unless price.nil?
103
+ (0..(options[:no_days].to_i-1)).each do |x|
104
+ #@availables << { :name => name, :spots => people, :price => price, :bookdate => (date+x).to_s } unless price.nil?
105
+ @availables << HostelifyAvailable.new(name,price,people,(date+x).to_s) unless price.nil?
137
106
  end
138
107
  end
108
+
139
109
  hostel.availability = @availables
140
110
  end
141
111
 
142
112
  return hostel
143
- end
144
113
 
145
- def self.setSearch(url,date,no_days)
146
- date = Date.strptime(date).strftime("%d/%m/%Y")
147
- agent = WWW::Mechanize.new
148
- page = agent.get(url)
149
- form = page.form_with(:name => 'searchForm') # => WWW::Mechanize::Form
150
- form.field_with(:name => 'intnights').options[no_days.to_i-1].select
151
- form.dtearrival = date #d/m/y
152
-
153
- Retryable.try 3 do
154
- page = agent.submit(form)
155
- end
156
-
157
- #to dollars!
158
- form = page.forms[0]
159
- form.field_with(:name => 'strSelectedCurrencyCode').options[5].select
160
-
161
- Retryable.try 3 do
162
- page = agent.submit(form)
163
- end
164
-
165
- data = page.search('//div[@id="content"]')
166
-
167
- return data
168
- end
169
-
170
- def self.setSearch_id(url,date,no_days)
171
- date = Date.strptime(date).strftime("%d/%m/%Y")
172
- agent = WWW::Mechanize.new
173
- page = agent.get(url)
174
- form = page.form_with(:name => 'frmCheckAvailBook') # => WWW::Mechanize::Form
175
- form.field_with(:name => 'intNights').options[no_days.to_i-1].select
176
- form.dteArrival = date #d/m/y
177
-
178
- Retryable.try 3 do
179
- page = agent.submit(form)
180
- end
181
- #change currency to dollars
182
- form = page.forms[1]
183
- #puts form.name
184
- form.field_with(:name => 'strSelectedCurrencyCode').options[5].select
185
-
186
- Retryable.try 3 do
187
- page = agent.submit(form)
188
- end
189
- data = page.search('//div[@id="content"]')
190
-
191
- return data
192
- end
193
114
 
115
+ end
116
+
194
117
  end
@@ -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/hostelify.rb CHANGED
@@ -8,3 +8,4 @@ require 'iconv'
8
8
  require 'hostelify/hostelify'
9
9
  require 'hostelify/hostelworld'
10
10
  require 'hostelify/hostelbookers'
11
+ #require 'hostelify/hosteltest'
@@ -49,7 +49,7 @@ end
49
49
 
50
50
  describe "with dates to get availabilty and verify output!" do
51
51
  before(:all) do
52
- @h = Hostelbookers.find_hostel_by_id(:id => 19831, :date => (Date.today+10).to_s)
52
+ @h = Hostelbookers.find_hostel_by_id(:location => "krakow,poland", :id => 19831, :date => (Date.today+10).to_s)
53
53
  end
54
54
 
55
55
  it "get first availability and check it merit" do
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 4
8
- - 4
9
- version: 0.4.4
8
+ - 5
9
+ version: 0.4.5
10
10
  platform: ruby
11
11
  authors:
12
12
  - Holden Thomas
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-05-19 00:00:00 +02:00
17
+ date: 2010-05-20 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies: []
20
20
 
@@ -29,9 +29,11 @@ extra_rdoc_files:
29
29
  - lib/hostelify.rb
30
30
  - lib/hostelify/gomio.rb
31
31
  - lib/hostelify/hostel.rb
32
+ - lib/hostelify/hostelbookers-old.rb
32
33
  - lib/hostelify/hostelbookers.rb
33
34
  - lib/hostelify/hostelify.rb
34
35
  - lib/hostelify/hostelworld.rb
36
+ - lib/hostelify/hostelworldmonkey.rb
35
37
  - lib/items.rb
36
38
  - lib/test.rb
37
39
  files:
@@ -42,9 +44,11 @@ files:
42
44
  - lib/hostelify.rb
43
45
  - lib/hostelify/gomio.rb
44
46
  - lib/hostelify/hostel.rb
47
+ - lib/hostelify/hostelbookers-old.rb
45
48
  - lib/hostelify/hostelbookers.rb
46
49
  - lib/hostelify/hostelify.rb
47
50
  - lib/hostelify/hostelworld.rb
51
+ - lib/hostelify/hostelworldmonkey.rb
48
52
  - lib/items.rb
49
53
  - lib/test.rb
50
54
  - spec/_helper.rb