zakuro 0.0.3 → 0.1.4
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.
- checksums.yaml +4 -4
- data/README.md +102 -42
- data/doc/operation.md +25 -0
- data/doc/operation/csv/month.csv +202 -0
- data/doc/operation/operation.xlsx +0 -0
- data/doc/operation/transfer.rb +77 -0
- data/lib/zakuro/calculation/base/multi_gengou.rb +101 -0
- data/lib/zakuro/calculation/base/multi_gengou_roller.rb +218 -0
- data/lib/zakuro/calculation/base/year.rb +107 -0
- data/lib/zakuro/calculation/cycle/abstract_remainder.rb +459 -0
- data/lib/zakuro/calculation/cycle/abstract_solar_term.rb +173 -0
- data/lib/zakuro/calculation/cycle/zodiac.rb +106 -0
- data/lib/zakuro/calculation/monthly/first_day.rb +45 -0
- data/lib/zakuro/calculation/monthly/initialized_month.rb +125 -0
- data/lib/zakuro/calculation/monthly/month.rb +187 -0
- data/lib/zakuro/calculation/monthly/month_label.rb +88 -0
- data/lib/zakuro/calculation/monthly/operated_month.rb +209 -0
- data/lib/zakuro/calculation/range/full_range.rb +210 -0
- data/lib/zakuro/calculation/range/operated_range.rb +144 -0
- data/lib/zakuro/calculation/range/operated_solar_terms.rb +201 -0
- data/lib/zakuro/calculation/range/transfer/western_date_allocation.rb +82 -0
- data/lib/zakuro/calculation/range/transfer/year_boundary.rb +146 -0
- data/lib/zakuro/calculation/specifier/single_day.rb +109 -0
- data/lib/zakuro/calculation/summary/single.rb +129 -0
- data/lib/zakuro/condition.rb +16 -13
- data/lib/zakuro/era/japan/gengou.rb +106 -0
- data/lib/zakuro/era/japan/gengou/parser.rb +167 -0
- data/lib/zakuro/era/japan/gengou/type.rb +178 -0
- data/lib/zakuro/era/japan/gengou/validator.rb +236 -0
- data/lib/zakuro/era/japan/reki.rb +91 -0
- data/lib/zakuro/era/{gengou → japan/yaml}/set-001-until-south.yaml +0 -0
- data/lib/zakuro/era/{gengou → japan/yaml}/set-002-from-north.yaml +0 -0
- data/lib/zakuro/era/{gengou → japan/yaml}/set-003-modern.yaml +0 -0
- data/lib/zakuro/era/western.rb +1 -1
- data/lib/zakuro/merchant.rb +2 -2
- data/lib/zakuro/operation/month/parser.rb +373 -0
- data/lib/zakuro/operation/month/type.rb +453 -0
- data/lib/zakuro/operation/month/validator.rb +802 -0
- data/lib/zakuro/operation/operation.rb +66 -0
- data/lib/zakuro/operation/yaml/month.yaml +6452 -0
- data/lib/zakuro/output/error.rb +7 -4
- data/lib/zakuro/output/logger.rb +50 -47
- data/lib/zakuro/output/response.rb +146 -143
- data/lib/zakuro/result/core.rb +52 -0
- data/lib/zakuro/result/data.rb +187 -0
- data/lib/zakuro/result/operation.rb +114 -0
- data/lib/zakuro/result/result.rb +37 -0
- data/lib/zakuro/{output → tools}/stringifier.rb +16 -9
- data/lib/zakuro/tools/typeof.rb +33 -0
- data/lib/zakuro/version.rb +1 -1
- data/lib/zakuro/version/abstract_version.rb +1 -1
- data/lib/zakuro/version/context.rb +23 -0
- data/lib/zakuro/version/senmyou/cycle/remainder.rb +63 -0
- data/lib/zakuro/version/senmyou/cycle/solar_term.rb +31 -0
- data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +186 -182
- data/lib/zakuro/version/senmyou/range/annual_range.rb +167 -0
- data/lib/zakuro/version/senmyou/senmyou.rb +10 -4
- data/lib/zakuro/version/senmyou/stella/lunar_orbit.rb +6 -6
- data/lib/zakuro/version/senmyou/stella/solar_average.rb +103 -152
- data/lib/zakuro/version/senmyou/stella/solar_location.rb +213 -0
- data/lib/zakuro/version/senmyou/stella/solar_orbit.rb +3 -184
- data/lib/zakuro/version/senmyou/stella/winter_solstice.rb +4 -4
- data/lib/zakuro/version/version_class_resolver.rb +62 -0
- data/lib/zakuro/version_factory.rb +3 -3
- metadata +53 -24
- data/lib/zakuro/cycle/abstract_remainder.rb +0 -456
- data/lib/zakuro/cycle/zodiac.rb +0 -103
- data/lib/zakuro/era/japan.rb +0 -664
- data/lib/zakuro/output/result.rb +0 -225
- data/lib/zakuro/version/senmyou/base/era.rb +0 -83
- data/lib/zakuro/version/senmyou/base/multi_gengou.rb +0 -98
- data/lib/zakuro/version/senmyou/base/multi_gengou_roller.rb +0 -205
- data/lib/zakuro/version/senmyou/base/remainder.rb +0 -60
- data/lib/zakuro/version/senmyou/base/solar_term.rb +0 -66
- data/lib/zakuro/version/senmyou/base/year.rb +0 -104
- data/lib/zakuro/version/senmyou/monthly/month.rb +0 -122
- data/lib/zakuro/version/senmyou/summary/annual_range.rb +0 -187
- data/lib/zakuro/version/senmyou/summary/full_range.rb +0 -224
- data/lib/zakuro/version/senmyou/summary/specifier.rb +0 -100
@@ -1,224 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative '../base/multi_gengou_roller'
|
4
|
-
|
5
|
-
require_relative '../../../era/western'
|
6
|
-
require_relative './annual_range'
|
7
|
-
|
8
|
-
# :nodoc:
|
9
|
-
module Zakuro
|
10
|
-
# :nodoc:
|
11
|
-
module Senmyou
|
12
|
-
# FullRange 完全範囲
|
13
|
-
# ある日からある日の範囲を計算可能な年月範囲
|
14
|
-
# * 前提として元号年はその元号の開始年から数える
|
15
|
-
# * ある日の元号年を求める場合、その元号が含まれる最初の年まで遡る
|
16
|
-
# * 元号は一つとは限らない。南北朝などで二つある場合は、古い方の元号から求める
|
17
|
-
#
|
18
|
-
# NOTE: 割り当てた元号は年初を基準にした元号年である
|
19
|
-
# * 元旦を基準にした時の正しい元号を設定している
|
20
|
-
# * 引き当てたい日付が元旦ではない場合、その月日に従い元号を再度求める
|
21
|
-
# * この再計算が必要になるのは、元号が切り替わる年のみである
|
22
|
-
class FullRange
|
23
|
-
attr_reader :multi_gengou_roller, :new_year_date, :western_year
|
24
|
-
|
25
|
-
# @return [Logger] ロガー
|
26
|
-
LOGGER = Logger.new(location: 'full_range')
|
27
|
-
|
28
|
-
def initialize(start_date: Western::Calendar.new, end_date: Western::Calendar.new)
|
29
|
-
@multi_gengou_roller = MultiGengouRoller.new(start_date: start_date, end_date: end_date)
|
30
|
-
@new_year_date = @multi_gengou_roller.oldest_date.clone
|
31
|
-
@western_year = @new_year_date.year
|
32
|
-
end
|
33
|
-
|
34
|
-
#
|
35
|
-
# 完全範囲を取得する
|
36
|
-
#
|
37
|
-
# @return [Array<Year>] 完全範囲
|
38
|
-
#
|
39
|
-
def get
|
40
|
-
years = FullRange.rearranged_years(annual_ranges: annual_ranges)
|
41
|
-
update_gengou(years: years)
|
42
|
-
end
|
43
|
-
|
44
|
-
# :reek:TooManyStatements { max_statements: 6 }
|
45
|
-
|
46
|
-
#
|
47
|
-
# 完全範囲内の年データを取得する
|
48
|
-
#
|
49
|
-
# @return [Array<Year>] 年データ(冬至基準)
|
50
|
-
#
|
51
|
-
def annual_ranges
|
52
|
-
oldest_date = @new_year_date
|
53
|
-
newest_date = @multi_gengou_roller.newest_date
|
54
|
-
|
55
|
-
years = []
|
56
|
-
((oldest_date.year)..(newest_date.year + 2)).each do |year|
|
57
|
-
years.push(
|
58
|
-
AnnualRange.collect_annual_range_after_last_november_1st(
|
59
|
-
western_year: year
|
60
|
-
)
|
61
|
-
)
|
62
|
-
end
|
63
|
-
|
64
|
-
years
|
65
|
-
end
|
66
|
-
|
67
|
-
#
|
68
|
-
# 完全範囲内の年データの開始月を変更する
|
69
|
-
#
|
70
|
-
# @param [Array<Year>] annual_ranges 年データ(冬至基準)
|
71
|
-
#
|
72
|
-
# @return [Array<Year>] 年データ(元旦基準)
|
73
|
-
#
|
74
|
-
def self.rearranged_years(annual_ranges:)
|
75
|
-
years = []
|
76
|
-
|
77
|
-
(0..(annual_ranges.size - 2)).each do |index|
|
78
|
-
year = rearranged_year(annual_ranges: annual_ranges, index: index)
|
79
|
-
years.push(year)
|
80
|
-
end
|
81
|
-
|
82
|
-
years
|
83
|
-
end
|
84
|
-
|
85
|
-
# :reek:TooManyStatements { max_statements: 8 }
|
86
|
-
|
87
|
-
#
|
88
|
-
# 完全範囲内の年データの元号を開始年基準で更新する
|
89
|
-
#
|
90
|
-
# @param [Array<Year>] years 年データ(元旦基準)
|
91
|
-
#
|
92
|
-
# @return [Array<Year>] 元号更新済み年データ(元旦基準)
|
93
|
-
#
|
94
|
-
def update_gengou(years:)
|
95
|
-
updated_years = []
|
96
|
-
|
97
|
-
nearest_end_date = choise_nearest_end_date
|
98
|
-
|
99
|
-
years.each do |year|
|
100
|
-
next_year(years: updated_years, year: year)
|
101
|
-
|
102
|
-
if @new_year_date > nearest_end_date
|
103
|
-
@multi_gengou_roller.transfer
|
104
|
-
nearest_end_date = choise_nearest_end_date
|
105
|
-
end
|
106
|
-
@multi_gengou_roller.next_year
|
107
|
-
end
|
108
|
-
|
109
|
-
updated_years
|
110
|
-
end
|
111
|
-
|
112
|
-
#
|
113
|
-
# 当年データを生成する
|
114
|
-
#
|
115
|
-
# @param [Array<Year>] annual_ranges 年データ(冬至基準)
|
116
|
-
# @param [Year] year 対象年
|
117
|
-
#
|
118
|
-
# @return [Year] 当年月ありの対象年
|
119
|
-
#
|
120
|
-
def self.push_current_year(annual_range:, year: Year.new)
|
121
|
-
annual_range.each do |month|
|
122
|
-
next if month.is_last_year
|
123
|
-
|
124
|
-
year.push(month: month)
|
125
|
-
end
|
126
|
-
|
127
|
-
year
|
128
|
-
end
|
129
|
-
|
130
|
-
#
|
131
|
-
# 昨年データを生成する
|
132
|
-
#
|
133
|
-
# @param [Array<Year>] annual_ranges 年データ(冬至基準)
|
134
|
-
# @param [Year] year 対象年
|
135
|
-
#
|
136
|
-
# @return [Year] 昨年月ありの対象年
|
137
|
-
#
|
138
|
-
def self.push_last_year(annual_range:, year: Year.new)
|
139
|
-
annual_range.each do |month|
|
140
|
-
next unless month.is_last_year
|
141
|
-
|
142
|
-
year.push(month: month)
|
143
|
-
end
|
144
|
-
|
145
|
-
year
|
146
|
-
end
|
147
|
-
|
148
|
-
#
|
149
|
-
# 年データの開始月を変更する
|
150
|
-
#
|
151
|
-
# @param [Array<Year>] annual_ranges 年データ(冬至基準)
|
152
|
-
# @param [Integer] index 対象年の要素番号
|
153
|
-
#
|
154
|
-
# @return [Year] 年データ(元旦基準)
|
155
|
-
#
|
156
|
-
def self.rearranged_year(annual_ranges:, index:)
|
157
|
-
current_annual_range = annual_ranges[index]
|
158
|
-
next_annual_range = annual_ranges[index + 1]
|
159
|
-
|
160
|
-
year = push_current_year(annual_range: current_annual_range)
|
161
|
-
push_last_year(annual_range: next_annual_range, year: year)
|
162
|
-
|
163
|
-
year
|
164
|
-
end
|
165
|
-
private_class_method :rearranged_year
|
166
|
-
|
167
|
-
private
|
168
|
-
|
169
|
-
#
|
170
|
-
# 元号処理対象の年を進める
|
171
|
-
#
|
172
|
-
# @param [Array<Year>] years 元号処理済み年データ(元旦基準)
|
173
|
-
# @param [Year] year 元号処理前の年(元旦基準)
|
174
|
-
#
|
175
|
-
def next_year(years:, year:)
|
176
|
-
updated_year = update_year(year: year)
|
177
|
-
|
178
|
-
years.push(updated_year)
|
179
|
-
|
180
|
-
next_new_year_date(total_days: updated_year.total_days)
|
181
|
-
|
182
|
-
nil
|
183
|
-
end
|
184
|
-
|
185
|
-
#
|
186
|
-
# 年の元号を更新する
|
187
|
-
#
|
188
|
-
# @param [Year] year 元号処理前の年(元旦基準)
|
189
|
-
#
|
190
|
-
# @return [Year] 元号処理済の年(元旦基準)
|
191
|
-
#
|
192
|
-
def update_year(year:)
|
193
|
-
multi_gengou = @multi_gengou_roller.multi_gengou.clone
|
194
|
-
|
195
|
-
updated_year = Year.new(multi_gengou: multi_gengou, new_year_date: @new_year_date.clone,
|
196
|
-
months: year.months)
|
197
|
-
updated_year.commit
|
198
|
-
|
199
|
-
updated_year
|
200
|
-
end
|
201
|
-
|
202
|
-
#
|
203
|
-
# 次の年に進める
|
204
|
-
#
|
205
|
-
# @param [Integer] total_days 年の日数
|
206
|
-
#
|
207
|
-
def next_new_year_date(total_days:)
|
208
|
-
@new_year_date += total_days
|
209
|
-
@multi_gengou_roller.next(days: total_days)
|
210
|
-
|
211
|
-
nil
|
212
|
-
end
|
213
|
-
|
214
|
-
#
|
215
|
-
# 現在日からみて直近の未来に対する元号の切替前日を求める
|
216
|
-
#
|
217
|
-
# @return [Western::Calendar] 元号の切替前日
|
218
|
-
#
|
219
|
-
def choise_nearest_end_date
|
220
|
-
@multi_gengou_roller.choise_nearest_end_date
|
221
|
-
end
|
222
|
-
end
|
223
|
-
end
|
224
|
-
end
|
@@ -1,100 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative '../../../era/western'
|
4
|
-
require_relative './full_range'
|
5
|
-
require_relative '../base/multi_gengou_roller'
|
6
|
-
require_relative '../base/year'
|
7
|
-
require_relative '../../../output/response'
|
8
|
-
require_relative '../../../output/logger'
|
9
|
-
|
10
|
-
# :nodoc:
|
11
|
-
module Zakuro
|
12
|
-
# :nodoc:
|
13
|
-
module Senmyou
|
14
|
-
#
|
15
|
-
# SingleDaySpecifier 一日検索
|
16
|
-
#
|
17
|
-
module SingleDaySpecifier
|
18
|
-
# @return [Logger] ロガー
|
19
|
-
LOGGER = Logger.new(location: 'specifier')
|
20
|
-
|
21
|
-
#
|
22
|
-
# 取得する
|
23
|
-
#
|
24
|
-
# @param [Western::Calendar] date 西暦日
|
25
|
-
#
|
26
|
-
# @return [Response::SingleDay] 和暦日
|
27
|
-
#
|
28
|
-
def self.get(date:)
|
29
|
-
years = FullRange.new(start_date: date).get
|
30
|
-
|
31
|
-
year = specify_year(years: years, date: date)
|
32
|
-
|
33
|
-
year = transfer(year: year, date: date)
|
34
|
-
|
35
|
-
month, first_date = specify_month(year: year, date: date)
|
36
|
-
|
37
|
-
Response::SingleDay.save_single_day(
|
38
|
-
param: Response::SingleDay::Param.new(
|
39
|
-
year: year, month: month,
|
40
|
-
date: date, days: date - first_date
|
41
|
-
)
|
42
|
-
)
|
43
|
-
end
|
44
|
-
|
45
|
-
#
|
46
|
-
# 年を特定する
|
47
|
-
#
|
48
|
-
# @param [Array<Year>] years 範囲
|
49
|
-
# @param [Western::Calendar] date 西暦日
|
50
|
-
#
|
51
|
-
# @return [Year] 対象年
|
52
|
-
#
|
53
|
-
def self.specify_year(years:, date:)
|
54
|
-
years.reverse_each do |year|
|
55
|
-
return year if date >= year.new_year_date
|
56
|
-
end
|
57
|
-
|
58
|
-
raise ArgumentError, "invalid year range. date: #{date.format}"
|
59
|
-
end
|
60
|
-
|
61
|
-
#
|
62
|
-
# 改元する
|
63
|
-
#
|
64
|
-
# @param [Year] year 年
|
65
|
-
# @param [Western::Calendar] date 西暦日
|
66
|
-
#
|
67
|
-
# @return [Year] 改元後の年
|
68
|
-
#
|
69
|
-
def self.transfer(year:, date:)
|
70
|
-
multi_gengou = MultiGengouRoller.transfer(multi_gengou: year.multi_gengou, date: date)
|
71
|
-
Year.new(multi_gengou: multi_gengou, new_year_date: year.new_year_date,
|
72
|
-
months: year.months, total_days: year.total_days)
|
73
|
-
end
|
74
|
-
|
75
|
-
# :reek:TooManyStatements { max_statements: 7 }
|
76
|
-
|
77
|
-
#
|
78
|
-
# 月を特定する
|
79
|
-
#
|
80
|
-
# @param [Year] year 年
|
81
|
-
# @param [Western::Calendar] date 西暦日
|
82
|
-
#
|
83
|
-
# @return [Month] 対象月
|
84
|
-
# @return [Western::Calendar] 月初日
|
85
|
-
#
|
86
|
-
def self.specify_month(year:, date:)
|
87
|
-
current_month_date = year.new_year_date.clone
|
88
|
-
next_month_date = current_month_date.clone
|
89
|
-
year.months.each do |month|
|
90
|
-
next_month_date += month.days
|
91
|
-
return month, current_month_date if next_month_date > date
|
92
|
-
|
93
|
-
current_month_date = next_month_date.clone
|
94
|
-
end
|
95
|
-
|
96
|
-
raise ArgumentError, "invalid month range. date: #{date.format}"
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|