zakuro 0.6.0 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +3 -0
  3. data/README.md +58 -16
  4. data/VERSION +1 -1
  5. data/doc/dropped_date.md +93 -0
  6. data/doc/error.md +45 -0
  7. data/doc/operation/transfer.rb +8 -8
  8. data/lib/zakuro/calculation/base/day.rb +52 -0
  9. data/lib/zakuro/calculation/base/gengou.rb +50 -4
  10. data/lib/zakuro/calculation/base/linear_gengou.rb +6 -6
  11. data/lib/zakuro/calculation/base/operated_year.rb +3 -3
  12. data/lib/zakuro/calculation/base/year.rb +4 -4
  13. data/lib/zakuro/calculation/cycle/abstract_remainder.rb +5 -3
  14. data/lib/zakuro/calculation/era/gengou/abstract_scroll.rb +209 -0
  15. data/lib/zakuro/calculation/era/gengou/dated_scroll.rb +30 -0
  16. data/lib/zakuro/calculation/era/gengou/internal/connector.rb +107 -0
  17. data/lib/zakuro/calculation/era/gengou/internal/counter.rb +214 -0
  18. data/lib/zakuro/calculation/era/gengou/internal/publisher.rb +104 -0
  19. data/lib/zakuro/calculation/era/gengou/internal/reserve/abstract_list.rb +230 -0
  20. data/lib/zakuro/calculation/era/gengou/internal/reserve/abstract_range.rb +193 -0
  21. data/lib/zakuro/calculation/era/gengou/internal/reserve/dated_list.rb +48 -0
  22. data/lib/zakuro/calculation/era/gengou/internal/reserve/dated_range.rb +30 -0
  23. data/lib/zakuro/calculation/era/gengou/internal/reserve/empty_link.rb +158 -0
  24. data/lib/zakuro/calculation/era/gengou/internal/reserve/named_list.rb +125 -0
  25. data/lib/zakuro/calculation/era/gengou/internal/reserve/named_range.rb +75 -0
  26. data/lib/zakuro/calculation/{gengou → era/gengou}/internal/reserve.rb +6 -7
  27. data/lib/zakuro/calculation/era/gengou/named_scroll.rb +30 -0
  28. data/lib/zakuro/calculation/{version → era/version}/internal/crawler.rb +7 -7
  29. data/lib/zakuro/calculation/{version → era/version}/internal/range.rb +4 -4
  30. data/lib/zakuro/calculation/{version → era/version}/version.rb +3 -3
  31. data/lib/zakuro/calculation/monthly/initialized_month.rb +1 -1
  32. data/lib/zakuro/calculation/monthly/month.rb +44 -5
  33. data/lib/zakuro/calculation/monthly/operated_month.rb +2 -2
  34. data/lib/zakuro/calculation/option/dropped_date/abstract_parameter.rb +44 -0
  35. data/lib/zakuro/calculation/option/dropped_date/location.rb +135 -0
  36. data/lib/zakuro/calculation/range/{full_range.rb → abstract_full_range.rb} +29 -27
  37. data/lib/zakuro/calculation/range/{operated_range.rb → abstract_operation_range.rb} +11 -14
  38. data/lib/zakuro/calculation/range/dated_full_range.rb +32 -0
  39. data/lib/zakuro/calculation/range/dated_operation_range.rb +33 -0
  40. data/lib/zakuro/calculation/range/medieval_annual_range.rb +2 -2
  41. data/lib/zakuro/calculation/range/named_full_range.rb +38 -0
  42. data/lib/zakuro/calculation/range/named_operation_range.rb +36 -0
  43. data/lib/zakuro/calculation/range/operated_solar_terms.rb +9 -11
  44. data/lib/zakuro/calculation/range/transfer/year_boundary.rb +6 -6
  45. data/lib/zakuro/calculation/stella/solar/abstract_location.rb +2 -0
  46. data/lib/zakuro/calculation/summary/internal/day.rb +40 -0
  47. data/lib/zakuro/calculation/summary/internal/month.rb +92 -0
  48. data/lib/zakuro/calculation/summary/{single.rb → internal/operation.rb} +6 -40
  49. data/lib/zakuro/calculation/summary/internal/option.rb +85 -0
  50. data/lib/zakuro/calculation/summary/japan/range.rb +158 -0
  51. data/lib/zakuro/calculation/summary/japan/single.rb +118 -0
  52. data/lib/zakuro/calculation/summary/japan/specifier/single_day.rb +96 -0
  53. data/lib/zakuro/calculation/summary/western/range.rb +124 -0
  54. data/lib/zakuro/calculation/summary/western/single.rb +113 -0
  55. data/lib/zakuro/calculation/summary/western/specifier/multiple_day.rb +174 -0
  56. data/lib/zakuro/calculation/summary/western/specifier/single_day.rb +98 -0
  57. data/lib/zakuro/calculation/type/optional.rb +46 -0
  58. data/lib/zakuro/condition.rb +75 -22
  59. data/lib/zakuro/context/context.rb +44 -0
  60. data/lib/zakuro/context/option.rb +117 -0
  61. data/lib/zakuro/context/version_class_resolver.rb +110 -0
  62. data/lib/zakuro/era/japan/gengou/alignment/aligner.rb +125 -0
  63. data/lib/zakuro/era/japan/gengou/alignment/division.rb +168 -0
  64. data/lib/zakuro/era/japan/gengou/alignment/line.rb +175 -0
  65. data/lib/zakuro/era/japan/gengou/alignment/linear_gengou.rb +187 -0
  66. data/lib/zakuro/era/japan/gengou/alignment.rb +55 -0
  67. data/lib/zakuro/era/japan/gengou/resource/parser.rb +245 -0
  68. data/lib/zakuro/era/japan/gengou/resource/type.rb +299 -0
  69. data/lib/zakuro/era/japan/gengou/resource/validator.rb +347 -0
  70. data/lib/zakuro/era/japan/gengou/{yaml → resource/yaml}/set-001-until-south.yaml +2 -2
  71. data/lib/zakuro/era/japan/gengou/{yaml → resource/yaml}/set-002-from-north.yaml +2 -2
  72. data/lib/zakuro/era/japan/gengou/{yaml → resource/yaml}/set-003-modern.yaml +2 -2
  73. data/lib/zakuro/era/japan/gengou/resource.rb +33 -0
  74. data/lib/zakuro/era/japan/gengou.rb +25 -79
  75. data/lib/zakuro/era/japan/version.rb +18 -18
  76. data/lib/zakuro/era/western/calendar.rb +13 -9
  77. data/lib/zakuro/exception/case/pattern.rb +71 -0
  78. data/lib/zakuro/exception/case/preset.rb +51 -0
  79. data/lib/zakuro/exception/case/template.rb +48 -0
  80. data/lib/zakuro/exception/cause.rb +28 -0
  81. data/lib/zakuro/exception/exception.rb +37 -0
  82. data/lib/zakuro/exception/zakuro_error.rb +46 -0
  83. data/lib/zakuro/gateway/locale/date.rb +127 -0
  84. data/lib/zakuro/gateway/locale/range.rb +67 -0
  85. data/lib/zakuro/gateway/range.rb +99 -0
  86. data/lib/zakuro/gateway/single.rb +70 -0
  87. data/lib/zakuro/merchant.rb +84 -12
  88. data/lib/zakuro/operation/month/parser.rb +11 -9
  89. data/lib/zakuro/operation/month/type.rb +31 -31
  90. data/lib/zakuro/operation/month/validator.rb +50 -50
  91. data/lib/zakuro/operation/yaml/month.yaml +3736 -3736
  92. data/lib/zakuro/output/logger.rb +17 -3
  93. data/lib/zakuro/output/response.rb +24 -57
  94. data/lib/zakuro/result/data/day.rb +43 -0
  95. data/lib/zakuro/result/data/gengou.rb +35 -0
  96. data/lib/zakuro/result/data/month.rb +63 -0
  97. data/lib/zakuro/result/data/option/abstract_option.rb +37 -0
  98. data/lib/zakuro/result/data/option/dropped_date/calculation.rb +47 -0
  99. data/lib/zakuro/result/data/option/dropped_date/option.rb +47 -0
  100. data/lib/zakuro/result/data/option/dropped_date/solar_term.rb +48 -0
  101. data/lib/zakuro/result/data/single_day.rb +56 -0
  102. data/lib/zakuro/result/data/solar_term.rb +35 -0
  103. data/lib/zakuro/result/data/year.rb +45 -0
  104. data/lib/zakuro/result/operation/bundle.rb +44 -0
  105. data/lib/zakuro/result/operation/month/annotation.rb +40 -0
  106. data/lib/zakuro/result/operation/month/bundle.rb +36 -0
  107. data/lib/zakuro/result/operation/month/history.rb +54 -0
  108. data/lib/zakuro/result/result.rb +21 -2
  109. data/lib/zakuro/tools/stringifier.rb +26 -3
  110. data/lib/zakuro/version/daien/cycle/remainder.rb +2 -2
  111. data/lib/zakuro/version/daien/option/dropped_date/parameter.rb +31 -0
  112. data/lib/zakuro/version/daien/range/annual_range.rb +1 -1
  113. data/lib/zakuro/version/daien/stella/lunar/adjustment.rb +2 -0
  114. data/lib/zakuro/version/daien/stella/lunar/value.rb +2 -0
  115. data/lib/zakuro/version/genka/cycle/remainder.rb +2 -2
  116. data/lib/zakuro/version/genka/option/dropped_date/parameter.rb +31 -0
  117. data/lib/zakuro/version/genka/range/annual_range.rb +1 -1
  118. data/lib/zakuro/version/gihou/cycle/remainder.rb +2 -2
  119. data/lib/zakuro/version/gihou/option/dropped_date/parameter.rb +31 -0
  120. data/lib/zakuro/version/gihou/range/annual_range.rb +1 -1
  121. data/lib/zakuro/version/gihou/stella/lunar/adjustment.rb +2 -0
  122. data/lib/zakuro/version/gihou/stella/lunar/value.rb +2 -0
  123. data/lib/zakuro/version/senmyou/README.md +11 -7
  124. data/lib/zakuro/version/senmyou/const/remainder.rb +5 -0
  125. data/lib/zakuro/version/senmyou/cycle/remainder.rb +37 -2
  126. data/lib/zakuro/version/senmyou/option/dropped_date/parameter.rb +33 -0
  127. data/lib/zakuro/version/senmyou/range/annual_range.rb +1 -1
  128. data/lib/zakuro/version/senmyou/stella/lunar/adjustment.rb +2 -0
  129. data/lib/zakuro/version/senmyou/stella/lunar/value.rb +2 -0
  130. metadata +85 -24
  131. data/lib/zakuro/calculation/gengou/internal/counter.rb +0 -129
  132. data/lib/zakuro/calculation/gengou/internal/reserve/interval.rb +0 -183
  133. data/lib/zakuro/calculation/gengou/internal/reserve/list.rb +0 -382
  134. data/lib/zakuro/calculation/gengou/scroll.rb +0 -262
  135. data/lib/zakuro/calculation/specifier/single_day.rb +0 -87
  136. data/lib/zakuro/era/japan/gengou/parser.rb +0 -237
  137. data/lib/zakuro/era/japan/gengou/type.rb +0 -285
  138. data/lib/zakuro/era/japan/gengou/validator.rb +0 -341
  139. data/lib/zakuro/result/data.rb +0 -187
  140. data/lib/zakuro/result/operation.rb +0 -114
  141. data/lib/zakuro/version/context.rb +0 -44
  142. data/lib/zakuro/version/version_class_resolver.rb +0 -74
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative '../western/calendar'
4
- require_relative './gengou/parser'
5
- require_relative './gengou/type'
4
+
5
+ require_relative './gengou/alignment'
6
6
 
7
7
  # :nodoc:
8
8
  module Zakuro
@@ -11,95 +11,41 @@ module Zakuro
11
11
  #
12
12
  module Japan
13
13
  #
14
- # GengouResource 元号情報
14
+ # Gengou 元号
15
15
  #
16
- module GengouResource
17
- # @return [Array<Set>] 元号セット情報リスト
18
- LIST = [
19
- Parser.run(filepath: File.expand_path(
20
- './gengou/yaml/set-001-until-south.yaml',
21
- __dir__
22
- )),
23
- Parser.run(filepath: File.expand_path(
24
- './gengou/yaml/set-002-from-north.yaml',
25
- __dir__
26
- )),
27
- Parser.run(filepath: File.expand_path(
28
- './gengou/yaml/set-003-modern.yaml',
29
- __dir__
30
- ))
31
- ].freeze
32
-
33
- # :reek:TooManyStatements { max_statements: 9 }
34
-
35
- #
36
- # 元号(1行目,2行目)を引き当てる
37
- #
38
- # * LIST配列の元号情報を配列順で「x行目」(1始まり)とする
39
- # * 1行目にデータがあれば、第一要素に1行目のデータが設定される
40
- # * 1行目と2行目にデータがあれば、第二要素に2行目のデータが設定される
41
- # * 1行目にデータがなく、2行目以降に1つだけデータがあれば、第一要素にそのデータを設定してそれ以外の要素は未設定
42
- # * 1行目にデータがなく、2行目以降に2つ以上のデータがあれば、第一要素に末尾行に一番近いデータを設定してそれ以外の要素は未設定
43
- #
44
- # @param [Western::Calendar] date 日
45
- #
46
- # @return [Array<Gengou>] 元号情報(1行目, 2行目)
47
- #
48
- def self.lines(date:)
49
- lines = native_lines(date: date)
50
- return lines unless lines[0].invalid?
51
-
52
- first = Japan::Gengou.new
53
- lines[1..].each.with_index(1) do |item, index|
54
- next if item.invalid?
55
-
56
- first = item
57
- lines[index] = Japan::Gengou.new
58
- end
59
- lines[0] = first
60
- lines
61
- end
62
-
63
- #
64
- # 元号を引き当てる
65
- #
66
- # * LISTから単純に元号を引き当てる
67
- # * 1行目,2行目といった概念は無視する
68
- #
69
- # @param [Western::Calendar] date 日
70
- #
71
- # @return [Array<Gengou>] 元号情報
72
- #
73
- def self.native_lines(date:)
74
- result = Array.new(LIST.size)
75
- LIST.each_with_index do |set, index|
76
- result[index] = set.include_item(date: date)
77
- end
78
- result
79
- end
16
+ module Gengou
17
+ # @return [Integer] 1行目
18
+ FIRST_LINE = Alignment::Aligner::FIRST_LINE
19
+ # @return [Integer] 2行目
20
+ SECOND_LINE = Alignment::Aligner::SECOND_LINE
80
21
 
