eew_parser 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/VERSION +1 -1
  2. data/eew_parser.gemspec +1 -1
  3. data/lib/eew_parser.rb +156 -29
  4. metadata +11 -16
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.1.3
data/eew_parser.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{eew_parser}
8
- s.version = "0.1.3"
8
+ s.version = "0.1.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Glass_saga"]
data/lib/eew_parser.rb CHANGED
@@ -576,10 +576,65 @@ AreaCord = {
576
576
  805 => "沖縄県石垣島",
577
577
  806 => "沖縄県与那国島",
578
578
  807 => "沖縄県西表島"}
579
+
580
+ class Error < StandardError; end
579
581
 
580
582
  # 引数には緊急地震速報の電文を与えます。
581
583
  def initialize(str)
582
584
  @fastcast = str
585
+ @fastcast.freeze
586
+ raise Error, "電文の形式が不正です" if @fastcast.size < 134
587
+ end
588
+
589
+ attr_reader :fastcast
590
+
591
+ # initializeに与えられた電文を返します。
592
+ def to_s
593
+ @fastcast
594
+ end
595
+
596
+ # 電文を解析した結果をHashで返します。
597
+ def to_hash
598
+ hash = {}
599
+ hash[:type] = self.type
600
+ hash[:from] = self.from
601
+ hash[:drill_type] = self.drill_type
602
+ hash[:report_time] = self.report_time
603
+ hash[:number_of_telegram] = self.number_of_telegram
604
+ hash[:continue?] = self.continue?
605
+ hash[:earthquake_time] = self.earthquake_time
606
+ hash[:id] = self.id
607
+ hash[:status] = self.status
608
+ hash[:final?] = self.final?
609
+ hash[:number] = self.number
610
+ hash[:epicenter] = self.epicenter
611
+ hash[:position] = self.position
612
+ hash[:depth] = self.depth
613
+ hash[:magnitude] = self.magnitude
614
+ hash[:seismic_intensity] = self.seismic_intensity
615
+ hash[:probability_of_position] = self.probability_of_position
616
+ hash[:probability_of_depth] = self.probability_of_depth
617
+ hash[:probability_of_magnitude] = self.probability_of_magnitude
618
+ hash[:probability_of_position_jma] = self.probability_of_position_jma
619
+ hash[:probability_of_depth_jma] = self.probability_of_depth_jma
620
+ hash[:land_or_sea] = self.land_or_sea
621
+ hash[:warning?] = self.warning?
622
+ hash[:change] = self.change
623
+ hash[:reason_of_change] = self.reason_of_change
624
+ hash[:ebi] = self.ebi
625
+ hash
626
+ end
627
+
628
+ def inspect
629
+ "#<EEWParser:#{self.id}>"
630
+ end
631
+
632
+ def ==(other)
633
+ self.fastcast == other.fastcast
634
+ end
635
+
636
+ def <=>(other)
637
+ self.id.to_i <=> other.id.to_i
583
638
  end
584
639
 
585
640
  # 電文種別コード
