zakuro 0.9.2 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/VERSION +1 -1
  4. data/doc/dropped_date.md +25 -0
  5. data/doc/operation/csv/month.csv +1 -1
  6. data/doc/operation/operation.xlsx +0 -0
  7. data/doc/vanished_date.md +26 -0
  8. data/lib/zakuro/calculation/cycle/abstract_remainder.rb +26 -0
  9. data/lib/zakuro/calculation/cycle/abstract_solar_term.rb +1 -1
  10. data/lib/zakuro/calculation/era/gengou/dated_scroll.rb +6 -2
  11. data/lib/zakuro/calculation/era/gengou/internal/counter.rb +5 -5
  12. data/lib/zakuro/calculation/era/gengou/internal/reserve/abstract_list.rb +12 -5
  13. data/lib/zakuro/calculation/era/gengou/internal/reserve/abstract_range.rb +9 -3
  14. data/lib/zakuro/calculation/era/gengou/internal/reserve/dated_list.rb +3 -2
  15. data/lib/zakuro/calculation/era/gengou/internal/reserve/dated_range.rb +4 -2
  16. data/lib/zakuro/calculation/era/gengou/internal/reserve/named_list.rb +5 -3
  17. data/lib/zakuro/calculation/era/gengou/internal/reserve/named_range.rb +9 -4
  18. data/lib/zakuro/calculation/era/gengou/named_scroll.rb +5 -2
  19. data/lib/zakuro/calculation/monthly/initialized_month.rb +4 -2
  20. data/lib/zakuro/calculation/monthly/meta/all_solar_term.rb +64 -0
  21. data/lib/zakuro/calculation/monthly/meta/meta_collector.rb +80 -0
  22. data/lib/zakuro/calculation/monthly/meta.rb +60 -0
  23. data/lib/zakuro/calculation/monthly/month.rb +60 -5
  24. data/lib/zakuro/calculation/monthly/operated_month.rb +5 -19
  25. data/lib/zakuro/calculation/option/dropped_date/location.rb +12 -23
  26. data/lib/zakuro/calculation/option/vanished_date/location.rb +9 -2
  27. data/lib/zakuro/calculation/range/abstract_full_range.rb +19 -2
  28. data/lib/zakuro/calculation/range/abstract_operation_range.rb +20 -2
  29. data/lib/zakuro/calculation/range/dated_full_range.rb +3 -1
  30. data/lib/zakuro/calculation/range/dated_operation_range.rb +3 -1
  31. data/lib/zakuro/calculation/range/medieval_annual_range.rb +1 -1
  32. data/lib/zakuro/calculation/range/named_full_range.rb +3 -1
  33. data/lib/zakuro/calculation/range/named_operation_range.rb +3 -1
  34. data/lib/zakuro/calculation/range/transfer/gengou_scroller.rb +2 -1
  35. data/lib/zakuro/calculation/range/transfer/year_boundary.rb +10 -8
  36. data/lib/zakuro/calculation/stella/solar/abstract_average.rb +8 -34
  37. data/lib/zakuro/calculation/summary/internal/option.rb +24 -5
  38. data/lib/zakuro/calculation/summary/western/specifier/single_day.rb +1 -1
  39. data/lib/zakuro/era/japan/gengou/alignment/linear_gengou.rb +1 -1
  40. data/lib/zakuro/era/japan/gengou/alignment.rb +14 -2
  41. data/lib/zakuro/era/japan/gengou/resource/parser.rb +83 -25
  42. data/lib/zakuro/era/japan/gengou/resource/type.rb +81 -26
  43. data/lib/zakuro/era/japan/gengou/resource/validator.rb +100 -21
  44. data/lib/zakuro/era/japan/gengou/resource/yaml/set-001-until-south.yaml +1123 -375
  45. data/lib/zakuro/era/japan/gengou/resource/yaml/set-002-from-north.yaml +487 -163
  46. data/lib/zakuro/era/japan/gengou/resource/yaml/set-003-modern.yaml +30 -10
  47. data/lib/zakuro/era/japan/gengou/resource.rb +16 -0
  48. data/lib/zakuro/era/japan/gengou.rb +7 -4
  49. data/lib/zakuro/operation/yaml/month.yaml +1 -1
  50. data/lib/zakuro/output/logger.rb +21 -3
  51. data/lib/zakuro/tools/remainder_comparer.rb +97 -0
  52. metadata +6 -2
@@ -23,6 +23,9 @@ module Zakuro
23
23
  # @return [Aligner] 整列結果
24
24
  SUMMARY = Aligner.new(resources: Resource::LIST)
25
25
 
26
+ # @return [Aligner] 整列結果(運用値)
27
+ OPERATED_SUMMARY = Aligner.new(resources: Resource::OPERATED_LIST)
28
+
26
29
  class << self
27
30
  #
28
31
  # 指定した範囲内の元号を取得する
@@ -30,11 +33,17 @@ module Zakuro
30
33
  # @param [Integer] line 行
31
34
  # @param [Western::Calendar] start_date 開始日
32
35
  # @param [Western::Calendar] last_date 終了日
36
+ # @param [True, False] operated 運用値設定
33
37
  #
34
38
  # @return [Array<LinearGengou>] 元号
35
39
  #
36
40
  def get(line: FIRST_LINE,
37
- start_date: Western::Calendar.new, last_date: Western::Calendar.new)
41
+ start_date: Western::Calendar.new, last_date: Western::Calendar.new,
42
+ operated: false)
43
+
44
+ if operated
45
+ return OPERATED_SUMMARY.get(line: line, start_date: start_date, last_date: last_date)
46
+ end
38
47
 
39
48
  SUMMARY.get(line: line, start_date: start_date, last_date: last_date)
40
49
  end
@@ -44,10 +53,13 @@ module Zakuro
44
53
  #
45
54
  # @param [Integer] line 行
46
55
  # @param [String] name 元号名
56
+ # @param [True, False] operated 運用値設定
47
57
  #
48
58
  # @return [Array<LinearGengou>] 元号
49
59
  #
50
- def get_by_name(line: FIRST_LINE, name:)
60
+ def get_by_name(line: FIRST_LINE, name:, operated: false)
61
+ return OPERATED_SUMMARY.get_by_name(line: line, name: name) if operated
62
+
51
63
  SUMMARY.get_by_name(line: line, name: name)
52
64
  end
53
65
  end
@@ -30,9 +30,11 @@ module Zakuro
30
30
  # @return [String] 元号名
31
31
  attr_reader :name
32
32
  # @return [Hash<String, String>] 開始年
33
- attr_reader :both_start_year
33
+ attr_reader :start_year
34
34
  # @return [Hash<String, String>] 開始日
35
- attr_reader :both_start_date
35
+ attr_reader :start_date
36
+ # @return [True, False] 運用値
37
+ attr_reader :operated
36
38
 
37
39
  #
38
40
  # 初期化
@@ -40,11 +42,12 @@ module Zakuro
40
42
  # @param [Hash<String, Strin>] hash 元号情報
41
43
  # @param [Integer] index (元号セット内での)元号の要素位置
42
44
  #
43
- def initialize(hash:, index:)
45
+ def initialize(hash:, index:, operated: false)
44
46
  @index = index
45
47
  @name = hash['name']
46
- @both_start_year = hash['start_year']
47
- @both_start_date = hash['start_date']
48
+ @start_year = hash['start_year']
49
+ @start_date = hash['start_date']
50
+ @operated = operated
48
51
  end
49
52
 
50
53
  #
@@ -53,11 +56,11 @@ module Zakuro
53
56
  # @return [Gengou] 元号情報
54
57
  #
55
58
  def create
56
- start_year = Both::YearParser.new(hash: both_start_year).create
57
- start_date = Both::DateParser.new(hash: both_start_date).create
59
+ year = Both::YearParser.new(hash: start_year).create
60
+ date = SwitchDateParser.new(hash: start_date, operated: operated).create
58
61
 
59
- Gengou.new(name: name, both_start_year: start_year,
60
- both_start_date: start_date)
62
+ Gengou.new(name: name, start_year: year,
63
+ start_date: date)
61
64
  end
62
65
  end
63
66
 
@@ -70,23 +73,27 @@ module Zakuro
70
73
  # @return [String] 元号セット名
71
74
  attr_reader :name
72
75
  # @return [Hash<String, String>] 終了年
73
- attr_reader :both_last_year
76
+ attr_reader :last_year
74
77
  # @return [Hash<String, String>] 終了日
75
- attr_reader :both_last_date
78
+ attr_reader :last_date
76
79
  # @return [Array<Hash<String, String>>] 元号情報
77
80
  attr_reader :list
81
+ # @return [True, False] 運用値
82
+ attr_reader :operated
78
83
 
79
84
  #
80
85
  # 初期化
81
86
  #
82
87
  # @param [Hash<String, Object>] hash 元号セット情報
88
+ # @param [True, False] operated 運用値設定
83
89
  #
84
- def initialize(hash:)
90
+ def initialize(hash:, operated: false)
85
91
  @id = hash['id']
86
92
  @name = hash['name']
87
- @both_last_year = hash['last_year']
88
- @both_last_date = hash['last_date']
93
+ @last_year = hash['last_year']
94
+ @last_date = hash['last_date']
89
95
  @list = hash['list']
96
+ @operated = operated
90
97
  end
91
98
 
92
99
  #
@@ -95,10 +102,10 @@ module Zakuro
95
102
  # @return [Set] 元号セット情報
96
103
  #
97
104
  def create
98
- last_date = Both::DateParser.new(hash: both_last_date).create
105
+ date = SwitchDateParser.new(hash: last_date, operated: operated).create
99
106
  list = create_list
100
107
  Set.new(
101
- id: id, name: name, both_last_date: last_date, list: list
108
+ id: id, name: name, last_date: date, list: list
102
109
  )
103
110
  end
104
111
 
@@ -112,7 +119,9 @@ module Zakuro
112
119
  def create_list
113
120
  result = []
114
121
  list.each_with_index do |li, index|
115
- gengou = GengouParser.new(hash: li, index: index).create
122
+ gengou = GengouParser.new(
123
+ hash: li, index: index, operated: operated
124
+ ).create
116
125
  next_index = index + 1
117
126
  gengou = calc_last_date_on_gengou_data(next_index: next_index,
118
127
  gengou: gengou)
@@ -136,11 +145,15 @@ module Zakuro
136
145
  return gengou
137
146
  end
138
147
  next_item = list[next_index]
148
+ next_start_date = SwitchDateParser.new(
149
+ hash: next_item['start_date'], operated: operated
150
+ ).create
151
+
139
152
  gengou.convert_next_start_year_to_last_year(
140
153
  next_start_year: next_item['start_year']['western']
141
154
  )
142
155
  gengou.convert_next_start_date_to_last_date(
143
- next_start_date: next_item['start_date']['western']
156
+ next_start_date: next_start_date.western
144
157
  )
145
158
  gengou
146
159
  end
@@ -153,9 +166,50 @@ module Zakuro
153
166
  # @param [GengouParser] gengou 元号
154
167
  #
155
168
  def last_gengou_data(gengou:)
156
- gengou.write_last_year(last_year: both_last_year['western'])
157
- last_date = Western::Calendar.parse(text: both_last_date['western'])
158
- gengou.write_last_date(last_date: last_date)
169
+ gengou.write_last_year(last_year: last_year['western'])
170
+
171
+ date = SwitchDateParser.new(hash: last_date, operated: operated).create
172
+
173
+ gengou.write_last_date(last_date: date.western)
174
+ end
175
+ end
176
+
177
+ #
178
+ # SwitchDateParser 切替日(運用/計算)
179
+ #
180
+ class SwitchDateParser
181
+ # @return [Hash<String, Strin>] 計算値
182
+ attr_reader :calculation
183
+ # @return [Hash<String, Strin>] 運用値
184
+ attr_reader :operation
185
+ # @return [True, False] 運用値
186
+ attr_reader :operated
187
+
188
+ #
189
+ # 初期化
190
+ #
191
+ # @param [Hash<String, Strin>] hash 切替日(運用/計算)
192
+ # @param [True, False] operated 運用値設定
193
+ #
194
+ def initialize(hash:, operated: false)
195
+ @calculation = hash['calculation']
196
+ @operation = hash['operation']
197
+ @operated = operated
198
+ end
199
+
200
+ #
201
+ # 切替日(運用/計算)情報を生成する
202
+ #
203
+ # @return [SwitchDate] 切替日(運用/計算)情報
204
+ #
205
+ def create
206
+ calculation_date = Both::DateParser.new(hash: calculation).create
207
+ operation_date = Both::DateParser.new(hash: operation).create
208
+
209
+ Japan::Gengou::Resource::SwitchDate.new(
210
+ calculation: calculation_date, operation: operation_date,
211
+ operated: operated
212
+ )
159
213
  end
160
214
  end
161
215
 
@@ -222,8 +276,11 @@ module Zakuro
222
276
  # @return [Both::Date] 日情報
223
277
  #
224
278
  def create
225
- japan_date = Japan::Calendar.parse(text: japan)
226
- western_date = Western::Calendar.parse(text: western)
279
+ japan_date = Japan::Calendar.new
280
+ western_date = Western::Calendar.new
281
+
282
+ japan_date = Japan::Calendar.parse(text: japan) unless japan == ''
283
+ western_date = Western::Calendar.parse(text: western) unless western == ''
227
284
 
228
285
  Japan::Gengou::Resource::Both::Date.new(
229
286
  japan: japan_date, western: western_date
@@ -237,19 +294,20 @@ module Zakuro
237
294
  # 解析/展開する
238
295
  #
239
296
  # @param [String] filepath 元号セットファイルパス
297
+ # @param [True, False] operated 運用値設定
240
298
  #
241
299
  # @return [Set] 元号セット情報
242
300
  #
243
301
  # @raise [ArgumentError] 引数エラー
244
302
  #
245
- def run(filepath: '')
303
+ def run(filepath: '', operated: false)
246
304
  yaml = YAML.load_file(filepath)
247
305
 
248
306
  failed = Validator.run(yaml_hash: yaml)
249
307
 
250
308
  raise ArgumentError, failed.join("\n") unless failed.empty?
251
309
 
252
- parser = SetParser.new(hash: yaml)
310
+ parser = SetParser.new(hash: yaml, operated: operated)
253
311
  parser.create
254
312
  end
255
313
  end
@@ -21,9 +21,9 @@ module Zakuro
21
21
  # @return [String] 元号名
22
22
  attr_reader :name
23
23
  # @return [Both::Year] 開始年(和暦/西暦)
24
- attr_reader :both_start_year
25
- # @return [Both::Date] 開始日(和暦/西暦)
26
- attr_reader :both_start_date
24
+ attr_reader :start_year
25
+ # @return [SwitchDate] 開始日(和暦/西暦)
26
+ attr_reader :start_date
27
27
  # @return [Integer] 終了年
28
28
  attr_reader :last_year
29
29
  # @return [Western::Calendar] 終了日
@@ -33,18 +33,18 @@ module Zakuro
33
33
  # 初期化
34
34
  #
35
35
  # @param [String] name 元号名
36
- # @param [Both::Year] both_start_year 開始年(和暦/西暦)
37
- # @param [Both::Date] both_start_date 開始日(和暦/西暦)
36
+ # @param [Both::Year] start_year 開始年(和暦/西暦)
37
+ # @param [SwitchDate] start_date 開始日(和暦/西暦)
38
38
  # @param [Integer] last_date 終了年
39
39
  # @param [Western::Calendar] last_date 終了日
40
40
  #
41
- def initialize(name: '', both_start_year: Both::Year.new,
42
- both_start_date: Both::Date.new,
41
+ def initialize(name: '', start_year: Both::Year.new,
42
+ start_date: SwitchDate.new,
43
43
  last_date: Western::Calendar.new,
44
44
  last_year: Both::Year::INVALID)
45
45
  @name = name
46
- @both_start_year = both_start_year
47
- @both_start_date = both_start_date
46
+ @start_year = start_year
47
+ @start_date = start_date
48
48
  @last_year = last_year
49
49
  @last_date = last_date
50
50
  end
@@ -86,7 +86,7 @@ module Zakuro
86
86
  # @param [Integer] next_start_year 次回開始年
87
87
  #
88
88
  def convert_next_start_year_to_last_year(next_start_year:)
89
- if both_start_year.western >= next_start_year
89
+ if start_year.western >= next_start_year
90
90
  @last_year = next_start_year
91
91
  return
92
92
  end
@@ -99,15 +99,14 @@ module Zakuro
99
99
  #
100
100
  # 次の元号の開始日から、元号の終了日に変換する
101
101
  #
102
- # @param [String] next_start_date 次回開始日
102
+ # @param [Western::Calendar] next_start_date 次回開始日
103
103
  #
104
104
  # @raise [ArgumentError] 引数エラー
105
105
  #
106
- def convert_next_start_date_to_last_date(next_start_date: '')
107
- raise ArgumentError, 'empty string cannot convert' if next_start_date.empty?
106
+ def convert_next_start_date_to_last_date(next_start_date: Western::Calendar.new)
107
+ raise ArgumentError, 'invalid value. cannot convert' if next_start_date.invalid?
108
108
 
109
- start_date = Western::Calendar.parse(text: next_start_date)
110
- @last_date = start_date - 1
109
+ @last_date = next_start_date.clone - 1
111
110
 
112
111
  nil
113
112
  end
@@ -121,7 +120,7 @@ module Zakuro
121
120
  # @return [False] 含まれない
122
121
  #
123
122
  def include?(date:)
124
- date >= both_start_date.western && date <= last_date
123
+ date >= start_date.western && date <= last_date
125
124
  end
126
125
 
127
126
  #
@@ -131,8 +130,8 @@ module Zakuro
131
130
  # @return [False] 不正なし
132
131
  #
133
132
  def invalid?
134
- both_start_year.japan == -1 || both_start_year.invalid? ||
135
- both_start_date.invalid? || last_date.invalid?
133
+ start_year.japan == -1 || start_year.invalid? ||
134
+ start_date.invalid? || last_date.invalid?
136
135
  end
137
136
 
138
137
  #
@@ -144,8 +143,8 @@ module Zakuro
144
143
  # end
145
144
 
146
145
  def to_s
147
- "name: #{@name}, both_start_year: #{both_start_year.format}, " \
148
- "both_start_date: #{both_start_date.format}, last_date: #{last_date.format}"
146
+ "name: #{@name}, start_year: #{start_year.format}, " \
147
+ "start_date: #{start_date.format}, last_date: #{last_date.format}"
149
148
  end
150
149
 
151
150
  class << self
@@ -190,9 +189,9 @@ module Zakuro
190
189
  # @return [String] 元号セット名
191
190
  attr_reader :name
192
191
  # @return [Both::Date] 元号セットでの終了年
193
- attr_reader :both_last_year
192
+ attr_reader :last_year
194
193
  # @return [Both::Date] 元号セットでの終了日
195
- attr_reader :both_last_date
194
+ attr_reader :last_date
196
195
  # @return [Array<Gengou>] 元号リスト
197
196
  attr_reader :list
198
197
 
@@ -204,12 +203,12 @@ module Zakuro
204
203
  # @param [Western::Calendar] last_date 元号セットでの終了日
205
204
  # @param [Array<Gengou>] list 元号リスト
206
205
  #
207
- def initialize(id: INVALID, name: '', both_last_year: Both::Year.new,
208
- both_last_date: Both::Date.new, list: [])
206
+ def initialize(id: INVALID, name: '', last_year: Both::Year.new,
207
+ last_date: Both::Date.new, list: [])
209
208
  @id = id
210
209
  @name = name
211
- @both_last_year = both_last_year
212
- @both_last_date = both_last_date
210
+ @last_year = last_year
211
+ @last_date = last_date
213
212
  @list = list
214
213
  end
215
214
 
@@ -239,6 +238,62 @@ module Zakuro
239
238
  end
240
239
  end
241
240
 
241
+ #
242
+ # SwitchDate 切替日(運用/計算)
243
+ #
244
+ class SwitchDate
245
+ # @return [Both::Date] 計算値
246
+ attr_reader :calculation
247
+ # @return [Both::Date] 運用値
248
+ attr_reader :operation
249
+ # @return [True, False] 運用値
250
+ attr_reader :operated
251
+ # @return [Japan::Calendar] 和暦日
252
+ attr_reader :japan
253
+ # @return [Western::Calendar] 西暦日
254
+ attr_reader :western
255
+
256
+ #
257
+ # 初期化
258
+ #
259
+ # @param [Both::Date] calculation 計算値
260
+ # @param [Both::Date] operation 運用値
261
+ # @param [True, False] operated 運用値設定
262
+ #
263
+ def initialize(calculation: Both::Date.new, operation: Both::Date.new, operated: false)
264
+ @calculation = calculation
265
+ @operation = operation
266
+ @operated = operated
267
+
268
+ select
269
+ end
270
+
271
+ #
272
+ # 不正か
273
+ #
274
+ # @return [True] 不正
275
+ # @return [False] 不正なし
276
+ #
277
+ def invalid?
278
+ japan.invalid? || western.invalid?
279
+ end
280
+
281
+ private
282
+
283
+ def select
284
+ @japan = operation.japan
285
+ @western = operation.western
286
+
287
+ return if operated
288
+
289
+ calc_japan = calculation.japan
290
+ calc_western = calculation.western
291
+
292
+ @japan = calc_japan unless calc_japan.invalid?
293
+ @western = calc_western unless calc_western.invalid?
294
+ end
295
+ end
296
+
242
297
  #
243
298
  # 和暦/西暦
244
299
  #
@@ -28,9 +28,9 @@ module Zakuro
28
28
  # @return [String] 元号セット名
29
29
  attr_reader :name
30
30
  # @return [Hash<String, String>] 終了年
31
- attr_reader :both_last_year
31
+ attr_reader :last_year
32
32
  # @return [Hash<String, String>] 終了日
33
- attr_reader :both_last_date
33
+ attr_reader :last_date
34
34
  # @return [Array<Hash<String, String>>] 元号情報
35
35
  attr_reader :list
36
36
 
@@ -42,8 +42,8 @@ module Zakuro
42
42
  def initialize(hash:)
43
43
  @id = hash['id']
44
44
  @name = hash['name']
45
- @both_last_year = hash['last_year']
46
- @both_last_date = hash['last_date']
45
+ @last_year = hash['last_year']
46
+ @last_date = hash['last_date']
47
47
  @list = hash['list']
48
48
  end
49
49
 
@@ -58,9 +58,9 @@ module Zakuro
58
58
 
59
59
  failed.push("invalid name. #{name}") unless name?
60
60
 
61
- failed |= validate_both_last_year
61
+ failed |= validate_last_year
62
62
 
63
- failed |= validate_both_last_date
63
+ failed |= validate_last_date
64
64
 
65
65
  failed |= validate_list
66
66
  failed
@@ -95,8 +95,8 @@ module Zakuro
95
95
  #
96
96
  # @return [Array<String>] 不正メッセージ
97
97
  #
98
- def validate_both_last_year
99
- Both::Year.new(hash: both_last_year).validate
98
+ def validate_last_year
99
+ Both::Year.new(hash: last_year).validate
100
100
  end
101
101
 
102
102
  #
@@ -104,8 +104,8 @@ module Zakuro
104
104
  #
105
105
  # @return [Array<String>] 不正メッセージ
106
106
  #
107
- def validate_both_last_date
108
- Both::Date.new(hash: both_last_date).validate
107
+ def validate_last_date
108
+ SwitchDate.new(hash: last_date).validate
109
109
  end
110
110
 
111
111
  #
@@ -145,9 +145,9 @@ module Zakuro
145
145
  # @return [String] 元号名
146
146
  attr_reader :name
147
147
  # @return [Hash<String, String>] 開始年
148
- attr_reader :both_start_year
148
+ attr_reader :start_year
149
149
  # @return [Hash<String, String>] 開始日
150
- attr_reader :both_start_date
150
+ attr_reader :start_date
151
151
 
152
152
  #
153
153
  # 初期化
@@ -158,8 +158,8 @@ module Zakuro
158
158
  def initialize(hash:, index:)
159
159
  @index = index
160
160
  @name = hash['name']
161
- @both_start_year = hash['start_year']
162
- @both_start_date = hash['start_date']
161
+ @start_year = hash['start_year']
162
+ @start_date = hash['start_date']
163
163
  end
164
164
 
165
165
  #
@@ -173,9 +173,9 @@ module Zakuro
173
173
 
174
174
  failed.push(prefix + "invalid name. #{name}") unless name?
175
175
 
176
- failed |= validate_both_start_year
176
+ failed |= validate_start_year
177
177
 
178
- failed |= validate_both_start_date
178
+ failed |= validate_start_date
179
179
 
180
180
  failed
181
181
  end
@@ -197,8 +197,8 @@ module Zakuro
197
197
  #
198
198
  # @return [Array<String>] 不正メッセージ
199
199
  #
200
- def validate_both_start_year
201
- Both::Year.new(hash: both_start_year).validate
200
+ def validate_start_year
201
+ Both::Year.new(hash: start_year).validate
202
202
  end
203
203
 
204
204
  #
@@ -206,8 +206,63 @@ module Zakuro
206
206
  #
207
207
  # @return [Array<String>] 不正メッセージ
208
208
  #
209
- def validate_both_start_date
210
- Both::Date.new(hash: both_start_date).validate
209
+ def validate_start_date
210
+ SwitchDate.new(hash: start_date).validate
211
+ end
212
+ end
213
+
214
+ #
215
+ # SwitchDate 切替日(運用/計算)
216
+ #
217
+ class SwitchDate
218
+ # @return [Hash<String, Strin>] 計算値
219
+ attr_reader :calculation
220
+ # @return [Hash<String, Strin>] 運用値
221
+ attr_reader :operation
222
+
223
+ #
224
+ # 初期化
225
+ #
226
+ # @param [Hash<String, Strin>] hash 切替日(運用/計算)
227
+ #
228
+ def initialize(hash:)
229
+ @calculation = hash['calculation']
230
+ @operation = hash['operation']
231
+ end
232
+
233
+ #
234
+ # 検証する
235
+ #
236
+ # @return [Array<String>] 不正メッセージ
237
+ #
238
+ def validate
239
+ failed = []
240
+
241
+ failed |= validate_calculation_date
242
+
243
+ failed |= validate_operation_date
244
+
245
+ failed
246
+ end
247
+
248
+ private
249
+
250
+ #
251
+ # 日(計算値)を検証する
252
+ #
253
+ # @return [Array<String>] 不正メッセージ
254
+ #
255
+ def validate_calculation_date
256
+ Both::Date.new(hash: calculation, optional: true).validate
257
+ end
258
+
259
+ #
260
+ # 日(運用値)を検証する
261
+ #
262
+ # @return [Array<String>] 不正メッセージ
263
+ #
264
+ def validate_operation_date
265
+ Both::Date.new(hash: operation).validate
211
266
  end
212
267
  end
213
268
 
@@ -282,15 +337,19 @@ module Zakuro
282
337
  attr_reader :japan
283
338
  # @return [String] 西暦日
284
339
  attr_reader :western
340
+ # @return [True] 省略可
341
+ # @return [False] 省略不可
342
+ attr_reader :optional
285
343
 
286
344
  #
287
345
  # 初期化
288
346
  #
289
347
  # @param [Hash<String, Strin>] hash 日情報
290
348
  #
291
- def initialize(hash:)
349
+ def initialize(hash:, optional: false)
292
350
  @japan = hash['japan']
293
351
  @western = hash['western']
352
+ @optional = optional
294
353
  end
295
354
 
296
355
  #
@@ -315,6 +374,8 @@ module Zakuro
315
374
  # @return [False] 正しくない
316
375
  #
317
376
  def japan?
377
+ return true if optional?(text: japan)
378
+
318
379
  Japan::Calendar.valid_date_text(text: japan)
319
380
  end
320
381
 
@@ -325,8 +386,26 @@ module Zakuro
325
386
  # @return [False] 正しくない
326
387
  #
327
388
  def western?
389
+ return true if optional?(text: western)
390
+
328
391
  Western::Calendar.valid_date_text(text: western)
329
392
  end
393
+
394
+ #
395
+ # 省略可で省略されているか
396
+ #
397
+ # @param [String] text 文字列
398
+ #
399
+ # @return [True] 省略あり
400
+ # @return [False] 省略なし
401
+ #
402
+ def optional?(text: '')
403
+ return false unless optional
404
+
405
+ return true if text == ''
406
+
407
+ false
408
+ end
330
409
  end
331
410
  end
332
411