weather_pinpoint_jp 0.0.1 → 0.0.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.
@@ -1,3 +1,3 @@
1
1
  module WeatherPinpointJp
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -3,8 +3,8 @@
3
3
  require "weather_pinpoint_jp/version"
4
4
  require 'net/http'
5
5
  require 'uri'
6
- require 'nokogiri'
7
6
  require 'open-uri'
7
+ require 'rexml/document'
8
8
  require 'pp'
9
9
 
10
10
  module WeatherPinpointJp
@@ -13,42 +13,57 @@ module WeatherPinpointJp
13
13
  STATION = 2
14
14
  POSTAL_CODE = 3
15
15
 
16
+ # weather code
17
+ SUNNY = 100
18
+ CLOUDY = 200
19
+ RAINY = 300
20
+ SNOWY = 400
21
+ HEAT_WAVE = 500
22
+ HEAVY_RAIN = 850
23
+
16
24
  class << self
17
25
  def get(keyword, type = ADDRESS)
18
26
  search_url = URI.parse("http://weathernews.jp/pinpoint/cgi/search_point.cgi")
19
- html_url = nil
20
- xml_url = nil
21
- name = nil
22
27
 
23
28
  # search location...
29
+ body = ""
24
30
  Net::HTTP.start(search_url.host, search_url.port) do |http|
25
31
  query = "<search><keyword>#{keyword}</keyword><category>#{type}</category></search>"
26
-
27
32
  res = http.post(search_url.path, query, {})
28
- escaped_body = res.body.gsub(/\&/, "&amp;")
29
- doc = Nokogiri::XML(escaped_body)
30
-
31
- result_num = doc.search('seac_cnt').children[0].content.to_i
32
- if result_num == 0
33
- raise "cannot find the location..."
34
- end
35
-
36
- html_url = doc.search('url').children[0].content
37
- name = doc.search('name').children[0].content
33
+ body = res.body
38
34
  end
39
35
 
40
- # get html...
41
- doc = Nokogiri::HTML(open(html_url))
36
+ # get location name & html url
37
+ (name, html_url) = get_name_and_url(body)
42
38
 
43
39
  # find the location code...
44
- onload_str = doc.search('body').first.attribute('onload').value
45
- location_code = onload_str.scan(/obsOrg=(.*?)&xmlFile/)[0][0]
40
+ location_code = get_code(html_url)
46
41
 
47
42
  # return pinpoint forecast instance...
48
43
  xml_url = "http://weathernews.jp/pinpoint/xml/#{location_code}.xml"
49
44
  return load(name, xml_url)
50
45
  end
51
46
 
47
+ def get_name_and_url(xml_str)
48
+ escaped_body = xml_str.gsub(/\&/, "&amp;")
49
+
50
+ doc = REXML::Document.new(escaped_body)
51
+ result_num = doc.elements['/pin_result/seac_cnt'].text.to_i
52
+ if result_num == 0
53
+ raise "cannot find the location..."
54
+ end
55
+
56
+ html_url = doc.elements['/pin_result/data_ret/ret/url'].text
57
+ name = doc.elements['/pin_result/data_ret/ret/name'].text
58
+
59
+ [name, html_url]
60
+ end
61
+
62
+ def get_code(url)
63
+ html = open(url).read
64
+ location_code = html.scan(/obsOrg=(.*?)&xmlFile/)[0][0]
65
+ end
66
+
52
67
  def load(name, url)
53
68
  return Forecast.new(name, url)
54
69
  end
@@ -60,33 +75,33 @@ module WeatherPinpointJp
60
75
  @url = url
61
76
 
62
77
  # load xml
63
- doc = Nokogiri::XML(open(url))
64
- day = doc.xpath('//weathernews/data/day')[0]
78
+ doc = REXML::Document.new(open(url))
79
+ day = doc.elements['//weathernews/data/day']
65
80
 
66
81
  # get starttime
67
- year = day.attribute('startYear').content.to_i
68
- month = day.attribute('startMonth').content.to_i
69
- date = day.attribute('startDate').content.to_i
70
- hour = day.attribute('startHour').content.to_i
82
+ year = day.attributes['startYear'].to_i
83
+ month = day.attributes['startMonth'].to_i
84
+ date = day.attributes['startDate'].to_i
85
+ hour = day.attributes['startHour'].to_i
71
86
 
72
87
  @start_time = Time.local(year, month, date, hour, 0, 0)
73
88
 
74
89
  # weather
75
90
  @weather = []
76
- day.xpath('weather/hour').children.each do |e|
77
- @weather << e.content.to_i
91
+ day.elements.each('weather/hour') do |e|
92
+ @weather << e.text.to_i
78
93
  end
79
94
 
80
95
  # temperature
81
96
  @temperature = []
82
- day.xpath('temperature/hour').children.each do |e|
83
- @temperature << e.content.to_i
97
+ day.elements.each('temperature/hour') do |e|
98
+ @temperature << e.text.to_i
84
99
  end
85
100
 
86
101
  # precipitation
87
102
  @precipitation = []
88
- day.xpath('precipitation/hour').children.each do |e|
89
- @precipitation << e.content.to_i
103
+ day.elements.each('precipitation/hour') do |e|
104
+ @precipitation << e.text.to_i
90
105
  end
91
106
  end
92
107
 
@@ -0,0 +1 @@
1
+ obsOrg=12345&xmlFile
data/test/test_data.xml CHANGED
@@ -116,4 +116,5 @@
116
116
  <hour>46</hour>
117
117
  </precipitation>
118
118
  </day>
119
+ </data>
119
120
  </weathernews>
@@ -0,0 +1,14 @@
1
+ <pin_result>
2
+ <ret_cnt>1</ret_cnt>
3
+ <seac_cnt>1</seac_cnt>
4
+ <data_ret>
5
+ <ret>
6
+ <name>地名1</name>
7
+ <url>http://example.com/result_url_1?text=1&test2=2&test3=3</url>
8
+ </ret>
9
+ <ret>
10
+ <name>地名2</name>
11
+ <url>http://example.com/result_url_2?text=1&test2=2&test3=3</url>
12
+ </ret>
13
+ </data_ret>
14
+ </pin_result>
data/test/test_load.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # -*- coding:utf-8 -*-
1
2
  require 'rubygems'
2
3
  require 'bundler/setup'
3
4
  $:.unshift File.expand_path '../lib', File.dirname(__FILE__)
@@ -18,12 +19,25 @@ class TestLoad < Minitest::Test
18
19
  assert_equal f.nil?, true
19
20
  end
20
21
 
22
+ def test_get_name_and_url
23
+ result_xml = open(File.dirname(__FILE__) + "/test_data_result.xml").read
24
+ (name, url) = WeatherPinpointJp.get_name_and_url(result_xml)
25
+ assert_equal name, "地名1"
26
+ assert_equal url, "http://example.com/result_url_1?text=1&test2=2&test3=3"
27
+ end
28
+
29
+ def test_get_code
30
+ url = File.dirname(__FILE__) + "/test_data.html"
31
+ code = WeatherPinpointJp.get_code(url)
32
+ assert_equal code, "12345"
33
+ end
34
+
21
35
  def test_load
22
36
  f = WeatherPinpointJp.load("test_data", File.dirname(__FILE__) + "/test_data.xml")
23
37
  assert_equal f.nil?, false, "load() failed..."
24
38
 
25
39
  # start time
26
- assert_equal f.start_time, Time.new(2013, 11, 12, 13, 0, 0)
40
+ assert_equal f.start_time, Time.new(2013, 11, 12, 13, 0, 0)
27
41
 
28
42
  # weather
29
43
  assert_equal f.weather.size, 36
@@ -21,6 +21,4 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "minitest"
24
-
25
- spec.add_dependency "nokogiri", "~> 1.6"
26
24
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: weather_pinpoint_jp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-13 00:00:00.000000000 Z
12
+ date: 2013-11-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -59,22 +59,6 @@ dependencies:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
- - !ruby/object:Gem::Dependency
63
- name: nokogiri
64
- requirement: !ruby/object:Gem::Requirement
65
- none: false
66
- requirements:
67
- - - ~>
68
- - !ruby/object:Gem::Version
69
- version: '1.6'
70
- type: :runtime
71
- prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ~>
76
- - !ruby/object:Gem::Version
77
- version: '1.6'
78
62
  description: weather information library for ruby
79
63
  email:
80
64
  - yoggy0@gmail.com
@@ -92,7 +76,9 @@ files:
92
76
  - samples/address.rb
93
77
  - samples/postalcode.rb
94
78
  - samples/station.rb
79
+ - test/test_data.html
95
80
  - test/test_data.xml
81
+ - test/test_data_result.xml
96
82
  - test/test_load.rb
97
83
  - weather_pinpoint_jp.gemspec
98
84
  homepage: https://github.com/yoggy/weather_pinpoint_jp
@@ -121,5 +107,7 @@ signing_key:
121
107
  specification_version: 3
122
108
  summary: weather information library for ruby
123
109
  test_files:
110
+ - test/test_data.html
124
111
  - test/test_data.xml
112
+ - test/test_data_result.xml
125
113
  - test/test_load.rb