jma_feed 0.0.2 → 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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/lib/jma_feed/atom/eqvol.rb +7 -0
  3. data/lib/jma_feed/atom/extra.rb +7 -0
  4. data/lib/jma_feed/atom/other.rb +7 -0
  5. data/lib/jma_feed/atom/regular.rb +7 -0
  6. data/lib/jma_feed/atom.rb +70 -0
  7. data/lib/jma_feed/entity/weather_alert/metrics_item.rb +14 -0
  8. data/lib/jma_feed/entity/weather_alert.rb +348 -0
  9. data/lib/jma_feed/node/base_node.rb +4 -0
  10. data/lib/jma_feed/report.rb +14 -1
  11. data/lib/jma_feed/report_entry/jmx/discharge.rb +4 -0
  12. data/lib/jma_feed/report_entry/jmx/earthquake.rb +22 -0
  13. data/lib/jma_feed/report_entry/jmx/earthquake_intensity.rb +14 -0
  14. data/lib/jma_feed/report_entry/jmx/humidity.rb +20 -0
  15. data/lib/jma_feed/report_entry/jmx/precipitation.rb +13 -0
  16. data/lib/jma_feed/report_entry/jmx/significancy.rb +14 -0
  17. data/lib/jma_feed/report_entry/jmx/snow_fall_depth.rb +20 -0
  18. data/lib/jma_feed/report_entry/jmx/tidal_level.rb +20 -0
  19. data/lib/jma_feed/report_entry/jmx/time_define.rb +18 -0
  20. data/lib/jma_feed/report_entry/jmx/visibility.rb +20 -0
  21. data/lib/jma_feed/report_entry/jmx/water_level.rb +4 -0
  22. data/lib/jma_feed/report_entry/jmx/wave_height.rb +20 -0
  23. data/lib/jma_feed/report_entry/jmx/wind_direction.rb +20 -0
  24. data/lib/jma_feed/report_entry/jmx/wind_speed.rb +20 -0
  25. data/lib/jma_feed/report_entry/vphw50.rb +4 -4
  26. data/lib/jma_feed/report_entry/vprn50.rb +5 -4
  27. data/lib/jma_feed/report_entry/vpww54.rb +221 -32
  28. data/lib/jma_feed/report_entry/vxse53.rb +135 -0
  29. data/lib/jma_feed/report_entry.rb +19 -2
  30. data/lib/jma_feed/result.rb +21 -22
  31. data/lib/jma_feed/result_doc.rb +53 -0
  32. data/lib/jma_feed/result_entry.rb +24 -1
  33. data/lib/jma_feed/version.rb +1 -1
  34. data/lib/jma_feed.rb +10 -3
  35. metadata +26 -8
  36. data/lib/jma_feed/api.rb +0 -48
  37. data/lib/jma_feed/entity/alert.rb +0 -176
@@ -0,0 +1,20 @@
1
+ class JMAFeed::JMX::Visibility < Giri::TextNodeInteger
2
+ xml_attribute :type
3
+ xml_attribute :unit
4
+ xml_attribute :ref_id, with_name: "refID"
5
+ xml_attribute :condition
6
+ xml_attribute :description
7
+
8
+ def time_define
9
+ (context.time_define_list || []).find{ref_id && ref_id == _1.time_id}
10
+ end
11
+
12
+ def metrics_item
13
+ @metrics_item ||= JMAFeed::WeatherAlert::MetricsItem.new(
14
+ name: type,
15
+ value: self,
16
+ description: description,
17
+ time_define: time_define,
18
+ )
19
+ end
20
+ end
@@ -4,4 +4,8 @@ class JMAFeed::JMX::WaterLevel < Giri::TextNodeBigDecimal
4
4
  xml_attribute :ref_id, with_name: "refID"
5
5
  xml_attribute :condition
6
6
  xml_attribute :description
7
+
8
+ def time_define
9
+ (context.time_define_list || []).find{ref_id && ref_id == _1.time_id}
10
+ end
7
11
  end
@@ -0,0 +1,20 @@
1
+ class JMAFeed::JMX::WaveHeight < Giri::TextNodeBigDecimal
2
+ xml_attribute :type
3
+ xml_attribute :unit
4
+ xml_attribute :ref_id, with_name: "refID"
5
+ # xml_attribute :condition
6
+ xml_attribute :description
7
+
8
+ def time_define
9
+ (context.time_define_list || []).find{ref_id && ref_id == _1.time_id}
10
+ end
11
+
12
+ def metrics_item
13
+ @metrics_item ||= JMAFeed::WeatherAlert::MetricsItem.new(
14
+ name: type,
15
+ value: self,
16
+ description: description,
17
+ time_define: time_define,
18
+ )
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ class JMAFeed::JMX::WindDirection < Giri::TextNodeString
2
+ xml_attribute :type
3
+ xml_attribute :unit
4
+ xml_attribute :ref_id, with_name: "refID"
5
+ xml_attribute :condition
6
+ xml_attribute :description
7
+
8
+ def time_define
9
+ (context.time_define_list || []).find{ref_id && ref_id == _1.time_id}
10
+ end
11
+
12
+ def metrics_item
13
+ @metrics_item ||= JMAFeed::WeatherAlert::MetricsItem.new(
14
+ name: type,
15
+ value: self,
16
+ description: description,
17
+ time_define: time_define,
18
+ )
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ class JMAFeed::JMX::WindSpeed < Giri::TextNodeInteger
2
+ xml_attribute :type
3
+ xml_attribute :unit
4
+ xml_attribute :ref_id, with_name: "refID"
5
+ xml_attribute :condition
6
+ xml_attribute :description
7
+
8
+ def time_define
9
+ (context.time_define_list || []).find{ref_id && ref_id == _1.time_id}
10
+ end
11
+
12
+ def metrics_item
13
+ @metrics_item ||= JMAFeed::WeatherAlert::MetricsItem.new(
14
+ name: type,
15
+ value: self,
16
+ description: description,
17
+ time_define: time_define,
18
+ )
19
+ end
20
+ end
@@ -22,19 +22,19 @@ class JMAFeed::VPHW50 < JMAFeed::ReportEntry
22
22
  end
23
23
  end
24
24
 
25
- def warning_district_report
25
+ def warning_area_type1
26
26
  warning.find{|w| w.type == "竜巻注意情報(発表細分)"}
27
27
  end
28
28
 
29
- def warning_district_1st
29
+ def warning_area_type2
30
30
  warning.find{|w| w.type == "竜巻注意情報(一次細分区域等)"}
31
31
  end
32
32
 
33
- def warning_district_aggregated
33
+ def warning_area_type3
34
34
  warning.find{|w| w.type == "竜巻注意情報(市町村等をまとめた地域等)"}
35
35
  end
36
36
 
37
- def warning_district_2nd
37
+ def warning_area_type4
38
38
  warning.find{|w| w.type == "竜巻注意情報(市町村等)"}
39
39
  end
40
40
  end
@@ -40,6 +40,7 @@ class JMAFeed::VPRN50 < JMAFeed::ReportEntry
40
40
 
41
41
  xml_node :body do
42
42
  xml_node_collection :meteorological_infos do
43
+ xml_attribute :type
43
44
  xml_node_collection :meteorological_info do
44
45
  date_time_node :date_time
45
46
  xml_node_collection :item do
@@ -82,19 +83,19 @@ class JMAFeed::VPRN50 < JMAFeed::ReportEntry
82
83
  end
83
84
  end
84
85
 
85
- def info_district_forecast
86
+ def info_area_type1
86
87
  meteorological_infos[0].meteorological_info[0]
87
88
  end
88
89
 
89
- def info_district_1st
90
+ def info_area_type2
90
91
  meteorological_infos[1].meteorological_info[0]
91
92
  end
92
93
 
93
- def info_district_aggregated
94
+ def info_area_type3
94
95
  meteorological_infos[2].meteorological_info[0]
