weather_fetcher 0.0.5 → 0.0.6

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/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: