zakuro 0.0.2 → 0.1.3

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 (80) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/README.md +102 -42
  4. data/doc/operation.md +25 -0
  5. data/doc/operation/csv/month.csv +202 -0
  6. data/doc/operation/operation.xlsx +0 -0
  7. data/doc/operation/transfer.rb +77 -0
  8. data/lib/zakuro/calculation/base/multi_gengou.rb +101 -0
  9. data/lib/zakuro/calculation/base/multi_gengou_roller.rb +218 -0
  10. data/lib/zakuro/calculation/base/year.rb +107 -0
  11. data/lib/zakuro/calculation/cycle/abstract_remainder.rb +459 -0
  12. data/lib/zakuro/calculation/cycle/abstract_solar_term.rb +151 -0
  13. data/lib/zakuro/calculation/cycle/zodiac.rb +106 -0
  14. data/lib/zakuro/calculation/monthly/first_day.rb +45 -0
  15. data/lib/zakuro/calculation/monthly/initialized_month.rb +120 -0
  16. data/lib/zakuro/calculation/monthly/month.rb +184 -0
  17. data/lib/zakuro/calculation/monthly/month_label.rb +88 -0
  18. data/lib/zakuro/calculation/monthly/operated_month.rb +201 -0
  19. data/lib/zakuro/calculation/range/full_range.rb +210 -0
  20. data/lib/zakuro/calculation/range/operated_range.rb +134 -0
  21. data/lib/zakuro/calculation/range/operated_solar_terms.rb +201 -0
  22. data/lib/zakuro/calculation/range/transfer/western_date_allocation.rb +76 -0
  23. data/lib/zakuro/calculation/range/transfer/year_boundary.rb +142 -0
  24. data/lib/zakuro/calculation/specifier/single_day.rb +109 -0
  25. data/lib/zakuro/calculation/summary/single.rb +129 -0
  26. data/lib/zakuro/condition.rb +17 -13
  27. data/lib/zakuro/era/japan/gengou.rb +106 -0
  28. data/lib/zakuro/era/japan/gengou/parser.rb +167 -0
  29. data/lib/zakuro/era/japan/gengou/type.rb +178 -0
  30. data/lib/zakuro/era/japan/gengou/validator.rb +236 -0
  31. data/lib/zakuro/era/japan/reki.rb +91 -0
  32. data/lib/zakuro/era/{gengou → japan/yaml}/set-001-until-south.yaml +0 -0
  33. data/lib/zakuro/era/{gengou → japan/yaml}/set-002-from-north.yaml +0 -0
  34. data/lib/zakuro/era/{gengou → japan/yaml}/set-003-modern.yaml +1 -1
  35. data/lib/zakuro/era/western.rb +1 -1
  36. data/lib/zakuro/merchant.rb +2 -2
  37. data/lib/zakuro/operation/month/parser.rb +373 -0
  38. data/lib/zakuro/operation/month/type.rb +453 -0
  39. data/lib/zakuro/operation/month/validator.rb +802 -0
  40. data/lib/zakuro/operation/operation.rb +66 -0
  41. data/lib/zakuro/operation/yaml/month.yaml +6452 -0
  42. data/lib/zakuro/output/error.rb +7 -4
  43. data/lib/zakuro/output/logger.rb +50 -47
  44. data/lib/zakuro/output/response.rb +146 -143
  45. data/lib/zakuro/result/core.rb +52 -0
  46. data/lib/zakuro/result/data.rb +187 -0
  47. data/lib/zakuro/result/operation.rb +114 -0
  48. data/lib/zakuro/result/result.rb +37 -0
  49. data/lib/zakuro/{output → tools}/stringifier.rb +16 -9
  50. data/lib/zakuro/tools/typeof.rb +33 -0
  51. data/lib/zakuro/version.rb +1 -1
  52. data/lib/zakuro/version/abstract_version.rb +1 -1
  53. data/lib/zakuro/version/context.rb +23 -0
  54. data/lib/zakuro/version/senmyou/cycle/remainder.rb +63 -0
  55. data/lib/zakuro/version/senmyou/cycle/solar_term.rb +31 -0
  56. data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +186 -182
  57. data/lib/zakuro/version/senmyou/range/annual_range.rb +164 -0
  58. data/lib/zakuro/version/senmyou/senmyou.rb +10 -4
  59. data/lib/zakuro/version/senmyou/stella/lunar_orbit.rb +7 -7
  60. data/lib/zakuro/version/senmyou/stella/solar_average.rb +103 -138
  61. data/lib/zakuro/version/senmyou/stella/solar_location.rb +213 -0
  62. data/lib/zakuro/version/senmyou/stella/solar_orbit.rb +6 -191
  63. data/lib/zakuro/version/senmyou/stella/winter_solstice.rb +4 -4
  64. data/lib/zakuro/version/version_class_resolver.rb +62 -0
  65. data/lib/zakuro/version_factory.rb +3 -3
  66. metadata +49 -20
  67. data/lib/zakuro/cycle/abstract_remainder.rb +0 -457
  68. data/lib/zakuro/cycle/zodiac.rb +0 -103
  69. data/lib/zakuro/era/japan.rb +0 -660
  70. data/lib/zakuro/output/result.rb +0 -219
  71. data/lib/zakuro/version/senmyou/base/era.rb +0 -83
  72. data/lib/zakuro/version/senmyou/base/multi_gengou.rb +0 -98
  73. data/lib/zakuro/version/senmyou/base/multi_gengou_roller.rb +0 -205
  74. data/lib/zakuro/version/senmyou/base/remainder.rb +0 -60
  75. data/lib/zakuro/version/senmyou/base/solar_term.rb +0 -66
  76. data/lib/zakuro/version/senmyou/base/year.rb +0 -104
  77. data/lib/zakuro/version/senmyou/monthly/month.rb +0 -122
  78. data/lib/zakuro/version/senmyou/summary/annual_range.rb +0 -186
  79. data/lib/zakuro/version/senmyou/summary/full_range.rb +0 -216
  80. data/lib/zakuro/version/senmyou/summary/specifier.rb +0 -100
@@ -1,103 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # :nodoc:
4
- module Zakuro
5
- # :nodoc:
6
- module Cycle
7
- #
8
- # Zodiac 十干十二支
9
- #
10
- module Zodiac
11
- # @return [Hash<Integer, String>] 十干十二支
12
- ZODIAC_NAME_PATTERNS = {
13
- 0 => '甲子', # きのえね
14
- 1 => '乙丑', # きのとうし
15
- 2 => '丙寅', # ひのえとら
16
- 3 => '丁卯', # ひのとう
17
- 4 => '戊辰', # つちのえたつ
18
- 5 => '己巳', # つちのとみ
19
- 6 => '庚午', # かのえうま
20
- 7 => '辛未', # かのとひつじ
21
- 8 => '壬申', # みずのえさる
22
- 9 => '癸酉', # みずのととり
23
- 10 => '甲戌', # きのえいぬ
24
- 11 => '乙亥', # きのとい
25
- 12 => '丙子', # ひのえね
26
- 13 => '丁丑', # ひのとうし
27
- 14 => '戊寅', # つちのえとら
28
- 15 => '己卯', # つちのとう
29
- 16 => '庚辰', # かのえたつ
30
- 17 => '辛巳', # かのとみ
31
- 18 => '壬午', # みずのえうま
32
- 19 => '癸未', # みずのとひつじ
33
- 20 => '甲申', # きのえさる
34
- 21 => '乙酉', # きのととり
35
- 22 => '丙戌', # ひのえいぬ
36
- 23 => '丁亥', # ひのとい
37
- 24 => '戊子', # つちのえね
38
- 25 => '己丑', # つちのとうし
39
- 26 => '庚寅', # かのえとら
40
- 27 => '辛卯', # かのとう
41
- 28 => '壬辰', # みずのえたつ
42
- 29 => '癸巳', # みずのとみ
43
- 30 => '甲午', # きのえうま
44
- 31 => '乙未', # きのとひつじ
45
- 32 => '丙申', # ひのえさる
46
- 33 => '丁酉', # ひのととり
47
- 34 => '戊戌', # つちのえいぬ
48
- 35 => '己亥', # つちのとい
49
- 36 => '庚子', # かのえね
50
- 37 => '辛丑', # かのとうし
51
- 38 => '壬寅', # みずのえとら
52
- 39 => '癸卯', # みずのとう
53
- 40 => '甲辰', # きのえたつ
54
- 41 => '乙巳', # きのとみ
55
- 42 => '丙午', # ひのえうま
56
- 43 => '丁未', # ひのとひつじ
57
- 44 => '戊申', # つちのえさる
58
- 45 => '己酉', # つちのととり
59
- 46 => '庚戌', # かのえいぬ
60
- 47 => '辛亥', # かのとい
61
- 48 => '壬子', # みずのえね
62
- 49 => '癸丑', # みずのとうし
63
- 50 => '甲寅', # きのえとら
64
- 51 => '乙卯', # きのとう
65
- 52 => '丙辰', # ひのえたつ
66
- 53 => '丁巳', # ひのとみ
67
- 54 => '戊午', # つちのえうま
68
- 55 => '己未', # つちのとひつじ
69
- 56 => '庚申', # かのえさる
70
- 57 => '辛酉', # かのととり
71
- 58 => '壬戌', # みずのえいぬ
72
- 59 => '癸亥' # みずのとい
73
- }.freeze
74
-
75
- # @return [Integer] 組み合わせ数
76
- LENGTH = ZODIAC_NAME_PATTERNS.length
77
-
78
- #
79
- # 大余を十干十二支に変換する
80
- #
81
- # @param [Integer] day 大余
82
- #
83
- # @return [String] 十干十二支
84
- #
85
- def self.day_name(day:)
86
- index = day % LENGTH
87
-
88
- ZODIAC_NAME_PATTERNS[index]
89
- end
90
-
91
- #
92
- # 西暦年を十干十二支に変換する
93
- #
94
- # @param [Integer] western_year 西暦年
95
- #
96
- # @return [String] 十干十二支
97
- #
98
- def self.year_name(western_year: 0)
99
- ZODIAC_NAME_PATTERNS[(western_year - 4) % LENGTH]
100
- end
101
- end
102
- end
103
- end
@@ -1,660 +0,0 @@
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 :new_year_date
102
- # @return [Western::Calendar] 終了日
103
- attr_reader :end_date
104
- # @return [Integer] 元号年
105
- attr_reader :year
106
-
107
- #
108
- # 初期化
109
- #
110
- # @param [String] name 元号名
111
- # @param [Western::Calendar] start_date 開始日
112
- # @param [Western::Calendar] new_year_date 元旦
113
- # @param [Western::Calendar] end_date 終了日
114
- # @param [Integer] year 元号年
115
- #
116
- def initialize(name: '', start_date: Western::Calendar.new,
117
- new_year_date: Western::Calendar.new,
118
- end_date: Western::Calendar.new, year: -1)
119
- @name = name
120
- @start_date = start_date
121
- @new_year_date = new_year_date
122
- @end_date = end_date
123
- @year = year
124
- end
125
-
126
- #
127
- # 終了日を更新する
128
- #
129
- # @param [Western::Calendar] end_date 終了日
130
- #
131
- def write_end_date(end_date:)
132
- unless Gengou.valid_date(date: end_date)
133
- raise ArgumentError, "invalid date format. [#{end_date}]"
134
- end
135
-
136
- @end_date = end_date
137
- nil
138
- end
139
-
140
- # :reek:NilCheck
141
-
142
- #
143
- # 日付が有効かどうかを確認する
144
- #
145
- # @param [Western::Calendar] date 日付
146
- #
147
- # @return [True] 有効
148
- # @return [False] 無効
149
- #
150
- def self.valid_date(date:)
151
- !date.nil? && date.is_a?(Western::Calendar)
152
- end
153
-
154
- #
155
- # 次の元号の開始日から、元号の終了日に変換する
156
- #
157
- # @param [String] next_start_date_string 次回開始日
158
- #
159
- def convert_next_start_date_to_end_date(next_start_date_string: '')
160
- raise ArgumentError, 'empty string cannot convert' if next_start_date_string.empty?
161
-
162
- start_date = Western::Calendar.parse(str: next_start_date_string)
163
- @end_date = start_date - 1
164
- nil
165
- end
166
-
167
- #
168
- # 指定した日が元号に含まれるか
169
- #
170
- # @param [Western::Calendar] date 日
171
- #
172
- # @return [True] 含まれる
173
- # @return [False] 含まれない
174
- #
175
- def include?(date:)
176
- date >= @start_date && date <= @end_date
177
- end
178
-
179
- #
180
- # 不正な元号データかを確認する
181
- #
182
- # @return [True] 正しくない
183
- # @return [True] 正しい
184
- #
185
- def invalid?
186
- @year == -1
187
- end
188
-
189
- #
190
- # 1元号年を追加する
191
- #
192
- def next_year
193
- @year += 1 unless invalid?
194
- nil
195
- end
196
-
197
- def to_s
198
- "name: #{@name}, start_date: #{@start_date.format}, " \
199
- "end_date: #{@end_date.format}, year: #{@year}"
200
- end
201
- end
202
-
203
- #
204
- # Set 元号セット
205
- #
206
- class Set
207
- # @return [Integer] 元号セットID
208
- attr_reader :id
209
- # @return [String] 元号セット名
210
- attr_reader :name
211
- # @return [Western::Calendar] 元号セットでの終了日
212
- attr_reader :end_date
213
- # @return [Array<Gengou>] 元号リスト
214
- attr_reader :list
215
-
216
- #
217
- # 初期化
218
- #
219
- # @param [Integer] id 元号セットID
220
- # @param [String] name 元号セット名
221
- # @param [Western::Calendar] end_date 元号セットでの終了日
222
- # @param [Array<Gengou>] list 元号リスト
223
- #
224
- def initialize(id: -1, name: '', end_date: Western::Calendar.new, list: [])
225
- @id = id
226
- @name = name
227
- @end_date = end_date
228
- @list = list
229
- end
230
-
231
- #
232
- # 指定した日付を含む元号を返す
233
- #
234
- # @param [Western::Calendar] date 日
235
- #
236
- # @return [Gengou] 元号
237
- #
238
- def include_item(date:)
239
- @list.each do |item|
240
- return item if item.include?(date: date)
241
- end
242
-
243
- Gengou.new
244
- end
245
-
246
- #
247
- # 元号セットが不正かどうかを確認する
248
- #
249
- # @return [True] 正しくない
250
- # @return [False] 正しい
251
- #
252
- def invalid?
253
- @id == -1
254
- end
255
- end
256
-
257
- #
258
- # Parser yaml解析
259
- #
260
- module Parser
261
- #
262
- # 検証する
263
- #
264
- # @param [Hash<String, Object>] yaml_hash yaml取得結果
265
- #
266
- # @return [Array<String>] 不正メッセージ
267
- #
268
- def self.validate(yaml_hash)
269
- SetParser.new(hash: yaml_hash).validate
270
- end
271
-
272
- #
273
- # GengouParser 元号情報の検証/展開を行う
274
- #
275
- class GengouParser
276
- # @return [Integer] 要素位置
277
- attr_reader :index
278
- # @return [String] 元号名
279
- attr_reader :name
280
- # @return [String] 開始日
281
- attr_reader :start_date
282
- # @return [String] 元旦
283
- attr_reader :new_year_date
284
- # @return [String] 開始年
285
- attr_reader :start_year
286
-
287
- #
288
- # 初期化
289
- #
290
- # @param [Hash<String, Strin>] hash 元号情報
291
- # @param [Integer] index (元号セット内での)元号の要素位置
292
- #
293
- def initialize(hash:, index:)
294
- @index = index
295
- @name = hash['name']
296
- @start_date = hash['start_date']
297
- @new_year_date = hash['new_year_date']
298
- @start_year = hash['start_year']
299
- end
300
-
301
- # :reek:TooManyStatements { max_statements: 6 }
302
-
303
- #
304
- # 検証する
305
- #
306
- # @return [Array<String>] 不正メッセージ
307
- #
308
- def validate
309
- prefix = "list[#{index}]. "
310
- failed = []
311
-
312
- failed.push(prefix + "invalid name. #{@name}") unless valid_name_type?
313
-
314
- failed.push(prefix + "invalid start_date. #{@start_date}") unless valid_start_date_type?
315
-
316
- failed.push(prefix + "invalid start_year. #{@start_year}") unless valid_year_type?
317
-
318
- unless valid_new_year_date_type?
319
- failed.push(prefix + "invalid new_year_date. #{@new_year_date}")
320
- end
321
-
322
- failed
323
- end
324
-
325
- # :reek:NilCheck
326
-
327
- #
328
- # 元号名を検証する
329
- #
330
- # @return [True] 正しい
331
- # @return [False] 正しくない
332
- #
333
- def valid_name_type?
334
- !(@name.nil? || !@name.is_a?(String))
335
- end
336
-
337
- #
338
- # 開始日文字列を検証する
339
- #
340
- # @return [True] 正しい
341
- # @return [False] 正しくない
342
- #
343
- def valid_start_date_type?
344
- Western::Calendar.valid_date_string(str: @start_date)
345
- end
346
-
347
- #
348
- # 元旦文字列を検証する
349
- #
350
- # @return [True] 正しい
351
- # @return [False] 正しくない
352
- #
353
- def valid_new_year_date_type?
354
- Western::Calendar.valid_date_string(str: @new_year_date)
355
- end
356
-
357
- # :reek:NilCheck
358
-
359
- #
360
- # 元号年を検証する
361
- #
362
- # @return [True] 正しい
363
- # @return [False] 正しくない
364
- #
365
- def valid_year_type?
366
- return true if @start_year.nil?
367
-
368
- @start_year.is_a?(Integer)
369
- end
370
-
371
- # :reek:NilCheck
372
-
373
- #
374
- # 元号情報を生成する
375
- #
376
- # @return [Gengou] 元号情報
377
- #
378
- def create
379
- start_date = Western::Calendar.parse(str: @start_date)
380
- new_year_date = Western::Calendar.parse(str: @new_year_date)
381
- start_year = @start_year.nil? ? 1 : @start_year
382
-
383
- Gengou.new(name: @name, start_date: start_date, new_year_date: new_year_date,
384
- year: start_year)
385
- end
386
- end
387
-
388
- #
389
- # SetParser 元号セット情報の検証/展開
390
- #
391
- class SetParser
392
- # @return [String] 元号セットID
393
- attr_reader :id
394
- # @return [String] 元号セット名
395
- attr_reader :name
396
- # @return [String] 終了日
397
- attr_reader :end_date
398
- # @return [Array<Hash<String, String>>] 元号情報
399
- attr_reader :list
400
-
401
- #
402
- # 初期化
403
- #
404
- # @param [Hash<String, Object>] hash 元号セット情報
405
- #
406
- def initialize(hash:)
407
- @id = hash['id']
408
- @name = hash['name']
409
- @end_date = hash['end_date']
410
- @list = hash['list']
411
- end
412
-
413
- # :reek:TooManyStatements { max_statements: 6 }
414
-
415
- #
416
- # 検証する
417
- #
418
- # @return [Array<String>] 不正メッセージ
419
- #
420
- def validate
421
- failed = []
422
- failed.push("invalid id. #{id}") unless valid_id_type?
423
-
424
- failed.push("invalid name. #{name}") unless valid_name_type?
425
-
426
- failed.push("invalid end_date. #{end_date}") unless valid_date_type?
427
-
428
- failed |= validate_list
429
- failed
430
- end
431
-
432
- # :reek:NilCheck
433
-
434
- #
435
- # IDを検証する
436
- #
437
- # @return [True] 正しい
438
- # @return [False] 正しくない
439
- #
440
- def valid_id_type?
441
- !(@id.nil? || !@id.is_a?(Integer))
442
- end
443
-
444
- #
445
- # 元号セット名を検証する
446
- #
447
- # @return [True] 正しい
448
- # @return [False] 正しくない
449
- #
450
- def valid_name_type?
451
- !(@name.nil? || !@name.is_a?(String))
452
- end
453
-
454
- #
455
- # 日付文字列を検証する
456
- #
457
- # @return [True] 正しい
458
- # @return [False] 正しくない
459
- #
460
- def valid_date_type?
461
- Western::Calendar.valid_date_string(str: @end_date)
462
- end
463
-
464
- # :reek:NilCheck
465
-
466
- #
467
- # 元号情報を検証する
468
- #
469
- # @return [True] 正しい
470
- # @return [False] 正しくない
471
- #
472
- def valid_list_type?
473
- (!@list.nil? || @list.is_a?(Array))
474
- end
475
-
476
- #
477
- # 元号情報を検証する
478
- #
479
- # @return [True] 正しい
480
- # @return [False] 正しくない
481
- #
482
- def validate_list
483
- return ["invalid list. #{@list.class}"] unless valid_list_type?
484
-
485
- failed = []
486
- list.each_with_index do |li, index|
487
- failed |= GengouParser.new(hash: li, index: index).validate
488
- end
489
- failed
490
- end
491
-
492
- #
493
- # 元号セット情報を生成する
494
- #
495
- # @return [Set] 元号セット情報
496
- #
497
- def create
498
- end_date = Western::Calendar.parse(str: @end_date)
499
- list = create_list
500
- Set.new(
501
- id: @id, name: @name, end_date: end_date, list: list
502
- )
503
- end
504
-
505
- # :reek:TooManyStatements { max_statements: 7 }
506
-
507
- #
508
- # 元号情報を生成する
509
- #
510
- # @return [Array<Gengou>] 元号情報
511
- #
512
- def create_list
513
- result = []
514
- @list.each_with_index do |li, index|
515
- gengou = GengouParser.new(hash: li, index: index).create
516
- next_index = index + 1
517
- gengou = calc_end_date_on_gengou_data(next_index: next_index,
518
- gengou: gengou)
519
- result.push(gengou)
520
- end
521
-
522
- result
523
- end
524
-
525
- # :reek:TooManyStatements { max_statements: 6 }
526
-
527
- #
528
- # 次の元号の開始日から、元号の終了日に変換する
529
- #
530
- # @param [Integer] next_index 次の元号の要素位置
531
- # @param [String] gengou 次回開始日
532
- #
533
- # @return [Gengou] 元号情報
534
- #
535
- def calc_end_date_on_gengou_data(next_index:, gengou:)
536
- if next_index >= @list.size
537
- end_date = Western::Calendar.parse(str: @end_date)
538
- gengou.write_end_date(end_date: end_date)
539
- return gengou
540
- end
541
- next_start_date = @list[next_index]['start_date']
542
- gengou.convert_next_start_date_to_end_date(
543
- next_start_date_string: next_start_date
544
- )
545
- gengou
546
- end
547
- end
548
-
549
- #
550
- # 解析/展開する
551
- #
552
- # @param [String] filepath 元号セットファイルパス
553
- #
554
- # @return [Set] 元号セット情報
555
- #
556
- def self.parse(filepath: '')
557
- yaml = YAML.load_file(filepath)
558
-
559
- parser = SetParser.new(hash: yaml)
560
- failed = parser.validate
561
- raise YAML::ParseError, failed.join('\n') unless failed.empty?
562
-
563
- parser.create
564
- end
565
- end
566
-
567
- #
568
- # GengouResource 元号情報
569
- #
570
- module GengouResource
571
- # @return [Array<Set>] 元号セット情報リスト
572
- LIST = [
573
- Parser.parse(filepath: File.expand_path(
574
- './gengou/set-001-until-south.yaml',
575
- __dir__
576
- )),
577
- Parser.parse(filepath: File.expand_path(
578
- './gengou/set-002-from-north.yaml',
579
- __dir__
580
- )),
581
- Parser.parse(filepath: File.expand_path(
582
- './gengou/set-003-modern.yaml',
583
- __dir__
584
- ))
585
- ].freeze
586
-
587
- # :reek:TooManyStatements { max_statements: 9 }
588
-
589
- #
590
- # 元号(1行目,2行目)を引き当てる
591
- #
592
- # * LINE配列の元号情報を配列順で「x行目」(1始まり)とする
593
- # * 1行目にデータがあれば、第一要素に1行目のデータが設定される
594
- # * 1行目と2行目にデータがあれば、第二要素に2行目のデータが設定される
595
- # * 1行目にデータがなく、2行目以降に1つだけデータがあれば、第一要素にそのデータを設定してそれ以外の要素は未設定
596
- # * 1行目にデータがなく、2行目以降に2つ以上のデータがあれば、第一要素に末尾行に一番近いデータを設定してそれ以外の要素は未設定
597
- #
598
- # @param [Western::Calendar] date 日
599
- #
600
- # @return [Array<Gengou>] 元号情報(1行目, 2行目)
601
- #
602
- def self.lines(date:)
603
- lines = native_lines(date: date)
604
- return lines unless lines[0].invalid?
605
-
606
- first = Japan::Gengou.new
607
- lines[1..-1].each.with_index(1) do |item, index|
608
- next if item.invalid?
609
-
610
- first = item
611
- lines[index] = Japan::Gengou.new
612
- end
613
- lines[0] = first
614
- lines
615
- end
616
-
617
- #
618
- # 元号を引き当てる
619
- #
620
- # * LISTから単純に元号を引き当てる
621
- # * 1行目,2行目といった概念は無視する
622
- #
623
- # @param [Western::Calendar] date 日
624
- #
625
- # @return [Array<Gengou>] 元号情報
626
- #
627
- def self.native_lines(date:)
628
- result = Array.new(LIST.size)
629
- LIST.each_with_index do |set, index|
630
- result[index] = set.include_item(date: date)
631
- end
632
- result
633
- end
634
-
635
- #
636
- # 「日本暦日原典」1行目の元号を返す
637
- #
638
- # @param [Western::Calendar] date 日
639
- #
640
- # @return [Gengou] 元号情報(1行目)
641
- #
642
- def self.first_line(date:)
643
- lines = lines(date: date)
644
- lines[0].clone
645
- end
646
-
647
- #
648
- # 「日本暦日原典」2行目の元号を返す
649
- #
650
- # @param [Western::Calendar] date 日
651
- #
652
- # @return [Gengou] 元号情報(2行目)
653
- #
654
- def self.second_line(date:)
655
- lines = lines(date: date)
656
- lines[1].clone
657
- end
658
- end
659
- end
660
- end