95
96
  end
96
97
 
97
- def info_district_2nd
98
+ def info_area_type4
98
99
  meteorological_infos[3].meteorological_info[0]
99
100
  end
100
101
  end
@@ -11,67 +11,256 @@
11
11
  # </MeteorologicalInfos>
12
12
  #
13
13
  class JMAFeed::VPWW54 < JMAFeed::ReportEntry
14
+ class WarningItemKind < Giri::BaseNode
15
+ text_node :name
16
+ text_node :code
17
+ text_node :status
18
+ text_node :condition
19
+ xml_node :last_kind do
20
+ text_node :name
21
+ text_node :code
22
+ end
23
+ xml_node_collection :next_kinds do
24
+ xml_node :next_kind do
25
+ text_node :name
26
+ text_node :code
27
+ date_time_node :date_time do
28
+ xml_attribute :precision, type: :duration
29
+ end
30
+ text_node :sentence
31
+ end
32
+ end
33
+ xml_node :attention do
34
+ text_node :note, collection: true
35
+ end
36
+ xml_node :addition do
37
+ text_node :note, collection: true
38
+ end
39
+
40
+ def weather_alert
41
+ @weather_alert ||= JMAFeed::WeatherAlert.all.find{|a| a.code == code}
42
+ end
43
+ end
44
+
14
45
  xml_node :body do
46
+ text_node :notice, collection: true
15
47
  xml_node_collection :warning do
16
48
  xml_attribute :type
17
49
  xml_node_collection :item do
18
- xml_node_collection :kind do
19
- text_node :name
20
- text_node :code
21
- text_node :status
22
- text_node :condition
23
- xml_node :attention do
24
- text_node :note, collection: true
25
- end
26
- xml_node :addition do
27
- text_node :note, collection: true
28
- end
29
-
30
- def alert
31
- @alert ||= JMAFeed::Alert.all.find{|a| a.code == code}
32
- end
33
- end
50
+ xml_node_collection :kind, type: "JMAFeed::VPWW54::WarningItemKind"
34
51
  text_node :change_status
35
52
  xml_node :area, type: "JMAFeed::JMX::Area"
36
53
 
37
- JMAFeed::Alert.clusters.each do |cluster,alerts|
54
+ JMAFeed::WeatherAlert.clusters.each do |cluster,alerts|
38
55
  define_method cluster do
39
56
  kind.find{|k| alerts.map(&:code).include?(k.code)}
40
57
  end
41
58
  end
42
59
  end
43
60
  end
61
+
44
62
  xml_node :meteorological_infos do
45
63
  xml_attribute :type
46
64
  xml_node :time_series_info do
65
+ context :time_define_list do
66
+ time_defines.time_define
67
+ end
68
+
47
69
  xml_node :time_defines do
48
- xml_node_collection :time_define do
49
- xml_attribute :time_id, with_name: :lower_camelcase
50
- date_time_node :date_time
51
- duration_node :duration
52
- text_node :name
53
- end
70
+ xml_node_collection :time_define, type: "JMAFeed::JMX::TimeDefine"
54
71
  end
55
72
  xml_node_collection :item do