81
22
  #
82
- # 「日本暦日原典」1行目の元号を返す
23
+ # 該当行の元号を取得する
83
24
  #
84
- # @param [Western::Calendar] date
25
+ # @param [Integer] line 行番号
26
+ # @param [Western::Calendar] start_date 開始日
27
+ # @param [Western::Calendar] last_date 終了日
85
28
  #
86
- # @return [Gengou] 元号情報(1行目)
29
+ # @return [Array<LinearGengou>] 該当行の元号
87
30
  #
88
- def self.first_line(date:)
89
- lines = lines(date: date)
90
- lines[0].clone
31
+ def self.line(line: FIRST_LINE,
32
+ start_date: Western::Calendar.new, last_date: Western::Calendar.new)
33
+ Alignment.get(
34
+ line: line, start_date: start_date, last_date: last_date
35
+ )
91
36
  end
92
37
 
93
38
  #
94
- # 「日本暦日原典」2行目の元号を返す
39
+ # 該当行の元号を取得する(元号名)
95
40
  #
96
- # @param [Western::Calendar] date
41
+ # @param [Integer] line 行番号
42
+ # @param [Western::Calendar] start_date 開始日
43
+ # @param [Western::Calendar] last_date 終了日
97
44
  #
98
- # @return [Gengou] 元号情報(2行目)
45
+ # @return [Array<LinearGengou>] 該当行の元号
99
46
  #
