zakuro 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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