56
- # TODO
73
+ xml_node_collection :kind do
74
+ text_node :name
75
+ text_node :code
76
+ text_node :condition
77
+ xml_node_collection :property do
78
+ text_node :type
79
+
80
+ JMAFeed::WeatherAlert.metrics_components.each do |metr_component|
81
+ xml_node_collection "#{metr_component[:name]}_part".to_sym do
82
+ xml_node :base do
83
+ xml_node_collection metr_component[:name], type: "JMAFeed::JMX::#{metr_component[:name].to_s.camelize}"
84
+
85
+ xml_node_collection :local do
86
+ text_node :area_name
87
+ xml_node_collection metr_component[:name], type: "JMAFeed::JMX::#{metr_component[:name].to_s.camelize}"
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ def weather_alert
95
+ @weather_alert ||= JMAFeed::WeatherAlert.all.find{|a| a.code == code}
96
+ end
97
+
98
+ # EXAMPLE of data structure
99
+ # {
100
+ # "土砂災害危険度" => {"全体" => [...]},
101
+ # "浸水害危険度" => {"全体" => [...]},
102
+ # "1時間最大雨量" => {"全体" => [...]},
103
+ # "3時間最大雨量" => {"全体" => [...]},
104
+ # }
105
+ # or
106
+ # {
107
+ # "土砂災害危険度" => {"山地" => [...], "平地" => [...]},
108
+ # "浸水害危険度" => {"山地" => [...], "平地" => [...]},
109
+ # "1時間最大雨量" => {"山地" => [...], "平地" => [...]},
110
+ # "3時間最大雨量" => {"山地" => [...], "平地" => [...]},
111
+ # }
112
+ def weather_alert_metrics
113
+ return nil unless weather_alert
114
+ weather_alert.metrics.map do |k,v|
115
+ metrics_part = property.find{_1.type == v[:property_type]}&.public_send("#{v[:name]}_part")
116
+ metrics_bases = metrics_part&.map(&:base)
117
+ metrics_items = if metrics_bases && metrics_bases.length > 0
118
+ primary_base = metrics_bases.first
119
+ metrics_bases_area_items = if primary_base.local && primary_base.local.length > 0
120
+ metrics_bases.map{|b|
121
+ b.local.map{|l|
122
+ [
123
+ l.area_name,
124
+ l.public_send(v[:name]).map(&:metrics_item)
125
+ ]
126
+ }.to_h
127
+ }
128
+ else
129
+ metrics_bases.map{|b|
130
+ [
131
+ [
132
+ "全体",
133
+ b.public_send(v[:name]).map(&:metrics_item)
134
+ ]
135
+ ].to_h
136
+ }
137
+ end
138
+
139
+ metrics_bases_area_items.find{|area_items|
140
+ local_area_name, area_metrics_items = area_items.first
141
+ area_metrics_items.first.name == k
142
+ }
143
+ else
144
+ nil
145
+ end
146
+
147
+ if metrics_items
148
+ [k, metrics_items]
149
+ else
150
+ nil
151
+ end
152
+ end.compact.to_h
153
+ end
154
+ end
155
+
156
+ JMAFeed::WeatherAlert.clusters.each do |cluster,alerts|
157
+ define_method cluster do
158
+ kind.find{|k| alerts.map(&:code).include?(k.code)}
159
+ end
160
+ end
161
+
162
+ xml_node :area, type: "JMAFeed::JMX::Area"
57
163
  end
58
164
  end
59
165
  end
60
166
 