100
- def self.second_line(date:)
101
- lines = lines(date: date)
102
- lines[1].clone
47
+ def self.line_by_name(line: FIRST_LINE, name:)
48
+ Alignment.get_by_name(line: line, name: name)
103
49
  end
104
50
  end
105
51
  end
@@ -23,7 +23,7 @@ module Zakuro
23
23
  # @return [Integer] 開始西暦年
24
24
  attr_reader :start_year
25
25
  # @return [Integer] 終了西暦年
26
- attr_reader :end_year
26
+ attr_reader :last_year
27
27
  # @return [True] リリース済
28
28
  # @return [False] 未リリース
29
29
  attr_reader :released
@@ -34,20 +34,20 @@ module Zakuro
34
34
  # @param [String] name 暦名
35
35
  # @param [Western::Calendar] start_date 暦の開始日
36
36
  # @param [Integer] start_year 開始西暦年
37
- # @param [Integer] end_year 終了西暦年
37
+ # @param [Integer] last_year 終了西暦年
38
38
  # @param [True, False] released リリース済 / 未リリース
39
39
  #
40
- def initialize(name:, start_date:, start_year:, end_year:, released:)
40
+ def initialize(name:, start_date:, start_year:, last_year:, released:)
41
41
  @name = name
42
42
  @start_date = start_date
43
43
  @start_year = start_year
44
- @end_year = end_year
44
+ @last_year = last_year
45
45
  @released = released
46
46
  end
47
47
  end
48
48
 
49
49
  # TODO: yamlにする
50
- # TODO: end_year は不要
50
+ # TODO: last_year は不要
51
51
 
52
52
  # @return [Array<Range>] 全和暦
53
53
  LIST = [
@@ -56,7 +56,7 @@ module Zakuro
56
56
  name: 'Genka',
57
57
  start_date: Western::Calendar.new(year: 445, month: 1, day: 24),
58
58
  start_year: 445,
59
- end_year: 697,
59
+ last_year: 697,
60
60
  released: true
61
61
  ),
62
62
  # 文武天皇02年01月01日
@@ -64,7 +64,7 @@ module Zakuro
64
64
  name: 'Gihou',
65
65
  start_date: Western::Calendar.new(year: 698, month: 2, day: 16),
66
66
  start_year: 698,
67
- end_year: 763,
67
+ last_year: 763,
68
68
  released: true
69
69
  ),
70
70
  # 天平宝字08年01月01日
@@ -72,7 +72,7 @@ module Zakuro
72
72
  name: 'Daien',
73
73
  start_date: Western::Calendar.new(year: 764, month: 2, day: 7),
74
74
  start_year: 764,
75
- end_year: 861,
75
+ last_year: 861,
76
76
  released: true
77
77
  ),
78
78
  # 貞観02年01月01日
@@ -80,7 +80,7 @@ module Zakuro
80
80
  name: 'Senmyou',
81
81
  start_date: Western::Calendar.new(year: 862, month: 2, day: 3),
82
82
  start_year: 862,
83
- end_year: 1684,
83
+ last_year: 1684,
84
84
  released: true
85
85
  ),
86
86
  # 貞享02年01月01日
@@ -88,7 +88,7 @@ module Zakuro
88
88
  name: 'Joukyou',
89
89
  start_date: Western::Calendar.new(year: 1685, month: 2, day: 4),
90
90
  start_year: 1685,
91
- end_year: 1754,
91
+ last_year: 1754,
92
92
  released: false
93
93
  ),
94
94
  # 宝暦05年01月01日
@@ -96,7 +96,7 @@ module Zakuro
96
96
  name: 'Houryaku',
97
97
  start_date: Western::Calendar.new(year: 1755, month: 2, day: 11),
98
98
  start_year: 1755,
99
- end_year: 1797,
99
+ last_year: 1797,
100
100
  released: false
101
101
  ),
102
102
  # 寛政10年01月01日
@@ -104,7 +104,7 @@ module Zakuro
104
104
  name: 'Kansei',
105
105
  start_date: Western::Calendar.new(year: 1798, month: 2, day: 16),
106
106
  start_year: 1798,
107
- end_year: 1843,
107
+ last_year: 1843,
108
108
  released: false
109
109
  ),
110
110
  # 天保13年01月01日
@@ -112,7 +112,7 @@ module Zakuro
112
112
  name: 'Tenpou',
113
113
  start_date: Western::Calendar.new(year: 1844, month: 2, day: 18),
114
114
  start_year: 1844,
115
- end_year: 1867,
115
+ last_year: 1867,
116
116
  released: false
117
117
  ),
118
118
  # 明治01年09月08日
@@ -120,7 +120,7 @@ module Zakuro
120
120
  name: 'Gregorio',
121
121
  start_date: Western::Calendar.new(year: 1868, month: 10, day: 23),
122
122
  start_year: 1868,
123
- end_year: 9999,
123
+ last_year: 9999,
124
124
  released: false
125
125
  )
126
126
  ].freeze
@@ -129,17 +129,17 @@ module Zakuro
129
129
  # 年を基準に暦を引き当てる
130
130
  #
131
131
  # @param [Integer] start_year 開始西暦年
132
- # @param [Integer] end_year 終了西暦年
132
+ # @param [Integer] last_year 終了西暦年
133
133
  #
134
134
  # @return [Array<Range>] 和暦
135
135
  #
136
- def self.ranges_with_year(start_year:, end_year:)
136
+ def self.ranges_with_year(start_year:, last_year:)
137
137
  result = []
138
138
 
139
139
  LIST.each do |range|
140
- next if start_year > range.end_year
140
+ next if start_year > range.last_year
141
141
 
142
- next if end_year < range.start_year
142
+ next if last_year < range.start_year
143
143
 
144
144
  result.push(range)
145
145
  end
@@ -188,6 +188,8 @@ module Zakuro
188
188
  # @param [Integer] day 日
189
189
  # @param [Symbol] type 日付種別
190
190
  #
191
+ # @raise [ArgumentError] 引数エラー
192
+ #
191
193
  def initialize(year: -4712, month: 1, day: 1, type: Type::DEFAULT)
192
194
  start = Western.to_native_start(type: type)
193
195
  @param = Parameter.new(year: year, month: month, day: day, start: start)
@@ -381,18 +383,20 @@ module Zakuro
381
383
  #
382
384
  # 年月日情報(西暦)を生成する
383
385
  #
384
- # @param [String] str 日付文字列
386
+ # @param [String] text 日付文字列
385
387
  # @param [Symbol] type 日付種別
386
388
  #
387
389
  # @return [Calendar] 年月日情報(西暦)
388
390
  #
389
- def self.parse(str: '', type: Type::DEFAULT)
390
- unless Calendar.valid_date_string(str: str, type: type)
391
- raise ArgumentError, "invalid date string: #{str}"
391
+ # @raise [ArgumentError] 引数エラー
392
+ #
393
+ def self.parse(text: '', type: Type::DEFAULT)
394
+ unless Calendar.valid_date_string(text: text, type: type)
395
+ raise ArgumentError, "invalid date string: #{text}"
392
396
  end
393
397
 
394
398
  start = DATE_START.fetch(type, DATE_START[Type::DEFAULT])
395
- date = Date.parse(str, start)
399
+ date = Date.parse(text, start)
396
400
 