@@ -593,6 +648,8 @@ AreaCord = {
593
648
  "マグニチュード、最大予測震度及び主要動到達予測時刻の高度利用者向け緊急地震速報(グリッドサーチ法、EPOS自動処理手法)"
594
649
  when "39"
595
650
  "キャンセル報"
651
+ else
652
+ raise Error, "電文の形式が不正です(電文種別コード)"
596
653
  end
597
654
  end
598
655
 
@@ -611,6 +668,8 @@ AreaCord = {
611
668
  "福岡"
612
669
  when "06"
613
670
  "沖縄"
671
+ else
672
+ raise Error, "電文の形式が不正です(発信官署)"
614
673
  end
615
674
  end
616
675
 
@@ -629,6 +688,8 @@ AreaCord = {
629
688
  "参考情報またはテキスト"
630
689
  when "30"
631
690
  "コード部のみの配信試験"
691
+ else
692
+ raise Error, "電文の形式が不正です(識別符)"
632
693
  end
633
694
  end
634
695
 
@@ -639,12 +700,21 @@ AreaCord = {
639
700
 
640
701
  # 電文がこの電文を含め何通あるか(Integer)
641
702
  def number_of_telegram
642
- @fastcast[23].to_i
703
+ number_of_telegram = @fastcast[23]
704
+ raise Error, "電文の形式が不正です" if number_of_telegram =~ /[^\d]/
705
+ number_of_telegram.to_i
643
706
  end
644
707
 
645
708
  # コードが続くかどうか
646
709
  def continue?
647
- @fastcast[24] == "1"
710
+ case @fastcast[24]
711
+ when "1"
712
+ true
713
+ when "0"
714
+ false
715
+ else
716
+ raise Error, "電文の形式が不正です"
717
+ end
648
718
  end
649
719
 
650
720
  # 地震発生時刻もしくは地震検知時刻のTimeオブジェクトを返します。
@@ -654,7 +724,9 @@ AreaCord = {
654
724
 
655
725
  # 地震識別番号(String)
656
726
  def id
657
- @fastcast[41, 14]
727
+ id = @fastcast[41, 14]
728
+ raise Error, "電文の形式が不正です(地震識別番号)" if id =~ /[^\d]/
729
+ id
658
730
  end
659
731
 
660
732
  # 発表状況(訂正等)の指示
@@ -672,24 +744,37 @@ AreaCord = {
672
744
  "最終の高度利用者向け緊急地震速報"
673
745
  when "/"
674
746
  "未設定"
747
+ else
748
+ raise Error, "電文の形式が不正です"
675
749
  end
676
750
  end
677
751
 
678
752
  # 最終報であればtrueを、そうでなければfalseを返します。
679
753
  def final?
680
- @fastcast[59] == "9"
754
+ case @fastcast[59]
755
+ when "9"
756
+ true
757
+ when "0", "6", "7", "8", "/"
758
+ false
759
+ else
760
+ raise Error, "電文の形式が不正です"
761
+ end
681
762
  end
682
763
 
683
764
  # 発表する高度利用者向け緊急地震速報の番号(地震単位での通番)(Integer)
684
765
  def number
685
- @fastcast[60, 2].to_i
766
+ number = @fastcast[60, 2]
767
+ raise Error, "電文の形式が不正です(高度利用者向け緊急地震速報の番号)" if number =~ /[^\d]/
768
+ number.to_i
686
769
  end
687
770
 
688
771
  alias :revision :number
689
772
 
690
773
  # 震央の名称
691
774
  def epicenter
692
- EpicenterCord[@fastcast[86, 3].to_i]
775
+ key = @fastcast[86, 3]
776
+ raise Error, "電文の形式が不正です(震央の名称)" if key =~ /[^\d]/
777
+ EpicenterCord[key.to_i]
693
778
  end
694
779
 
695
780
  # 震央の位置
@@ -698,16 +783,19 @@ AreaCord = {
698
783
  if position == "//// /////"
699
784
  "不明又は未設定"
700
785
  else
786
+ raise Error, "電文の形式が不正です(震央の位置)" if position =~ /[^\d|\s|N|E]/
701
787
  position.insert(3, ".").insert(10, ".")
702
788
  end
703
789
  end
704
790
 
705
791
  # 震源の深さ(単位 km)
706
792
  def depth
707
- if @fastcast[101, 3] == "///"
793
+ depth = @fastcast[101, 3]
794
+ if depth == "///"
708
795
  "不明又は未設定"
709
796
  else
710
- @fastcast[101, 3].to_i
797
+ raise Error, "電文の形式が不正です(震源の深さ)" if depth =~ /[^\d]/
798
+ depth.to_i
711
799
  end
712
800
  end
713
801
 
@@ -715,10 +803,12 @@ AreaCord = {
715
803
  # マグニチュードが不明又は未設定である場合は"不明又は未設定"を返します。
716
804
  # そうでなければ、マグニチュードをFloatで返します。
717
805
  def magnitude
718
- if @fastcast[105, 2] == "//"
806
+ magnitude = @fastcast[105, 2]
807
+ if magnitude == "//"
719
808
  "不明又は未設定"
720
809
  else
721
- (@fastcast[105] + "." + @fastcast[106]).to_f
810
+ raise Error, "電文の形式が不正です(マグニチュード)" if magnitude =~ /[^\d]/
811
+ (magnitude[0] + "." + magnitude[1]).to_f
722
812
  end
723
813
  end
724
814
 
@@ -745,12 +835,16 @@ AreaCord = {
745
835
  "6強"
746
836
  when "07"
747
837
  "7"
838
+ else
839
+ raise Error, "電文の形式が不正です(震度)"
748
840
  end
749
841
  end
750
842
 
751
843
  # 最大予測震度
752
844
  def seismic_intensity
753
845
  to_seismic_intensity(@fastcast[108, 2])
846
+ rescue Error
847
+ raise Error, "電文の形式が不正です(最大予測震度)"
754
848
  end
755
849
 
756
850
  # 震央の確からしさ
@@ -776,6 +870,8 @@ AreaCord = {
776
870
  "予備"
777
871
  when "/"
778
872
  "不明又は未設定"
873
+ else
874
+ raise Error, "電文の形式が不正です(震央の確からしさ)"
779
875
  end
780
876
  end
781
877
 
@@ -802,6 +898,8 @@ AreaCord = {
802
898
  "予備"
803
899
  when "/"
804
900
  "不明又は未設定"
901
+ else
902
+ raise Error, "電文の形式が不正です(震源の深さの確からしさ)"
805
903
  end
806
904
  end
807
905
 
@@ -828,6 +926,8 @@ AreaCord = {
828
926
  "予備"
829
927
  when "/"
830
928
  "不明又は未設定"
929
+ else
930
+ raise Error, "電文の形式が不正です(マグニチュードの確からしさ)"
831
931
  end
832
932
  end
833
933
 
@@ -844,8 +944,10 @@ AreaCord = {
844
944
  "グリッドサーチ法(5点)[気象庁データ]"
845
945
  when "/"
846
946
  "不明又は未設定"
847
- else
947
+ when "5".."9"
848
948
  "未定義"
949
+ else
950
+ raise Error, "電文の形式が不正です(震央の確からしさ[気象庁の部内システムでの利用])"
849
951
  end
850
952
  end
851
953
 
@@ -862,8 +964,10 @@ AreaCord = {
862
964
  "グリッドサーチ法(5点)[気象庁データ]"
863
965
  when "/"
864
966
  "不明又は未設定"
865
- else
967
+ when "5".."9"
866
968
  "未定義"
969
+ else
970
+ raise Error, "電文の形式が不正です(震源の深さの確からしさ[気象庁の部内システムでの利用])"
867
971
  end
868
972
  end
869
973
 
@@ -876,14 +980,23 @@ AreaCord = {
876
980
  "海域"
877
981
  when "/"
878
982
  "不明又は未設定"
879
- else
983
+ when "2".."9"
880
984
  "未定義"
985
+ else
986
+ raise Error, "電文の形式が不正です(震央位置の海陸判定)"
881
987
  end
882
988
  end
883
989
 
884
990
  # 警報を含む内容であればtrue、そうでなければfalse
885
991
  def warning?
886
- @fastcast[122] == "1"
992
+ case @fastcast[122]
993
+ when "0", "/", "2".."9"
994
+ false
995
+ when "1"
996
+ true
997
+ else
998
+ raise Error, "電文の形式が不正です(警報の判別)"
999
+ end
887
1000
  end
888
1001
 
889
1002
  # 最大予測震度の変化
@@ -895,8 +1008,12 @@ AreaCord = {
895
1008
  "最大予測震度が1.0以上大きくなった"
896
1009
  when "2"
897
1010
  "最大予測震度が1.0以上小さくなった"
898
- else
1011
+ when "3".."9"
899
1012
  "未定義"
1013
+ when "/"
1014
+ "不明又は未設定"
1015
+ else
1016
+ raise Error, "電文の形式が不正です(最大予測震度の変化)"
900
1017
  end
901
1018
  end
902
1019
 
@@ -915,13 +1032,15 @@ AreaCord = {
915
1032
  "震源の深さが変化したため"
916
1033
  when "/"
917
1034
  "不明又は未設定"
918
- else
1035
+ when "5".."9"
919
1036
  "未定義"
1037
+ else
1038
+ raise Error, "電文の形式が不正です(最大予測震度の変化の理由)"
920
1039
  end
921
1040
  end
922
1041
 
923
1042
  # 地域毎の警報の判別、最大予測震度及び主要動到達予測時刻
924
- # EBIがあればHashを格納したArrayを、なければnilを返します。Hashに格納されるkeyとvalueはそれぞれ次のようになっています。
1043
+ # EBIがあればHashを格納したArrayを、なければ空のArrayを返します。Hashに格納されるkeyとvalueはそれぞれ次のようになっています。
925
1044
  # :area_name 地域名称
926
1045
  # :intensity 最大予測震度
927
1046
  # :arrival_time 予想到達時刻のTimeオブジェクト。既に到達している場合はnil
@@ -934,6 +1053,7 @@ AreaCord = {
934
1053
  while i + 20 < @fastcast.size
935
1054
  local = {}
936
1055
  local[:area_name] = AreaCord[@fastcast[i, 3].to_i] # 地域名称
1056
+ raise Error, "電文の形式が不正でです(地域名称[EBI])" unless local[:area_name]
937
1057
  if @fastcast[i+7, 2] == "//"
938
1058
  local[:intensity] = "#{to_seismic_intensity(@fastcast[i+5, 2])}以上" # 最大予測震度
939
1059
  elsif @fastcast[i+5, 2] == @fastcast[i+7, 2]
@@ -951,16 +1071,20 @@ AreaCord = {
951
1071
  local[:warning] = false # 警報を含むかどうか
952
1072
  when "1"
953
1073
  local[:warning] = true
954
- else
1074
+ when "/", "2".."9"
955
1075
  local[:warning] = nil
1076
+ else
1077
+ raise Error, "電文の形式が不正でです(警報の判別[EBI])"
956
1078
  end
957
1079
  case @fastcast[i+18]
958
1080
  when "0"
959
1081
  local[:arrival] = false # 既に到達しているかどうか
960
1082
  when "1"
961
1083
  local[:arrival] = true
962
- else
1084
+ when "/", "2".."9"
963
1085
  local[:arrival] = nil
1086
+ else
1087
+ raise Error, "電文の形式が不正でです(主要動の到達予測状況[EBI])"
964
1088
  end
965
1089
  data << local
966
1090
  i += 20
@@ -970,7 +1094,7 @@ AreaCord = {
970
1094
  end
971
1095
 
972
1096
  if __FILE__ == $PROGRAM_NAME # テスト
973
- str = <<EOS #テスト用の電文
1097
+ str = <<EOS #テスト用の電文
974
1098
  37 03 00 110415233453 C11
975
1099
  110415233416
976
1100
  ND20110415233435 NCN005 JD////////////// JN///
@@ -983,10 +1107,13 @@ EBI 251 S6+6- ////// 11 300 S5+5- ////// 11 250 S5+5- ////// 11
983
1107
  330 S0403 233454 00 222 S0403 233455 00
984
1108
  9999=
985
1109
  EOS
986
- p str
987
- fc = EEWParser.new(str)
988
-
989
- puts <<FC
1110
+
1111
+ fc = EEWParser.new(str)
1112
+ p fc
1113
+ p fc.fastcast
1114
+ p fc.to_hash
1115
+
1116
+ puts <<FC
990
1117
  電文種別コード: #{fc.type}
991
1118
  発信官署: #{fc.from}
992
1119
  訓練等の識別符: #{fc.drill_type}
@@ -1010,10 +1137,10 @@ puts <<FC
1010
1137
  震央位置の海陸判定: #{fc.land_or_sea}
1011
1138
  警報を含む内容かどうか: #{fc.warning?}
1012
1139
  最大予測震度の変化: #{fc.change}
1013
- 最大予測震度の変化の理由: #{fc.reason_of_chaage}
1140
+ 最大予測震度の変化の理由: #{fc.reason_of_change}
1014
1141
  FC
1015
- fc.ebi.each do |local|
1016
- puts "地域コード: #{local[:area_cord]} 最大予測震度: #{local[:intensity]} 予想到達時刻: #{local[:arrival_time]}"
1017
- puts "警報を含むかどうか: #{local[:warning]} 既に到達しているかどうか: #{local[:arrival]}"
1018
- end
1142
+ fc.ebi.each do |local|
1143
+ puts "地域コード: #{local[:area_cord]} 最大予測震度: #{local[:intensity]} 予想到達時刻: #{local[:arrival_time]}"
1144
+ puts "警報を含むかどうか: #{local[:warning]} 既に到達しているかどうか: #{local[:arrival]}"
1145
+ end
1019
1146
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eew_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-04-25 00:00:00.000000000 +09:00
13
- default_executable:
12
+ date: 2011-04-25 00:00:00.000000000Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: shoulda
17
- requirement: &26769080 !ruby/object:Gem::Requirement
16
+ requirement: &10071040 !ruby/object:Gem::Requirement
18
17
  none: false
19
18
  requirements:
20
19
  - - ! '>='
@@ -22,10 +21,10 @@ dependencies:
22
21
  version: '0'
23
22
  type: :development
24
23
  prerelease: false
25
- version_requirements: *26769080
24
+ version_requirements: *10071040
26
25
  - !ruby/object:Gem::Dependency
27
26
  name: bundler
28
- requirement: &26768280 !ruby/object:Gem::Requirement
27
+ requirement: &10070560 !ruby/object:Gem::Requirement
29
28
  none: false
30
29
  requirements:
31
30
  - - ~>
@@ -33,10 +32,10 @@ dependencies:
33
32
  version: 1.0.0
34
33
  type: :development
35
34
  prerelease: false
36
- version_requirements: *26768280
35
+ version_requirements: *10070560
37
36
  - !ruby/object:Gem::Dependency
38
37
  name: jeweler
39
- requirement: &26767480 !ruby/object:Gem::Requirement
38
+ requirement: &10070080 !ruby/object:Gem::Requirement
40
39
  none: false
41
40
  requirements:
42
41
  - - ~>
@@ -44,10 +43,10 @@ dependencies:
44
43
  version: 1.5.2
45
44
  type: :development
46
45
  prerelease: false
47
- version_requirements: *26767480
46
+ version_requirements: *10070080
48
47
  - !ruby/object:Gem::Dependency
49
48
  name: rcov
50
- requirement: &26766400 !ruby/object:Gem::Requirement
49
+ requirement: &10069600 !ruby/object:Gem::Requirement
51
50
  none: false
52
51
  requirements:
53
52
  - - ! '>='
@@ -55,7 +54,7 @@ dependencies:
55
54
  version: '0'
56
55
  type: :development
57
56
  prerelease: false
58
- version_requirements: *26766400
57
+ version_requirements: *10069600
59
58
  description: parser for Earthquake Early Warning
60
59
  email: glass.saga@gmail.com
61
60
  executables: []
@@ -72,7 +71,6 @@ files:
72
71
  - VERSION
73
72
  - eew_parser.gemspec
74
73
  - lib/eew_parser.rb
75
- has_rdoc: true
76
74
  homepage: http://github.com/Glasssaga/eew_parser
77
75
  licenses:
78
76
  - NYSL Version 0.9982
@@ -86,9 +84,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
86
84
  - - ! '>='
87
85
  - !ruby/object:Gem::Version
88
86
  version: '0'
89
- segments:
90
- - 0
91
- hash: -4382551266260180307
92
87
  required_rubygems_version: !ruby/object:Gem::Requirement
93
88
  none: false
94
89
  requirements:
@@ -97,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
92
  version: '0'
98
93
  requirements: []
99
94
  rubyforge_project:
100
- rubygems_version: 1.6.2
95
+ rubygems_version: 1.8.3
101
96
  signing_key:
102
97
  specification_version: 3
103
98
  summary: parser for Earthquake Early Warning