61
- def warning_district_forecast
62
- warning[0]
167
+ def warning_area_type1
168
+ warning.find{|w| w.type == "気象警報・注意報(府県予報区等)"}
169
+ end
170
+
171
+ def warning_area_type2
172
+ warning.find{|w| w.type == "気象警報・注意報(一次細分区域等)"}
173
+ end
174
+
175
+ def warning_area_type3
176
+ warning.find{|w| w.type == "気象警報・注意報(市町村等をまとめた地域等)"}
177
+ end
178
+
179
+ def warning_area_type4
180
+ warning.find{|w| w.type == "気象警報・注意報(市町村等)"}
181
+ end
182
+ end
183
+
184
+ def detect_with_area(area, weather_alert_clusters: nil)
185
+ weather_alert_clusters ||= JMAFeed::WeatherAlert.clusters.keys
186
+ warning_item = detect_warning_item_with_area(area)
187
+ return nil unless warning_item
188
+
189
+ warning_alerts = weather_alert_clusters.map{|cluster|
190
+ warning_item.public_send(cluster)
191
+ }.compact
192
+
193
+ info_item = detect_info_item_with_area(area)
194
+ info_alerts = info_item && weather_alert_clusters.map{|cluster|
195
+ info_item.public_send(cluster)
196
+ }.compact
197
+
198
+ AreaAlert.new(
199
+ entry: self,
200
+ area: area,
201
+ weather_warnings: warning_alerts.map{|w|
202
+ WeatherWarning.new(w, info: info_alerts&.find{|i| i.code == w.code})
203
+ }
204
+ )
205
+ end
206
+
207
+ def detect_warning_item_with_area(area)
208
+ items = if area.is_a?(JMACode::AreaInformationCity)
209
+ body.warning_area_type4.item
210
+ else
211
+ if area.used_by.include?("area_forecast_type3_in_weather_alert")
212
+ body.warning_area_type3.item
213
+ elsif area.used_by.include?("area_forecast_type2_in_weather_alert")
214
+ body.warning_area_type2.item
215
+ elsif area.used_by.include?("area_forecast_type1_in_weather_alert")
216
+ body.warning_area_type1.item
217
+ else
218
+ nil
219
+ end
220
+ end
221
+ items&.find{_1.area.code == area.code}
222
+ end
223
+
224
+ def detect_info_item_with_area(area)
225
+ # NOTE: 当該電文で特別警報・警報・注意報の全てが解除される場合、MeteorologicalInfos 部は省略される。 (気象警報・注意報(H27)_解説資料.pdf > 3-3)
226
+ return nil unless body.meteorological_infos
227
+
228
+ if area.is_a?(JMACode::AreaInformationCity)
229
+ body.meteorological_infos.time_series_info.item.find{_1.area.code == area.code}
230
+ else
231
+ nil
232
+ end
233
+ end
234
+
235
+ class AreaAlert < Struct.new(:entry, :area, :weather_warnings, keyword_init: true)
236
+ end
237
+
238
+ class WeatherWarning < DelegateClass(WarningItemKind)
239
+ attr_reader :info
240
+ def initialize(warning, info:)
241
+ @warning = warning
242
+ @info = info
243
+ super(warning)
244
+ end
245
+
246
+ def cluster
247
+ weather_alert.cluster
248
+ end
249
+
250
+ def risk_level
251
+ weather_alert.risk_level
63
252
  end
64
253
 
65
- def warning_district_1st
66
- warning[1]
254
+ def attentions
255
+ attention&.note
67
256
  end
68
257
 
69
- def warning_district_aggregated
70
- warning[2]
258
+ def additions
259
+ addition&.note
71
260
  end
72
261
 
73
- def warning_district_2nd
74
- warning[3]
262
+ def metrics
263
+ info&.weather_alert_metrics
75
264
  end
76
265
  end
77
266
  end
