zakuro 0.0.0

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.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +9 -0
  3. data/.gitignore +69 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +14 -0
  6. data/.travis.yml +6 -0
  7. data/Gemfile +19 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +44 -0
  10. data/Rakefile +20 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/images/12/346/234/210/344/273/245/351/231/215/343/201/256/345/205/245/345/256/232/346/260/227.png +0 -0
  14. data/images/12/346/234/210/344/273/245/351/231/215/343/201/256/346/234/210/343/201/256/351/200/262/351/200/200.png +0 -0
  15. data/images/source/description.numbers +0 -0
  16. data/images//345/205/245/345/256/232/346/260/227/343/201/256/350/265/267/347/256/227.png +0 -0
  17. data/images//345/220/204/346/234/210/343/201/256/346/261/202/343/202/201/346/226/271.png +0 -0
  18. data/images//345/244/252/351/231/275/343/201/250/346/234/210.png +0 -0
  19. data/lib/zakuro.rb +9 -0
  20. data/lib/zakuro/condition.rb +239 -0
  21. data/lib/zakuro/cycle/abstract_remainder.rb +457 -0
  22. data/lib/zakuro/cycle/zodiac.rb +103 -0
  23. data/lib/zakuro/era/gengou/set-001-until-south.yaml +375 -0
  24. data/lib/zakuro/era/gengou/set-002-from-north.yaml +166 -0
  25. data/lib/zakuro/era/gengou/set-003-modern.yaml +12 -0
  26. data/lib/zakuro/era/japan.rb +630 -0
  27. data/lib/zakuro/era/western.rb +412 -0
  28. data/lib/zakuro/merchant.rb +57 -0
  29. data/lib/zakuro/output/error.rb +10 -0
  30. data/lib/zakuro/output/logger.rb +64 -0
  31. data/lib/zakuro/output/response.rb +170 -0
  32. data/lib/zakuro/output/result.rb +219 -0
  33. data/lib/zakuro/output/stringifier.rb +62 -0
  34. data/lib/zakuro/version.rb +7 -0
  35. data/lib/zakuro/version/abstract_version.rb +29 -0
  36. data/lib/zakuro/version/genka/genka.rb +19 -0
  37. data/lib/zakuro/version/gihou/gihou.rb +19 -0
  38. data/lib/zakuro/version/gregorio/gregorio.rb +19 -0
  39. data/lib/zakuro/version/houryaku/houryaku.rb +19 -0
  40. data/lib/zakuro/version/joukyou/joukyou.rb +19 -0
  41. data/lib/zakuro/version/kansei/kansei.rb +19 -0
  42. data/lib/zakuro/version/senmyou/README.md +586 -0
  43. data/lib/zakuro/version/senmyou/base/era.rb +81 -0
  44. data/lib/zakuro/version/senmyou/base/gengou.rb +210 -0
  45. data/lib/zakuro/version/senmyou/base/remainder.rb +60 -0
  46. data/lib/zakuro/version/senmyou/base/solar_term.rb +66 -0
  47. data/lib/zakuro/version/senmyou/base/year.rb +58 -0
  48. data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +220 -0
  49. data/lib/zakuro/version/senmyou/monthly/month.rb +112 -0
  50. data/lib/zakuro/version/senmyou/senmyou.rb +34 -0
  51. data/lib/zakuro/version/senmyou/stella/lunar_orbit.rb +332 -0
  52. data/lib/zakuro/version/senmyou/stella/solar_average.rb +192 -0
  53. data/lib/zakuro/version/senmyou/stella/solar_orbit.rb +398 -0
  54. data/lib/zakuro/version/senmyou/stella/winter_solstice.rb +106 -0
  55. data/lib/zakuro/version/senmyou/summary/annual_data.rb +186 -0
  56. data/lib/zakuro/version/senmyou/summary/gengou_data.rb +294 -0
  57. data/lib/zakuro/version/taien/taien.rb +19 -0
  58. data/lib/zakuro/version/tenpou/tenpou.rb +19 -0
  59. data/lib/zakuro/version_factory.rb +59 -0
  60. data/zakuro.gemspec +31 -0
  61. metadata +106 -0
@@ -0,0 +1,166 @@
1
+ id: 2
2
+ name: "北朝+南北朝後"
3
+ end_date: "1868-1-24"
4
+ list:
5
+ - name: "正慶"
6
+ start_date: "1332-1-28"
7
+ - name: "建武"
8
+ start_date: "1334-2-5"
9
+ - name: "暦応"
10
+ start_date: "1338-1-22"
11
+ - name: "康永"
12
+ start_date: "1342-2-6"
13
+ - name: "貞和"
14
+ start_date: "1345-2-3"
15
+ - name: "観応"
16
+ start_date: "1350-2-8"
17
+ - name: "文和"
18
+ start_date: "1352-1-18"
19
+ - name: "延文"
20
+ start_date: "1356-2-2"
21
+ - name: "康安"
22
+ start_date: "1361-2-6"
23
+ - name: "貞治"
24
+ start_date: "1362-1-27"
25
+ - name: "応安"
26
+ start_date: "1368-1-21"
27
+ - name: "永和"
28
+ start_date: "1375-2-2"
29
+ - name: "康暦"
30
+ start_date: "1379-1-19"
31
+ - name: "永徳"
32
+ start_date: "1381-1-26"
33
+ - name: "至徳"
34
+ start_date: "1384-1-23"
35
+ - name: "嘉慶"
36
+ start_date: "1387-1-21"
37
+ - name: "康応"
38
+ start_date: "1389-1-28"
39
+ - name: "明徳"
40
+ start_date: "1390-1-17"
41
+ - name: "応永"
42
+ start_date: "1394-2-1"
43
+ - name: "正長"
44
+ start_date: "1428-1-17"
45
+ - name: "永享"
46
+ start_date: "1429-2-4"
47
+ - name: "嘉吉"
48
+ start_date: "1441-1-23"
49
+ - name: "文安"
50
+ start_date: "1444-1-20"
51
+ - name: "宝徳"
52
+ start_date: "1449-1-25"
53
+ - name: "享徳"
54
+ start_date: "1452-1-22"
55
+ - name: "康正"
56
+ start_date: "1455-1-18"
57
+ - name: "長禄"
58
+ start_date: "1457-1-26"
59
+ - name: "寛正"
60
+ start_date: "1460-1-24"
61
+ - name: "文正"
62
+ start_date: "1466-1-17"
63
+ - name: "応仁"
64
+ start_date: "1467-2-5"
65
+ - name: "文明"
66
+ start_date: "1469-2-12"
67
+ - name: "長享"
68
+ start_date: "1487-1-25"
69
+ - name: "延徳"
70
+ start_date: "1489-2-1"
71
+ - name: "明応"
72
+ start_date: "1492-1-30"
73
+ - name: "文亀"
74
+ start_date: "1501-1-19"
75
+ - name: "永正"
76
+ start_date: "1504-1-18"
77
+ - name: "大永"
78
+ start_date: "1521-2-8"
79
+ - name: "享禄"
80
+ start_date: "1528-1-22"
81
+ - name: "天文"
82
+ start_date: "1532-2-6"
83
+ - name: "弘治"
84
+ start_date: "1555-1-23"
85
+ - name: "永禄"
86
+ start_date: "1558-1-20"
87
+ - name: "元亀"
88
+ start_date: "1570-2-5"
89
+ - name: "天正"
90
+ start_date: "1573-2-3"
91
+ - name: "文禄"
92
+ start_date: "1592-2-13"
93
+ - name: "慶長"
94
+ start_date: "1596-1-30"
95
+ - name: "元和"
96
+ start_date: "1615-1-29"
97
+ - name: "寛永"
98
+ start_date: "1624-2-19"
99
+ - name: "正保"
100
+ start_date: "1644-2-8"
101
+ - name: "慶安"
102
+ start_date: "1648-1-25"
103
+ - name: "承応"
104
+ start_date: "1652-2-10"
105
+ - name: "明暦"
106
+ start_date: "1655-2-7"
107
+ - name: "万治"
108
+ start_date: "1658-2-3"
109
+ - name: "寛文"
110
+ start_date: "1661-1-31"
111
+ - name: "延宝"
112
+ start_date: "1673-2-17"
113
+ - name: "天和"
114
+ start_date: "1681-2-19"
115
+ - name: "貞享"
116
+ start_date: "1684-2-16"
117
+
118
+
119
+ - name: "元禄"
120
+ start_date: "1688-2-2"
121
+ - name: "宝永"
122
+ start_date: "1704-2-5"
123
+ - name: "正徳"
124
+ start_date: "1711-2-17"
125
+ - name: "享保"
126
+ start_date: "1716-1-25"
127
+ - name: "元文"
128
+ start_date: "1736-2-12"
129
+ - name: "寛保"
130
+ start_date: "1741-2-16"
131
+ - name: "延享"
132
+ start_date: "1744-2-14"
133
+ - name: "寛延"
134
+ start_date: "1748-1-30"
135
+ - name: "宝暦"
136
+ start_date: "1751-1-27"
137
+ - name: "明和"
138
+ start_date: "1764-2-2"
139
+ - name: "安永"
140
+ start_date: "1772-2-4"
141
+ - name: "天明"
142
+ start_date: "1781-1-24"
143
+ - name: "寛政"
144
+ start_date: "1789-1-26"
145
+ - name: "享和"
146
+ start_date: "1801-2-13"
147
+ - name: "文化"
148
+ start_date: "1804-2-11"
149
+ - name: "文政"
150
+ start_date: "1818-2-5"
151
+ - name: "天保"
152
+ start_date: "1830-1-25"
153
+ - name: "弘化"
154
+ start_date: "1844-2-18"
155
+ - name: "嘉永"
156
+ start_date: "1848-2-5"
157
+ - name: "安政"
158
+ start_date: "1854-1-29"
159
+ - name: "万延"
160
+ start_date: "1860-1-23"
161
+ - name: "文久"
162
+ start_date: "1861-2-10"
163
+ - name: "元治"
164
+ start_date: "1864-2-8"
165
+ - name: "慶応"
166
+ start_date: "1865-1-27"
@@ -0,0 +1,12 @@
1
+ id: 3
2
+ name: "近代(一世一元)"
3
+ end_date: "9999-12-31"
4
+ list:
5
+ - name: "明治"
6
+ start_date: "1868-1-25"
7
+ - name: "大正"
8
+ start_date: "1912-7-30"
9
+ - name: "昭和"
10
+ start_date: "1926-12-25"
11
+ - name: "令和"
12
+ start_date: "2019-5-1"
@@ -0,0 +1,630 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './western'
4
+ require 'yaml'
5
+
6
+ # :nodoc:
7
+ module Zakuro
8
+ #
9
+ # Japan 和暦
10
+ #
11
+ module Japan
12
+ #
13
+ # Reki 暦
14
+ #
15
+ module Reki
16
+ #
17
+ # Range 暦(範囲)
18
+ #
19
+ class Range
20
+ # @return [String] 暦のクラス名
21
+ # version 以下を参照
22
+ attr_reader :class_name
23
+ # @return [Western::Calendar] 暦の開始日
24
+ attr_reader :start_date
25
+
26
+ #
27
+ # 初期化
28
+ #
29
+ # @param [String] class_name 暦のクラス名
30
+ # @param [Western::Calendar] start_date 暦の開始日
31
+ #
32
+ def initialize(class_name:, start_date:)
33
+ @class_name = class_name
34
+ @start_date = start_date
35
+ end
36
+ end
37
+
38
+ LIST = [
39
+ Range.new(
40
+ class_name: 'Zakuro::Genka::Gateway',
41
+ start_date: Western::Calendar.new(year: 445, month: 1, day: 24)
42
+ ),
43
+ Range.new(
44
+ class_name: 'Zakuro::Gihou::Gateway',
45
+ start_date: Western::Calendar.new(year: 698, month: 2, day: 16)
46
+ ),
47
+ Range.new(
48
+ class_name: 'Zakuro::Taien::Gateway',
49
+ start_date: Western::Calendar.new(year: 764, month: 2, day: 7)
50
+ ),
51
+ Range.new(
52
+ class_name: 'Zakuro::Senmyou::Gateway',
53
+ start_date: Western::Calendar.new(year: 862, month: 2, day: 3)
54
+ ),
55
+ Range.new(
56
+ class_name: 'Zakuro::Joukyou::Gateway',
57
+ start_date: Western::Calendar.new(year: 1685, month: 2, day: 4)
58
+ ),
59
+ Range.new(
60
+ class_name: 'Zakuro::Houryaku::Gateway',
61
+ start_date: Western::Calendar.new(year: 1755, month: 2, day: 11)
62
+ ),
63
+ Range.new(
64
+ class_name: 'Zakuro::Kansei::Gateway',
65
+ start_date: Western::Calendar.new(year: 1798, month: 2, day: 16)
66
+ ),
67
+ Range.new(
68
+ class_name: 'Zakuro::Tenpou::Gateway',
69
+ start_date: Western::Calendar.new(year: 1844, month: 2, day: 18)
70
+ ),
71
+ Range.new(
72
+ class_name: 'Zakuro::Gregorio::Gateway',
73
+ start_date: Western::Calendar.new(year: 1872, month: 12, day: 9)
74
+ )
75
+ ].freeze
76
+
77
+ #
78
+ # 指定した日付から対象の暦を引き当てる
79
+ #
80
+ # @param [Western::Calendar] date 日付
81
+ #
82
+ # @return [String] 暦のクラス名
83
+ #
84
+ def self.class_name(date: Western::Calendar.new)
85
+ LIST.reverse_each do |range|
86
+ return range.class_name if date >= range.start_date
87
+ end
88
+ raise ArgumentError, "invalid date: #{date.format}"
89
+ end
90
+ end
91
+
92
+ #
93
+ # Gengou 元号情報
94
+ #
95
+ class Gengou
96
+ # @return [String] 元号名
97
+ attr_reader :name
98
+ # @return [Western::Calendar] 開始日
99
+ attr_reader :start_date
100
+ # @return [Western::Calendar] 終了日
101
+ attr_reader :end_date
102
+ # @return [Integer] 元号年
103
+ attr_reader :year
104
+
105
+ #
106
+ # 初期化
107
+ #
108
+ # @param [<Type>] name 元号名
109
+ # @param [<Type>] start_date 開始日
110
+ # @param [<Type>] end_date 終了日
111
+ # @param [<Type>] year 元号年
112
+ #
113
+ def initialize(name: '', start_date: Western::Calendar.new,
114
+ end_date: Western::Calendar.new, year: -1)
115
+ @name = name
116
+ @start_date = start_date
117
+ @end_date = end_date
118
+ @year = year
119
+ end
120
+
121
+ #
122
+ # 終了日を更新する
123
+ #
124
+ # @param [Western::Calendar] end_date 終了日
125
+ #
126
+ def write_end_date(end_date:)
127
+ unless Gengou.valid_date(date: end_date)
128
+ raise ArgumentError, "invalid date format. [#{end_date}]"
129
+ end
130
+
131
+ @end_date = end_date
132
+ nil
133
+ end
134
+
135
+ # :reek:NilCheck
136
+
137
+ #
138
+ # 日付が有効かどうかを確認する
139
+ #
140
+ # @param [Western::Calendar] date 日付
141
+ #
142
+ # @return [True] 有効
143
+ # @return [False] 無効
144
+ #
145
+ def self.valid_date(date:)
146
+ !date.nil? && date.is_a?(Western::Calendar)
147
+ end
148
+
149
+ #
150
+ # 次の元号の開始日から、元号の終了日に変換する
151
+ #
152
+ # @param [String] next_start_date_string 次回開始日
153
+ #
154
+ def convert_next_start_date_to_end_date(next_start_date_string: '')
155
+ raise ArgumentError, 'empty string cannot convert' if next_start_date_string.empty?
156
+
157
+ start_date = Western::Calendar.parse(str: next_start_date_string)
158
+ @end_date = start_date - 1
159
+ nil
160
+ end
161
+
162
+ #
163
+ # 指定した日が元号に含まれるか
164
+ #
165
+ # @param [Western::Calendar] date 日
166
+ #
167
+ # @return [True] 含まれる
168
+ # @return [False] 含まれない
169
+ #
170
+ def include?(date:)
171
+ date >= @start_date && date <= @end_date
172
+ end
173
+
174
+ #
175
+ # 不正な元号データかを確認する
176
+ #
177
+ # @return [True] 正しくない
178
+ # @return [True] 正しい
179
+ #
180
+ def invalid?
181
+ @year == -1
182
+ end
183
+
184
+ #
185
+ # 1元号年を追加する
186
+ #
187
+ def next_year
188
+ @year += 1
189
+ nil
190
+ end
191
+ end
192
+
193
+ #
194
+ # Set 元号セット
195
+ #
196
+ class Set
197
+ # @return [Integer] 元号セットID
198
+ attr_reader :id
199
+ # @return [String] 元号セット名
200
+ attr_reader :name
201
+ # @return [Western::Calendar] 元号セットでの終了日
202
+ attr_reader :end_date
203
+ # @return [Array<Gengou>] 元号リスト
204
+ attr_reader :list
205
+
206
+ #
207
+ # 初期化
208
+ #
209
+ # @param [Integer] id 元号セットID
210
+ # @param [String] name 元号セット名
211
+ # @param [Western::Calendar] end_date 元号セットでの終了日
212
+ # @param [Array<Gengou>] list 元号リスト
213
+ #
214
+ def initialize(id: -1, name: '', end_date: Western::Calendar.new, list: [])
215
+ @id = id
216
+ @name = name
217
+ @end_date = end_date
218
+ @list = list
219
+ end
220
+
221
+ #
222
+ # 指定した日付を含む元号を返す
223
+ #
224
+ # @param [Western::Calendar] date 日
225
+ #
226
+ # @return [Gengou] 元号
227
+ #
228
+ def include_item(date:)
229
+ @list.each do |item|
230
+ return item if item.include?(date: date)
231
+ end
232
+
233
+ Gengou.new
234
+ end
235
+
236
+ #
237
+ # 元号セットが不正かどうかを確認する
238
+ #
239
+ # @return [True] 正しくない
240
+ # @return [False] 正しい
241
+ #
242
+ def invalid?
243
+ @id == -1
244
+ end
245
+ end
246
+
247
+ #
248
+ # Parser yaml解析
249
+ #
250
+ module Parser
251
+ #
252
+ # 検証する
253
+ #
254
+ # @param [Hash<String, Object>] yaml_hash yaml取得結果
255
+ #
256
+ # @return [Array<String>] 不正メッセージ
257
+ #
258
+ def self.validate(yaml_hash)
259
+ SetParser.new(hash: yaml_hash).validate
260
+ end
261
+
262
+ #
263
+ # GengouParser 元号情報の検証/展開を行う
264
+ #
265
+ class GengouParser
266
+ # @return [Integer] 要素位置
267
+ attr_reader :index
268
+ # @return [String] 元号名
269
+ attr_reader :name
270
+ # @return [String] 開始日
271
+ attr_reader :start_date
272
+ # @return [String] 開始年
273
+ attr_reader :start_year
274
+
275
+ #
276
+ # 初期化
277
+ #
278
+ # @param [Hash<String, Strin>] hash 元号情報
279
+ # @param [Integer] index (元号セット内での)元号の要素位置
280
+ #
281
+ def initialize(hash:, index:)
282
+ @index = index
283
+ @name = hash['name']
284
+ @start_date = hash['start_date']
285
+ @start_year = hash['start_year']
286
+ end
287
+
288
+ # :reek:TooManyStatements { max_statements: 6 }
289
+
290
+ #
291
+ # 検証する
292
+ #
293
+ # @return [Array<String>] 不正メッセージ
294
+ #
295
+ def validate
296
+ prefix = "list[#{index}]. "
297
+ failed = []
298
+
299
+ failed.push(prefix + "invalid name. #{@name}") unless valid_name_type?
300
+
301
+ failed.push(prefix + "invalid start_date. #{@start_date}") unless valid_date_type?
302
+
303
+ failed.push(prefix + "invalid start_year. #{@start_year}") unless valid_year_type?
304
+ failed
305
+ end
306
+
307
+ # :reek:NilCheck
308
+
309
+ #
310
+ # 元号名を検証する
311
+ #
312
+ # @return [True] 正しい
313
+ # @return [False] 正しくない
314
+ #
315
+ def valid_name_type?
316
+ !(@name.nil? || !@name.is_a?(String))
317
+ end
318
+
319
+ #
320
+ # 日付文字列を検証する
321
+ #
322
+ # @return [True] 正しい
323
+ # @return [False] 正しくない
324
+ #
325
+ def valid_date_type?
326
+ Western::Calendar.valid_date_string(str: @start_date)
327
+ end
328
+
329
+ # :reek:NilCheck
330
+
331
+ #
332
+ # 元号年を検証する
333
+ #
334
+ # @return [True] 正しい
335
+ # @return [False] 正しくない
336
+ #
337
+ def valid_year_type?
338
+ return true if @start_year.nil?
339
+
340
+ @start_year.is_a?(Integer)
341
+ end
342
+
343
+ # :reek:NilCheck
344
+
345
+ #
346
+ # 元号情報を生成する
347
+ #
348
+ # @return [Gengou] 元号情報
349
+ #
350
+ def create
351
+ start_date = Western::Calendar.parse(str: @start_date)
352
+ start_year = @start_year.nil? ? 1 : @start_year
353
+
354
+ Gengou.new(name: @name, start_date: start_date, year: start_year)
355
+ end
356
+ end
357
+
358
+ #
359
+ # SetParser 元号セット情報の検証/展開
360
+ #
361
+ class SetParser
362
+ # @return [String] 元号セットID
363
+ attr_reader :id
364
+ # @return [String] 元号セット名
365
+ attr_reader :name
366
+ # @return [String] 終了日
367
+ attr_reader :end_date
368
+ # @return [Array<Hash<String, String>>] 元号情報
369
+ attr_reader :list
370
+
371
+ #
372
+ # 初期化
373
+ #
374
+ # @param [Hash<String, Object>] hash 元号セット情報
375
+ #
376
+ def initialize(hash:)
377
+ @id = hash['id']
378
+ @name = hash['name']
379
+ @end_date = hash['end_date']
380
+ @list = hash['list']
381
+ end
382
+
383
+ # :reek:TooManyStatements { max_statements: 6 }
384
+
385
+ #
386
+ # 検証する
387
+ #
388
+ # @return [Array<String>] 不正メッセージ
389
+ #
390
+ def validate
391
+ failed = []
392
+ failed.push("invalid id. #{id}") unless valid_id_type?
393
+
394
+ failed.push("invalid name. #{name}") unless valid_name_type?
395
+
396
+ failed.push("invalid end_date. #{end_date}") unless valid_date_type?
397
+
398
+ failed |= validate_list
399
+ failed
400
+ end
401
+
402
+ # :reek:NilCheck
403
+
404
+ #
405
+ # IDを検証する
406
+ #
407
+ # @return [True] 正しい
408
+ # @return [False] 正しくない
409
+ #
410
+ def valid_id_type?
411
+ !(@id.nil? || !@id.is_a?(Integer))
412
+ end
413
+
414
+ #
415
+ # 元号セット名を検証する
416
+ #
417
+ # @return [True] 正しい
418
+ # @return [False] 正しくない
419
+ #
420
+ def valid_name_type?
421
+ !(@name.nil? || !@name.is_a?(String))
422
+ end
423
+
424
+ #
425
+ # 日付文字列を検証する
426
+ #
427
+ # @return [True] 正しい
428
+ # @return [False] 正しくない
429
+ #
430
+ def valid_date_type?
431
+ Western::Calendar.valid_date_string(str: @end_date)
432
+ end
433
+
434
+ # :reek:NilCheck
435
+
436
+ #
437
+ # 元号情報を検証する
438
+ #
439
+ # @return [True] 正しい
440
+ # @return [False] 正しくない
441
+ #
442
+ def valid_list_type?
443
+ (!@list.nil? || @list.is_a?(Array))
444
+ end
445
+
446
+ #
447
+ # 元号情報を検証する
448
+ #
449
+ # @return [True] 正しい
450
+ # @return [False] 正しくない
451
+ #
452
+ def validate_list
453
+ return ["invalid list. #{@list.class}"] unless valid_list_type?
454
+
455
+ failed = []
456
+ list.each_with_index do |li, index|
457
+ failed |= GengouParser.new(hash: li, index: index).validate
458
+ end
459
+ failed
460
+ end
461
+
462
+ #
463
+ # 元号セット情報を生成する
464
+ #
465
+ # @return [Set] 元号セット情報
466
+ #
467
+ def create
468
+ end_date = Western::Calendar.parse(str: @end_date)
469
+ list = create_list
470
+ Set.new(
471
+ id: @id, name: @name, end_date: end_date, list: list
472
+ )
473
+ end
474
+
475
+ # :reek:TooManyStatements { max_statements: 7 }
476
+
477
+ #
478
+ # 元号情報を生成する
479
+ #
480
+ # @return [Array<Gengou>] 元号情報
481
+ #
482
+ def create_list
483
+ result = []
484
+ @list.each_with_index do |li, index|
485
+ gengou = GengouParser.new(hash: li, index: index).create
486
+ next_index = index + 1
487
+ gengou = calc_end_date_on_gengou_data(next_index: next_index,
488
+ gengou: gengou)
489
+ result.push(gengou)
490
+ end
491
+
492
+ result
493
+ end
494
+
495
+ # :reek:TooManyStatements { max_statements: 6 }
496
+
497
+ #
498
+ # 次の元号の開始日から、元号の終了日に変換する
499
+ #
500
+ # @param [Integer] next_index 次の元号の要素位置
501
+ # @param [String] gengou 次回開始日
502
+ #
503
+ # @return [Gengou] 元号情報
504
+ #
505
+ def calc_end_date_on_gengou_data(next_index:, gengou:)
506
+ if next_index >= @list.size
507
+ end_date = Western::Calendar.parse(str: @end_date)
508
+ gengou.write_end_date(end_date: end_date)
509
+ return gengou
510
+ end
511
+ next_start_date = @list[next_index]['start_date']
512
+ gengou.convert_next_start_date_to_end_date(
513
+ next_start_date_string: next_start_date
514
+ )
515
+ gengou
516
+ end
517
+ end
518
+
519
+ #
520
+ # 解析/展開する
521
+ #
522
+ # @param [String] filepath 元号セットファイルパス
523
+ #
524
+ # @return [Set] 元号セット情報
525
+ #
526
+ def self.parse(filepath: '')
527
+ yaml = YAML.load_file(filepath)
528
+
529
+ parser = SetParser.new(hash: yaml)
530
+ failed = parser.validate
531
+ raise YAML::ParseError, failed.join('\n') unless failed.empty?
532
+
533
+ parser.create
534
+ end
535
+ end
536
+
537
+ #
538
+ # GengouResource 元号情報
539
+ #
540
+ module GengouResource
541
+ # @return [Array<Set>] 元号セット情報リスト
542
+ LIST = [
543
+ Parser.parse(filepath: File.expand_path(
544
+ './gengou/set-001-until-south.yaml',
545
+ __dir__
546
+ )),
547
+ Parser.parse(filepath: File.expand_path(
548
+ './gengou/set-002-from-north.yaml',
549
+ __dir__
550
+ )),
551
+ Parser.parse(filepath: File.expand_path(
552
+ './gengou/set-003-modern.yaml',
553
+ __dir__
554
+ ))
555
+ ].freeze
556
+
557
+ # :reek:TooManyStatements { max_statements: 9 }
558
+
559
+ #
560
+ # 元号(1行目,2行目)を引き当てる
561
+ #
562
+ # * LINE配列の元号情報を配列順で「x行目」(1始まり)とする
563
+ # * 1行目にデータがあれば、第一要素に1行目のデータが設定される
564
+ # * 1行目と2行目にデータがあれば、第二要素に2行目のデータが設定される
565
+ # * 1行目にデータがなく、2行目以降に1つだけデータがあれば、第一要素にそのデータを設定してそれ以外の要素は未設定
566
+ # * 1行目にデータがなく、2行目以降に2つ以上のデータがあれば、第一要素に末尾行に一番近いデータを設定してそれ以外の要素は未設定
567
+ #
568
+ # @param [Western::Calendar] date 日
569
+ #
570
+ # @return [Array<Gengou>] 元号情報(1行目, 2行目)
571
+ #
572
+ def self.lines(date:)
573
+ lines = native_lines(date: date)
574
+ return lines unless lines[0].invalid?
575
+
576
+ first = Japan::Gengou.new
577
+ lines[1..-1].each.with_index(1) do |item, index|
578
+ next if item.invalid?
579
+
580
+ first = item
581
+ lines[index] = Japan::Gengou.new
582
+ end
583
+ lines[0] = first
584
+ lines
585
+ end
586
+
587
+ #
588
+ # 元号を引き当てる
589
+ #
590
+ # * LISTから単純に元号を引き当てる
591
+ # * 1行目,2行目といった概念は無視する
592
+ #
593
+ # @param [Western::Calendar] date 日
594
+ #
595
+ # @return [Array<Gengou>] 元号情報
596
+ #
597
+ def self.native_lines(date:)
598
+ result = Array.new(LIST.size)
599
+ LIST.each_with_index do |set, index|
600
+ result[index] = set.include_item(date: date)
601
+ end
602
+ result
603
+ end
604
+
605
+ #
606
+ # 「日本暦日原典」1行目の元号を返す
607
+ #
608
+ # @param [Western::Calendar] date 日
609
+ #
610
+ # @return [Gengou] 元号情報(1行目)
611
+ #
612
+ def self.first_line(date:)
613
+ lines = lines(date: date)
614
+ lines[0].clone
615
+ end
616
+
617
+ #
618
+ # 「日本暦日原典」2行目の元号を返す
619
+ #
620
+ # @param [Western::Calendar] date 日
621
+ #
622
+ # @return [Gengou] 元号情報(2行目)
623
+ #
624
+ def self.second_line(date:)
625
+ lines = lines(date: date)
626
+ lines[1].clone
627
+ end
628
+ end
629
+ end
630
+ end