sunnyday 0.1.2

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 176c4a595e4f4d2ff634509716f5b70878d7c190
4
+ data.tar.gz: 79f0a6c54cd74a4d405d9c6c5fd581c0fa17a5fe
5
+ SHA512:
6
+ metadata.gz: 7b62c768fa1c83cb5eef9f0e842911eb66c55581d1b2d5b36ae34b0ceb1691af650f9c0ded0b7cb59ce3ad29ce5fdc26aff20dff58b7c25cd3b878ea3f25b8fd
7
+ data.tar.gz: febfec8367d0cd912fd676b5cfe4202f8c41782d2d7b731830e99ef81b347a008e4a48ad8756ef21a730360bae0296875791b9a11f5c8a57f472f22ed60623fb
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ .DS_Store
2
+ .idea/**
3
+ lib/bundler/man
4
+ pkg
5
+ rdoc
6
+ spec/reports
7
+ test/tmp
8
+ test/version_tmp
9
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'rake'
data/Gemfile.lock ADDED
@@ -0,0 +1,22 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ sunnyday (0.1.2)
5
+ term-ansicolor
6
+ thor
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ rake (10.1.0)
12
+ term-ansicolor (1.2.2)
13
+ tins (~> 0.8)
14
+ thor (0.18.1)
15
+ tins (0.12.0)
16
+
17
+ PLATFORMS
18
+ ruby
19
+
20
+ DEPENDENCIES
21
+ rake
22
+ sunnyday!
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Heiko Dreyer
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # Readme
2
+
3
+ sunnyday is a ruby wrapper around the openweather.org api.
4
+
5
+ Include the gem and quickly fetch weather data, e.g. like that:
6
+
7
+ SunnyDay::Client.new.current_weather(q: 'London, UK')
8
+
9
+ There is also a CLI:
10
+
11
+ sunnyday weather London,UK
12
+
13
+ However, CLI output is still WIP.
14
+
15
+ ---
16
+ # License
17
+
18
+ Copyright (c) 2013 Heiko Dreyer
19
+
20
+ MIT License
21
+
22
+ Permission is hereby granted, free of charge, to any person obtaining
23
+ a copy of this software and associated documentation files (the
24
+ "Software"), to deal in the Software without restriction, including
25
+ without limitation the rights to use, copy, modify, merge, publish,
26
+ distribute, sublicense, and/or sell copies of the Software, and to
27
+ permit persons to whom the Software is furnished to do so, subject to
28
+ the following conditions:
29
+
30
+ The above copyright notice and this permission notice shall be
31
+ included in all copies or substantial portions of the Software.
32
+
33
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
34
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
35
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
36
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
37
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
38
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
39
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
data/bin/sunnyday ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib = File.expand_path('../../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'sunnyday'
7
+ require 'sunnyday/cli/cli'
8
+
9
+ SunnyDay::CLI.start(ARGV)
@@ -0,0 +1,66 @@
1
+ require 'thor'
2
+ require 'sunnyday/cli/output'
3
+
4
+ module SunnyDay
5
+ class CLI < Thor
6
+ class_option :lat, :type => :numeric
7
+ class_option :long, :type => :numeric
8
+ class_option :id, :type => :numeric
9
+ class_option :units, :type => :string
10
+ class_option :lang, :type => :string
11
+ class_option :app_id, :type => :numeric
12
+ class_option :api_version, :type => :numeric
13
+
14
+ desc 'weather <city>', 'Retrieves current weather for a specific city. You can provide a city name (standard), latitude and longitude or a city id.'
15
+ def weather(city = nil)
16
+ return unless validate(city)
17
+ data = client.current_weather(w_options(city))
18
+ SunnyDay::Output.new.weather(data)
19
+ end
20
+
21
+ desc 'forecast <city>', 'Retrieves current forecast for a specific city. You can provide a city name (standard), latitude and longitude or a city id.'
22
+ def forecast(city = nil)
23
+ return unless validate(city)
24
+ data = client.forecast(w_options(city))
25
+ SunnyDay::Output.new.forecast(data)
26
+ end
27
+
28
+ desc 'd_forecast <days> <city>', 'Retrieves daily forecast for a specific city. You can provide a city name (standard), latitude and longitude or a city id.'
29
+ def d_forecast(days, city = nil)
30
+ return unless validate(city)
31
+ opts = w_options(city)
32
+ opts[:cnt] = days
33
+ data = client.daily_forecast(opts)
34
+ SunnyDay::Output.new.daily_forecast(data)
35
+ end
36
+
37
+ desc 'find <city> --limit', 'Searching for city. You can provide a city name (standard) or latitude and longitude.'
38
+ option :limit, :type => :numeric
39
+ def find(city = nil)
40
+ return unless validate(city)
41
+ opts = w_options(city)
42
+ opts[:cnt] = (options[:limit] - 1) if options[:limit] && options[:limit] > 0
43
+ opts.delete(:limit) if opts.has_key?(:limit)
44
+ data = client.find(opts)
45
+ SunnyDay::Output.new.find(data)
46
+ end
47
+
48
+ private
49
+
50
+ def validate(city)
51
+ valid = !city.nil? || (!options[:lat].nil? && !options[:long].nil?) || !options[:id].nil?
52
+ puts 'Sorry, your input doesn’t appear to be valid. Use "sunnyday help" to see available options.' unless valid
53
+ valid
54
+ end
55
+
56
+ def w_options(city)
57
+ opts = options.dup
58
+ opts[:q] = city unless city.nil?
59
+ opts
60
+ end
61
+
62
+ def client(config = {})
63
+ SunnyDay.client(config)
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,52 @@
1
+ require 'term/ansicolor'
2
+
3
+ module SunnyDay
4
+ class Color
5
+ extend Term::ANSIColor
6
+ end
7
+
8
+ class Output
9
+ def weather(data)
10
+ return if has_error?(data)
11
+ print Color.bold, "\nWeather data for #{data[:name]}, #{data[:sys][:country]}\n", Color.clear
12
+ puts Color.green, "Current temperature: #{data[:main][:temp]} degrees.", Color.clear
13
+ puts "Weather: #{data[:weather][0][:description]}\n"
14
+ puts ''
15
+ print "Max temperature: #{data[:main][:temp_max]} degrees.\n"
16
+ print "Min temperature: #{data[:main][:temp_min]} degrees.\n"
17
+ print "Sunrise: #{Time.at(data[:sys][:sunrise])}\n"
18
+ print "Sunset: #{Time.at(data[:sys][:sunset])}\n"
19
+ puts ''
20
+ end
21
+
22
+ def forecast(data)
23
+ return if has_error?(data)
24
+ puts data
25
+ end
26
+
27
+ def daily_forecast(data)
28
+ return if has_error?(data)
29
+ puts data
30
+ end
31
+
32
+ def find(data)
33
+ return if has_error?(data)
34
+ print Color.bold, "\nFound #{data[:count]} #{data[:count] == 1 ? 'entry' : 'entries'}:\n\n", Color.clear
35
+ data[:list].each do |entry|
36
+ print Color.green, "#{entry[:name]}, #{entry[:sys][:country]} -> id: #{entry[:id]}\n",Color.clear
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def has_error?(data)
43
+ has_error = data[:cod].to_s != '200'
44
+ error(data[:message]) if has_error
45
+ has_error
46
+ end
47
+
48
+ def error(message)
49
+ print Color.red, "\n#{message}\n", Color.clear
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,51 @@
1
+ require 'net/http'
2
+ require 'json'
3
+
4
+ module SunnyDay
5
+ class Client
6
+ attr_accessor :config
7
+
8
+ def initialize(options = {})
9
+ @config = SunnyDay::Configuration.new(options)
10
+ end
11
+
12
+ def configure
13
+ yield(@config) if block_given?
14
+ end
15
+
16
+ def current_weather(options = {})
17
+ call('weather', options)
18
+ end
19
+
20
+ def forecast(options = {})
21
+ call('forecast', options)
22
+ end
23
+
24
+ def daily_forecast(options = {})
25
+ call('forecast/daily', options)
26
+ end
27
+
28
+ def find(options = {})
29
+ call('find', options)
30
+ end
31
+
32
+ private
33
+
34
+ def call(path, options = {})
35
+ options.delete(:mode) if options.has_key?(:mode)
36
+ uri = "/data/#{@config.api_version}/#{full_path(path, options)}language=#{@config.language}"
37
+ uri.concat("&units=#{@config.units}") unless @config.units.nil?
38
+ uri.concat("&APPID=#{@config.app_id}") unless @config.app_id.nil?
39
+ response = Net::HTTP.get_response(BASE_URL, uri)
40
+ JSON.parse(response.body, symbolize_names: true)
41
+ end
42
+
43
+ def full_path(path, options)
44
+ string = ''
45
+ options.each_key do |key|
46
+ string << "#{key}=#{options[key]}&"
47
+ end
48
+ "#{path}?#{string}"
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,26 @@
1
+ module SunnyDay
2
+ BASE_URL = 'api.openweathermap.org'
3
+
4
+ class Configuration
5
+ # App id. Default none.
6
+ attr_accessor :app_id
7
+
8
+ # API version. Default 2.5.
9
+ attr_accessor :api_version
10
+
11
+ # Language. Default 'en'
12
+ attr_accessor :language
13
+
14
+ # Units - 'metric' or 'imperial'. Default metric.
15
+ attr_accessor :units
16
+
17
+ def initialize(options = {})
18
+ options.each_key do |key|
19
+ instance_variable_set("@#{key}", options[key])
20
+ end
21
+
22
+ @api_version ||= '2.5'
23
+ @language ||= 'en'
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,3 @@
1
+ module SunnyDay
2
+ VERSION = '0.1.2'
3
+ end
data/lib/sunnyday.rb ADDED
@@ -0,0 +1,12 @@
1
+ require 'sunnyday/configuration'
2
+ require 'sunnyday/client'
3
+
4
+ module SunnyDay
5
+ class << self
6
+ attr_accessor :client
7
+
8
+ def client(options = {})
9
+ @client ||= SunnyDay::Client.new(options)
10
+ end
11
+ end
12
+ end
data/sunnyday.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ $:.push File.expand_path('../lib', __FILE__)
2
+ require 'sunnyday/version'
3
+
4
+ Gem::Specification.new do |s|
5
+ s.platform = Gem::Platform::RUBY
6
+ s.name = 'sunnyday'
7
+ s.version = SunnyDay::VERSION
8
+ s.date = '2013-10-19'
9
+ s.summary = 'Sunnyday is a wrapper around the OpenWeatherMap api (openweathermap.com)'
10
+ s.description = 'The OpenWeatherMap service provides free weather data. This gem is a wrapper around the public api. Visit openweathermap.com for more details.'
11
+ s.authors = ['Heiko Dreyer']
12
+ s.email = 'heiko@boxedfolder.com'
13
+ s.homepage = 'http://github.com/bfolder/sunnyday'
14
+ s.license = 'MIT'
15
+
16
+ s.files = `git ls-files`.split($/)
17
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
19
+ s.require_paths = ['lib']
20
+ s.required_ruby_version = '>= 1.8.7'
21
+ s.add_dependency 'thor'
22
+ s.add_dependency 'term-ansicolor'
23
+ end
data/test/test.rb ADDED
@@ -0,0 +1,49 @@
1
+ $LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/../lib' )
2
+
3
+ require 'test/unit'
4
+ require 'sunnyday'
5
+
6
+ class TestCaseGeneral < Test::Unit::TestCase
7
+ def test_client_configuration
8
+ @client = SunnyDay.client
9
+ assert_not_nil(@client, 'Client should not be nil')
10
+
11
+ @client.configure do |config|
12
+ config.app_id = 21311323
13
+ end
14
+ assert_equal(21311323, @client.config.app_id, 'App id should equal 21311323')
15
+
16
+ @client = SunnyDay::Client.new(app_id: 21311323, language: 'de', api_version: '1.5', units: 'imperial')
17
+ assert_not_nil(@client, 'Client should not be nil')
18
+ assert_equal(21311323, @client.config.app_id, 'App id should equal 21311323')
19
+ assert_equal('de', @client.config.language, 'Language should be de')
20
+ assert_equal('1.5', @client.config.api_version, 'Api version should be 1.5')
21
+ assert_equal('imperial', @client.config.units, 'Units should be imperial')
22
+ end
23
+
24
+ def setup
25
+ @client = SunnyDay.client
26
+ end
27
+
28
+ def test_current_weather
29
+ results = @client.current_weather(q: 'London, UK')
30
+ assert_equal('London', results[:name], 'Should be London')
31
+ end
32
+
33
+ def test_forecast
34
+ results = @client.forecast(q: 'London,UK')
35
+ assert_equal('London', results[:city][:name], 'Should be London')
36
+ end
37
+
38
+ def test_daily_forecast
39
+ results = @client.daily_forecast(q: 'London,UK', cnt: 7)
40
+ assert_equal('London', results[:city][:name], 'Should be London')
41
+ assert_equal(7, results[:list].size, 'This should be 7 days forecast')
42
+ end
43
+
44
+ def test_find
45
+ results = @client.find(q: 'London,UK')
46
+ assert(results[:list].size > 0, 'There should be at least one result')
47
+ assert_equal('London', results[:list][0][:name], 'Should be London')
48
+ end
49
+ end
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sunnyday
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Heiko Dreyer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-10-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
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'
27
+ - !ruby/object:Gem::Dependency
28
+ name: term-ansicolor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: The OpenWeatherMap service provides free weather data. This gem is a
42
+ wrapper around the public api. Visit openweathermap.com for more details.
43
+ email: heiko@boxedfolder.com
44
+ executables:
45
+ - sunnyday
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - .gitignore
50
+ - Gemfile
51
+ - Gemfile.lock
52
+ - LICENSE
53
+ - README.md
54
+ - Rakefile
55
+ - bin/sunnyday
56
+ - lib/sunnyday.rb
57
+ - lib/sunnyday/cli/cli.rb
58
+ - lib/sunnyday/cli/output.rb
59
+ - lib/sunnyday/client.rb
60
+ - lib/sunnyday/configuration.rb
61
+ - lib/sunnyday/version.rb
62
+ - sunnyday.gemspec
63
+ - test/test.rb
64
+ homepage: http://github.com/bfolder/sunnyday
65
+ licenses:
66
+ - MIT
67
+ metadata: {}
68
+ post_install_message:
69
+ rdoc_options: []
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - '>='
75
+ - !ruby/object:Gem::Version
76
+ version: 1.8.7
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ requirements: []
83
+ rubyforge_project:
84
+ rubygems_version: 2.1.11
85
+ signing_key:
86
+ specification_version: 4
87
+ summary: Sunnyday is a wrapper around the OpenWeatherMap api (openweathermap.com)
88
+ test_files:
89
+ - test/test.rb