eew_parser 0.1.6 → 0.1.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 1f74754622c172c291cfdb1f7398b4c4e2e31792
4
- data.tar.gz: 374da3d56c11df515a67455cd9a0b37d8cf89212
2
+ SHA256:
3
+ metadata.gz: 2b294cfd9c1382b61a98de3a48840965b5385cc47f9b94660ec4083139be23ab
4
+ data.tar.gz: 72da81378e933180388a00b0208ef833810e1916d691e4204d699629310ad0aa
5
5
  SHA512:
6
- metadata.gz: 0e5f348ef7333be0c3435fd04e07b06a1d650ef9006e0d4fc87eb2145fa1904dd0bac27395aef237a59d3cccefb3ebb8b3cf7628c5d2320f92837ad0b932fc74
7
- data.tar.gz: 79b620487888e4f5b4f6fadb62580f9965180280acd66c27379491419b8157a68a91ba105f726fc2948042597e5e2eea689577e045b238910d8ab35c7333e6b3
6
+ metadata.gz: 52285f840a2de4ac27e9a8061fbf71d626966999a75d61d9f23a08b2c279a38c69995b4670d04fd06ef08742b2a829b2ccbe0858280990a6ed12800bcfe36111
7
+ data.tar.gz: e375ab94a68a98dc9a2e45948631742a7aedb6dd73d778abb3def74b6761e94b48e8ac816c629f3878b2699948c3f7e296ff08c522482939928e427bdc8e1432
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.5
4
+ before_install:
5
+ - export TZ=Asia/Tokyo
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2014 Masaki Matsushita
3
+ Copyright (c) 2018 Masaki Matsushita
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # EEW::Parser
2
+
3
+ [![Build Status](https://travis-ci.org/mmasaki/eew_parser.svg?branch=master)](https://travis-ci.org/mmasaki/eew_parser)
4
+
5
+ 高度利用者向け緊急地震速報コード電文フォーマットを扱う為のライブラリです。
6
+ http://eew.mizar.jp/excodeformat を元に作成しました。
7
+ 詳しくは http://www.rubydoc.info/gems/eew_parser を参照して下さい。
8
+
9
+ ```ruby
10
+ str = <<EOS
11
+ 37 03 00 110415005029 C11
12
+ 110415004944
13
+ ND20110415005001 NCN001 JD////////////// JN///
14
+ 189 N430 E1466 070 41 02 RK66204 RT10/// RC/////
15
+ 9999=
16
+ EOS
17
+
18
+
19
+ eew = EEWParser.new(str)
20
+ puts "最大予測震度: #{fc.seismic_intensity}"
21
+ ```
22
+
23
+ ## インストール
24
+
25
+ ```
26
+ gem install eew_parser
27
+ ```
28
+
29
+ でインストールできます。
30
+
31
+ ## Copyright
32
+
33
+ Copyright (c) 2018 Masaki Matsushita. See LICENSE.txt for
34
+ further details.
data/Rakefile CHANGED
@@ -1,4 +1,6 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
3
 
4
+ task :default => [:spec]
5
+
4
6
  RSpec::Core::RakeTask.new("spec")
data/eew_parser.gemspec CHANGED
@@ -1,11 +1,11 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "eew_parser"
3
- spec.version = "0.1.6"
3
+ spec.version = "0.1.7"
4
4
  spec.authors = ["Masaki Matsushita"]
5
5
  spec.email = ["glass.saga@gmail.com"]
6
6
  spec.summary = %q{Parser for Earthquake Early Warning from JMA}
7
7
  spec.description = %q{Parser for Earthquake Early Warning from JMA}
8
- spec.homepage = %q{https://github.com/Glasssaga/eew_parser}
8
+ spec.homepage = %q{https://github.com/mmasaki/eew_parser}
9
9
  spec.license = "MIT"
10
10
 
11
11
  spec.files = `git ls-files -z`.split("\x0")
@@ -13,6 +13,8 @@ Gem::Specification.new do |spec|
13
13
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
14
14
  spec.require_paths = ["lib"]
15
15
 
16
- spec.add_development_dependency "bundler", "~> 1.7"
17
- spec.add_development_dependency "rake", "~> 10.0"
16
+ spec.add_development_dependency "bundler", "~> 1.16"
17
+ spec.add_development_dependency "rake", "~> 11.2"
18
+ spec.add_development_dependency "rspec", "~> 3.7"
19
+ spec.add_development_dependency "rspec-its", "~> 1.2"
18
20
  end
data/lib/area_code.rb CHANGED
@@ -190,5 +190,5 @@ module EEW
190
190
  805 => "沖縄県石垣島",
191
191
  806 => "沖縄県与那国島",
192
192
  807 => "沖縄県西表島"
193
- }
193
+ }.freeze
194
194
  end
data/lib/eew_parser.rb CHANGED
@@ -4,8 +4,7 @@ require_relative "epicenter_code"
4
4
  require_relative "area_code"
5
5
 
6
6
  # 緊急地震速報パーサ
7
- # Author:: Glass_saga
8
- # License:: NYSL Version 0.9982
7
+ # Author:: mmasaki
9
8
  #
10
9
  # 高度利用者向け緊急地震速報コード電文フォーマットを扱う為のライブラリです。
11
10
  # http://eew.mizar.jp/excodeformat を元に作成しました。
@@ -30,14 +29,19 @@ module EEW
30
29
  raise ArgumentError unless str.is_a?(String)
31
30
  @fastcast = str.dup
32
31
  @fastcast.freeze
33
- raise Error, "電文の形式が不正です" if @fastcast.size < 135
32
+ raise Error, "電文の形式が不正です" if @fastcast.bytesize < 135
34
33
  end
35
34
 
36
35
  attr_reader :fastcast
37
36
 
38
37
  # initializeに与えられた電文を返します。
39
38
  def to_s
40
- @fastcast
39
+ @fastcast.dup
40
+ end
41
+
42
+ # 電文のサイズを返します。
43
+ def size
44
+ @fastcast.bytesize
41
45
  end
42
46
 
43
47
  # 緊急地震速報の内容をテキストで出力します。
@@ -94,8 +98,16 @@ module EEW
94
98
  return hash
95
99
  end
96
100
 
101
+ # 正しい電文であるかを返します
102
+ def verify
103
+ Attributes.each do |attribute|
104
+ __send__(attribute)
105
+ end
106
+ return true
107
+ end
108
+
97
109
  def inspect
98
- "#<EEWParser:#{id}>"
110
+ "#<EEWParser:#{id} (第#{number}報) #{epicenter} #{seismic_intensity}>"
99
111
  end
100
112
 
101
113
  def ==(other)
@@ -103,7 +115,7 @@ module EEW
103
115
  end
104
116
 
105
117
  def <=>(other)
106
- Integer(id) <=> Integer(id)
118
+ __id__ <=> other.__id__
107
119
  end
108
120
 
109
121
  # 電文種別コード
@@ -162,6 +174,18 @@ module EEW
162
174
  end
163
175
  end
164
176
 
177
+ # 訓練かどうか
178
+ def drill?
179
+ case @fastcast[6, 2]
180
+ when "00", "10", "20"
181
+ return false
182
+ when "01", "11", "30"
183
+ return true
184
+ else
185
+ raise Error, "電文の形式が不正です(識別符)"
186
+ end
187
+ end
188
+
165
189
  # 電文の発表時刻のTimeオブジェクトを返します。
166
190
  def report_time
167
191
  Time.local("20" + @fastcast[9, 2], @fastcast[11, 2], @fastcast[13, 2], @fastcast[15, 2], @fastcast[17, 2], @fastcast[19, 2])
@@ -170,8 +194,9 @@ module EEW
170
194
  # 電文がこの電文を含め何通あるか(Integer)
171
195
  def number_of_telegram
172
196
  number_of_telegram = @fastcast[23]
173
- raise Error, "電文の形式が不正です" if number_of_telegram =~ /[^\d]/
174
- number_of_telegram.to_i
197
+ return Integer(number_of_telegram, 10)
198
+ rescue ArgumentError
199
+ raise Error, "電文の形式が不正です"
175
200
  end
176
201
 
177
202
  # コードが続くかどうか
@@ -194,8 +219,14 @@ module EEW
194
219
  # 地震識別番号(String)
195
220
  def id
196
221
  id = @fastcast[41, 14]
197
- raise Error, "電文の形式が不正です(地震識別番号)" if id =~ /[^\d]/
198
- id
222
+ Integer(id, 10) # verify
223
+ return id
224
+ rescue ArgumentError
225
+ raise Error, "電文の形式が不正です(地震識別番号: #{id})"
226
+ end
227
+
228
+ def __id__
229
+ id + number.to_s
199
230
  end
200
231
 
201
232
  # 発表状況(訂正等)の指示
@@ -218,6 +249,12 @@ module EEW
218
249
  end
219
250
  end
220
251
 
252
+ # 第1報であればtrueを、そうでなければfalseを返します。
253
+ def first?
254
+ return true if self.number == 1
255
+ return false
256
+ end
257
+
221
258
  # 最終報であればtrueを、そうでなければfalseを返します。
222
259
  def final?
223
260
  case @fastcast[59]
@@ -233,17 +270,22 @@ module EEW
233
270
  # 発表する高度利用者向け緊急地震速報の番号(地震単位での通番)(Integer)
234
271
  def number
235
272
  number = @fastcast[60, 2]
236
- raise Error, "電文の形式が不正です(高度利用者向け緊急地震速報の番号)" if number =~ /[^\d]/
237
- number.to_i
273
+ return Integer(number, 10)
274
+ rescue ArgumentError
275
+ raise Error, "電文の形式が不正です(高度利用者向け緊急地震速報の番号)"
238
276
  end
239
277
 
240
278
  alias :revision :number
241
279
 
242
280
  # 震央の名称
243
281
  def epicenter
244
- key = @fastcast[86, 3]
245
- raise Error, "電文の形式が不正です(震央の名称)" if key =~ /[^\d]/
246
- EpicenterCode[key.to_i]
282
+ code = @fastcast[86, 3]
283
+ code = Integer(code, 10)
284
+ EpicenterCode.fetch(code)
285
+ rescue KeyError
286
+ raise Error, "電文の形式が不正です(震央地名コード: #{code})"
287
+ rescue ArgumentError
288
+ raise Error, "電文の形式が不正です(震央の名称)"
247
289
  end
248
290
 
249
291
  # 震央の位置
@@ -252,7 +294,7 @@ module EEW
252
294
  if position == "//// /////"
253
295
  "不明又は未設定"
254
296
  else
255
- raise Error, "電文の形式が不正です(震央の位置)" if position =~ /[^\d|\s|N|E]/
297
+ raise Error, "電文の形式が不正です(震央の位置)" unless position.match(/N\d{3} E\d{4}/)
256
298
  position.insert(3, ".").insert(10, ".")
257
299
  end
258
300
  end
@@ -261,11 +303,12 @@ module EEW
261
303
  def depth
262
304
  depth = @fastcast[101, 3]
263
305
  if depth == "///"
264
- "不明又は未設定"
306
+ return "不明又は未設定"
265
307
  else
266
- raise Error, "電文の形式が不正です(震源の深さ)" if depth =~ /[^\d]/
267
- depth.to_i
308
+ return Integer(depth, 10)
268
309
  end
310
+ rescue ArgumentError
311
+ raise Error, "電文の形式が不正です(震源の深さ)"
269
312
  end
270
313
 
271
314
  # マグニチュード
@@ -274,11 +317,12 @@ module EEW
274
317
  def magnitude
275
318
  magnitude = @fastcast[105, 2]
276
319
  if magnitude == "//"
277
- "不明又は未設定"
320
+ return "不明又は未設定"
278
321
  else
279
- raise Error, "電文の形式が不正です(マグニチュード)" if magnitude =~ /[^\d]/
280
- (magnitude[0] + "." + magnitude[1]).to_f
322
+ return Float(magnitude[0] + "." + magnitude[1])
281
323
  end
324
+ rescue ArgumentError
325
+ raise Error, "電文の形式が不正です(マグニチュード)"
282
326
  end
283
327
 
284
328
  # 電文フォーマットの震度を文字列に変換
@@ -312,8 +356,6 @@ module EEW
312
356
  # 最大予測震度
313
357
  def seismic_intensity
314
358
  to_seismic_intensity(@fastcast[108, 2])
315
- rescue Error
316
- raise Error, "電文の形式が不正です(最大予測震度)"
317
359
  end
318
360
 
319
361
  # 震央の確からしさ
@@ -486,6 +528,16 @@ module EEW
486
528
  end
487
529
  end
488
530
 
531
+ # 最大予測震度に変化があったかどうか
532
+ def changed?
533
+ case @fastcast[129]
534
+ when "0", "3".."9", "/"
535
+ return false
536
+ when "1", "2"
537
+ return true
538
+ end
539
+ end
540
+
489
541
  # 最大予測震度の変化の理由
490
542
  def reason_of_change
491
543
  case @fastcast[130]
@@ -508,6 +560,15 @@ module EEW
508
560
  end
509
561
  end
510
562
 
563
+ # EBIを含むかどうか
564
+ def has_ebi?
565
+ if @fastcast[135, 3] == "EBI"
566
+ return true
567
+ else
568
+ return false
569
+ end
570
+ end
571
+
511
572
  # 地域毎の警報の判別、最大予測震度及び主要動到達予測時刻
512
573
  # EBIがあればHashを格納したArrayを、なければ空のArrayを返します。Hashに格納されるkeyとvalueはそれぞれ次のようになっています。
513
574
  # :area_name 地域名称
@@ -519,7 +580,7 @@ module EEW
519
580
  data = []
520
581
  return data unless @fastcast[135, 3] == "EBI"
521
582
  i = 139
522
- while i + 20 < @fastcast.size
583
+ while i + 20 < @fastcast.bytesize
523
584
  local = {}
524
585
  local[:area_code] = @fastcast[i, 3].to_i
525
586
  local[:area_name] = AreaCode[local[:area_code]] # 地域名称
@@ -364,5 +364,5 @@ module EEW
364
364
  977 => "南大西洋",
365
365
  978 => "北極付近",
366
366
  979 => "南極付近"
367
- }
367
+ }.freeze
368
368
  end
