zakuro 0.0.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +102 -42
  3. data/doc/operation.md +25 -0
  4. data/doc/operation/csv/month.csv +202 -0
  5. data/doc/operation/operation.xlsx +0 -0
  6. data/doc/operation/transfer.rb +77 -0
  7. data/lib/zakuro/calculation/base/multi_gengou.rb +101 -0
  8. data/lib/zakuro/calculation/base/multi_gengou_roller.rb +218 -0
  9. data/lib/zakuro/calculation/base/year.rb +107 -0
  10. data/lib/zakuro/calculation/cycle/abstract_remainder.rb +459 -0
  11. data/lib/zakuro/calculation/cycle/abstract_solar_term.rb +173 -0
  12. data/lib/zakuro/calculation/cycle/zodiac.rb +106 -0
  13. data/lib/zakuro/calculation/monthly/first_day.rb +45 -0
  14. data/lib/zakuro/calculation/monthly/initialized_month.rb +125 -0
  15. data/lib/zakuro/calculation/monthly/month.rb +187 -0
  16. data/lib/zakuro/calculation/monthly/month_label.rb +88 -0
  17. data/lib/zakuro/calculation/monthly/operated_month.rb +209 -0
  18. data/lib/zakuro/calculation/range/full_range.rb +210 -0
  19. data/lib/zakuro/calculation/range/operated_range.rb +144 -0
  20. data/lib/zakuro/calculation/range/operated_solar_terms.rb +201 -0
  21. data/lib/zakuro/calculation/range/transfer/western_date_allocation.rb +82 -0
  22. data/lib/zakuro/calculation/range/transfer/year_boundary.rb +146 -0
  23. data/lib/zakuro/calculation/specifier/single_day.rb +109 -0
  24. data/lib/zakuro/calculation/summary/single.rb +129 -0
  25. data/lib/zakuro/condition.rb +16 -13
  26. data/lib/zakuro/era/japan/gengou.rb +106 -0
  27. data/lib/zakuro/era/japan/gengou/parser.rb +167 -0
  28. data/lib/zakuro/era/japan/gengou/type.rb +178 -0
  29. data/lib/zakuro/era/japan/gengou/validator.rb +236 -0
  30. data/lib/zakuro/era/japan/reki.rb +91 -0
  31. data/lib/zakuro/era/{gengou → japan/yaml}/set-001-until-south.yaml +0 -0
  32. data/lib/zakuro/era/{gengou → japan/yaml}/set-002-from-north.yaml +0 -0
  33. data/lib/zakuro/era/{gengou → japan/yaml}/set-003-modern.yaml +0 -0
  34. data/lib/zakuro/era/western.rb +1 -1
  35. data/lib/zakuro/merchant.rb +2 -2
  36. data/lib/zakuro/operation/month/parser.rb +373 -0
  37. data/lib/zakuro/operation/month/type.rb +453 -0
  38. data/lib/zakuro/operation/month/validator.rb +802 -0
  39. data/lib/zakuro/operation/operation.rb +66 -0
  40. data/lib/zakuro/operation/yaml/month.yaml +6452 -0
  41. data/lib/zakuro/output/error.rb +7 -4
  42. data/lib/zakuro/output/logger.rb +50 -47
  43. data/lib/zakuro/output/response.rb +146 -143
  44. data/lib/zakuro/result/core.rb +52 -0
  45. data/lib/zakuro/result/data.rb +187 -0
  46. data/lib/zakuro/result/operation.rb +114 -0
  47. data/lib/zakuro/result/result.rb +37 -0
  48. data/lib/zakuro/{output → tools}/stringifier.rb +16 -9
  49. data/lib/zakuro/tools/typeof.rb +33 -0
  50. data/lib/zakuro/version.rb +1 -1
  51. data/lib/zakuro/version/abstract_version.rb +1 -1
  52. data/lib/zakuro/version/context.rb +23 -0
  53. data/lib/zakuro/version/senmyou/cycle/remainder.rb +63 -0
  54. data/lib/zakuro/version/senmyou/cycle/solar_term.rb +31 -0
  55. data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +186 -182
  56. data/lib/zakuro/version/senmyou/range/annual_range.rb +167 -0
  57. data/lib/zakuro/version/senmyou/senmyou.rb +10 -4
  58. data/lib/zakuro/version/senmyou/stella/lunar_orbit.rb +6 -6
  59. data/lib/zakuro/version/senmyou/stella/solar_average.rb +103 -152
  60. data/lib/zakuro/version/senmyou/stella/solar_location.rb +213 -0
  61. data/lib/zakuro/version/senmyou/stella/solar_orbit.rb +3 -184
  62. data/lib/zakuro/version/senmyou/stella/winter_solstice.rb +4 -4
  63. data/lib/zakuro/version/version_class_resolver.rb +62 -0
  64. data/lib/zakuro/version_factory.rb +3 -3
  65. metadata +53 -24
  66. data/lib/zakuro/cycle/abstract_remainder.rb +0 -456
  67. data/lib/zakuro/cycle/zodiac.rb +0 -103
  68. data/lib/zakuro/era/japan.rb +0 -664
  69. data/lib/zakuro/output/result.rb +0 -225
  70. data/lib/zakuro/version/senmyou/base/era.rb +0 -83
  71. data/lib/zakuro/version/senmyou/base/multi_gengou.rb +0 -98
  72. data/lib/zakuro/version/senmyou/base/multi_gengou_roller.rb +0 -205
  73. data/lib/zakuro/version/senmyou/base/remainder.rb +0 -60
  74. data/lib/zakuro/version/senmyou/base/solar_term.rb +0 -66
  75. data/lib/zakuro/version/senmyou/base/year.rb +0 -104
  76. data/lib/zakuro/version/senmyou/monthly/month.rb +0 -122
  77. data/lib/zakuro/version/senmyou/summary/annual_range.rb +0 -187
  78. data/lib/zakuro/version/senmyou/summary/full_range.rb +0 -224
  79. 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