zakuro 0.0.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +4 -0
  3. data/.gitignore +7 -1
  4. data/.rubocop.yml +3 -0
  5. data/Gemfile +2 -0
  6. data/Makefile +2 -0
  7. data/README.md +156 -10
  8. data/Rakefile +1 -1
  9. data/doc/gengou.md +315 -0
  10. data/doc/operation.md +25 -0
  11. data/doc/operation/csv/month.csv +202 -0
  12. data/doc/operation/operation.xlsx +0 -0
  13. data/doc/operation/transfer.rb +77 -0
  14. data/lib/zakuro/condition.rb +19 -15
  15. data/lib/zakuro/cycle/abstract_remainder.rb +3 -4
  16. data/lib/zakuro/era/japan/gengou.rb +106 -0
  17. data/lib/zakuro/era/japan/gengou/parser.rb +167 -0
  18. data/lib/zakuro/era/japan/gengou/type.rb +178 -0
  19. data/lib/zakuro/era/japan/gengou/validator.rb +236 -0
  20. data/lib/zakuro/era/japan/reki.rb +91 -0
  21. data/lib/zakuro/era/japan/yaml/set-001-until-south.yaml +1121 -0
  22. data/lib/zakuro/era/japan/yaml/set-002-from-north.yaml +485 -0
  23. data/lib/zakuro/era/japan/yaml/set-003-modern.yaml +28 -0
  24. data/lib/zakuro/era/western.rb +11 -1
  25. data/lib/zakuro/merchant.rb +3 -1
  26. data/lib/zakuro/operation/month/parser.rb +373 -0
  27. data/lib/zakuro/operation/month/type.rb +458 -0
  28. data/lib/zakuro/operation/month/validator.rb +802 -0
  29. data/lib/zakuro/operation/operation.rb +66 -0
  30. data/lib/zakuro/operation/yaml/month.yaml +6452 -0
  31. data/lib/zakuro/output/error.rb +2 -0
  32. data/lib/zakuro/output/logger.rb +2 -0
  33. data/lib/zakuro/output/response.rb +21 -19
  34. data/lib/zakuro/result/core.rb +52 -0
  35. data/lib/zakuro/result/data.rb +187 -0
  36. data/lib/zakuro/result/operation.rb +114 -0
  37. data/lib/zakuro/result/result.rb +37 -0
  38. data/lib/zakuro/{output → tools}/stringifier.rb +16 -9
  39. data/lib/zakuro/tools/typeof.rb +33 -0
  40. data/lib/zakuro/version.rb +1 -1
  41. data/lib/zakuro/version/senmyou/README.md +3 -1
  42. data/lib/zakuro/version/senmyou/base/era.rb +3 -1
  43. data/lib/zakuro/version/senmyou/base/multi_gengou.rb +98 -0
  44. data/lib/zakuro/version/senmyou/base/multi_gengou_roller.rb +217 -0
  45. data/lib/zakuro/version/senmyou/base/remainder.rb +4 -4
  46. data/lib/zakuro/version/senmyou/base/solar_term.rb +20 -0
  47. data/lib/zakuro/version/senmyou/base/year.rb +52 -6
  48. data/lib/zakuro/version/senmyou/monthly/first_day.rb +44 -0
  49. data/lib/zakuro/version/senmyou/monthly/initialized_month.rb +48 -0
  50. data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +1 -1
  51. data/lib/zakuro/version/senmyou/monthly/month.rb +136 -67
  52. data/lib/zakuro/version/senmyou/monthly/month_label.rb +87 -0
  53. data/lib/zakuro/version/senmyou/monthly/operated_month.rb +167 -0
  54. data/lib/zakuro/version/senmyou/{summary/annual_data.rb → range/annual_range.rb} +38 -40
  55. data/lib/zakuro/version/senmyou/range/full_range.rb +324 -0
  56. data/lib/zakuro/version/senmyou/range/operated_range.rb +126 -0
  57. data/lib/zakuro/version/senmyou/range/operated_solar_terms.rb +181 -0
  58. data/lib/zakuro/version/senmyou/senmyou.rb +2 -2
  59. data/lib/zakuro/version/senmyou/specifier/single_day_specifier.rb +102 -0
  60. data/lib/zakuro/version/senmyou/stella/lunar_orbit.rb +1 -1
  61. data/lib/zakuro/version/senmyou/stella/solar_average.rb +54 -32
  62. data/lib/zakuro/version/senmyou/stella/solar_orbit.rb +3 -7
  63. data/lib/zakuro/version/senmyou/summary/single.rb +125 -0
  64. data/lib/zakuro/version_factory.rb +1 -1
  65. metadata +40 -13
  66. data/.travis.yml +0 -6
  67. data/lib/zakuro/era/gengou/set-001-until-south.yaml +0 -375
  68. data/lib/zakuro/era/gengou/set-002-from-north.yaml +0 -166
  69. data/lib/zakuro/era/gengou/set-003-modern.yaml +0 -12
  70. data/lib/zakuro/era/japan.rb +0 -630
  71. data/lib/zakuro/output/result.rb +0 -219
  72. data/lib/zakuro/version/senmyou/base/gengou.rb +0 -210
  73. data/lib/zakuro/version/senmyou/summary/gengou_data.rb +0 -294
