zakuro 0.0.0 → 0.1.1

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 (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