weather_fetcher 0.0.16 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c4e125667ec4f19310d5d5fd67f808d78b0c8f22
4
+ data.tar.gz: 0f5834b7b8bbea71bc4ce3ac3e57b0fd2aa8110f
5
+ SHA512:
6
+ metadata.gz: 9800629a7cefc2f5f8ee4e0c808ae9aad1ad1b6b4fe1fff3d556443a12cef3dc9aa7db534189a2c7cc1970e249dfc3b7dbad160003c92492c7a13f6e1822d74f
7
+ data.tar.gz: bf7c4406acea6b09332b217d89bc1374b59cd0fb9177072db9eac8e7dabdf1a513101fa874e9e993ff7c86dfa2b9df4a4e941990195ea1aac941d50ba8c7e350
data/Gemfile CHANGED
@@ -1,11 +1,12 @@
1
1
  source "http://rubygems.org"
2
2
 
3
+ gem 'curb'
3
4
  gem "simple_metar_parser", ">= 0.0.1"
4
5
 
5
6
  group :development do
6
- gem "rspec", "~> 2.3.0"
7
- gem "bundler", "~> 1.0.0"
8
- gem "jeweler", "~> 1.6.4"
7
+ gem "rspec"
8
+ gem "bundler"
9
+ gem "jeweler"
9
10
  gem 'simplecov', :require => false, :group => :test
10
11
  gem "rdoc"
11
12
  end
data/Gemfile.lock CHANGED
@@ -1,38 +1,74 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- diff-lcs (1.1.3)
5
- git (1.2.5)
6
- jeweler (1.6.4)
4
+ addressable (2.3.5)
5
+ builder (3.2.2)
6
+ curb (0.8.5)
7
+ diff-lcs (1.2.5)
8
+ docile (1.1.1)
9
+ faraday (0.8.8)
10
+ multipart-post (~> 1.2.0)
11
+ git (1.2.6)
12
+ github_api (0.10.1)
13
+ addressable
14
+ faraday (~> 0.8.1)
15
+ hashie (>= 1.2)
16
+ multi_json (~> 1.4)
17
+ nokogiri (~> 1.5.2)
18
+ oauth2
19
+ hashie (2.0.5)
20
+ highline (1.6.20)
21
+ httpauth (0.2.0)
22
+ jeweler (1.8.8)
23
+ builder
7
24
  bundler (~> 1.0)
8
25
  git (>= 1.2.5)
26
+ github_api (= 0.10.1)
27
+ highline (>= 1.6.15)
28
+ nokogiri (= 1.5.10)
9
29
  rake
10
- json (1.7.5)
11
- multi_json (1.5.0)
12
- rake (10.0.3)
13
- rdoc (3.12)
30
+ rdoc
31
+ json (1.8.1)
32
+ jwt (0.1.8)
33
+ multi_json (>= 1.5)
34
+ multi_json (1.8.2)
35
+ multi_xml (0.5.5)
36
+ multipart-post (1.2.0)
37
+ nokogiri (1.5.10)
38
+ oauth2 (0.9.2)
39
+ faraday (~> 0.8)
40
+ httpauth (~> 0.2)
41
+ jwt (~> 0.1.4)
42
+ multi_json (~> 1.0)
43
+ multi_xml (~> 0.5)
44
+ rack (~> 1.2)
45
+ rack (1.5.2)
46
+ rake (10.1.1)
47
+ rdoc (4.0.1)
14
48
  json (~> 1.4)
15
- rspec (2.3.0)
16
- rspec-core (~> 2.3.0)
17
- rspec-expectations (~> 2.3.0)
18
- rspec-mocks (~> 2.3.0)
19
- rspec-core (2.3.1)
20
- rspec-expectations (2.3.0)
21
- diff-lcs (~> 1.1.2)
22
- rspec-mocks (2.3.0)
49
+ rspec (2.14.1)
50
+ rspec-core (~> 2.14.0)
51
+ rspec-expectations (~> 2.14.0)
52
+ rspec-mocks (~> 2.14.0)
53
+ rspec-core (2.14.7)
54
+ rspec-expectations (2.14.4)
55
+ diff-lcs (>= 1.1.3, < 2.0)
56
+ rspec-mocks (2.14.4)
23
57
  simple_metar_parser (0.0.1)
