zakuro 0.0.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
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