@@ -21,14 +21,24 @@ EBI 251 S6+6- ////// 11 300 S5+5- ////// 11 250 S5+5- ////// 11
21
21
  EEW::Parser.new(fastcast)
22
22
  end
23
23
 
24
+ let(:different_id) do
25
+ _fastcast = fastcast.dup
26
+ _fastcast[61] = "6" # 第6報にセット
27
+ EEW::Parser.new(_fastcast)
28
+ end
29
+
24
30
  subject do
25
31
  EEW::Parser.new(fastcast)
26
32
  end
27
33
 
28
34
  describe "#==" do
29
- it "同じ地震IDであればtrue" do
35
+ it "同じ地震IDと第n報目であればtrue" do
30
36
  expect(subject).to eq(same_id)
31
37
  end
38
+
39
+ it "同じ地震IDでも第n報目かが異なればfalse" do
40
+ expect(subject).not_to eq(different_id)
41
+ end
32
42
  end
33
43
 
34
44
  its(:type) { is_expected.to eq("マグニチュード、最大予測震度及び主要動到達予測時刻の高度利用者向け緊急地震速報(グリッドサーチ法、EPOS自動処理手法)") }
@@ -37,6 +47,8 @@ EBI 251 S6+6- ////// 11 300 S5+5- ////// 11 250 S5+5- ////// 11
37
47
 