24
- simplecov (0.7.1)
25
- multi_json (~> 1.0)
26
- simplecov-html (~> 0.7.1)
27
- simplecov-html (0.7.1)
58
+ simplecov (0.8.2)
59
+ docile (~> 1.1.0)
60
+ multi_json
61
+ simplecov-html (~> 0.8.0)
62
+ simplecov-html (0.8.0)
28
63
 
29
64
  PLATFORMS
30
65
  ruby
31
66
 
32
67
  DEPENDENCIES
33
- bundler (~> 1.0.0)
34
- jeweler (~> 1.6.4)
68
+ bundler
69
+ curb
70
+ jeweler
35
71
  rdoc
36
- rspec (~> 2.3.0)
72
+ rspec
37
73
  simple_metar_parser (>= 0.0.1)
38
74
  simplecov
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.16
1
+ 0.1.0
@@ -1,5 +1,7 @@
1
1
  #encoding: utf-8
2
2
 
3
+ require 'nokogiri'
4
+
3
5
  module WeatherFetcher
4
6
  class Provider::InteriaPl < HtmlBasedProvider
5
7
 
@@ -8,122 +10,62 @@ module WeatherFetcher
8
10
  end
9
11
 
10
12
  def process(string)
11
- WeatherData.factory( _process(string) )
13
+ WeatherData.factory(_process(string))
12
14
  end
13
15
 
14
16
  # Process response body and rip out weather data
15
17
  def _process(body_raw)
18
+ data = Array.new
19
+ b = Nokogiri::HTML(body_raw)
20
+
21
+ weather_days = b.css(".weather-forecast-day")
22
+ weather_days.each do |d|
23
+ klass = d.attribute("class").value
24
+ klass =~ /(\d{4})-(\d{1,2})-(\d{1,2})/
25
+ t = Time.local($1.to_i, $2.to_i, $3.to_i)
26
+
27
+ weather_list = d.css("li.weather-entry")
28
+ weather_list.each do |w|
29
+ hour = w.css(".entry-hour > .hour").children.first.to_s.to_i
30
+ min = w.css(".entry-hour > .minute").children.first.to_s.to_i
31
+ time_from = t + hour * 3600 + min * 60
32
+
33
+ temp = w.css(".forecast-top > .forecast-temp").children.first.to_s.to_f
34
+ feel_temp = w.css(".forecast-top > .forecast-feeltemp").children.first.to_s.gsub(/Odczuwalna/, "").to_f
35
+ wind = w.css(".wind-speed > .speed-value").children.first.to_s.to_f
36
+ rain = w.css("span.entry-precipitation-value.rain").children.first.to_s.gsub(/,/, ".").to_f
37
+ snow = w.css("span.entry-precipitation-value.snow").children.first
38
+ if snow
39
+ snow = snow.to_s.gsub(/,/, ".").to_f
40
+ else
41
+ snow = nil
42
+ end
43
+ cloud_cover = w.css("span.entry-precipitation-value.cloud-cover").children.first.to_s.to_f
44
+ humidity = w.css(".entry-humidity").children.first.to_s.to_f
45
+ # puts humidity.inspect
46
+
47
+ h = {
48
+ :time_created => Time.now,
49
+ :time_from => time_from,
50
+ :time_to => time_from + 3600,
51
+ :temperature => temp,
52
+ :feel_temperature => feel_temp,
53
+ # :pressure => pressures[0][0].to_f,
54
+ :wind_kmh => wind,
55
+ :wind => wind / 3.6,
56
+ # :snow => nil, #snows[0][0].to_f,
57
+ :rain => rain,
58
+ :cloud_cover => cloud_cover,
59
+ :humidity => humidity,
60
+ :provider => self.class.provider_name
61
+ }
62
+
63
+ data << h
64
+ end
16
65
 