@@ -0,0 +1,135 @@
1
+ # 地震情報(震源・震度に関する情報)
2
+ # https://xml.kishou.go.jp/tec_material.html
3
+ # 電文毎の解説資料 > 解説資料セットzip > 地震火山関連_解説資料.pdf > (ウ)地震情報(震源・震度に関する情報)
4
+ #
5
+ class JMAFeed::VXSE53 < JMAFeed::ReportEntry
6
+ xml_node :head do
7
+ text_node :event_id, with_name: "EventID"
8
+ end
9
+
10
+ xml_node :body do
11
+ xml_node :earthquake, type: "JMAFeed::JMX::Earthquake"
12
+
13
+ xml_node :intensity do
14
+ xml_node :observation do
15
+ xml_node :code_define do
16
+ text_node :type, collection: true do
17
+ xml_attribute :xpath
18
+ end
19
+ end
20
+
21
+ text_node :max_int
22
+
23
+ xml_node_collection :pref do
24
+ text_node :name
25
+ text_node :code
26
+ xml_node :max_int, type: "JMAFeed::JMX::EarthquakeIntensity"
27
+ text_node :revise
28
+ xml_node_collection :area do
29
+ text_node :name
30
+ text_node :code
31
+ xml_node :max_int, type: "JMAFeed::JMX::EarthquakeIntensity"
32
+ text_node :revise
33
+ xml_node_collection :city do
34
+ text_node :name
35
+ text_node :code
36
+ xml_node :max_int, type: "JMAFeed::JMX::EarthquakeIntensity"
37
+ text_node :revise
38
+ text_node :condition
39
+ xml_node_collection :intensity_station do
40
+ text_node :name
41
+ text_node :code
42
+ xml_node :int, type: "JMAFeed::JMX::EarthquakeIntensity"
43
+ text_node :revise
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ xml_node :comments do
52
+ xml_node :forecast_comment do
53
+ xml_attribute :code_type
54
+ text_node :text
55
+ text_node :code
56
+ end
57
+ xml_node :var_comment do
58
+ xml_attribute :code_type
59
+ text_node :text
60
+ text_node :code
61
+ end
62
+ xml_node :free_form_comment do
63
+ text_node :text
64
+ end
65
+ end
66
+ end
67
+
68
+ def detect_with_area(area)
69
+ pref = detect_pref_with_area(area)
70
+ return nil unless pref
71
+
72
+ earthquake = body.earthquake
73
+ comments = [
74
+ body.comments&.forecast_comment&.text,
75
+ body.comments&.var_comment&.text,
76
+ body.comments&.free_form_comment&.text,
77
+ ].compact
78
+ if area.is_a?(JMACode::Prefecture)
79
+ AreaAlert.new(entry: self, area: area, intensity: pref, earthquake: earthquake, comments: comments)
80
+ else
81
+ local_area = detect_local_area_with_area(area, pref)
82
+ if local_area && area.is_a?(JMACode::AreaForecastLocalE)
83
+ AreaAlert.new(entry: self, area: area, intensity: local_area, earthquake: earthquake, comments: comments)
84
+ else
85
+ city = detect_city_with_area(area, local_area)
86
+ if city && area.is_a?(JMACode::AreaInformationCity)
87
+ AreaAlert.new(entry: self, area: area, intensity: city, earthquake: earthquake, comments: comments)
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+ def detect_pref_with_area(area)
94
+ intensity = body.intensity
95
+ return nil unless intensity
96
+
97
+ prefs = intensity.observation.pref
98
+ pref_code = if area.is_a?(JMACode::Prefecture)
99
+ area.code
100
+ elsif area.is_a?(JMACode::AreaForecastLocalE)
101
+ area.prefecture_code
102
+ elsif area.is_a?(JMACode::AreaInformationCity)
103
+ area.prefecture_code
104
+ else
105
+ nil
106
+ end
107
+
108
+ prefs.find{|pr| pr.code == pref_code}
109
+ end
110
+
111
+ def detect_local_area_with_area(area, pref_node)
112
+ area_code = if area.is_a?(JMACode::AreaForecastLocalE)
113
+ area.code
114
+ elsif area.is_a?(JMACode::AreaInformationCity)
115
+ area.area_forecast_local_e_code
116
+ else
117
+ nil
118
+ end
119
+
120
+ pref_node.area.find{|ar| ar.code == area_code}
121
+ end
122
+
123
+ def detect_city_with_area(area, local_area_node)
124
+ city_code = if area.is_a?(JMACode::AreaInformationCity)
125
+ area.code
126
+ else
127
+ nil
128
+ end
129
+
130
+ local_area_node.city.find{|c| c.code == city_code}
131
+ end
132
+
133
+ class AreaAlert < Struct.new(:entry, :area, :intensity, :earthquake, :comments, keyword_init: true)
134
+ end
135
+ end
@@ -1,10 +1,13 @@
1
1
  require "nokogiri"
2
- require "giri"
3
2
 
4
- class JMAFeed::ReportEntry < Giri::BaseNode
3
+ class JMAFeed::ReportEntry < JMAFeed::BaseNode
5
4
  class << self
6
5
  def get(url)
7
6
  xml = Net::HTTP.get(URI.parse(url))
7
+ build(xml)
8
+ end
9
+
10
+ def build(xml)
8
11
  doc = Nokogiri::XML(xml)
9
12
  new(doc.root)
10
13
  end
