zakuro 0.6.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (181) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +3 -0
  3. data/README.md +46 -17
  4. data/VERSION +1 -1
  5. data/doc/dropped_date.md +93 -0
  6. data/doc/error.md +45 -0
  7. data/doc/operation/transfer.rb +8 -8
  8. data/lib/zakuro/calculation/base/day.rb +52 -0
  9. data/lib/zakuro/calculation/base/gengou.rb +49 -3
  10. data/lib/zakuro/calculation/base/linear_gengou.rb +5 -5
  11. data/lib/zakuro/calculation/base/operated_year.rb +26 -24
  12. data/lib/zakuro/calculation/base/year.rb +7 -7
  13. data/lib/zakuro/calculation/cycle/abstract_remainder.rb +55 -47
  14. data/lib/zakuro/calculation/cycle/abstract_solar_term.rb +28 -24
  15. data/lib/zakuro/calculation/cycle/zodiac.rb +22 -20
  16. data/lib/zakuro/calculation/era/gengou/{scroll.rb → abstract_scroll.rb} +44 -37
  17. data/lib/zakuro/calculation/era/gengou/dated_scroll.rb +30 -0
  18. data/lib/zakuro/calculation/era/gengou/internal/connector.rb +4 -4
  19. data/lib/zakuro/calculation/era/gengou/internal/counter.rb +16 -16
  20. data/lib/zakuro/calculation/era/gengou/internal/publisher.rb +74 -72
  21. data/lib/zakuro/calculation/era/gengou/internal/reserve/{list.rb → abstract_list.rb} +50 -64
  22. data/lib/zakuro/calculation/era/gengou/internal/reserve/{range.rb → abstract_range.rb} +73 -50
  23. data/lib/zakuro/calculation/era/gengou/internal/reserve/dated_list.rb +48 -0
  24. data/lib/zakuro/calculation/era/gengou/internal/reserve/dated_range.rb +30 -0
  25. data/lib/zakuro/calculation/era/gengou/internal/reserve/empty_link.rb +156 -0
  26. data/lib/zakuro/calculation/era/gengou/internal/reserve/named_list.rb +125 -0
  27. data/lib/zakuro/calculation/era/gengou/internal/reserve/named_range.rb +73 -0
  28. data/lib/zakuro/calculation/era/gengou/internal/reserve.rb +23 -22
  29. data/lib/zakuro/calculation/era/gengou/named_scroll.rb +30 -0
  30. data/lib/zakuro/calculation/era/version/internal/crawler.rb +39 -22
  31. data/lib/zakuro/calculation/era/version/version.rb +12 -10
  32. data/lib/zakuro/calculation/monthly/abstract_lunar_phase.rb +13 -9
  33. data/lib/zakuro/calculation/monthly/const.rb +18 -0
  34. data/lib/zakuro/calculation/monthly/initialized_month.rb +40 -38
  35. data/lib/zakuro/calculation/monthly/month.rb +55 -16
  36. data/lib/zakuro/calculation/monthly/month_label.rb +4 -4
  37. data/lib/zakuro/calculation/monthly/operated_month.rb +37 -86
  38. data/lib/zakuro/calculation/monthly/operated_solar_term.rb +80 -0
  39. data/lib/zakuro/calculation/option/dropped_date/abstract_parameter.rb +44 -0
  40. data/lib/zakuro/calculation/option/dropped_date/location.rb +135 -0
  41. data/lib/zakuro/calculation/range/{full_range.rb → abstract_full_range.rb} +45 -29
  42. data/lib/zakuro/calculation/range/abstract_operation_range.rb +193 -0
  43. data/lib/zakuro/calculation/range/dated_full_range.rb +32 -0
  44. data/lib/zakuro/calculation/range/dated_operation_range.rb +33 -0
  45. data/lib/zakuro/calculation/range/medieval_annual_range.rb +64 -63
  46. data/lib/zakuro/calculation/range/named_full_range.rb +38 -0
  47. data/lib/zakuro/calculation/range/named_operation_range.rb +36 -0
  48. data/lib/zakuro/calculation/range/operated_solar_term.rb +220 -0
  49. data/lib/zakuro/calculation/range/transfer/gengou_scroller.rb +32 -29
  50. data/lib/zakuro/calculation/range/transfer/year_boundary.rb +115 -117
  51. data/lib/zakuro/calculation/stella/lunar/abstract_location.rb +1 -1
  52. data/lib/zakuro/calculation/stella/lunar/choukei_value.rb +48 -46
  53. data/lib/zakuro/calculation/stella/solar/abstract_average.rb +31 -26
  54. data/lib/zakuro/calculation/stella/solar/abstract_location.rb +7 -5
  55. data/lib/zakuro/calculation/stella/solar/choukei_value.rb +114 -114
  56. data/lib/zakuro/calculation/summary/internal/day.rb +42 -0
  57. data/lib/zakuro/calculation/{specifier → summary}/internal/month.rb +33 -12
  58. data/lib/zakuro/calculation/summary/internal/operation.rb +68 -67
  59. data/lib/zakuro/calculation/summary/internal/option.rb +101 -0
  60. data/lib/zakuro/calculation/summary/japan/range.rb +179 -0
  61. data/lib/zakuro/calculation/summary/japan/single.rb +118 -0
  62. data/lib/zakuro/calculation/summary/japan/specifier/single_day.rb +98 -0
  63. data/lib/zakuro/calculation/summary/japan/specifier/specified_range.rb +34 -0
  64. data/lib/zakuro/calculation/summary/western/range.rb +127 -0
  65. data/lib/zakuro/calculation/summary/western/single.rb +115 -0
  66. data/lib/zakuro/calculation/summary/western/specifier/multiple_day.rb +173 -0
  67. data/lib/zakuro/calculation/summary/western/specifier/single_day.rb +100 -0
  68. data/lib/zakuro/calculation/type/old_float.rb +2 -2
  69. data/lib/zakuro/calculation/type/optional.rb +46 -0
  70. data/lib/zakuro/condition.rb +143 -94
  71. data/lib/zakuro/context/context.rb +44 -0
  72. data/lib/zakuro/context/option.rb +119 -0
  73. data/lib/zakuro/context/version_class_resolver.rb +112 -0
  74. data/lib/zakuro/era/japan/calendar.rb +35 -33
  75. data/lib/zakuro/era/japan/gengou/alignment/aligner.rb +93 -74
  76. data/lib/zakuro/era/japan/gengou/alignment/division.rb +135 -133
  77. data/lib/zakuro/era/japan/gengou/alignment/line.rb +143 -122
  78. data/lib/zakuro/era/japan/gengou/alignment/linear_gengou.rb +177 -168
  79. data/lib/zakuro/era/japan/gengou/alignment.rb +40 -25
  80. data/lib/zakuro/era/japan/gengou/resource/parser.rb +199 -181
  81. data/lib/zakuro/era/japan/gengou/resource/type.rb +243 -234
  82. data/lib/zakuro/era/japan/gengou/resource/validator.rb +257 -254
  83. data/lib/zakuro/era/japan/gengou/resource.rb +23 -22
  84. data/lib/zakuro/era/japan/gengou.rb +28 -41
  85. data/lib/zakuro/era/japan/version.rb +18 -16
  86. data/lib/zakuro/era/western/calendar.rb +104 -88
  87. data/lib/zakuro/exception/case/pattern.rb +71 -0
  88. data/lib/zakuro/exception/case/preset.rb +51 -0
  89. data/lib/zakuro/exception/case/template.rb +48 -0
  90. data/lib/zakuro/exception/cause.rb +28 -0
  91. data/lib/zakuro/exception/exception.rb +39 -0
  92. data/lib/zakuro/exception/zakuro_error.rb +46 -0
  93. data/lib/zakuro/gateway/locale/date.rb +127 -0
  94. data/lib/zakuro/gateway/locale/range.rb +67 -0
  95. data/lib/zakuro/gateway/range.rb +99 -0
  96. data/lib/zakuro/gateway/single.rb +81 -0
  97. data/lib/zakuro/merchant.rb +67 -33
  98. data/lib/zakuro/operation/month/parser.rb +252 -249
  99. data/lib/zakuro/operation/month/type.rb +44 -35
  100. data/lib/zakuro/operation/month/validator.rb +182 -178
  101. data/lib/zakuro/operation/operation.rb +38 -36
  102. data/lib/zakuro/operation/yaml/month.yaml +3736 -3736
  103. data/lib/zakuro/output/logger.rb +17 -3
  104. data/lib/zakuro/output/response.rb +107 -141
  105. data/lib/zakuro/result/data/day.rb +43 -0
  106. data/lib/zakuro/result/data/gengou.rb +35 -0
  107. data/lib/zakuro/result/data/month.rb +63 -0
  108. data/lib/zakuro/result/data/option/abstract_option.rb +37 -0
  109. data/lib/zakuro/result/data/option/dropped_date/calculation.rb +47 -0
  110. data/lib/zakuro/result/data/option/dropped_date/option.rb +47 -0
  111. data/lib/zakuro/result/data/option/dropped_date/solar_term.rb +48 -0
  112. data/lib/zakuro/result/data/single_day.rb +56 -0
  113. data/lib/zakuro/result/data/solar_term.rb +35 -0
  114. data/lib/zakuro/result/data/year.rb +45 -0
  115. data/lib/zakuro/result/operation/month/annotation.rb +40 -0
  116. data/lib/zakuro/result/operation/month/history.rb +54 -0
  117. data/lib/zakuro/result/operation/month.rb +31 -0
  118. data/lib/zakuro/result/operation.rb +22 -97
  119. data/lib/zakuro/result/result.rb +6 -4
  120. data/lib/zakuro/tools/stringifier.rb +67 -42
  121. data/lib/zakuro/tools/typeconv.rb +17 -15
  122. data/lib/zakuro/tools/typeof.rb +15 -13
  123. data/lib/zakuro/version/daien/cycle/remainder.rb +2 -2
  124. data/lib/zakuro/version/daien/monthly/lunar_phase.rb +10 -12
  125. data/lib/zakuro/version/daien/option/dropped_date/parameter.rb +31 -0
  126. data/lib/zakuro/version/daien/range/annual_range.rb +19 -17
  127. data/lib/zakuro/version/daien/stella/lunar/adjustment.rb +42 -37
  128. data/lib/zakuro/version/daien/stella/lunar/localization.rb +16 -14
  129. data/lib/zakuro/version/daien/stella/lunar/value.rb +52 -47
  130. data/lib/zakuro/version/daien/stella/origin/average_november.rb +15 -13
  131. data/lib/zakuro/version/daien/stella/origin/lunar_age.rb +23 -21
  132. data/lib/zakuro/version/daien/stella/origin/winter_solstice.rb +22 -20
  133. data/lib/zakuro/version/daien/stella/solar/adjustment.rb +12 -10
  134. data/lib/zakuro/version/daien/stella/solar/average.rb +53 -51
  135. data/lib/zakuro/version/daien/stella/solar/interval.rb +19 -17
  136. data/lib/zakuro/version/daien/stella/solar/value.rb +13 -11
  137. data/lib/zakuro/version/genka/cycle/remainder.rb +4 -4
  138. data/lib/zakuro/version/genka/monthly/lunar_phase.rb +7 -5
  139. data/lib/zakuro/version/genka/option/dropped_date/parameter.rb +31 -0
  140. data/lib/zakuro/version/genka/range/annual_range.rb +48 -44
  141. data/lib/zakuro/version/genka/stella/origin/first_term.rb +30 -28
  142. data/lib/zakuro/version/genka/stella/origin/january.rb +22 -20
  143. data/lib/zakuro/version/gihou/cycle/remainder.rb +2 -2
  144. data/lib/zakuro/version/gihou/monthly/lunar_phase.rb +9 -9
  145. data/lib/zakuro/version/gihou/option/dropped_date/parameter.rb +31 -0
  146. data/lib/zakuro/version/gihou/range/annual_range.rb +19 -17
  147. data/lib/zakuro/version/gihou/stella/lunar/adjustment.rb +42 -37
  148. data/lib/zakuro/version/gihou/stella/lunar/localization.rb +16 -14
  149. data/lib/zakuro/version/gihou/stella/lunar/value.rb +52 -47
  150. data/lib/zakuro/version/gihou/stella/origin/average_november.rb +15 -13
  151. data/lib/zakuro/version/gihou/stella/origin/lunar_age.rb +23 -21
  152. data/lib/zakuro/version/gihou/stella/origin/winter_solstice.rb +24 -22
  153. data/lib/zakuro/version/gihou/stella/solar/adjustment.rb +12 -10
  154. data/lib/zakuro/version/gihou/stella/solar/average.rb +52 -50
  155. data/lib/zakuro/version/gihou/stella/solar/interval.rb +19 -17
  156. data/lib/zakuro/version/gihou/stella/solar/value.rb +13 -11
  157. data/lib/zakuro/version/senmyou/const/remainder.rb +5 -0
  158. data/lib/zakuro/version/senmyou/cycle/remainder.rb +37 -2
  159. data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +10 -10
  160. data/lib/zakuro/version/senmyou/option/dropped_date/parameter.rb +33 -0
  161. data/lib/zakuro/version/senmyou/range/annual_range.rb +19 -17
  162. data/lib/zakuro/version/senmyou/stella/lunar/adjustment.rb +42 -36
  163. data/lib/zakuro/version/senmyou/stella/lunar/localization.rb +16 -14
  164. data/lib/zakuro/version/senmyou/stella/lunar/value.rb +39 -34
  165. data/lib/zakuro/version/senmyou/stella/origin/average_november.rb +15 -13
  166. data/lib/zakuro/version/senmyou/stella/origin/lunar_age.rb +23 -21
  167. data/lib/zakuro/version/senmyou/stella/origin/winter_solstice.rb +22 -20
  168. data/lib/zakuro/version/senmyou/stella/solar/adjustment.rb +12 -10
  169. data/lib/zakuro/version/senmyou/stella/solar/average.rb +52 -50
  170. data/lib/zakuro/version/senmyou/stella/solar/interval.rb +19 -17
  171. data/lib/zakuro/version/senmyou/stella/solar/value.rb +13 -11
  172. metadata +68 -16
  173. data/lib/zakuro/calculation/range/operated_range.rb +0 -193
  174. data/lib/zakuro/calculation/range/operated_solar_terms.rb +0 -220
  175. data/lib/zakuro/calculation/specifier/multiple_day.rb +0 -162
  176. data/lib/zakuro/calculation/specifier/single_day.rb +0 -87
  177. data/lib/zakuro/calculation/summary/range.rb +0 -120
  178. data/lib/zakuro/calculation/summary/single.rb +0 -110
  179. data/lib/zakuro/result/data.rb +0 -187
  180. data/lib/zakuro/version/context.rb +0 -44
  181. data/lib/zakuro/version/version_class_resolver.rb +0 -74
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../context/option'
4
+ require_relative '../../../result/data/option/dropped_date/option'
5
+ require_relative '../../../result/data/solar_term'
6
+
7
+ require_relative '../../option/dropped_date/location'
8
+
9
+ # :nodoc:
10
+ module Zakuro
11
+ # :nodoc:
12
+ module Calculation
13
+ # :nodoc:
14
+ module Summary
15
+ #
16
+ # Option オプション
17
+ #
18
+ module Option
19
+ class << self
20
+ #
21
+ # 初期化
22
+ #
23
+ # @param [Calculation::Monthly::Month] month 月情報(各暦のデータ型)
24
+ # @param [Calculation::Base::Day] day 日情報
25
+ #
26
+ # @return [Hash<String, Result::Data::Option::AbstractOption>] オプション結果
27
+ #
28
+ def create(month:, day:)
29
+ options = {}
30
+ context = month.context
31
+
32
+ if context.option.dropped_date?
33
+ remainder = day.remainder
34
+ solar_terms = month.solar_terms
35
+ option = dropped_date(
36
+ context: context, remainder: remainder, solar_terms: solar_terms
37
+ )
38
+ options[Context::Option::DROPPED_DATE_KEY] = option
39
+ end
40
+
41
+ options
42
+ end
43
+
44
+ private
45
+
46
+ #
47
+ # 没日を求める
48
+ #
49
+ # @param [Context::Context] context 暦コンテキスト
50
+ # @param [Cycle::AbstractRemainder] remainder 当日和暦日
51
+ # @param [Array<Cycle::AbstractSolarTerm>] solar_terms 二十四節気
52
+ #
53
+ # @return [Result::Data::Option::DroppedDate::Option] 没日
54
+ #
55
+ def dropped_date(context:, remainder:, solar_terms:)
56
+ option = Result::Data::Option::DroppedDate::Option.new(
57
+ matched: false,
58
+ calculation: Result::Data::Option::DroppedDate::Calculation.new
59
+ )
60
+
61
+ return option if remainder.invalid?
62
+
63
+ location = Calculation::Option::DroppedDate::Location.new(
64
+ context: context, solar_terms: solar_terms
65
+ )
66
+
67
+ return option unless location.exist?
68
+
69
+ dropped_date = location.get
70
+
71
+ return option unless remainder.day == dropped_date.day
72
+
73
+ dropped_date_option(location: location)
74
+ end
75
+
76
+ #
77
+ # 没日オプション値を生成する
78
+ #
79
+ # @param [Calculation::Option::DroppedDate::Location] location 没日位置
80
+ #
81
+ # @return [Result::Data::Option::DroppedDate::Option] 没日オプション値
82
+ #
83
+ def dropped_date_option(location:)
84
+ dropped_date = location.get
85
+ solar_term = location.solar_term
86
+ Result::Data::Option::DroppedDate::Option.new(
87
+ matched: true,
88
+ calculation: Result::Data::Option::DroppedDate::Calculation.new(
89
+ remainder: dropped_date.format,
90
+ solar_term: Result::Data::SolarTerm.new(
91
+ index: solar_term.index,
92
+ remainder: solar_term.remainder.format
93
+ )
94
+ )
95
+ )
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,179 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../range/named_operation_range'
4
+
5
+ require_relative '../../range/named_full_range'
6
+
7
+ require_relative '../western/specifier/multiple_day'
8
+
9
+ require_relative '../internal/operation'
10
+
11
+ require_relative './specifier/single_day'
12
+
13
+ require_relative './specifier/specified_range'
14
+
15
+ # :nodoc:
16
+ module Zakuro
17
+ # :nodoc:
18
+ module Calculation
19
+ # :nodoc:
20
+ module Summary
21
+ # :nodoc:
22
+ module Japan
23
+ #
24
+ # Range 期間
25
+ #
26
+ module Range
27
+ class << self
28
+ #
29
+ # 生成する
30
+ #
31
+ # @param [Context::Context] context 暦コンテキスト
32
+ # @param [Japan::Calendar] start_date 和暦開始日
33
+ # @param [Japan::Calendar] last_date 和暦終了日
34
+ #
35
+ # @return [Result::Range] 期間検索結果(和暦日)
36
+ #
37
+ def get(context:, start_date: Japan::Calendar.new,
38
+ last_date: Japan::Calendar.new)
39
+ years = get_full_range_years(
40
+ context: context, start_date: start_date, last_date: last_date
41
+ )
42
+ operated_years = get_operation_range_years(
43
+ context: context, years: years, start_date: start_date, last_date: last_date
44
+ )
45
+
46
+ range = specified_range(
47
+ operated_years: operated_years, start_date: start_date, last_date: last_date
48
+ )
49
+
50
+ list = create_list(
51
+ context: context,
52
+ operated_years: operated_years, years: years, range: range
53
+ )
54
+
55
+ Result::Range.new(list: list)
56
+ end
57
+
58
+ private
59
+
60
+ #
61
+ # 特定範囲を取得する
62
+ #
63
+ # @param [Array<Base::OperatedYear>] operated_years 運用結果範囲
64
+ # @param [Japan::Calendar] start_date 和暦開始日
65
+ # @param [Japan::Calendar] last_date 和暦終了日
66
+ #
67
+ # @return [SpecifiedRange] 特定範囲
68
+ #
69
+ def specified_range(operated_years: [], start_date: Japan::Calendar.new,
70
+ last_date: Japan::Calendar.new)
71
+ japan_start_date = Specifier::SingleDay.get(
72
+ years: operated_years, date: start_date
73
+ )
74
+ japan_last_date = Specifier::SingleDay.get(
75
+ years: operated_years, date: last_date
76
+ )
77
+
78
+ SpecifiedRange.new(start_date: japan_start_date, last_date: japan_last_date)
79
+ end
80
+
81
+ #
82
+ # 1日検索結果リストを生成する
83
+ #
84
+ # @param [Context::Context] context 暦コンテキスト
85
+ # @param [Array<Base::OperatedYear>] operated_years 運用結果範囲
86
+ # @param [Array<Base::Year>] years 完全範囲
87
+ # @param [SpecifiedRange] range 特定範囲
88
+ #
89
+ # @return [Array<Result::Single>] 結果リスト
90
+ #
91
+ def create_list(context:, operated_years: [], years: [],
92
+ range:)
93
+ western_start_date = range.start_date.day.western_date
94
+ western_last_date = range.last_date.day.western_date
95
+
96
+ operated_dates = Western::Specifier::MultipleDay.get(
97
+ context: context, years: operated_years,
98
+ start_date: western_start_date, last_date: western_last_date
99
+ )
100
+
101
+ dates = Western::Specifier::MultipleDay.get(
102
+ context: context, years: years,
103
+ start_date: western_start_date, last_date: western_last_date
104
+ )
105
+
106
+ create_result_list(dates: dates, operated_dates: operated_dates)
107
+ end
108
+
109
+ #
110
+ # 完全範囲を取得する
111
+ #
112
+ # @param [Context::Context] context 暦コンテキスト
113
+ # @param [Japan::Calendar] start_date 和暦開始日
114
+ # @param [Japan::Calendar] last_date 和暦終了日
115
+ #
116
+ # @return [Array<Base::Year>] 完全範囲
117
+ #
118
+ def get_full_range_years(context:, start_date: Japan::Calendar.new,
119
+ last_date: Japan::Calendar.new)
120
+ full_range = Calculation::Range::NamedFullRange.new(
121
+ context: context, start_name: start_date.gengou, last_name: last_date.gengou
122
+ )
123
+ full_range.get
124
+ end
125
+
126
+ #
127
+ # 運用結果範囲を取得する
128
+ #
129
+ # @param [Context::Context] context 暦コンテキスト
130
+ # @param [Array<Base::Year>] years 完全範囲
131
+ # @param [Japan::Calendar] start_date 和暦開始日
132
+ # @param [Japan::Calendar] last_date 和暦終了日
133
+ #
134
+ # @return [Array<Base::OperatedYear>] 運用結果範囲
135
+ #
136
+ def get_operation_range_years(context:, years:, start_date: Japan::Calendar.new,
137
+ last_date: Japan::Calendar.new)
138
+ operation_range = Calculation::Range::NamedOperationRange.new(
139
+ context: context, years: years,
140
+ start_name: start_date.gengou, last_name: last_date.gengou
141
+ )
142
+ operation_range.get
143
+ end
144
+
145
+ #
146
+ # 結果リストを生成する
147
+ #
148
+ # @param [Array<Result::Data::SingleDay>] dates 検索結果(計算値)
149
+ # @param [Array<Result::Data::SingleDay>] operated_dates 検索結果(運用値)
150
+ #
151
+ # @return [Array<Result::Single>] 結果リスト
152
+ #
153
+ def create_result_list(dates:, operated_dates:)
154
+ result = []
155
+
156
+ return result if dates.size != operated_dates.size
157
+
158
+ (0..(dates.size - 1)).each do |index|
159
+ data = operated_dates[index]
160
+
161
+ date = dates[index]
162
+ operation = Operation.create(calc_date: date)
163
+
164
+ result.push(
165
+ Result::Single.new(
166
+ data: data,
167
+ operation: operation
168
+ )
169
+ )
170
+ end
171
+
172
+ result
173
+ end
174
+ end
175
+ end
176
+ end
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../range/named_operation_range'
4
+
5
+ require_relative '../../range/named_full_range'
6
+
7
+ require_relative '../western/specifier/single_day'
8
+
9
+ require_relative '../internal/operation'
10
+
11
+ require_relative './specifier/single_day'
12
+
13
+ # :nodoc:
14
+ module Zakuro
15
+ # :nodoc:
16
+ module Calculation
17
+ # :nodoc:
18
+ module Summary
19
+ # :nodoc:
20
+ module Japan
21
+ #
22
+ # Single 一日
23
+ #
24
+ module Single
25
+ class << self
26
+ #
27
+ # 生成する
28
+ #
29
+ # @param [Context::Context] context 暦コンテキスト
30
+ # @param [Japan::Calendar] date 和暦日
31
+ #
32
+ # @return [Result::Single] 一日検索結果(和暦日)
33
+ #
34
+ def get(context:, date: Japan::Calendar.new)
35
+ years = get_full_range_years(context: context, date: date)
36
+
37
+ data = get_data(context: context, years: years, date: date)
38
+
39
+ western_date = data.day.western_date
40
+ operation = get_operation(years: years, date: western_date)
41
+
42
+ Result::Single.new(
43
+ data: data,
44
+ operation: operation
45
+ )
46
+ end
47
+
48
+ private
49
+
50
+ #
51
+ # 完全範囲を取得する
52
+ #
53
+ # @param [Context::Context] context 暦コンテキスト
54
+ # @param [Japan::Calendar] date 和暦日
55
+ #
56
+ # @return [Array<Base::Year>] 完全範囲
57
+ #
58
+ def get_full_range_years(context:, date: Japan::Calendar.new)
59
+ full_range = Calculation::Range::NamedFullRange.new(
60
+ context: context, start_name: date.gengou
61
+ )
62
+ full_range.get
63
+ end
64
+
65
+ #
66
+ # 1日を取得する
67
+ #
68
+ # @param [Context::Context] context 暦コンテキスト
69
+ # @param [Array<Base::Year>] years 完全範囲
70
+ # @param [Japan::Calendar] date 和暦日
71
+ #
72
+ # @return [Data::SingleDay] 1日
73
+ #
74
+ def get_data(context:, years:, date: Japan::Calendar.new)
75
+ operated_years = get_operation_range_years(context: context, years: years, date: date)
76
+
77
+ Specifier::SingleDay.get(
78
+ years: operated_years, date: date
79
+ )
80
+ end
81
+
82
+ #
83
+ # 運用結果範囲を取得する
84
+ #
85
+ # @param [Context::Context] context 暦コンテキスト
86
+ # @param [Array<Calculation::Base::Year>] years 完全範囲
87
+ # @param [Japan::Calendar] date 和暦日
88
+ #
89
+ # @return [Array<Base::OperatedYear>] 運用結果範囲
90
+ #
91
+ def get_operation_range_years(context:, years:, date: Japan::Calendar.new)
92
+ operation_range = Calculation::Range::NamedOperationRange.new(
93
+ context: context, start_name: date.gengou, years: years
94
+ )
95
+ operation_range.get
96
+ end
97
+
98
+ #
99
+ # 完全範囲を取得する
100
+ #
101
+ # @param [Array<Calculation::Base::Year>] years 完全範囲
102
+ # @param [Western::Calendar] date 和暦日
103
+ #
104
+ # @return [Array<Base::Year>] 完全範囲
105
+ #
106
+ def get_operation(years:, date: Western::Calendar.new)
107
+ calc_date = Western::Specifier::SingleDay.get(
108
+ years: years, date: date
109
+ )
110
+
111
+ Operation.create(calc_date: calc_date)
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../../era/japan/calendar'
4
+ require_relative '../../../../era/western/calendar'
5
+ require_relative '../../../../output/response'
6
+ require_relative '../../../../output/logger'
7
+
8
+ require_relative '../../../base/year'
9
+
10
+ require_relative '../../internal/day'
11
+ require_relative '../../internal/option'
12
+
13
+ # :nodoc:
14
+ module Zakuro
15
+ # :nodoc:
16
+ module Calculation
17
+ # :nodoc:
18
+ module Summary
19
+ # :nodoc:
20
+ module Japan
21
+ # :nodoc:
22
+ module Specifier
23
+ #
24
+ # SingleDay 一日検索
25
+ #
26
+ module SingleDay
27
+ # @return [Output::Logger] ロガー
28
+ LOGGER = Output::Logger.new(location: 'specifier')
29
+
30
+ class << self
31
+ #
32
+ # 取得する
33
+ #
34
+ # @param [Array<Year>] yeas 範囲
35
+ # @param [Japan::Calendar] date 和暦日
36
+ #
37
+ # @return [Result::Data::SingleDay] 和暦日
38
+ #
39
+ def get(years: [], date: Japan::Calendar.new)
40
+ year, month = specify(years: years, date: date)
41
+ first_date = month.western_date.clone
42
+ days = date.day - 1
43
+ western_date = first_date + days
44
+ day = Day.get(month: month, date: western_date)
45
+
46
+ options = Option.create(month: month, day: day)
47
+
48
+ Output::Response::SingleDay.create(
49
+ year: year, month: month, day: day, options: options
50
+ )
51
+ end
52
+
53
+ private
54
+
55
+ #
56
+ # 年を特定する
57
+ #
58
+ # @param [Array<Year>] years 範囲
59
+ # @param [Japan::Calendar] date 和暦日
60
+ #
61
+ # @return [Base::Year] 対象年
62
+ # @return [Monthly::Month] 対象月
63
+ #
64
+ # @raise [ArgumentError] 引数エラー
65
+ #
66
+ def specify(years:, date:)
67
+ years.each do |year|
68
+ month = specify_month(year: year, date: date)
69
+ return year, month unless month.invalid?
70
+ end
71
+
72
+ raise ArgumentError, "invalid year range. date: #{date.format}"
73
+ end
74
+
75
+ #
76
+ # 月を特定する
77
+ #
78
+ # @param [Base::Year] year 年
79
+ # @param [Japan::Calendar] date 和暦日
80
+ #
81
+ # @return [Monthly::Month] 対象月
82
+ #
83
+ def specify_month(year:, date:)
84
+ months = year.months
85
+
86
+ months.each do |month|
87
+ return month if month.include_by_japan_date?(date: date)
88
+ end
89
+
90
+ Monthly::Month.new
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nodoc:
4
+ module Zakuro
5
+ # :nodoc:
6
+ module Calculation
7
+ # :nodoc:
8
+ module Summary
9
+ # :nodoc:
10
+ module Japan
11
+ #
12
+ # SpecifiedRange 特定範囲
13
+ #
14
+ class SpecifiedRange
15
+ # @return [Result::Data::SingleDay] 特定開始日
16
+ attr_reader :start_date
17
+ # @return [Result::Data::SingleDay] 特定終了日
18
+ attr_reader :last_date
19
+
20
+ #
21
+ # 初期化
22
+ #
23
+ # @param [Result::Data::SingleDay] start_date 特定開始日
24
+ # @param [Result::Data::SingleDay] last_date 特定終了日
25
+ #
26
+ def initialize(start_date:, last_date:)
27
+ @start_date = start_date
28
+ @last_date = last_date
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,127 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../range/dated_operation_range'
4
+
5
+ require_relative '../../range/dated_full_range'
6
+
7
+ require_relative './specifier/multiple_day'
8
+
9
+ require_relative '../internal/operation'
10
+
11
+ # :nodoc:
12
+ module Zakuro
13
+ # :nodoc:
14
+ module Calculation
15
+ # :nodoc:
16
+ module Summary
17
+ # :nodoc:
18
+ module Western
19
+ #
20
+ # Range 期間
21
+ #
22
+ module Range
23
+ class << self
24
+ #
25
+ # 生成する
26
+ #
27
+ # @param [Context::Context] context 暦コンテキスト
28
+ # @param [Western::Calendar] start_date 西暦開始日
29
+ # @param [Western::Calendar] last_date 西暦終了日
30
+ #
31
+ # @return [Result::Range] 期間検索結果(和暦日)
32
+ #
33
+ def get(context:, start_date: Western::Calendar.new,
34
+ last_date: Western::Calendar.new)
35
+ years = get_full_range_years(
36
+ context: context, start_date: start_date, last_date: last_date
37
+ )
38
+ operated_years = get_operation_range_years(
39
+ context: context, years: years, start_date: start_date, last_date: last_date
40
+ )
41
+
42
+ dates = Specifier::MultipleDay.get(
43
+ context: context, years: years, start_date: start_date, last_date: last_date
44
+ )
45
+
46
+ operated_dates = Specifier::MultipleDay.get(
47
+ context: context, years: operated_years,
48
+ start_date: start_date, last_date: last_date
49
+ )
50
+
51
+ list = create_result_list(dates: dates, operated_dates: operated_dates)
52
+
53
+ Result::Range.new(list: list)
54
+ end
55
+
56
+ private
57
+
58
+ #
59
+ # 完全範囲を取得する
60
+ #
61
+ # @param [Context::Context] context 暦コンテキスト
62
+ # @param [Western::Calendar] start_date 西暦開始日
63
+ # @param [Western::Calendar] last_date 西暦終了日
64
+ #
65
+ # @return [Array<Base::Year>] 完全範囲
66
+ #
67
+ def get_full_range_years(context:, start_date: Western::Calendar.new,
68
+ last_date: Western::Calendar.new)
69
+ full_range = Calculation::Range::DatedFullRange.new(
70
+ context: context, start_date: start_date, last_date: last_date
71
+ )
72
+ full_range.get
73
+ end
74
+
75
+ #
76
+ # 運用結果範囲を取得する
77
+ #
78
+ # @param [Context::Context] context 暦コンテキスト
79
+ # @param [Array<Base::Year>] years 完全範囲
80
+ # @param [Western::Calendar] start_date 西暦開始日
81
+ # @param [Western::Calendar] last_date 西暦終了日
82
+ #
83
+ # @return [Array<Base::OperatedYear>] 運用結果範囲
84
+ #
85
+ def get_operation_range_years(context:, years:, start_date: Western::Calendar.new,
86
+ last_date: Western::Calendar.new)
87
+ operation_range = Calculation::Range::DatedOperationRange.new(
88
+ context: context, start_date: start_date, last_date: last_date, years: years
89
+ )
90
+ operation_range.get
91
+ end
92
+
93
+ #
94
+ # 結果リストを生成する
95
+ #
96
+ # @param [Array<Result::Data::SingleDay>] dates 検索結果(計算値)
97
+ # @param [Array<Result::Data::SingleDay>] operated_dates 検索結果(運用値)
98
+ #
99
+ # @return [Array<Result::Single>] 結果リスト
100
+ #
101
+ def create_result_list(dates:, operated_dates:)
102
+ result = []
103
+
104
+ return result if dates.size != operated_dates.size
105
+
106
+ (0..(dates.size - 1)).each do |index|
107
+ data = operated_dates[index]
108
+
109
+ date = dates[index]
110
+ operation = Operation.create(calc_date: date)
111
+
112
+ result.push(
113
+ Result::Single.new(
114
+ data: data,
115
+ operation: operation
116
+ )
117
+ )
118
+ end
119
+
120
+ result
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end