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