397
401
  Calendar.new(
398
402
  year: date.year, month: date.month, day: date.day, type: type
@@ -402,18 +406,18 @@ module Zakuro
402
406
  #
403
407
  # 日付文字列を検証する
404
408
  #
405
- # @param [String] str 日付文字列
409
+ # @param [String] text 日付文字列
406
410
  # @param [Symbol] type 日付種別
407
411
  #
408
412
  # @return [True] 正しい
409
413
  # @return [True] 正しくない
410
414
  #
411
- def self.valid_date_string(str: '', type: Type::DEFAULT)
415
+ def self.valid_date_string(text: '', type: Type::DEFAULT)
412
416
  start = DATE_START.fetch(type, DATE_START[Type::DEFAULT])
413
417
  begin
414
- Date.parse(str, start)
418
+ Date.parse(text, start)
415
419
  rescue ArgumentError => _e
416
- false
420
+ return false
417
421
  end
418
422
  true
419
423
  end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './template'
4
+
5
+ # :nodoc:
6
+ module Zakuro
7
+ # :nodoc:
8
+ module Exception
9
+ # :nodoc:
10
+ module Case
11
+ #
12
+ # Pattern 原因パターン
13
+ #
14
+ module Pattern
15
+ INTERNAL_ERROR = Template.new(
16
+ code: 'ERROR_0001',
17
+ message: '内部エラーです。',
18
+ length: 0
19
+ )
20
+
21
+ INVALID_DATE_TYPE = Template.new(
22
+ code: 'ERROR_0101',
23
+ message: '日付の型は文字列/日付です。指定型:%s',
24
+ length: 1
25
+ )
26
+
27
+ INVALID_RANGE_TYPE = Template.new(
28
+ code: 'ERROR_0102',
29
+ message: '範囲の型はhashです。指定型:%s',
30
+ length: 1
31
+ )
32
+
33
+ INVALID_OPTION_TYPE = Template.new(
34
+ code: 'ERROR_0103',
35
+ message: 'オプションの型はhashです。指定型:%s',
36
+ length: 1
37
+ )
38
+
39
+ INVALID_COLUMN_TYPE = Template.new(
40
+ code: 'ERROR_0104',
41
+ message: '列の型は配列です。指定型:%s',
42
+ length: 1
43
+ )
44
+
45
+ INVALID_CONDITION_TYPE = Template.new(
46
+ code: 'ERROR_0105',
47
+ message: '条件の型は配列です。指定型:%s',
48
+ length: 1
49
+ )
50
+
51
+ INVALID_DATE = Template.new(
52
+ code: 'ERROR_0201',
53
+ message: '一日検索の日付指定が誤っています。',
54
+ length: 0
55
+ )
56
+
57
+ INVALID_RANGE = Template.new(
58
+ code: 'ERROR_0202',
59
+ message: '範囲検索の日付指定が誤っています。',
60
+ length: 0
61
+ )
62
+
63
+ UNCOMMITTABLE_DATE = Template.new(
64
+ code: 'ERROR_0203',
65
+ message: '検索不可能な日付指定です。',
66
+ length: 0
67
+ )
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './template'
4
+
5
+ # :nodoc:
6
+ module Zakuro
7
+ # :nodoc:
8
+ module Exception
9
+ # :nodoc:
10
+ module Case
11
+ #
12
+ # Preset プリセット
13
+ #
14
+ class Preset
15
+ # @return [Template] テンプレート
16
+ attr_reader :template
17
+ # @return [Array<Object>] メッセージ引数
18
+ attr_reader :args
19
+
20
+ #
21
+ # 初期化
22
+ #
23
+ # @param [String] args メッセージ引数
24
+ # @param [String] template テンプレート
25
+ #
26
+ def initialize(*args, template:)
27
+ @template = template
28
+ @args = args
29
+ end
30
+
31
+ #
32
+ # エラーコードを取得する
33
+ #
34
+ # @return [String] エラーコード
35
+ #
36
+ def code
37
+ @template.code
38
+ end
39
+
40
+ #
41
+ # メッセージを作成する
42
+ #
43
+ # @return [String] メッセージ
44
+ #
45
+ def message
46
+ @template.format(*args)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nodoc:
4
+ module Zakuro
5
+ # :nodoc:
6
+ module Exception
7
+ # :nodoc:
8
+ module Case
9
+ #
10
+ # Template テンプレート
11
+ #
12
+ class Template
13
+ # @return [String] エラーコード
14
+ attr_reader :code
15
+ # @return [String] メッセージ
16
+ attr_reader :message
17
+ # @return [Integer] テンプレート引数長
18
+ attr_reader :length
19
+
20
+ #
21
+ # 初期化
22
+ #
23
+ # @param [String] code エラーコード
24
+ # @param [String] message メッセージ
25
+ # @param [Integer] length テンプレート引数長
26
+ #
27
+ def initialize(code:, message:, length: 0)
28
+ @code = code
29
+ @message = message
30
+ @length = length
31
+ end
32
+
33
+ #
34
+ # メッセージを作成する
35
+ #
36
+ # @param [Array<Object>] args テンプレート引数長
37
+ #
38
+ # @return [String] メッセージ
39
+ #
40
+ def format(*args)
41
+ return '' unless args.size == length
42
+
43
+ super(message, *args)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nodoc:
4
+ module Zakuro
5
+ # :nodoc:
6
+ module Exception
7
+ #
8
+ # Cause 原因
9
+ #
10
+ class Cause
11
+ # @return [String] エラーコード
12
+ attr_reader :code
13
+ # @return [String] メッセージ
14
+ attr_reader :message
15
+
16
+ #
17
+ # 初期化
18
+ #
19
+ # @param [String] code エラーコード
20
+ # @param [String] message メッセージ
21
+ #
22
+ def initialize(code:, message:)
23
+ @code = code
24
+ @message = message
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../output/logger'
4
+
5
+ require_relative './case/preset'
6
+ require_relative './case/pattern'
7
+
8
+ require_relative './zakuro_error'
9
+ require_relative './cause'
10
+
11
+ # :nodoc:
12
+ module Zakuro
13
+ # :nodoc:
14
+ module Exception
15
+ # @return [Output::Logger] ロガー
16
+ LOGGER = Output::Logger.new(location: 'exception')
17
+
18
+ # @return [String] 共通メッセージ
19
+ MESSAGE = 'an error has occurred'
20
+
21
+ #
22
+ # 例外を取得する
23
+ #
24
+ # @param [Array<Case::Preset>] presets 原因プリセット
25
+ #
26
+ # @return [ZakuroError] ライブラリエラー
27
+ #
28
+ def self.get(presets: [])
29
+ causes = []
30
+ presets.each do |preset|
31
+ causes.push(Cause.new(code: preset.code, message: preset.message))
32
+ end
33
+
34
+ ZakuroError.new(msg: MESSAGE, causes: causes)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require_relative './cause'
5
+
6
+ # :nodoc:
7
+ module Zakuro
8
+ # :nodoc:
9
+ module Exception
10
+ #
11
+ # ZakuroError ライブラリ内エラー
12
+ #
13
+ class ZakuroError < StandardError
14
+ # @return [Array<ErrorMessage>] エラーメッセージ
15
+ attr_reader :causes
16
+
17
+ #
18
+ # 初期化
19
+ #
20
+ # @param [String] msg メッセージ
21
+ # @param [Array<Cause>] causes 原因
22
+ #
23
+ def initialize(msg: '', causes: [])
24
+ @causes = causes
25
+ out = "#{msg}:#{text}"
26
+ super(out)
27
+ end
28
+
29
+ private
30
+
31
+ #
32
+ # 原因をJSON文字列にする
33
+ #
34
+ # @return [String] JSON文字列
35
+ #
36
+ def text
37
+ list = []
38
+ @causes.each do |cause|
39
+ list.push(Tools::Stringifier.to_h(obj: cause, class_prefix: 'Zakuro'))
40
+ end
41
+
42
+ JSON.generate(list)
43
+ end
44
+ end
45
+ end
46
+ end