@@ -1,219 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'json'
4
-
5
- require_relative './stringifier'
6
-
7
- # :nodoc:
8
- module Zakuro
9
- #
10
- # Result 演算結果
11
- #
12
- module Result
13
- #
14
- # Gengou 元号
15
- #
16
- class Gengou
17
- # @return [String] 元号名
18
- attr_reader :name
19
- # @return [Integer] 元号年
20
- attr_reader :number
21
-
22
- #
23
- # 初期化
24
- #
25
- # @param [String] name 元号名
26
- # @param [Integer] number 元号年
27
- #
28
- def initialize(name:, number:)
29
- @name = name
30
- @number = number
31
- end
32
- end
33
-
34
- #
35
- # Year 年
36
- #
37
- class Year
38
- # @return [Gengou] 元号(1行目)
39
- attr_reader :first_gengou
40
- # @return [Gengou] 元号(2行目)
41
- attr_reader :second_gengou
42
- # @return [String] 十干十二支
43
- attr_reader :zodiac_name
44
- # @return [Integer] 日数
45
- attr_reader :total_days
46
-
47
- #
48
- # 初期化
49
- #
50
- # @param [Gengou] first_gengou 元号(1行目)
51
- # @param [Gengou] second_gengou 元号(2行目)
52
- # @param [String] zodiac_name 十干十二支
53
- # @param [Integer] total_days 日数
54
- #
55
- def initialize(first_gengou:, second_gengou:, zodiac_name:, total_days:)
56
- @first_gengou = first_gengou
57
- @second_gengou = second_gengou
58
- @zodiac_name = zodiac_name
59
- @total_days = total_days
60
- end
61
- end
62
-
63
- #
64
- # SolarTerm 二十四節気
65
- #
66
- class SolarTerm
67
- # @return [Integer] 連番
68
- attr_reader :index
69
- # @return [String] 大余小余
70
- attr_reader :remainder
71
-
72
- #
73
- # 初期化
74
- #
75
- # @param [Integer] index 連番
76
- # @param [String] remainder 大余小余
77
- #
78
- def initialize(index:, remainder:)
79
- @index = index
80
- @remainder = remainder
81
- end
82
- end
83
-
84
- # :reek:TooManyInstanceVariables { max_instance_variables: 6 }
85
-
86
- #
87
- # Month 月
88
- #
89
- class Month
90
- # TODO: days_name -> zodiac_name
91
-
92
- # @return [Integer] 月順(1-12)
93
- attr_reader :number
94
- # @return [True] 閏月
95
- # @return [False] 平月
96
- attr_reader :leaped
97
- # @return [String] 十干十二支
98
- attr_reader :days_name
99
- # @return [Day] 月初日データ
100
- attr_reader :first_day
101
- # @return [SolarTerm] 二十四節気(節気)
102
- attr_reader :odd_solar_terms
103
- # @return [SolarTerm] 二十四節気(中気)
104
- attr_reader :even_solar_terms
105
-
106
- # rubocop:disable Metrics/ParameterLists
107
- # :reek:LongParameterList { max_params: 6 }
108
-
109
- #
110
- # 初期化
111
- #
112
- # @param [Integer] number 月順(1-12)
113
- # @param [True, False] leaped 閏月/平月
114
- # @param [String] days_name 十干十二支
115
- # @param [Day] first_day 月初日データ
116
- # @param [SolarTerm] odd_solar_terms 二十四節気(節気)
117
- # @param [SolarTerm] even_solar_terms 二十四節気(中気)
118
- #
119
- def initialize(number:, leaped:, days_name:, first_day:,
120
- odd_solar_terms:, even_solar_terms:)
121
- @number = number
122
- @leaped = leaped
123
- @days_name = days_name
124
- @first_day = first_day
125
- @odd_solar_terms = odd_solar_terms
126
- @even_solar_terms = even_solar_terms
127
- end
128
- # rubocop:enable Metrics/ParameterLists
129
- end
130
-
131
- #
132
- # Day 日
133
- #
134
- class Day
135
- # @return [Integer] 月初日から数えた日(M月d日のdに相当)
136
- attr_reader :number
137
- # @return [String] 十干十二支
138
- attr_reader :zodiac_name
139
- # @return [String] 大余小余
140
- attr_reader :remainder
141
- # @return [String] 年月日
142
- attr_reader :western_date
143
-
144
- #
145
- # 初期化
146
- #
147
- # @param [Integer] number 月初日から数えた日(M月d日のdに相当)
148
- # @param [String] zodiac_name 十干十二支
149
- # @param [String] remainder 大余小余
150
- # @param [String] western_date 年月日
151
- #
152
- def initialize(number:, zodiac_name:, remainder:, western_date:)
153
- @number = number
154
- @zodiac_name = zodiac_name
155
- @remainder = remainder
156
- @western_date = western_date
157
- end
158
- end
159
-
160
- #
161
- # Core 共通処理
162
- #
163
- class Core
164
- #
165
- # ハッシュ化する
166
- #
167
- # @return [Hash<String, Object>] ハッシュ
168
- #
169
- def to_h
170
- Stringifier.to_h(obj: self, class_prefix: 'Zakuro::Result')
171
- end
172
-
173
- #
174
- # JSON化する
175
- #
176
- # @param [JSON::State] _args 引数( Struct#to_json )
177
- #
178
- # @return [String] JSON文字列
179
- #
180
- def to_json(*_args)
181
- JSON.generate(to_h)
182
- end
183
-
184
- #
185
- # JSON(整形)化する
186
- #
187
- # @return [String] JSON(整形)文字列
188
- #
189
- def to_pretty_json
190
- JSON.pretty_generate(to_h)
191
- end
192
- end
193
-
194
- #
195
- # SingleDay 1日分情報
196
- #
197
- class SingleDay < Core
198
- # @return [Year] 年
199
- attr_reader :year
200
- # @return [Month] 月
201
- attr_reader :month
202
- # @return [Day] 日
203
- attr_reader :day
204
-
205
- #
206
- # 初期化
207
- #
208
- # @param [Year] year 年
209
- # @param [Month] month 月
210
- # @param [Day] day 日
211
- #
212
- def initialize(year:, month:, day:)
213
- @year = year
214
- @month = month
215
- @day = day
216
- end
217
- end
218
- end
219
- end
@@ -1,210 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative './era'
4
-
5
- # :nodoc:
6
- module Zakuro
7
- # :nodoc:
8
- module Senmyou
9
- #
10
- # Gengou 元号
11
- #
12
- class Gengou
13
- # @return [Japan::Gengou] 元号(1行目)
14
- attr_reader :first_line
15
- # @return [Japan::Gengou] 元号(2行目)
16
- attr_reader :second_line
17
- # @return [Integer] 年の日数
18
- attr_reader :total_days
19
- # @return [Western::Calendar] 元号内での最過去日(2つの元号が重複した場合はより過去の日となる)/ 次の元号年の年初(1月1日)
20
- attr_reader :first_date
21
-
22
- #
23
- # 初期化
24
- #
25
- # @note (see #next_year)
26
- # 次年度以降の first_date はその元号の1年目の最初の日を設定する
27
- #
28
- # @param [Western::Calendar] date 対象日
29
- # @param [Japan::Gengou] first_line 元号(1行目)
30
- # * 計算結果を持ち越すため、自クラスでの初期化時のみ使用する
31
- # @param [Japan::Gengou] second_line 元号(2行目)
32
- # * 計算結果を持ち越すため、自クラスでの初期化時のみ使用する
33
- #
34
- def initialize(date: Era::START_DATE, first_line: Japan::Gengou.new,
35
- second_line: Japan::Gengou.new)
36
- @total_days = 0
37
-
38
- if Gengou.first_called?(first_line: first_line,
39
- second_line: second_line)
40
- initialize_first_called(date: date)
41
- return
42
- end
43
- @first_line = first_line
44
- @second_line = second_line
45
- @first_date = date.clone
46
- end
47
-
48
- #
49
- # 初期化で最初の呼び出しかどうかを判定する
50
- #
51
- # @note 以下の前提がある
52
- # * 初回呼び出しでは first_line/second_line を引数に指定しない(情報がないのでできない)
53
- # * 次回以降の呼び出し( next_year ) では計算済みのfirst_line/second_lineを渡す
54
- #
55
- # @param [Japan::Gengou] first_line 元号(1行目)
56
- # @param [Japan::Gengou] second_line 元号(2行目)
57
- #
58
- # @return [True] 初回呼び出し
59
- # @return [False] 次回以降の呼び出し
60
- #
61
- def self.first_called?(first_line:, second_line:)
62
- first_line.invalid? && second_line.invalid?
63
- end
64
-
65
- #
66
- # 初期化(初回呼び出し)
67
- #
68
- # @param [Western::Calendar] date 日付
69
- #
70
- def initialize_first_called(date:)
71
- raise ArgumentError, 'invalid senmyou date' unless Era.include?(date: date)
72
-
73
- # 2つの元号が重なった時に、元号の開始日が最も古い日
74
- @first_date = choise_oldest_gengou_date(
75
- first_line: Era.first(start_date: date),
76
- second_line: Era.second(start_date: date)
77
- )
78
- @first_line = Era.first(start_date: @first_date)
79
- @second_line = Era.second(start_date: @first_date)
80
-
81
- nil
82
- end
83
-
84
- #
85
- # 十干十二支を取得する
86
- #
87
- # @return [String] 十干十二支
88
- #
89
- def zodiac_name
90
- Era.zodiac_name(western_year: @first_date.year)
91
- end
92
-
93
- #
94
- # 年の日数に加算する
95
- #
96
- # @param [Integer] days 日数
97
- #
98
- def add_days(days: 0)
99
- @total_days += days
100
-
101
- nil
102
- end
103
-
104
- #
105
- # 次の年にする
106
- #
107
- # @return [Gengou] 次の年の元号
108
- #
109
- def next_year
110
- next_date = @first_date.clone + @total_days
111
- first = Gengou.next_first_line(gengou: @first_line, date: next_date)
112
- second = Gengou.next_second_line(gengou: @second_line, date: next_date)
113
-
114
- first, second = Gengou.swap_two_gengou_on_last_period(first: first,
115
- second: second)
116
-
117
- Gengou.new(date: next_date,
118
- first_line: first, second_line: second)
119
- end
120
-
121
- #
122
- # 南北朝の終末処理をする
123
- #
124
- # @note 特別対応。北朝の "明徳" を4年から主流にする(2行目から1行目にする)
125
- #
126
- # @param [Japan::Gengou] first 元号(1行目)
127
- # @param [Japan::Gengou] second 元号(2行目)
128
- #
129
- # @return [Array<Japan::Gengou>] 元号(1行目), 元号(2行目)
130
- #
131
- def self.swap_two_gengou_on_last_period(first:, second:)
132
- if first.name == second.name
133
- first = second
134
- second = Japan::Gengou.new
135
- end
136
- [first, second]
137
- end
138
-
139
- #
140
- # 元号(1行目)を次の年にする
141
- #
142
- # @param [Japan::Gengou] gengou 元号(1行目)
143
- # @param [Western::Calendar] date 日付
144
- #
145
- # @return [Japan::Gengou] 翌年の元号(1行目)
146
- #
147
- def self.next_first_line(gengou:, date:)
148
- return Era.first(start_date: date) unless gengou.include?(date: date)
149
-
150
- next_gengou = gengou.clone
151
- next_gengou.next_year
152
- next_gengou
153
- end
154
-
155
- #
156
- # 元号(2行目)を次の年にする
157
- #
158
- # @param [Japan::Gengou] gengou 元号(2行目)
159
- # @param [Western::Calendar] date 日付
160
- #
161
- # @return [Japan::Gengou] 翌年の元号(2行目)
162
- #
163
- def self.next_second_line(gengou:, date:)
164
- return Era.second(start_date: date) unless gengou.include?(date: date)
165
-
166
- next_gengou = gengou.clone
167
- next_gengou.next_year
168
- next_gengou
169
- end
170
-
171
- #
172
- # 元号内での最過去日を求める
173
- # @note 2つの元号が重複した場合はより過去の日となる
174
- #
175
- # @param [Japan::Gengou] first_line 元号(1行目)
176
- # @param [Japan::Gengou] second_line 元号(2行目)
177
- #
178
- # @return [Western::Calendar] 最過去日
179
- #
180
- def choise_oldest_gengou_date(first_line: @first_line,
181
- second_line: @second_line)
182
- first_start_date = first_line.start_date.clone
183
- second_start_date = second_line.start_date.clone
184
- # first_lineは常に存在する
185
- return first_start_date if second_line.invalid?
186
-
187
- first_start_date < second_start_date ? first_start_date : second_start_date
188
- end
189
-
190
- #
191
- # 元号内での最未来日を求める
192
- # @note 2つの元号が重複した場合はより未来の日となる
193
- #
194
- # @param [Japan::Gengou] first_line 元号(1行目)
195
- # @param [Japan::Gengou] second_line 元号(2行目)
196
- #
197
- # @return [Western::Calendar] 最未来日
198
- #
199
- def choise_newest_gengou_date(first_line: @first_line,
200
- second_line: @second_line)
201
- first_end_date = first_line.end_date.clone
202
- second_end_date = second_line.end_date.clone
203
- # first_lineは常に存在する
204
- return first_end_date if second_line.invalid?
205
-
206
- first_end_date > second_end_date ? first_end_date : second_end_date
207
- end
208
- end
209
- end
210
- end
@@ -1,294 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../../../era/western'
4
- require_relative 'annual_data'
5
- require_relative '../../../output/response'
6
- require_relative '../base/era'
7
- require_relative '../base/gengou'
8
- require_relative '../base/year'
9
-
10
- # :nodoc:
11
- module Zakuro
12
- # :nodoc:
13
- module Senmyou
14
- #
15
- # GengouData 元号の年情報
16
- #
17
- module GengouData
18
- def self.get_ancient_date(date: Western::Calendar.new)
19
- SingleDay.get_ancient_date(date: date)
20
- end
21
-
22
- #
23
- # SingleDay 1日データ
24
- #
25
- module SingleDay
26
- #
27
- # 1日データを取得する
28
- #
29
- # @param [Western::Calendar] date 年月日情報(西暦)
30
- #
31
- # @return [Response::SingleDay] 1日データ
32
- #
33
- def self.get_ancient_date(date: Western::Calendar.new)
34
- raise ArgumentError, 'invalid senmyou date' unless Era.include?(date: date)
35
-
36
- target = get_target(year_list: get_year_list(date: date), date: date)
37
-
38
- Response::SingleDay.save_single_day(
39
- param: Response::SingleDay::Param.new(
40
- year: target.year, month: target.month,
41
- date: target.date, days: target.days
42
- )
43
- )
44
- end
45
-
46
- #
47
- # Target 対象
48
- #
49
- class Target
50
- # @return [Year] 年
51
- attr_reader :year
52
- # @return [Month] 月
53
- attr_reader :month
54
- # @return [Western::Calendar] 日
55
- attr_reader :date
56
- # @return [Integer] 月初からの日数
57
- attr_reader :days
58
-
59
- #
60
- # 初期化
61
- #
62
- # @param [Year] year 年
63
- # @param [Month] month 月
64
- # @param [Western::Calendar] date 日
65
- # @param [Integer] days 月初からの日数
66
- #
67
- def initialize(year:, month:, date:, days:)
68
- @year = year
69
- @month = month
70
- @date = date
71
- @days = days
72
- end
73
- end
74
-
75
- #
76
- # MonthSearchResult 1年内に該当する月を検索した結果
77
- #
78
- class MonthSearchResult
79
- # @return [Month] 月
80
- attr_reader :target_month
81
- # @return [Western::Calendar] 月初日
82
- attr_reader :first_date
83
- # @return [True] 該当データ引き当て済
84
- # @return [False] 該当データ引き当てなし
85
- attr_reader :breaked
86
-
87
- #
88
- # 初期化
89
- #
90
- # @param [Month] target_month 月
91
- # @param [Western::Calendar] first_date 月初日
92
- # @param [True, False] breaked 該当データ引き当て
93
- #
94
- def initialize(target_month: Month.new,
95
- first_date: Western::Calendar.new, breaked:)
96
- @target_month = target_month
97
- @first_date = first_date
98
- @breaked = breaked
99
- end
100
- end
101
-
102
- #
103
- # 指定日に関連する暦の範囲だけ年データを生成する
104
- #
105
- # @param [Western::Calendar] date 西暦日
106
- #
107
- # @return [Array<Year>] 年データ
108
- #
109
- def self.get_year_list(date:)
110
- # 元号の最初の年月日を取る
111
- gengou = Gengou.new(date: date.clone)
112
-
113
- # 南北朝には元号が2つ並び、必ずしも範囲が重ならないケースもある
114
- # 対象日付に重なる元号から論理和の範囲を取り、処理漏れがないようにする
115
- start_date = gengou.first_date.clone
116
- # 最後の年は翌年から今年の冬至を求めるため範囲を1年広げる
117
- newest_date = gengou.choise_newest_gengou_date.next_year
118
-
119
- Series.get_year_list(
120
- start_gengou: gengou, start_date: start_date, end_date: newest_date
121
- )
122
- end
123
-
124
- #
125
- # 対象を引き当てる
126
- #
127
- # @param [Array<Year>] year_list 年データ
128
- # @param [Western::Calendar] date 西暦日
129
- #
130
- # @return [Target] 対象
131
- #
132
- def self.get_target(year_list:, date:)
133
- # 対象年/対象月を引き当てる
134
- year_list.each do |year|
135
- result = get_target_month(date: date, year: year)
136
-
137
- next unless result.breaked
138
-
139
- return Target.new(
140
- year: year, month: result.target_month, date: date,
141
- # 対象日に調整する
142
- days: date - result.first_date
143
- )
144
- end
145
-
146
- raise ArgumentError, "invalid range: #{date.format}"
147
- end
148
-
149
- # :reek:TooManyStatements { max_statements: 6 }
150
-
151
- #
152
- # 対象の月を引き当てる
153
- #
154
- # @param [Western::Calendar] date 西暦日
155
- # @param [Year] year 年
156
- #
157
- # @return [MonthSearchResult] 1年内に該当する月を検索した結果
158
- #
159
- def self.get_target_month(date:, year:)
160
- first_date = year.gengou.first_date.clone
161
- year.months.each do |month|
162
- # 月末の日付を超える場合
163
- next_first_date = first_date.clone + month.days
164
- if date < next_first_date
165
- return MonthSearchResult.new(target_month: month,
166
- first_date: first_date, breaked: true)
167
- end
168
- first_date = next_first_date
169
- end
170
- MonthSearchResult.new(breaked: false)
171
- end
172
- end
173
-
174
- #
175
- # Series 和暦時系列データ
176
- #
177
- module Series
178
- # :reek:TooManyInstanceVariables { max_instance_variables: 6 }
179
-
180
- #
181
- # TimeAdvance 時間進行
182
- #
183
- class TimeAdvance
184
- #
185
- # 初期化
186
- #
187
- # @param [Gengou] start_gengou 開始元号
188
- # @param [Western::Calendar] start_date 開始日
189
- # @param [Western::Calendar] end_date 終了日
190
- #
191
- def initialize(start_gengou:, start_date:, end_date:)
192
- @current_date = start_date.clone
193
- @end_date = end_date
194
- @year_list = []
195
- @western_year = start_date.year
196
- @year = Year.new(gengou: start_gengou)
197
- end
198
-
199
- #
200
- # 年データを収集する
201
- #
202
- # @return [Array<Year>] 年データ
203
- #
204
- def collect_year_list
205
- push_current_year
206
-
207
- # 2年目以降
208
- while @current_date <= @end_date
209
- compensate_last_year
210
-
211
- push_current_year
212
- end
213
-
214
- @year_list
215
- end
216
-
217
- private
218
-
219
- #
220
- # 1年データを収集する
221
- #
222
- # @return [Array<Month>] 1年データ
223
- #
224
- def collect_annual_data
225
- AnnualData.collect_annual_data_after_last_november_1st(
226
- western_year: @western_year
227
- )
228
- end
229
-
230
- #
231
- # 昨年データの不足分を補完する
232
- # 昨年11月1日から今年1月1日の前日のデータを1年前データとする
233
- #
234
- # @return [<Type>] <description>
235
- #
236
- def compensate_last_year
237
- last_year = @year_list[@year_list.size - 1]
238
- collect_annual_data.each do |month|
239
- next unless month.is_last_year
240
-
241
- # 昨年の月データのみ
242
- last_year.push(month: month)
243
- @current_date += month.days
244
- end
245
- end
246
-
247
- # :reek:TooManyStatements { max_statements: 7 }
248
-
249
- #
250
- # 当年データを生成する
251
- #
252
- def push_current_year
253
- next_year
254
- collect_annual_data.each do |month|
255
- next if month.is_last_year
256
-
257
- @year.push(month: month)
258
- @current_date += month.days
259
- end
260
- @year_list.push(@year)
261
-
262
- @western_year += 1
263
- end
264
-
265
- #
266
- # 次の元号年を取得する
267
- #
268
- def next_year
269
- return if @year_list.empty?
270
-
271
- @year = Year.new(gengou: @year.gengou.next_year)
272
- end
273
- end
274
-
275
- #
276
- # 期間内の年データ全てを返す
277
- #
278
- # @param [Gengou] start_gengou 開始元号
279
- # @param [Western::Calendar] start_date 開始日
280
- # @param [Western::Calendar] end_date 終了日
281
- #
282
- # @return [Array<Year>] 年データ
283
- #
284
- def self.get_year_list(start_gengou:, start_date:, end_date:)
285
- advance = TimeAdvance.new(
286
- start_gengou: start_gengou, start_date: start_date, end_date: end_date
287
- )
288
-
289
- advance.collect_year_list
290
- end
291
- end
292
- end
293
- end
294
- end