38
48
  its(:drill_type) { is_expected.to eq("通常") }
39
49
 
50
+ it { is_expected.not_to be_drill }
51
+
40
52
  describe "#report_time" do
41
53
  let(:report_time) { Time.parse("2011-04-15 23:34:53 +0900") }
42
54
  its(:report_time) { is_expected.to eq(report_time) }
@@ -55,6 +67,8 @@ EBI 251 S6+6- ////// 11 300 S5+5- ////// 11 250 S5+5- ////// 11
55
67
 
56
68
  its(:status) { is_expected.to eq("通常発表") }
57
69
 
70
+ it { is_expected.not_to be_first }
71
+
58
72
  it { is_expected.not_to be_final }
59
73
 
60
74
  its(:number) { is_expected.to eq(5) }
@@ -85,6 +99,8 @@ EBI 251 S6+6- ////// 11 300 S5+5- ////// 11 250 S5+5- ////// 11
85
99
 
86
100
  its(:change) { is_expected.to eq("最大予測震度が1.0以上大きくなった") }
87
101
 
102
+ it { is_expected.to be_changed }
103
+
88
104
  its(:reason_of_change) { is_expected.to eq("M及び震源位置が変化したため") }
89
105
 
90
106
  describe "#ebi" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eew_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masaki Matsushita
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-28 00:00:00.000000000 Z
11
+ date: 2018-06-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,28 +16,56 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
19
+ version: '1.16'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.7'
26
+ version: '1.16'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '11.2'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '11.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.7'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.7'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec-its
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.2'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.2'
41
69
  description: Parser for Earthquake Early Warning from JMA
