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
@@ -0,0 +1,299 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../western/calendar'
4
+
5
+ require_relative '../../calendar'
6
+
7
+ # :nodoc:
8
+ module Zakuro
9
+ # :nodoc:
10
+ module Japan
11
+ # :nodoc:
12
+ module Gengou
13
+ #
14
+ # Resource yaml解析結果
15
+ #
16
+ module Resource
17
+ #
18
+ # Gengou 元号情報
19
+ #
20
+ class Gengou
21
+ # @return [String] 元号名
22
+ attr_reader :name
23
+ # @return [Both::Year] 開始年(和暦/西暦)
24
+ attr_reader :both_start_year
25
+ # @return [Both::Date] 開始日(和暦/西暦)
26
+ attr_reader :both_start_date
27
+ # @return [Integer] 終了年
28
+ attr_reader :last_year
29
+ # @return [Western::Calendar] 終了日
30
+ attr_reader :last_date
31
+
32
+ #
33
+ # 初期化
34
+ #
35
+ # @param [String] name 元号名
36
+ # @param [Both::Year] both_start_year 開始年(和暦/西暦)
37
+ # @param [Both::Date] both_start_date 開始日(和暦/西暦)
38
+ # @param [Integer] last_date 終了年
39
+ # @param [Western::Calendar] last_date 終了日
40
+ #
41
+ def initialize(name: '', both_start_year: Both::Year.new,
42
+ both_start_date: Both::Date.new,
43
+ last_date: Western::Calendar.new,
44
+ last_year: Both::Year::INVALID)
45
+ @name = name
46
+ @both_start_year = both_start_year
47
+ @both_start_date = both_start_date
48
+ @last_year = last_year
49
+ @last_date = last_date
50
+ end
51
+
52
+ #
53
+ # 終了年を更新する
54
+ #
55
+ # @param [Integer] last_year 終了年
56
+ #
57
+ # @raise [ArgumentError] 引数エラー
58
+ #
59
+ def write_last_year(last_year:)
60
+ unless Gengou.valid_year(year: last_year)
61
+ raise ArgumentError, "invalid year format. [#{last_year}]"
62
+ end
63
+
64
+ @last_year = last_year
65
+ end
66
+
67
+ #
68
+ # 終了日を更新する
69
+ #
70
+ # @param [Western::Calendar] last_date 終了日
71
+ #
72
+ # @raise [ArgumentError] 引数エラー
73
+ #
74
+ def write_last_date(last_date:)
75
+ unless Gengou.valid_date(date: last_date)
76
+ raise ArgumentError, "invalid date format. [#{last_date}]"
77
+ end
78
+
79
+ @last_date = last_date
80
+ nil
81
+ end
82
+
83
+ #
84
+ # 年が不正なしかどうかを確認する
85
+ #
86
+ # @param [Integer] year 年
87
+ #
88
+ # @return [True] 不正なし
89
+ # @return [False] 不正
90
+ #
91
+ def self.valid_year(year:)
92
+ return false unless year
93
+
94
+ year.is_a?(Integer)
95
+ end
96
+
97
+ #
98
+ # 日付が不正なしかどうかを確認する
99
+ #
100
+ # @param [Western::Calendar] date 日付
101
+ #
102
+ # @return [True] 不正なし
103
+ # @return [False] 不正
104
+ #
105
+ def self.valid_date(date:)
106
+ return false unless date
107
+
108
+ date.is_a?(Western::Calendar)
109
+ end
110
+
111
+ #
112
+ # 次の元号の開始年から、元号の終了年に変換する
113
+ #
114
+ # @param [Integer] next_start_year 次回開始年
115
+ #
116
+ def convert_next_start_year_to_last_year(next_start_year:)
117
+ if @both_start_year.western >= next_start_year
118
+ @last_year = next_start_year
119
+ return
120
+ end
121
+
122
+ @last_year = next_start_year - 1
123
+
124
+ nil
125
+ end
126
+
127
+ #
128
+ # 次の元号の開始日から、元号の終了日に変換する
129
+ #
130
+ # @param [String] next_start_date 次回開始日
131
+ #
132
+ # @raise [ArgumentError] 引数エラー
133
+ #
134
+ def convert_next_start_date_to_last_date(next_start_date: '')
135
+ raise ArgumentError, 'empty string cannot convert' if next_start_date.empty?
136
+
137
+ start_date = Western::Calendar.parse(text: next_start_date)
138
+ @last_date = start_date - 1
139
+
140
+ nil
141
+ end
142
+
143
+ #
144
+ # 指定した日が元号に含まれるか
145
+ #
146
+ # @param [Western::Calendar] date 日
147
+ #
148
+ # @return [True] 含まれる
149
+ # @return [False] 含まれない
150
+ #
151
+ def include?(date:)
152
+ date >= @both_start_date.western && date <= @last_date
153
+ end
154
+
155
+ #
156
+ # 不正か
157
+ #
158
+ # @return [True] 不正
159
+ # @return [False] 不正なし
160
+ #
161
+ def invalid?
162
+ @both_start_year.japan == -1 || @both_start_year.invalid? ||
163
+ @both_start_date.invalid? || @last_date.invalid?
164
+ end
165
+
166
+ #
167
+ # 1元号年を追加する
168
+ #
169
+ # def next_year
170
+ # @year += 1 unless invalid?
171
+ # nil
172
+ # end
173
+
174
+ def to_s
175
+ "name: #{@name}, both_start_year: #{@both_start_year.format}, " \
176
+ "both_start_date: #{@both_start_date.format}, last_date: #{@last_date.format}"
177
+ end
178
+ end
179
+
180
+ #
181
+ # Set 元号セット
182
+ #
183
+ class Set
184
+ # @return [Integer] 不正値
185
+ INVALID = -1
186
+ # @return [Integer] 元号セットID
187
+ attr_reader :id
188
+ # @return [String] 元号セット名
189
+ attr_reader :name
190
+ # @return [Both::Date] 元号セットでの終了年
191
+ attr_reader :both_last_year
192
+ # @return [Both::Date] 元号セットでの終了日
193
+ attr_reader :both_last_date
194
+ # @return [Array<Gengou>] 元号リスト
195
+ attr_reader :list
196
+
197
+ #
198
+ # 初期化
199
+ #
200
+ # @param [Integer] id 元号セットID
201
+ # @param [String] name 元号セット名
202
+ # @param [Western::Calendar] last_date 元号セットでの終了日
203
+ # @param [Array<Gengou>] list 元号リスト
204
+ #
205
+ def initialize(id: INVALID, name: '', both_last_year: Both::Year.new,
206
+ both_last_date: Both::Date.new, list: [])
207
+ @id = id
208
+ @name = name
209
+ @both_last_year = both_last_year
210
+ @both_last_date = both_last_date
211
+ @list = list
212
+ end
213
+
214
+ #
215
+ # 指定した日付を含む元号を返す
216
+ #
217
+ # @param [Western::Calendar] date 日
218
+ #
219
+ # @return [Gengou] 元号
220
+ #
221
+ def include_item(date:)
222
+ @list.each do |item|
223
+ return item if item.include?(date: date)
224
+ end
225
+
226
+ Gengou.new
227
+ end
228
+
229
+ #
230
+ # 元号セットが不正かどうかを確認する
231
+ #
232
+ # @return [True] 正しくない
233
+ # @return [False] 正しい
234
+ #
235
+ def invalid?
236
+ @id == INVALID
237
+ end
238
+ end
239
+
240
+ #
241
+ # 和暦/西暦
242
+ #
243
+ module Both
244
+ #
245
+ # Year 年
246
+ #
247
+ class Year
248
+ # @return [Integer] 不正値
249
+ INVALID = -1
250
+ # @return [Integer] 和暦元号年
251
+ attr_reader :japan
252
+ # @return [Integer] 西暦年
253
+ attr_reader :western
254
+
255
+ def initialize(japan: INVALID, western: INVALID)
256
+ @japan = japan
257
+ @western = western
258
+ end
259
+
260
+ #
261
+ # 不正か
262
+ #
263
+ # @return [True] 不正
264
+ # @return [False] 不正なし
265
+ #
266
+ def invalid?
267
+ @japan == INVALID || @western == INVALID
268
+ end
269
+ end
270
+
271
+ #
272
+ # Date 日
273
+ #
274
+ class Date
275
+ # @return [Japan::Calendar] 和暦日
276
+ attr_reader :japan
277
+ # @return [Western::Calendar] 西暦日
278
+ attr_reader :western
279
+
280
+ def initialize(japan: Japan::Calendar.new, western: Western::Calendar.new)
281
+ @japan = japan
282
+ @western = western
283
+ end
284
+
285
+ #
286
+ # 不正か
287
+ #
288
+ # @return [True] 不正
289
+ # @return [False] 不正なし
290
+ #
291
+ def invalid?
292
+ @japan.invalid? || @western.invalid?
293
+ end
294
+ end
295
+ end
296
+ end
297
+ end
298
+ end
299
+ end
@@ -0,0 +1,347 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../japan/calendar'
4
+ require_relative '../../../western/calendar'
5
+ require_relative './type'
6
+ require 'yaml'
7
+
8
+ # :nodoc:
9
+ module Zakuro
10
+ # :nodoc:
11
+ module Japan
12
+ # :nodoc:
13
+ module Gengou
14
+ #
15
+ # Resource yaml解析結果
16
+ #
17
+ module Resource
18
+ #
19
+ # Validator yaml解析
20
+ #
21
+ module Validator
22
+ #
23
+ # Set 元号セット情報の検証/展開
24
+ #
25
+ class Set
26
+ # @return [String] 元号セットID
27
+ attr_reader :id
28
+ # @return [String] 元号セット名
29
+ attr_reader :name
30
+ # @return [Hash<String, String>] 終了年
31
+ attr_reader :both_last_year
32
+ # @return [Hash<String, String>] 終了日
33
+ attr_reader :both_last_date
34
+ # @return [Array<Hash<String, String>>] 元号情報
35
+ attr_reader :list
36
+
37
+ #
38
+ # 初期化
39
+ #
40
+ # @param [Hash<String, Object>] hash 元号セット情報
41
+ #
42
+ def initialize(hash:)
43
+ @id = hash['id']
44
+ @name = hash['name']
45
+ @both_last_year = hash['last_year']
46
+ @both_last_date = hash['last_date']
47
+ @list = hash['list']
48
+ end
49
+
50
+ #
51
+ # 検証する
52
+ #
53
+ # @return [Array<String>] 不正メッセージ
54
+ #
55
+ def validate
56
+ failed = []
57
+ failed.push("invalid id. #{@id}") unless id?
58
+
59
+ failed.push("invalid name. #{@name}") unless name?
60
+
61
+ failed |= validate_both_last_year
62
+
63
+ failed |= validate_both_last_date
64
+
65
+ failed |= validate_list
66
+ failed
67
+ end
68
+
69
+ #
70
+ # IDを検証する
71
+ #
72
+ # @return [True] 正しい
73
+ # @return [False] 正しくない
74
+ #
75
+ def id?
76
+ return false unless @id
77
+
78
+ @id.is_a?(Integer)
79
+ end
80
+
81
+ #
82
+ # 元号セット名を検証する
83
+ #
84
+ # @return [True] 正しい
85
+ # @return [False] 正しくない
86
+ #
87
+ def name?
88
+ return false unless @name
89
+
90
+ @name.is_a?(String)
91
+ end
92
+
93
+ #
94
+ # 終了年を検証する
95
+ #
96
+ # @return [Array<String>] 不正メッセージ
97
+ #
98
+ def validate_both_last_year
99
+ Both::Year.new(hash: @both_last_year).validate
100
+ end
101
+
102
+ #
103
+ # 終了日を検証する
104
+ #
105
+ # @return [Array<String>] 不正メッセージ
106
+ #
107
+ def validate_both_last_date
108
+ Both::Date.new(hash: @both_last_date).validate
109
+ end
110
+
111
+ #
112
+ # 元号情報を検証する
113
+ #
114
+ # @return [True] 正しい
115
+ # @return [False] 正しくない
116
+ #
117
+ def list?
118
+ return false unless @list
119
+
120
+ @list.is_a?(Array)
121
+ end
122
+
123
+ #
124
+ # 元号情報を検証する
125
+ #
126
+ # @return [Array<String>] 不正メッセージ
127
+ #
128
+ def validate_list
129
+ return ["invalid list. #{@list.class}"] unless list?
130
+
131
+ failed = []
132
+ list.each_with_index do |li, index|
133
+ failed |= Gengou.new(hash: li, index: index).validate
134
+ end
135
+ failed
136
+ end
137
+ end
138
+
139
+ #
140
+ # Gengou 元号情報
141
+ #
142
+ class Gengou
143
+ # @return [Integer] 要素位置
144
+ attr_reader :index
145
+ # @return [String] 元号名
146
+ attr_reader :name
147
+ # @return [Hash<String, String>] 開始年
148
+ attr_reader :both_start_year
149
+ # @return [Hash<String, String>] 開始日
150
+ attr_reader :both_start_date
151
+
152
+ #
153
+ # 初期化
154
+ #
155
+ # @param [Hash<String, Strin>] hash 元号情報
156
+ # @param [Integer] index (元号セット内での)元号の要素位置
157
+ #
158
+ def initialize(hash:, index:)
159
+ @index = index
160
+ @name = hash['name']
161
+ @both_start_year = hash['start_year']
162
+ @both_start_date = hash['start_date']
163
+ end
164
+
165
+ #
166
+ # 検証する
167
+ #
168
+ # @return [Array<String>] 不正メッセージ
169
+ #
170
+ def validate
171
+ prefix = "list[#{index}]. "
172
+ failed = []
173
+
174
+ failed.push(prefix + "invalid name. #{@name}") unless name?
175
+
176
+ failed |= validate_both_start_year
177
+
178
+ failed |= validate_both_start_date
179
+
180
+ failed
181
+ end
182
+
183
+ #
184
+ # 元号名を検証する
185
+ #
186
+ # @return [True] 正しい
187
+ # @return [False] 正しくない
188
+ #
189
+ def name?
190
+ return false unless @name
191
+
192
+ @name.is_a?(String)
193
+ end
194
+
195
+ #
196
+ # 開始年を検証する
197
+ #
198
+ # @return [Array<String>] 不正メッセージ
199
+ #
200
+ def validate_both_start_year
201
+ Both::Year.new(hash: @both_start_year).validate
202
+ end
203
+
204
+ #
205
+ # 開始日を検証する
206
+ #
207
+ # @return [Array<String>] 不正メッセージ
208
+ #
209
+ def validate_both_start_date
210
+ Both::Date.new(hash: @both_start_date).validate
211
+ end
212
+ end
213
+
214
+ #
215
+ # 和暦/西暦
216
+ #
217
+ module Both
218
+ #
219
+ # Year 年
220
+ #
221
+ class Year
222
+ # @return [String] 和暦元号年
223
+ attr_reader :japan
224
+ # @return [String] 西暦年
225
+ attr_reader :western
226
+
227
+ #
228
+ # 初期化
229
+ #
230
+ # @param [Hash<String, Strin>] hash 年情報
231
+ #
232
+ def initialize(hash:)
233
+ @japan = hash['japan']
234
+ @western = hash['western']
235
+ end
236
+
237
+ #
238
+ # 検証する
239
+ #
240
+ # @return [Array<String>] 不正メッセージ
241
+ #
242
+ def validate
243
+ failed = []
244
+
245
+ failed.push("invalid japan year. #{@japan}") unless japan?
246
+
247
+ failed.push("invalid western year. #{@western}") unless western?
248
+
249
+ failed
250
+ end
251
+
252
+ #
253
+ # 和暦元号年を検証する
254
+ #
255
+ # @return [True] 正しい
256
+ # @return [False] 正しくない
257
+ #
258
+ def japan?
259
+ return false unless @japan
260
+
261
+ @japan.is_a?(Integer)
262
+ end
263
+
264
+ #
265
+ # 和暦元号年を検証する
266
+ #
267
+ # @return [True] 正しい
268
+ # @return [False] 正しくない
269
+ #
270
+ def western?
271
+ return false unless @western
272
+
273
+ @western.is_a?(Integer)
274
+ end
275
+ end
276
+
277
+ #
278
+ # Date 日
279
+ #
280
+ class Date
281
+ # @return [String] 和暦日
282
+ attr_reader :japan
283
+ # @return [String] 西暦日
284
+ attr_reader :western
285
+
286
+ #
287
+ # 初期化
288
+ #
289
+ # @param [Hash<String, Strin>] hash 日情報
290
+ #
291
+ def initialize(hash:)
292
+ @japan = hash['japan']
293
+ @western = hash['western']
294
+ end
295
+
296
+ #
297
+ # 検証する
298
+ #
299
+ # @return [Array<String>] 不正メッセージ
300
+ #
301
+ def validate
302
+ failed = []
303
+
304
+ failed.push("invalid japan date. #{@japan}") unless japan?
305
+
306
+ failed.push("invalid western date. #{@western}") unless western?
307
+
308
+ failed
309
+ end
310
+
311
+ #
312
+ # 和暦日を検証する
313
+ #
314
+ # @return [True] 正しい
315
+ # @return [False] 正しくない
316
+ #
317
+ def japan?
318
+ Japan::Calendar.valid_date_string(text: @japan)
319
+ end
320
+
321
+ #
322
+ # 西暦日を検証する
323
+ #
324
+ # @return [True] 正しい
325
+ # @return [False] 正しくない
326
+ #
327
+ def western?
328
+ Western::Calendar.valid_date_string(text: @western)
329
+ end
330
+ end
331
+ end
332
+
333
+ #
334
+ # 検証する
335
+ #
336
+ # @param [Hash<String, Object>] yaml_hash yaml取得結果
337
+ #
338
+ # @return [Array<String>] 不正メッセージ
339
+ #
340
+ def self.run(yaml_hash:)
341
+ Set.new(hash: yaml_hash).validate
342
+ end
343
+ end
344
+ end
345
+ end
346
+ end
347
+ end
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  id: 1
3
3
  name: 南北朝前+南朝
4
- end_year:
4
+ last_year:
5
5
  japan: 9
6
6
  western: 1392
7
- end_date:
7
+ last_date:
8
8
  japan: 元中09年閏10月04日
9
9
  western: '1392-11-18'
10
10
  list:
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  id: 2
3
3
  name: 北朝+南北朝後
4
- end_year:
4
+ last_year:
5
5
  japan: 1
6
6
  western: 1865
7
- end_date:
7
+ last_date:
8
8
  japan: 慶応01年09月07日
9
9
  western: '1868-10-22'
10
10
  list:
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  id: 3
3
3
  name: 近代(一世一元)
4
- end_year:
4
+ last_year:
5
5
  japan: 7981
6
6
  western: 9999
7
- end_date:
7
+ last_date:
8
8
  japan: 令和7981年12月31日
9
9
  western: '9999-12-31'
10
10
  list:
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './resource/parser'
4
+
5
+ # :nodoc:
6
+ module Zakuro
7
+ # :nodoc:
8
+ module Japan
9
+ # :nodoc:
10
+ module Gengou
11
+ #
12
+ # Resource yaml解析結果
13
+ #
14
+ module Resource
15
+ # @return [Array<Set>] 元号セット情報リスト
16
+ LIST = [
17
+ Parser.run(filepath: File.expand_path(
18
+ './resource/yaml/set-001-until-south.yaml',
19
+ __dir__
20
+ )),
21
+ Parser.run(filepath: File.expand_path(
22
+ './resource/yaml/set-002-from-north.yaml',
23
+ __dir__
24
+ )),
25
+ Parser.run(filepath: File.expand_path(
26
+ './resource/yaml/set-003-modern.yaml',
27
+ __dir__
28
+ ))
29
+ ].freeze
30
+ end
31
+ end
32
+ end
33
+ end