@@ -25,16 +28,30 @@ class JMAFeed::ReportEntry < Giri::BaseNode
25
28
  text_node :info_type
26
29
  text_node :info_kind
27
30
  text_node :info_kind_version
31
+ xml_node :headline do
32
+ text_node :text
33
+ end
28
34
  end
29
35
  end
30
36
 
31
37
  require "jma_feed/report_entry/jmx/area"
38
+ require "jma_feed/report_entry/jmx/time_define"
32
39
  require "jma_feed/report_entry/jmx/significancy"
33
40
  require "jma_feed/report_entry/jmx/precipitation"
34
41
  require "jma_feed/report_entry/jmx/water_level"
35
42
  require "jma_feed/report_entry/jmx/discharge"
43
+ require "jma_feed/report_entry/jmx/wind_direction"
44
+ require "jma_feed/report_entry/jmx/wind_speed"
45
+ require "jma_feed/report_entry/jmx/wave_height"
46
+ require "jma_feed/report_entry/jmx/visibility"
47
+ require "jma_feed/report_entry/jmx/snow_fall_depth"
48
+ require "jma_feed/report_entry/jmx/humidity"
49
+ require "jma_feed/report_entry/jmx/tidal_level"
50
+ require "jma_feed/report_entry/jmx/earthquake"
51
+ require "jma_feed/report_entry/jmx/earthquake_intensity"
36
52
  require "jma_feed/report_entry/vprn50"
37
53
  require "jma_feed/report_entry/vpww54"
38
54
  require "jma_feed/report_entry/vxko"
39
55
  require "jma_feed/report_entry/vphw50"
40
56
  require "jma_feed/report_entry/vptaii"
57
+ require "jma_feed/report_entry/vxse53"
@@ -13,52 +13,51 @@ class JMAFeed::Result
13
13
  http_result.body
14
14
  end
15
15
 
16
+ def modified?
17
+ http_result.kind_of?(Net::HTTPSuccess)
18
+ end
19
+
16
20
  def last_modified
17
21
  DateTime.parse(http_result["Last-Modified"])
18
22
  end
19
23
 
20
24
  def doc
21
- @doc ||= Nokogiri::XML(body)
25
+ @doc ||= JMAFeed::ResultDoc.new(body)
22
26
  end
23
27
 
24
- def namespace
25
- {atom: doc.root.namespace.href}
26
- end
28
+ # def namespace
29
+ # {atom: doc.root.namespace.href}
30
+ # end
27
31
 
28
- def text(name)
29
- doc.xpath("/atom:feed/atom:#{name}", namespace).text
30
- end
32
+ # def text(name)
33
+ # doc.xpath("/atom:feed/atom:#{name}", namespace).text
34
+ # end
31
35
 
32
36
  def title
33
- text('title')
37
+ doc.title
34
38
  end
35
39
 
36
40
  def subtitle
37
- text('subtitle')
41
+ doc.subtitle
38
42
  end
39
43
 
40
44
  def id
41
- text('id')
45
+ doc.id
42
46
  end
43
47
 
44
48
  def updated
45
- DateTime.parse(text('updated'))
49
+ doc.updated
46
50
  end
47
51
 
48
52
  def related
49
- text('link[@rel="related"]/@href')
53
+ doc.related
50
54
  end
51
55
 
52
56
  def entries
53
- @entries ||= doc.xpath('/atom:feed/atom:entry', namespace).map do |entry|
54
- JMAFeed::ResultEntry.new(
55
- title: entry.xpath('atom:title', namespace).text,
56
- link: entry.xpath('atom:link/@href', namespace).text,
57
- id: entry.xpath('atom:id', namespace).text,
58
- updated: entry.xpath('atom:updated', namespace).text,
59
- author: entry.xpath('atom:author/atom:name', namespace).text,
60
- content: entry.xpath('atom:content', namespace).text,
61
- )
62
- end
57
+ doc.entries
58
+ end
59
+
60
+ def all_entries
61
+ doc.all_entries
63
62
  end
64
63
  end