weather_fetcher 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.5
1
+ 0.0.6
@@ -2,9 +2,9 @@
2
2
  module WeatherFetcher
3
3
  class Fetcher
4
4
 
5
- def self.fetch(p)
5
+ def self.fetch(p, max_response_time = 0.8)
6
6
  require 'yaml'
7
- classes = ProviderList.providers
7
+ classes = ProviderList.providers(max_response_time)
8
8
  result = Array.new
9
9
 
10
10
  classes.each do |c|
@@ -1,9 +1,9 @@
1
1
  module WeatherFetcher
2
2
  class ProviderList
3
- def self.providers
3
+ def self.providers(speed = 0.7)
4
4
  classes = WeatherFetcher::Provider.constants
5
- classes.collect{|c| WeatherFetcher::Provider.const_get c}.select{|c| c.kind_of? Class}
5
+ classes = classes.collect{|c| WeatherFetcher::Provider.const_get c}.select{|c| c.kind_of? Class}
6
+ classes.select{|k| not defined? k::SLOW or k::SLOW <= speed}
6
7
  end
7
-
8
8
  end
9
9
  end
@@ -9,9 +9,14 @@ module WeatherFetcher
9
9
  # Get processed weather for one definition
10
10
  def fetch_and_process_single(p)
11
11
  return nil unless can_fetch?(p)
12
-
12
+
13
+ @pre_download = Time.now
13
14
  body = fetch_url(url(p))
15
+ @pre_process = Time.now
14
16
  processed = process(body)
17
+ @post_process = Time.now
18
+ store_time_costs(processed)
19
+
15
20
  return processed
16
21
  end
17
22
 
@@ -2,6 +2,9 @@
2
2
 
3
3
  module WeatherFetcher
4
4
  class Provider::AllMetSat < MetarProvider
5
+ # this provider is turned off because long response time
6
+ # typical website response - 5s
7
+ SLOW = 5.0
5
8
 
6
9
  def url_for_metar(metar_city)
7
10
  u = "http://pl.allmetsat.com/metar-taf/polska.php?icao=#{metar_city.upcase}"
@@ -2,6 +2,10 @@
2
2
 
3
3
  module WeatherFetcher
4
4
  class Provider::Wunderground < MetarProvider
5
+ # this provider is turned off because quite long response time
6
+ # and because there are 2 other faster metar providers available
7
+ # typical website response - 1s
8
+ SLOW = 1.1
5
9
 
6
10
  def url_for_metar(metar_city)
7
11
  u = "http://www.wunderground.com/Aviation/index.html?query=#{metar_city.upcase}"
@@ -5,13 +5,17 @@ module WeatherFetcher
5
5
  class MetarProvider < HtmlBasedProvider
6
6
 
7
7
  TYPE = :metar
8
+ # treat metars as not current when time_from is not within time range
9
+ MAX_METAR_TIME_THRESHOLD = 4*3600
8
10
 
9
11
  # Get processed weather for one definition
10
12
  def fetch_and_process_single(p)
11
13
  return nil unless can_fetch?(p)
12
14
 
15
+ @pre_download = Time.now
13
16
  url = url_for_metar(metar(p))
14
17
  body = fetch_url(url)
18
+ @pre_process = Time.now
15
19
  metars = process(body)
16
20
  metars = [metars] unless metars.kind_of?(Array)
17
21
  processed = Array.new
@@ -19,7 +23,7 @@ module WeatherFetcher
19
23
  metars.each do |m|
20
24
  m = SimpleMetarParser::Parser.parse(m)
21
25
 
22
- if m.valid?
26
+ if m.valid? and (m.time_from - Time.now).abs < MAX_METAR_TIME_THRESHOLD
23
27
  processed << {
24
28
  :time_created => Time.now,
25
29
  :time_from => m.time_from,
@@ -30,13 +34,18 @@ module WeatherFetcher
30
34
  :wind => m.wind.mps,
31
35
  :snow_metar => m.specials.snow_metar,
32
36
  :rain_metar => m.specials.rain_metar,
33
- :provider => self.class.provider_name
37
+ :provider => self.class.provider_name,
38
+ :metar_string => m.raw
34
39
  }
35
40
  end
36
41
 
37
42
  end
38
43
 
39
- return WeatherData.factory(processed)
44
+ processed = WeatherData.factory(processed)
45
+ @post_process = Time.now
46
+ store_time_costs(processed)
47
+
48
+ return processed
40
49
  end
41
50
 
42
51
  def self.provider_name
@@ -68,8 +68,13 @@ module WeatherFetcher
68
68
  def fetch_and_process_single(d)
69
69
  return nil unless can_fetch?
70
70
 
71
+ @pre_download = Time.now
71
72
  body = fetch_url(url)
73
+ @pre_process = Time.now
72
74
  processed = process(body)
75
+ @post_process = Time.now
76
+ store_time_costs(processed)
77
+
73
78
  return processed