42
70
  email:
43
71
  - glass.saga@gmail.com
@@ -47,18 +75,18 @@ extra_rdoc_files: []
47
75
  files:
48
76
  - ".document"
49
77
  - ".gitignore"
78
+ - ".travis.yml"
50
79
  - Gemfile
51
80
  - LICENSE.txt
52
- - README.rdoc
81
+ - README.md
53
82
  - Rakefile
54
- - VERSION
55
83
  - eew_parser.gemspec
56
84
  - lib/area_code.rb
57
85
  - lib/eew_parser.rb
58
86
  - lib/epicenter_code.rb
59
87
  - spec/eew_parser_spec.rb
60
88
  - spec/spec_helper.rb
61
- homepage: https://github.com/Glasssaga/eew_parser
89
+ homepage: https://github.com/mmasaki/eew_parser
62
90
  licenses:
63
91
  - MIT
64
92
  metadata: {}
@@ -78,11 +106,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
106
  version: '0'
79
107
  requirements: []
80
108
  rubyforge_project:
81
- rubygems_version: 2.4.5
109
+ rubygems_version: 2.7.7
82
110
  signing_key:
83
111
  specification_version: 4
84
112
  summary: Parser for Earthquake Early Warning from JMA
85
113
  test_files:
86
114
  - spec/eew_parser_spec.rb
87
115
  - spec/spec_helper.rb
88
- has_rdoc:
data/README.rdoc DELETED
@@ -1,27 +0,0 @@
1
- = eew_parser
2
-
3
- 高度利用者向け緊急地震速報コード電文フォーマットを扱う為のライブラリです。
4
- http://eew.mizar.jp/excodeformat を元に作成しました。
5
- 詳しくは http://glasssaga.dip.jp/eew_parser_doc/EEWParser.html を参照して下さい。
6
-
7
- str = <<EOS
8
- 37 03 00 110415005029 C11
9
- 110415004944
10
- ND20110415005001 NCN001 JD////////////// JN///
11
- 189 N430 E1466 070 41 02 RK66204 RT10/// RC/////
12
- 9999=
13
- EOS
14
-
15
- eew = EEWParser.new(str)
16
- puts "最大予測震度: #{fc.seismic_intensity}"
17
-
18
- == インストール
19
-
20
- gem install eew_parser
21
-
22
- でインストールできます。
23
-
24
- == Copyright
25
-
26
- Copyright (c) 2014 Masaki Matsushita. See LICENSE.txt for
27
- further details.
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.1.3