17
- body = body_raw.downcase
18
-
19
- hours_first = body.scan(/(\d{2})\s*do\s*(\d{2})/)
20
- #puts hours_first.inspect
21
- hours_add = body.scan(/<td height=\"40\">.*(\d{2})-(\d{2}).*<\/td>/)
22
- #puts hours_add.inspect
23
- hours = hours_first + hours_add
24
- #puts hours.inspect
25
-
26
- # interia uses min/aesthes./max temperatures, aesth. used
27
- temperatures = body.scan(/<span\s*class=\"tex2b\"\s*style=\"font-size:\s*14px;\">(-?\d+)<\/span>/)
28
- # there is 'sample' temperature which should be deleted
29
- temperatures.delete_at(2) # if temperatures[2] == 5
30
- #puts temperatures.inspect
31
-
32
- winds = body.scan(/wiatr:\D*(\d+)\D*km\/h\s*</)
33
- #puts winds.inspect
34
-
35
- rains = body.scan(/deszcz:\D*(\d+\.?\d*)\D*mm\s*</)
36
- #puts rains.inspect
37
-
38
- snows = body.scan(/nieg:\D*(\d+\.?\d*)\D*mm\s*</)
39
- #puts snows.inspect
40
-
41
- pressures = body.scan(/<b>(\d{3,4})<\/b>.*hpa/)
42
- #puts pressures.inspect
43
-
44
- # TODO fix it better!
45
- #puts rains.inspect
46
- #puts snows.inspect
47
- if snows.nil? or snows.size < 2
48
- snows = [[nil], [nil], [nil]]
49
- end
50
- if rains.nil? or rains.size < 2
51
- rains = [[nil], [nil], [nil]]
52
- end
53
-
54
- unix_time_today = Time.mktime(
55
- Time.now.year,
56
- Time.now.month,
57
- Time.now.day,
58
- 0, 0, 0, 0)
59
-
60
- unix_time_now_from = unix_time_today + 3600 * hours[0][0].to_i
61
- unix_time_now_to = unix_time_today + 3600 * hours[0][1].to_i
62
- if hours[0][1].to_i < hours[0][0].to_i
63
- # next day
64
- unix_time_now_to += 24 * 3600
65
66
  end
66
67
 
67
- unix_time_soon_from = unix_time_today + 3600 * hours[1][0].to_i
68
- unix_time_soon_to = unix_time_today + 3600 * hours[1][1].to_i
69
- if hours[1][1].to_i < hours[1][0].to_i
70
- # next day
71
- unix_time_soon_to += 24 * 3600
72
- end
73
- if hours[1][0].to_i > hours[1][0].to_i
74
- # time soon is whole new day
75
- unix_time_soon_from += 24 * 3600
76
- unix_time_soon_to += 24 * 3600
77
- end
78
-
79
- # if 1 data is for next day morning
80
- if hours[0][1].to_i < Time.now.hour
81
- unix_time_now_to += 24 * 3600
82
- unix_time_now_from += 24 * 3600
83
-
84
- unix_time_soon_to += 24 * 3600
85
- unix_time_soon_from += 24 * 3600
86
- end
87
-
88
- # TODO zrób auto testy dla innych typów
89
- # TODO i dodaj inkrementacje dnia po
90
- # if 1 data is for next day morning
91
- if unix_time_now_to > unix_time_soon_to
92
- unix_time_soon_to += 24 * 3600
93
- unix_time_soon_from += 24 * 3600
94
- end
95
-
96
- data = [
97
- {
98
- :time_created => Time.now,
99
- :time_from => unix_time_now_from,
100
- :time_to => unix_time_now_to,
101
- :temperature => temperatures[0][0].to_f,
102
- :pressure => pressures[0][0].to_f,
103
- :wind_kmh => winds[0][0].to_f,
104
- :wind => winds[0][0].to_f / 3.6,
105
- :snow => snows[0][0].to_f,
106
- :rain => rains[0][0].to_f,
107
- :provider => self.class.provider_name
108
- },
109
- {
110
- :time_created => Time.now,
111
- :time_from => unix_time_soon_from,
112
- :time_to => unix_time_soon_to,
113
- :temperature => temperatures[1][0].to_f,
114
- :pressure => pressures[1][0].to_f,
115
- :wind_kmh => winds[1][0].to_f,
116
- :wind => winds[1][0].to_f / 3.6,
117
- :snow => snows[1][0].to_f,
118
- :rain => rains[1][0].to_f,
119
- :provider => self.class.provider_name
120
- }
121
- ]
122
-
123
68
  return data
124
69
  end
125
-
126
70
  end
127
-
128
71
  end
129
-
@@ -1,5 +1,8 @@
1
1
  #encoding: utf-8
2
2
 
3
+ require 'nokogiri'
4
+ require 'time'
5
+
3
6
  module WeatherFetcher
4
7
  class Provider::OnetPl < HtmlBasedProvider
5
8
 
@@ -9,107 +12,44 @@ module WeatherFetcher
9
12
 
10
13
  def process(string)
11
14
  a = Array.new
12
- a += WeatherData.factory(_process_body(string))
15
+ a += WeatherData.factory(_process_body_long_term(string))
13
16
  return a
14
17
  end
15
18
 
16
19
  # Process response body and rip out weather data, details
17
- def _process_body(body_raw)
18
-
19
- body_tmp = body_raw.downcase
20
- body = body_tmp
21
-
22
- times = body.scan(/<span class=\"time\">godz. <strong>(\d+)-(\d+)/i)
23
- temperatures = body.scan(/<span class="temp">\s*(-*\d+)[^<]+<\/span>/i)
24
- pressures = body.scan(/(\d*)\s*hpa/i)
25
- winds = body.scan(/(\d*)\s*km\/h/)
26
- # no more snow :(
27
- #snows = body.scan(/nieg:<\/td><td class=\"[^"]*\">\s*([0-9.]*)\s*mm</)
28
- snow = []
29
- #rains = body.scan(/Deszcz:\s*<\/label>\s*([0-9,]+)\s*mm/i)
30
- rains = body.scan(/Deszcz:[^0-9]*([0-9,]+)\s*mm/i)
31
-
32
- unix_time_today = Time.mktime(
33
- Time.now.year,
34
- Time.now.month,
35
- Time.now.day,
36
- 0, 0, 0, 0)
37
-
38
- # should be ok
39
- # puts times.size, temperatures.size, pressures.size, winds.size, rains.size
40
- # puts times.inspect, temperatures.inspect, pressures.inspect, winds.inspect, rains.inspect
41
-
20
+ def _process_body_long_term(body_raw)
42
21
  data = Array.new
22
+ b = Nokogiri::HTML(body_raw)
43
23
 
44
- # today
45
- (0..3).each do |i|
46
- h = {
47
- :time_created => Time.now,
48
- :time_from => unix_time_today + times[i][0].to_i * 3600,
49
- :time_to => unix_time_today + times[i][1].to_i * 3600,
50
- :temperature => temperatures[1 + i][0].to_f,
51
- :pressure => pressures[0][0].to_f,
52
- :wind_kmh => winds[0][0].to_f,
53
- :wind => winds[0][0].to_f / 3.6,
54
- :snow => nil, #snows[0][0].to_f,
55
- :rain => rains[0][0].gsub(/,/, '.').to_f,
56
- :provider => self.class.provider_name
57
- }
58
- h[:time_to] += 24*3600 if h[:time_to] < h[:time_from]
24
+ weather_days = b.css(".day-longterm")
25
+ weather_days.each do |weather_day|
26
+ time_from = Time.parse(weather_day.css("time").attribute("datetime").value.to_s)
27
+ temp = weather_day.css(".temp").children.first.to_s.to_f
59
28
 
60
- data << h
61
- end
29
+ desc = weather_day.css(".details").children.collect { |d| d.to_s.gsub(/\n/, "").gsub(/\t/, "") }
30
+ pressure = desc[3].to_f
31
+ wind = desc[7].to_f
32
+ rain = desc[10].gsub(/,/, '.').to_f
62
33
 
63
- # tomorrow
64
- (4..7).each do |i|
65
34
  h = {
66
35
  :time_created => Time.now,
67
- :time_from => unix_time_today + times[i][0].to_i * 3600 + 24*3600,
68
- :time_to => unix_time_today + times[i][1].to_i * 3600 + 24*3600,
69
- :temperature => temperatures[6 + i][0].to_f,
70
- :pressure => pressures[1][0].to_f,
71
- :wind_kmh => winds[1][0].to_f,
72
- :wind => winds[1][0].to_f / 3.6,
73
- :snow => nil, #snows[0][0].to_f,
74
- :rain => rains[1][0].gsub(/,/, '.').to_f,
36
+ :time_from => time_from,
37
+ :time_to => time_from + 24*3600,
38
+ :temperature => temp,
39
+ #:feel_temperature => feel_temp,
40
+ :pressure => pressure,
41
+ :wind_kmh => wind,
42
+ :wind => wind / 3.6,
43
+ # :snow => nil, #snows[0][0].to_f,
44
+ :rain => rain,
45
+ #:cloud_cover => cloud_cover,
46
+ #:humidity => humidity,
75
47
  :provider => self.class.provider_name
76
48
  }
77
- h[:time_to] += 24*3600 if h[:time_to] < h[:time_from]
78
-
79
49
  data << h
80
- end
81
- # puts data.to_yaml
82
-
83
- # longer
84
- dates = body.scan(/<time datetime=\"(\d{4})-(\d{1,2})-(\d{1,2})\">/i)
85
50
 
86
- # sometimes 10, sometimes 9
87
- (0..9).each do |i|
88
- unix_time = Time.mktime(
89
- dates[i][0].to_i,
90
- dates[i][1].to_i,
91
- dates[i][2].to_i
92
- )
93
- # puts unix_time, dates[i].inspect
94
-
95
- h = {
96
- :time_created => Time.now,
97
- :time_from => unix_time,
98
- :time_to => unix_time + 24*3600,
99
- :temperature => temperatures[13 + i][0].to_f,
100
- :pressure => pressures[3 + i][0].to_f,
101
- :wind_kmh => winds[3 + i][0].to_f,
102
- :wind => winds[3 + i][0].to_f / 3.6,
103
- :snow => nil, #snows[0][0].to_f,
104
- :rain => rains[3 + i][0].gsub(/,/, '.').to_f,
105
- :provider => self.class.provider_name
106
- }
107
- h[:time_to] += 24*3600 if h[:time_to] < h[:time_from]
108
-
109
- data << h
51
+ # puts h.inspect
110
52
  end
111
- # puts data.to_yaml
112
-
113
53
  return data
114
54
  end
115
55
 
@@ -25,7 +25,8 @@ module WeatherFetcher
25
25
 
26
26
  # Url for current provider
27
27
  def url(p)
28
- "http://free.worldweatheronline.com/feed/weather.ashx?key=#{@@api}&q=#{p[:coords][:lat]},#{p[:coords][:lon]}&num_of_days=2&format=json"
28
+ #"http://free.worldweatheronline.com/feed/weather.ashx?key=#{@@api}&q=#{p[:coords][:lat]},#{p[:coords][:lon]}&num_of_days=2&format=json"
29
+ "http://api.worldweatheronline.com/free/v1/weather.ashx?q=#{p[:coords][:lat]},#{p[:coords][:lon]}&format=json&num_of_days=5&key=#{@@api}"
29
30
  end
30
31
 
31
32
  def can_fetch?(p)
@@ -1,5 +1,8 @@
1
1
  #encoding: utf-8
2
2
 
3
+ require 'nokogiri'
4
+ require 'time'
5
+
3
6
  module WeatherFetcher
4
7
  class Provider::WpPl < HtmlBasedProvider
5
8
 
@@ -8,105 +11,70 @@ module WeatherFetcher
8
11
  end
9
12
 
10
13
  def process(string)
11
- return WeatherData.factory( _process(string) )
14
+ return WeatherData.factory(_process(string))
12
15
  end
13
16
 
14
17
  # Process response body and rip out weather data
15
18
  def _process(body_raw)
16
-
17
- body = body_raw.downcase
18
-
19
- # days from detailed weather
20
- days = body.scan(/(\d{1,2})\.(\d{1,2})\.(\d{4})/)
21
- #puts days.inspect
22
- #puts days.size
23
-
24
- hours = body.scan(/(\d{2})-(\d{2})/)
25
- hours = hours.select { |h| h[0].to_i <= 24 and h[1].to_i <= 24 }
26
- #puts hours.inspect
27
- #puts hours.size
28
-
29
- # create times
30
- i_day = 0
31
- times = Array.new
32
-
33
- (0...(hours.size)).each do |ih|
34
- # next day
35
- if ih > 0 and hours[ih][0].to_i < hours[ih - 1][0].to_i
36
- i_day += 1
19
+ data = Array.new
20
+ b = Nokogiri::HTML(body_raw)
21
+
22
+ current_day_time = unix_time_today
23
+ weather_days = b.css(".obszar")
24
+ weather_days.each do |w|
25
+ time = w.css(".czas").children.first.to_s.gsub(/\s/, '')
26
+ time =~ /(\d{2}):(\d{2})-(\d{2}):(\d{2})/
27
+ time_from = current_day_time + 3600*$1.to_i + 60*$2.to_i
28
+ time_to = current_day_time + 3600*$3.to_i + 60*$4.to_i
29
+
30
+ temp_night = w.css(".tempNoc").children.first
31
+ temp_day = w.css(".tempDzien").children.first
32
+ temp = nil
33
+ if temp_night
34
+ temp = temp_night.children.first.to_s.to_f
35
+ end
36
+ if temp_day
37
+ temp = temp_day.children.first.to_s.to_f
37
38
  end
38
39
 
39
- # can not create time with hour 24
40
- hour_from = hours[ih][0].to_i
41
- hour_from = 0 if hour_from == 24
42
- time_from = Time.mktime(
43
- days[i_day][2].to_i,
44
- days[i_day][1].to_i,
45
- days[i_day][0].to_i,
46
- hour_from,
47
- 0,
48
- 0,
49
- 0
50
- )
51
- time_from += 24*3600 if hours[ih][0].to_i == 24
52
-
53
- hour_to = hours[ih][1].to_i
54
- hour_to = 0 if hour_to == 24
55
- time_to = Time.mktime(
56
- days[i_day][2].to_i,
57
- days[i_day][1].to_i,
58
- days[i_day][0].to_i,
59
- hour_to,
60
- 0,
61
- 0,
62
- 0
63
- )
64
- time_to += 24*3600 if hours[ih][1].to_i == 24
65
-
66
- h = { :time_from => time_from, :time_to => time_to }
67
- times << h
68
- end
69
- # puts times.to_yaml
70
- #puts times.size
71
-
72
- temperatures = body.scan(/temperatura:\s*<strong>(-?\d+)[^<]*<\/strong>/)
73
- #puts temperatures.inspect
74
- #puts temperatures.size
40
+ temp_feel = w.css(".tempOdczuwalna").children.first
41
+ if temp_feel
42
+ temp_feel = temp_feel.children.first.to_s.to_f
43
+ end
75
44
 
76
- #winds = body.scan(/<strong>(\d*\.?\d*)\s*km\/h<\/strong>/)
77
- #winds.slice!(0,5)
78
- winds = body.scan(/<td width=\"30%\">[^<]*<strong>(\d*\.?\d*)\s*km\/h<\/strong>/)
79
- #puts winds.inspect
80
- #puts winds.size
45
+ pressure = w.css("span.cisnienie").children.first
46
+ if pressure
47
+ pressure = pressure.to_s.to_f
48
+ end
81
49
 
82
- data = Array.new
50
+ rain = w.css(".opady").children.first
51
+ if rain
52
+ rain = rain.children[1].to_s.to_f
53
+ end
83
54
 
84
- (0...(temperatures.size)).each do |i|
85
- t = temperatures[i][0]
86
- t = t.to_f unless t.nil?
87
-
88
- wind_speed_km_per_h = winds[i][0]
89
- if t.nil?
90
- wind_speed_km_per_h = nil
91
- w = nil
92
- else
93
- wind_speed_km_per_h = wind_speed_km_per_h.to_f
94
- w = wind_speed_km_per_h / 3.6
55
+ wind = w.css(".wiatrPredkosc").children.first
56
+ if wind
57
+ wind = wind.children.first.to_s.to_f
95
58
  end
96
59
 
97
60
  h = {
98
61
  :time_created => Time.now,
99
- :time_from => times[i][:time_from],
100
- :time_to => times[i][:time_to],
101
- :temperature => t,
102
- #:pressure => nil,
103
- :wind_kmh => wind_speed_km_per_h,
104
- :wind => w,
105
- #:snow => snows[0][0].to_f,
106
- #:rain => rains[0][0].to_f,
62
+ :time_from => time_from,
63
+ :time_to => time_to,
64
+ :temperature => temp,
65
+ :feel_temperature => temp_feel,
66
+ :pressure => pressure,
67
+ :wind_kmh => wind,
68
+ :wind => wind / 3.6,
69
+ # :snow => nil, #snows[0][0].to_f,
70
+ :rain => rain,
71
+ #:cloud_cover => cloud_cover,
72
+ #:humidity => humidity,
107
73
  :provider => self.class.provider_name
108
74
  }
109
75
 
76
+ # puts h.inspect
77
+
110
78
  data << h
111
79
  end
112
80
 
@@ -1,10 +1,12 @@
1
1
  require 'net/http'
2
+ require 'curb'
2
3
 
3
4
  # All ugly providers who parse even uglier html code and rip off data
4
5
  module WeatherFetcher
5
6
  class HtmlBasedProvider < Provider
6
7
 
7
8
  TYPE = :html_based
9
+ USER_AGENT = "Chrome 32.0.1667.0"
8
10
 
9
11
  # Get processed weather for one definition
10
12
  def fetch_and_process_single(p)
@@ -22,8 +24,20 @@ module WeatherFetcher
22
24
  end
23
25
 
24
26
  # Download url
27
+ def fetch_url_old(url)
28
+ s = Net::HTTP.get2(URI.parse(url), { 'User-Agent' => USERAGENT })
29
+ puts s.inspect, url
30
+ return s
31
+ end
32
+
25
33
  def fetch_url(url)
26
- return Net::HTTP.get(URI.parse(url))
34
+ http = Curl::Easy.perform(url) do |curl|
35
+ curl.headers["User-Agent"] = USER_AGENT
36
+ curl.enable_cookies = true
37
+ curl.follow_location = true
38
+ end
39
+ s = http.body_str
40
+ return s
27
41
  end
28
42
 
29
43
  # Url for current provider
@@ -88,6 +88,14 @@ module WeatherFetcher
88
88
  raise NotImplementedError
89
89
  end
90
90
 
91
+ def unix_time_today
92
+ Time.mktime(
93
+ Time.now.year,
94
+ Time.now.month,
95
+ Time.now.day,
96
+ 0, 0, 0, 0)
97
+ end
98
+
91
99
  def self.short_class_name
92
100
  self.to_s.gsub(/^.*::/, '')
93
101
  end
metadata CHANGED
@@ -1,82 +1,113 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: weather_fetcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.16
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Aleksander Kwiatkowski
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-12-15 00:00:00.000000000Z
11
+ date: 2013-12-24 00:00:00.000000000 Z
13
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: curb
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
14
27
  - !ruby/object:Gem::Dependency
15
28
  name: simple_metar_parser
16
- requirement: &24423700 !ruby/object:Gem::Requirement
17
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
18
30
  requirements:
19
- - - ! '>='
31
+ - - '>='
20
32
  - !ruby/object:Gem::Version
21
33
  version: 0.0.1
22
34
  type: :runtime
23
35
  prerelease: false
24
- version_requirements: *24423700
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.0.1
25
41
  - !ruby/object:Gem::Dependency
26
42
  name: rspec
27
- requirement: &24423080 !ruby/object:Gem::Requirement
28
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
29
44
  requirements:
30
- - - ~>
45
+ - - '>='
31
46
  - !ruby/object:Gem::Version
32
- version: 2.3.0
47
+ version: '0'
33
48
  type: :development
34
49
  prerelease: false
35
- version_requirements: *24423080
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
36
55
  - !ruby/object:Gem::Dependency
37
56
  name: bundler
38
- requirement: &24422440 !ruby/object:Gem::Requirement
39
- none: false
57
+ requirement: !ruby/object:Gem::Requirement
40
58
  requirements:
41
- - - ~>
59
+ - - '>='
42
60
  - !ruby/object:Gem::Version
43
- version: 1.0.0
61
+ version: '0'
44
62
  type: :development
45
63
  prerelease: false
46
- version_requirements: *24422440
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
47
69
  - !ruby/object:Gem::Dependency
48
70
  name: jeweler
49
- requirement: &24421820 !ruby/object:Gem::Requirement
50
- none: false
71
+ requirement: !ruby/object:Gem::Requirement
51
72
  requirements:
52
- - - ~>
73
+ - - '>='
53
74
  - !ruby/object:Gem::Version
54
- version: 1.6.4
75
+ version: '0'
55
76
  type: :development
56
77
  prerelease: false
57
- version_requirements: *24421820
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
58
83
  - !ruby/object:Gem::Dependency
59
84
  name: simplecov
60
- requirement: &24421140 !ruby/object:Gem::Requirement
61
- none: false
85
+ requirement: !ruby/object:Gem::Requirement
62
86
  requirements:
63
- - - ! '>='
87
+ - - '>='
64
88
  - !ruby/object:Gem::Version
65
89
  version: '0'
66
90
  type: :development
67
91
  prerelease: false
68
- version_requirements: *24421140
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: rdoc
71
- requirement: &24392740 !ruby/object:Gem::Requirement
72
- none: false
99
+ requirement: !ruby/object:Gem::Requirement
73
100
  requirements:
74
- - - ! '>='
101
+ - - '>='
75
102
  - !ruby/object:Gem::Version
76
103
  version: '0'
77
104
  type: :development
78
105
  prerelease: false
79
- version_requirements: *24392740
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
80
111
  description: At this moment you can fetch weather http://www.worldweatheronline.com/,
81
112
  from various Polish websites (Onet.pl, Wp.pl, Interia.pl) and from some METAR providers.
82
113
  More providers coming soon :)
@@ -115,29 +146,25 @@ files:
115
146
  homepage: http://github.com/akwiatkowski/weather_fetcher
116
147
  licenses:
117
148
  - LGPLv3
149
+ metadata: {}
118
150
  post_install_message:
119
151
  rdoc_options: []
120
152
  require_paths:
121
153
  - lib
122
154
  required_ruby_version: !ruby/object:Gem::Requirement
123
- none: false
124
155
  requirements:
125
- - - ! '>='
156
+ - - '>='
126
157
  - !ruby/object:Gem::Version
127
158
  version: '0'
128
- segments:
129
- - 0
130
- hash: -4097979390535855784
131
159
  required_rubygems_version: !ruby/object:Gem::Requirement
132
- none: false
133
160
  requirements:
134
- - - ! '>='
161
+ - - '>='
135
162
  - !ruby/object:Gem::Version
136
163
  version: '0'
137
164
  requirements: []
138
165
  rubyforge_project:
139
- rubygems_version: 1.8.15
166
+ rubygems_version: 2.0.3
140
167
  signing_key:
141
- specification_version: 3
168
+ specification_version: 4
142
169
  summary: Fetch weather from various providers in one place
143
170
  test_files: []