74
79
  end
75
80
 
@@ -95,5 +100,12 @@ module WeatherFetcher
95
100
  return p[:classes][short_class_name]
96
101
  end
97
102
 
103
+ def store_time_costs(_processed)
104
+ _processed.each do |p|
105
+ p.time_costs[:download_time] = @pre_process - @pre_download
106
+ p.time_costs[:process_time] = @post_process - @pre_process
107
+ end
108
+ end
109
+
98
110
  end
99
111
  end
@@ -0,0 +1,21 @@
1
+ # Helps getting provider classes which should be executed because
2
+ # there might be updated weather
3
+ module WeatherFetcher
4
+ class SchedulerHelper
5
+
6
+ def self.recommended_providers(_wd, speed = 0.7)
7
+ # all available
8
+ all_providers_classes = ProviderList.providers(speed)
9
+
10
+ # getting list providers to remove because there is now
11
+ # new weather available
12
+ providers_to_remove = _wd.select{|w| w.next_fetch_time > Time.now}.collect{|w| w.provider}.uniq
13
+
14
+ # remove providers
15
+ recommended = all_providers_classes.select{|k| ([k.provider_name] & providers_to_remove).size == 0}
16
+
17
+ return recommended
18
+ end
19
+
20
+ end
21
+ end
@@ -2,13 +2,13 @@
2
2
  module WeatherFetcher
3
3
  class WeatherData
4
4
 
5
- # TODO move to other gem
5
+ attr_accessor :time_costs
6
6
 
7
7
  def initialize(h = { })
8
+ @time_costs = Hash.new
8
9
  @h = h
9
10
  @h.keys.each do |k|
10
11
  self.instance_variable_set("@#{k}".to_sym, @h[k])
11
- #send :attr_accessor, k
12
12
  end
13
13
  end
14
14
 
@@ -37,7 +37,9 @@ module WeatherFetcher
37
37
  @next_fetch_time = @fetch_time + _interval
38
38
  end
39
39
 
40
- attr_reader :temperature, :wind, :time_from, :time_to, :fetch_time, :next_fetch_time
40
+ attr_reader :time_created, :time_from, :time_to, :fetch_time, :next_fetch_time,
41
+ :temperature, :wind, :pressure, :wind_kmh, :snow, :rain,
42
+ :provider
41
43
 
42
44
  end
43
45
  end
@@ -6,6 +6,7 @@ require 'weather_fetcher/weather_data'
6
6
  require 'weather_fetcher/providers'
7
7
  require 'weather_fetcher/provider_list'
8
8
  require 'weather_fetcher/fetcher'
9
+ require 'weather_fetcher/scheduler_helper'
9
10
  require 'weather_fetcher/server'
10
11
 
11
12
  module WeatherFetcher
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: weather_fetcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-09-15 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: simple_metar_parser
16
- requirement: &13340220 !ruby/object:Gem::Requirement
16
+ requirement: &18527420 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.0.1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *13340220
24
+ version_requirements: *18527420
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &13339720 !ruby/object:Gem::Requirement
27
+ requirement: &18526900 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 2.3.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *13339720
35
+ version_requirements: *18526900
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: bundler
38
- requirement: &13339220 !ruby/object:Gem::Requirement
38
+ requirement: &18526400 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.0.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *13339220
46
+ version_requirements: *18526400
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: jeweler
49
- requirement: &13338700 !ruby/object:Gem::Requirement
49
+ requirement: &18525900 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.6.4
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *13338700
57
+ version_requirements: *18525900
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: simplecov
60
- requirement: &13338200 !ruby/object:Gem::Requirement
60
+ requirement: &18525380 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *13338200
68
+ version_requirements: *18525380
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rdoc
71
- requirement: &13337660 !ruby/object:Gem::Requirement
71
+ requirement: &18524780 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *13337660
79
+ version_requirements: *18524780
80
80
  description: Fetch weather from various Polish websites and via other gems. At the
81
81
  moment it is only polish portal Onet.pl but more providers will come soon.
82
82
  email: bobikx@poczta.fm
@@ -107,6 +107,7 @@ files:
107
107
  - lib/weather_fetcher/providers/metar/wunderground.rb
108
108
  - lib/weather_fetcher/providers/metar_provider.rb
109
109
  - lib/weather_fetcher/providers/provider.rb
110
+ - lib/weather_fetcher/scheduler_helper.rb
110
111
  - lib/weather_fetcher/server.rb
111
112
  - lib/weather_fetcher/utils/time.rb
112
113
  - lib/weather_fetcher/weather_data.rb
@@ -125,7 +126,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
125
126
  version: '0'
126
127
  segments:
127
128
  - 0
128
- hash: -3850165663943565534
129
+ hash: 809385546591305443
129
130
  required_rubygems_version: !ruby/object:Gem::Requirement
130
131
  none: false
131
132
  requirements: