zakuro 0.0.2 → 0.1.3

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