hg-weather 0.1.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c7d4ec3fd09af7a164322701fa97a41c42175df8
4
+ data.tar.gz: 0ceb34a84d0615f0066ee6fc436b269f03c357aa
5
+ SHA512:
6
+ metadata.gz: 59d305e2b8af1144dc45abcffb5ef27edbb3521fbf8a5faf0945dae92124241085fd32c0df2d487d914db46af1b412e7c5fd415cff1a3404fc87e8c552315705
7
+ data.tar.gz: f941ba9d787daaf439193e0649ffc80d273c5a026a2c2aa943920fa29390ed8e9357499569f37a97ec12696f9fec16da00fc55c8dbee7939fd8276eafde70272
@@ -0,0 +1,66 @@
1
+ require 'open-uri'
2
+ require 'json'
3
+
4
+ require 'hg/weather/version'
5
+ require 'hg/weather/data'
6
+
7
+ module HG
8
+ module Weather
9
+ HOST_NAME = '://api.hgbrasil.com/weather'
10
+
11
+ class << self
12
+ # API Key
13
+ attr_accessor :api_key
14
+ @@api_key = nil
15
+
16
+ # API Key status
17
+ attr_reader :api_key_status
18
+ @@api_key_status = :unknown
19
+
20
+ # Use SSL to access the API
21
+ attr_accessor :use_ssl
22
+ @@use_ssl = true
23
+
24
+ # Use Rails cache for recieved data (realy recommended)
25
+ attr_accessor :use_rails_cache
26
+ @@use_rails_cache = true
27
+
28
+ attr_accessor :cid, :city_name, :latitude, :longitude, :client_ip
29
+ @@client_ip = :remote
30
+ end
31
+
32
+ def self.setup(&block)
33
+ yield self
34
+ end
35
+
36
+ def self.get(options = {})
37
+ to_request = {
38
+ lat: options[:latitude], lon: options[:longitude],
39
+ cid: options[:cid], city_name: options[:city_name],
40
+ user_ip: options[:client_ip]
41
+ }.delete_if{|k,v| v.nil?}
42
+
43
+ process(to_request)
44
+ end
45
+
46
+ def self.process params
47
+ params = defaults.merge(params).delete_if{|k,v| v.nil?}
48
+
49
+ return HG::Weather::Data.new(params, HOST_NAME, self.use_ssl)
50
+ end
51
+
52
+ def self.defaults
53
+ {
54
+ lat: self.latitude,
55
+ lon: self.longitude,
56
+ user_ip: self.client_ip,
57
+ cid: self.cid,
58
+ city_name: self.city_name,
59
+ key: self.api_key,
60
+ format: :json,
61
+ sdk_version: "ruby_#{HG::Weather::VERSION}"
62
+ }
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,104 @@
1
+ require 'hg/weather/temperature'
2
+
3
+ module HG
4
+ module Weather
5
+
6
+ class Condition
7
+ ONE_DAY = 86_400
8
+
9
+ # Public: Temperature
10
+ attr_accessor :temperature
11
+
12
+ # Public: Max Temperature
13
+ attr_accessor :max_temperature
14
+
15
+ # Public: Min Temperature
16
+ attr_accessor :min_temperature
17
+
18
+ # Public: Humidity
19
+ attr_accessor :humidity
20
+
21
+ # Public: Image ID
22
+ attr_accessor :image_id
23
+
24
+ # Public: Description
25
+ attr_accessor :description
26
+
27
+ # Public: Slug
28
+ attr_accessor :slug
29
+
30
+ # Public: Wind speedy
31
+ attr_accessor :wind_speed
32
+
33
+ # Public: Sunrise
34
+ attr_accessor :sunrise
35
+
36
+ # Public: Sunset
37
+ attr_accessor :sunset
38
+
39
+ # Public: Currently, day or night
40
+ attr_accessor :currently
41
+
42
+ # Public: Datetime, if forecast time is always midnight
43
+ attr_accessor :datetime
44
+
45
+ # Public: Is forecast
46
+ attr_accessor :is_forecast
47
+
48
+ def initialize(options = {})
49
+ if options.count != 0
50
+ @temperature = Temperature.new(options[:temperature]) if options[:temperature]
51
+ @max_temperature = Temperature.new(options[:max_temperature]) if options[:max_temperature]
52
+ @min_temperature = Temperature.new(options[:min_temperature]) if options[:min_temperature]
53
+ @humidity = options[:humidity].to_i if options[:humidity]
54
+ @image_id = options[:image_id] if options[:image_id]
55
+ @description = options[:description] if options[:description]
56
+ @slug = options[:slug].to_sym if options[:slug]
57
+ @wind_speed = options[:wind_speed] if options[:wind_speed]
58
+ @currently = (options[:currently] == 'dia' ? :day : :night) if options[:currently]
59
+ @datetime = process_datetime(options[:date], options[:time]) if options[:date]
60
+ @sunrise = process_sunrise(options[:sunrise]) if options[:sunrise]
61
+ @sunset = process_sunset(options[:sunset]) if options[:sunset]
62
+ @is_forecast = options[:is_forecast] if options[:is_forecast]
63
+ end
64
+ end
65
+
66
+ def is_day?
67
+ return nil if self.currently.nil?
68
+ self.currently == :day
69
+ end
70
+
71
+ def is_night?
72
+ return nil if self.currently.nil?
73
+ self.currently == :night
74
+ end
75
+
76
+ protected
77
+ def process_datetime date, time = nil
78
+ return Time.now if date.nil?
79
+
80
+ return Time.strptime((date + ' ' + (time ? time : '00:00')), '%d/%m/%Y %H:%M')
81
+ end
82
+
83
+ def process_sunset sunset
84
+ return nil if sunrise.nil? || self.datetime.nil?
85
+ sunset = Time.parse(sunset)
86
+
87
+ return (sunset > midnight_of(self.datetime + ONE_DAY) ? sunset - ONE_DAY : sunset)
88
+ end
89
+
90
+ def process_sunrise sunrise
91
+ return nil if sunrise.nil? || self.datetime.nil?
92
+ sunrise = Time.parse(sunrise)
93
+
94
+ return (sunrise < midnight_of(self.datetime + ONE_DAY) ? sunrise + ONE_DAY : sunrise)
95
+ end
96
+
97
+ def midnight_of time
98
+ time = Time.now if time.nil?
99
+ Time.new(time.year, time.month, time.day)
100
+ end
101
+ end
102
+
103
+ end
104
+ end
@@ -0,0 +1,71 @@
1
+ require 'hg/weather/condition'
2
+
3
+ module HG
4
+ module Weather
5
+
6
+ class Data
7
+
8
+ attr_accessor :request, :requested_at, :key_status
9
+ attr_accessor :condition, :forecast
10
+ attr_accessor :cid, :city_name, :search_method
11
+
12
+ def initialize params, host_name, use_ssl = true
13
+ query_params = params.map{|k,v| "#{k.to_s}=#{v.to_s}"}.join('&')
14
+ @request = (use_ssl ? 'https' : 'http') + host_name + '?' + query_params
15
+ @requested_at = Time.now
16
+
17
+ request_data = JSON.parse(open(self.request).read)
18
+
19
+ if request_data['results']
20
+ results = request_data['results']
21
+
22
+ @key_status = (params[:key] ? (request_data['key_status'] == 'valida' ? :valid : :invalid) : :empty)
23
+
24
+ @city_name = results['city_name']
25
+ @search_method = request_data['by']
26
+ @cid = results['cid']
27
+
28
+ @condition = Condition.new(to_current(results))
29
+
30
+ @forecast = []
31
+ results['forecast'].each do |forecast|
32
+ @forecast << Condition.new(to_forecast(forecast))
33
+ end
34
+ end
35
+
36
+ return self
37
+ end
38
+
39
+
40
+ def to_current r
41
+ {
42
+ temperature: r['temp'],
43
+ description: r['description'],
44
+ slug: r['condition_slug'],
45
+ wind_speed: r['wind_speedy'],
46
+ humidity: r['humidity'],
47
+ image_id: r['image_id'],
48
+ sunrise: r['sunrise'],
49
+ sunset: r['sunset'],
50
+ currently: r['currently'],
51
+ date: r['date'],
52
+ time: r['time'],
53
+ is_forecast: false
54
+ }
55
+ end
56
+
57
+ # TODO: Improve to get year of date
58
+ def to_forecast r
59
+ {
60
+ date: r['date'] + '/' + Time.now.year.to_s,
61
+ max_temperature: r['max'],
62
+ min_temperature: r['min'],
63
+ description: r['description'],
64
+ condition_slug: r['condition'],
65
+ is_forecast: true
66
+ }
67
+ end
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,23 @@
1
+ module HG
2
+ module Weather
3
+
4
+ class Temperature
5
+ attr_accessor :celsius
6
+ attr_accessor :fahrenheit
7
+
8
+ def initialize temperature, format = :c
9
+ return if temperature.nil?
10
+ temperature = temperature.to_f
11
+
12
+ if format == :c
13
+ @celsius = temperature
14
+ @fahrenheit = (temperature * 1.8) + 32
15
+ else
16
+ @fahrenheit = temperature
17
+ @celsius = (temperature - 32) / 1.8
18
+ end
19
+ end
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,5 @@
1
+ module HG
2
+ module Weather
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hg-weather
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Hugo Demiglio
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-04-05 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Get current and forecast weather using HG Weather API.
14
+ email:
15
+ - hugodemiglio@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/hg/weather.rb
21
+ - lib/hg/weather/condition.rb
22
+ - lib/hg/weather/data.rb
23
+ - lib/hg/weather/temperature.rb
24
+ - lib/hg/weather/version.rb
25
+ homepage: http://hgbrasil.com/weather
26
+ licenses:
27
+ - MIT
28
+ metadata: {}
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubyforge_project:
45
+ rubygems_version: 2.4.8
46
+ signing_key:
47
+ specification_version: 4
48
+ summary: Simple gem to get weather data from HG Weather.
49
+ test_files: []