zakuro 0.0.2 → 0.1.3

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