zakuro 0.7.0 → 0.7.2

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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +37 -10
  3. data/VERSION +1 -1
  4. data/doc/dropped_date.md +93 -0
  5. data/doc/error.md +45 -0
  6. data/lib/zakuro/calculation/base/day.rb +52 -0
  7. data/lib/zakuro/calculation/base/operated_year.rb +3 -3
  8. data/lib/zakuro/calculation/base/year.rb +4 -4
  9. data/lib/zakuro/calculation/cycle/abstract_remainder.rb +5 -3
  10. data/lib/zakuro/calculation/monthly/initialized_month.rb +1 -1
  11. data/lib/zakuro/calculation/monthly/month.rb +3 -3
  12. data/lib/zakuro/calculation/monthly/operated_month.rb +1 -1
  13. data/lib/zakuro/calculation/option/dropped_date/abstract_parameter.rb +44 -0
  14. data/lib/zakuro/calculation/option/dropped_date/location.rb +135 -0
  15. data/lib/zakuro/calculation/range/abstract_full_range.rb +10 -8
  16. data/lib/zakuro/calculation/range/abstract_operation_range.rb +2 -2
  17. data/lib/zakuro/calculation/range/dated_full_range.rb +1 -1
  18. data/lib/zakuro/calculation/range/dated_operation_range.rb +1 -1
  19. data/lib/zakuro/calculation/range/medieval_annual_range.rb +2 -2
  20. data/lib/zakuro/calculation/range/named_full_range.rb +1 -1
  21. data/lib/zakuro/calculation/range/named_operation_range.rb +1 -1
  22. data/lib/zakuro/calculation/range/operated_solar_terms.rb +9 -9
  23. data/lib/zakuro/calculation/range/transfer/year_boundary.rb +6 -6
  24. data/lib/zakuro/calculation/stella/solar/abstract_location.rb +2 -0
  25. data/lib/zakuro/calculation/summary/internal/day.rb +40 -0
  26. data/lib/zakuro/calculation/summary/internal/month.rb +15 -7
  27. data/lib/zakuro/calculation/summary/internal/option.rb +85 -0
  28. data/lib/zakuro/calculation/summary/japan/range.rb +15 -9
  29. data/lib/zakuro/calculation/summary/japan/single.rb +6 -6
  30. data/lib/zakuro/calculation/summary/japan/specifier/single_day.rb +10 -5
  31. data/lib/zakuro/calculation/summary/western/range.rb +5 -5
  32. data/lib/zakuro/calculation/summary/western/single.rb +9 -9
  33. data/lib/zakuro/calculation/summary/western/specifier/multiple_day.rb +15 -10
  34. data/lib/zakuro/calculation/summary/western/specifier/single_day.rb +12 -7
  35. data/lib/zakuro/calculation/type/optional.rb +46 -0
  36. data/lib/zakuro/condition.rb +60 -20
  37. data/lib/zakuro/context/context.rb +44 -0
  38. data/lib/zakuro/context/option.rb +117 -0
  39. data/lib/zakuro/context/version_class_resolver.rb +110 -0
  40. data/lib/zakuro/era/japan/gengou/alignment/aligner.rb +4 -0
  41. data/lib/zakuro/era/japan/gengou/resource/parser.rb +2 -0
  42. data/lib/zakuro/era/japan/gengou/resource/type.rb +6 -0
  43. data/lib/zakuro/era/western/calendar.rb +4 -0
  44. data/lib/zakuro/exception/case/pattern.rb +39 -3
  45. data/lib/zakuro/exception/exception.rb +3 -3
  46. data/lib/zakuro/exception/zakuro_error.rb +19 -1
  47. data/lib/zakuro/gateway/range.rb +2 -2
  48. data/lib/zakuro/gateway/single.rb +1 -1
  49. data/lib/zakuro/merchant.rb +78 -8
  50. data/lib/zakuro/operation/month/parser.rb +2 -0
  51. data/lib/zakuro/output/response.rb +24 -57
  52. data/lib/zakuro/result/data/option/abstract_option.rb +37 -0
  53. data/lib/zakuro/result/data/option/dropped_date/calculation.rb +47 -0
  54. data/lib/zakuro/result/data/option/dropped_date/option.rb +47 -0
  55. data/lib/zakuro/result/data/option/dropped_date/solar_term.rb +48 -0
  56. data/lib/zakuro/result/data/single_day.rb +9 -1
  57. data/lib/zakuro/result/operation/{operation.rb → bundle.rb} +0 -0
  58. data/lib/zakuro/result/result.rb +1 -1
  59. data/lib/zakuro/tools/stringifier.rb +26 -3
  60. data/lib/zakuro/version/daien/cycle/remainder.rb +2 -2
  61. data/lib/zakuro/version/daien/option/dropped_date/parameter.rb +31 -0
  62. data/lib/zakuro/version/daien/range/annual_range.rb +1 -1
  63. data/lib/zakuro/version/daien/stella/lunar/adjustment.rb +2 -0
  64. data/lib/zakuro/version/daien/stella/lunar/value.rb +2 -0
  65. data/lib/zakuro/version/genka/cycle/remainder.rb +2 -2
  66. data/lib/zakuro/version/genka/option/dropped_date/parameter.rb +31 -0
  67. data/lib/zakuro/version/genka/range/annual_range.rb +1 -1
  68. data/lib/zakuro/version/gihou/cycle/remainder.rb +2 -2
  69. data/lib/zakuro/version/gihou/option/dropped_date/parameter.rb +31 -0
  70. data/lib/zakuro/version/gihou/range/annual_range.rb +1 -1
  71. data/lib/zakuro/version/gihou/stella/lunar/adjustment.rb +2 -0
  72. data/lib/zakuro/version/gihou/stella/lunar/value.rb +2 -0
  73. data/lib/zakuro/version/senmyou/const/remainder.rb +5 -0
  74. data/lib/zakuro/version/senmyou/cycle/remainder.rb +37 -2
  75. data/lib/zakuro/version/senmyou/option/dropped_date/parameter.rb +33 -0
  76. data/lib/zakuro/version/senmyou/range/annual_range.rb +1 -1
  77. data/lib/zakuro/version/senmyou/stella/lunar/adjustment.rb +2 -0
  78. data/lib/zakuro/version/senmyou/stella/lunar/value.rb +2 -0
  79. metadata +26 -9
  80. data/lib/zakuro/version/context.rb +0 -44
  81. data/lib/zakuro/version/version_class_resolver.rb +0 -74
@@ -23,7 +23,7 @@ module Zakuro
23
23
  #
24
24
  # 生成する
25
25
  #
26
- # @param [Context] context 暦コンテキスト
26
+ # @param [Context::Context] context 暦コンテキスト
27
27
  # @param [Western::Calendar] date 西暦日
28
28
  #
29
29
  # @return [Result::Single] 一日検索結果(和暦日)
@@ -44,10 +44,10 @@ module Zakuro
44
44
  #
45
45
  # 完全範囲を取得する
46
46
  #
47
- # @param [Context] context 暦コンテキスト
47
+ # @param [Context::Context] context 暦コンテキスト
48
48
  # @param [Western::Calendar] date 西暦日
49
49
  #
50
- # @return [Array<Base::Year>] 完全範囲
50
+ # @return [Array<Calculation::Base::Year>] 完全範囲
51
51
  #
52
52
  def self.get_full_range_years(context:, date: Western::Calendar.new)
53
53
  full_range = Calculation::Range::DatedFullRange.new(context: context, start_date: date)
@@ -58,8 +58,8 @@ module Zakuro
58
58
  #
59
59
  # 運用結果範囲を取得する
60
60
  #
61
- # @param [Context] context 暦コンテキスト
62
- # @param [Array<Base::Year>] years 完全範囲
61
+ # @param [Context::Context] context 暦コンテキスト
62
+ # @param [Array<Calculation::Base::Year>] years 完全範囲
63
63
  # @param [Western::Calendar] date 西暦日
64
64
  #
65
65
  # @return [Array<Base::OperatedYear>] 運用結果範囲
@@ -75,8 +75,8 @@ module Zakuro
75
75
  #
76
76
  # 1日を取得する
77
77
  #
78
- # @param [Context] context 暦コンテキスト
79
- # @param [Array<Base::Year>] years 完全範囲
78
+ # @param [Context::Context] context 暦コンテキスト
79
+ # @param [Array<Calculation::Base::Year>] years 完全範囲
80
80
  # @param [Western::Calendar] date 西暦日
81
81
  #
82
82
  # @return [Data::SingleDay] 1日
@@ -93,10 +93,10 @@ module Zakuro
93
93
  #
94
94
  # 完全範囲を取得する
95
95
  #
96
- # @param [Context] context 暦コンテキスト
96
+ # @param [Array<Calculation::Base::Year>] years 完全範囲
97
97
  # @param [Western::Calendar] date 西暦日
98
98
  #
99
- # @return [Array<Base::Year>] 完全範囲
99
+ # @return [Array<Calculation::Base::Year>] 完全範囲
100
100
  #
101
101
  def self.get_operation(years:, date: Western::Calendar.new)
102
102
  calc_date = Specifier::SingleDay.get(
@@ -28,15 +28,18 @@ module Zakuro
28
28
  #
29
29
  # 取得する
30
30
  #
31
- # @param [Array<Base::Year>] years 範囲
31
+ # @param [Context::Context] context 暦コンテキスト
32
+ # @param [Array<Calculation::Base::Year>] years 範囲
32
33
  # @param [Western::Calendar] start_date 西暦開始日
33
34
  # @param [Western::Calendar] last_date 西暦終了日
34
35
  #
35
36
  # @return [Array<Result::Data::SingleDay>] 期間検索結果(和暦日)
36
37
  #
37
- def self.get(years: [], start_date: Western::Calendar.new,
38
+ def self.get(context:, years: [], start_date: Western::Calendar.new,
38
39
  last_date: Western::Calendar.new)
39
- months = specify(years: years, start_date: start_date, last_date: last_date)
40
+ months = specify(
41
+ context: context, years: years, start_date: start_date, last_date: last_date
42
+ )
40
43
 
41
44
  result = []
42
45
  months.each do |month|
@@ -49,18 +52,19 @@ module Zakuro
49
52
  #
50
53
  # 年を特定する
51
54
  #
52
- # @param [Array<Year>] years 範囲
55
+ # @param [Context::Context] context 暦コンテキスト
56
+ # @param [Array<Calculation::Base::Year>] years 範囲
53
57
  # @param [Western::Calendar] start_date 西暦開始日
54
58
  # @param [Western::Calendar] last_date 西暦終了日
55
59
  #
56
60
  # @return [Array<Month>] 特定月
57
61
  #
58
- def self.specify(years: [], start_date: Western::Calendar.new,
62
+ def self.specify(context:, years: [], start_date: Western::Calendar.new,
59
63
  last_date: Western::Calendar.new)
60
64
  result = []
61
65
  years.each do |year|
62
66
  result |= specify_month(
63
- year: year, start_date: start_date, last_date: last_date
67
+ context: context, year: year, start_date: start_date, last_date: last_date
64
68
  )
65
69
  end
66
70
 
@@ -73,13 +77,14 @@ module Zakuro
73
77
  #
74
78
  # 月を特定する
75
79
  #
76
- # @param [Year] year
80
+ # @param [Context::Context] context 暦コンテキスト
81
+ # @param [Calculation::Base::Year] year 年
77
82
  # @param [Western::Calendar] start_date 西暦開始日
78
83
  # @param [Western::Calendar] last_date 西暦終了日
79
84
  #
80
85
  # @return [Month] 対象月
81
86
  #
82
- def self.specify_month(year:, start_date: Western::Calendar.new,
87
+ def self.specify_month(context:, year:, start_date: Western::Calendar.new,
83
88
  last_date: Western::Calendar.new)
84
89
  months = year.months
85
90
 
@@ -95,7 +100,7 @@ module Zakuro
95
100
  monthly_last_date = last_date.clone if last_date < monthly_last_date
96
101
 
97
102
  specify_months.push(
98
- Month.new(year: year, month: month,
103
+ Month.new(context: context, year: year, month: month,
99
104
  start_date: monthly_start_date, last_date: monthly_last_date)
100
105
  )
101
106
  end
@@ -107,7 +112,7 @@ module Zakuro
107
112
  #
108
113
  # 月が範囲に含まれるか
109
114
  #
110
- # @param [Monthly::Month] month 月
115
+ # @param [Calculation::Monthly::Month] month 月
111
116
  # @param [Western::Calendar] start_date 西暦開始日
112
117
  # @param [Western::Calendar] last_date 西暦終了日
113
118
  #
@@ -6,6 +6,9 @@ require_relative '../../../../output/logger'
6
6
 
7
7
  require_relative '../../../base/year'
8
8
 
9
+ require_relative '../../internal/day'
10
+ require_relative '../../internal/option'
11
+
9
12
  # :nodoc:
10
13
  module Zakuro
11
14
  # :nodoc:
@@ -26,20 +29,20 @@ module Zakuro
26
29
  #
27
30
  # 取得する
28
31
  #
29
- # @param [Array<Year>] yeas 範囲
32
+ # @param [Array<Calculation::Base::Year>] years 範囲
30
33
  # @param [Western::Calendar] date 西暦日
31
34
  #
32
35
  # @return [Result::Data::SingleDay] 和暦日
33
36
  #
34
37
  def self.get(years: [], date: Western::Calendar.new)
35
38
  year, month = specify(years: years, date: date)
36
- first_date = month.western_date
37
39
 
38
- Output::Response::SingleDay.save_single_day(
39
- param: Output::Response::SingleDay::Param.new(
40
- year: year, month: month,
41
- date: date, days: date - first_date
42
- )
40
+ day = Day.get(month: month, date: date)
41
+
42
+ options = Option.create(month: month, day: day)
43
+
44
+ Output::Response::SingleDay.create(
45
+ year: year, month: month, day: day, options: options
43
46
  )
44
47
  end
45
48
 
@@ -52,6 +55,8 @@ module Zakuro
52
55
  # @return [Base::Year] 対象年
53
56
  # @return [Monthly::Month] 対象月
54
57
  #
58
+ # @raise [ArgumentError] 引数エラー
59
+ #
55
60
  def self.specify(years:, date:)
56
61
  years.each do |year|
57
62
  month = specify_month(year: year, date: date)
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nodoc:
4
+ module Zakuro
5
+ # :nodoc:
6
+ module Calculation
7
+ # :nodoc:
8
+ module Type
9
+ #
10
+ # Optional 参照管理
11
+ #
12
+ # * インスタンスのnil操作を避ける
13
+ # * safe navigation operator を使用しない
14
+ #
15
+ class Optional
16
+ #
17
+ # 初期化
18
+ #
19
+ # @param [Object] obj インスタンス
20
+ #
21
+ def initialize(obj: nil)
22
+ @obj = obj
23
+ end
24
+
25
+ #
26
+ # インスタンスを取得する
27
+ #
28
+ # @return [Object] インスタンス
29
+ #
30
+ def get
31
+ @obj
32
+ end
33
+
34
+ #
35
+ # 不正か
36
+ #
37
+ # @return [True] 不正
38
+ # @return [False] 不正なし
39
+ #
40
+ def invalid?
41
+ @obj.nil?
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative './exception/exception'
4
+
3
5
  require 'date'
4
6
 
5
7
  # :nodoc:
@@ -29,7 +31,7 @@ module Zakuro
29
31
  #
30
32
  # @param [Date] date 日付
31
33
  #
32
- # @return [Array<String>] エラーメッセージ
34
+ # @return [Array<Exception::Case::Preset>] エラープリセット配列
33
35
  #
34
36
  def self.validate(date:)
35
37
  failed = []
@@ -37,7 +39,12 @@ module Zakuro
37
39
 
38
40
  return failed if date.is_a?(Date) || date.is_a?(String)
39
41
 
40
- failed.push("invalid date: #{date}")
42
+ failed.push(
43
+ Exception::Case::Preset.new(
44
+ date.class,
45
+ template: Exception::Case::Pattern::INVALID_DATE_TYPE
46
+ )
47
+ )
41
48
  failed
42
49
  end
43
50
  end
@@ -54,7 +61,7 @@ module Zakuro
54
61
  #
55
62
  # 初期化
56
63
  #
57
- # @param [Hash<Symbol>] hash パラメータ
64
+ # @param [Hash<Symbol, Object>] hash パラメータ
58
65
  # @option hash [Symbol] :start 開始日
59
66
  # @option hash [Symbol] :start 終了日
60
67
  #
@@ -68,16 +75,21 @@ module Zakuro
68
75
  #
69
76
  # 検証する
70
77
  #
71
- # @param [Hash<Symbol>] hash パラメータ
78
+ # @param [Hash<Symbol, Object>] hash パラメータ
72
79
  #
73
- # @return [Array<String>] エラーメッセージ
80
+ # @return [Array<Exception::Case::Preset>] エラープリセット
74
81
  #
75
82
  def self.validate(hash:)
76
83
  failed = []
77
84
  return failed unless hash
78
85
 
79
86
  unless hash.is_a?(Hash)
80
- failed.push("invalid range type. #{hash}. should be hash")
87
+ failed.push(
88
+ Exception::Case::Preset.new(
89
+ hash.class,
90
+ template: Exception::Case::Pattern::INVALID_RANGE_TYPE
91
+ )
92
+ )
81
93
  return failed
82
94
  end
83
95
 
@@ -124,7 +136,7 @@ module Zakuro
124
136
  #
125
137
  # @param [Array<String>] columns 列
126
138
  #
127
- # @return [Array<String>] エラーメッセージ
139
+ # @return [Array<Exception::Case::Preset>] エラープリセット配列
128
140
  #
129
141
  def self.validate(columns:)
130
142
  # TODO: 列内容のバリデーション
@@ -134,7 +146,12 @@ module Zakuro
134
146
 
135
147
  return failed if columns.is_a?(Array)
136
148
 
137
- failed.push("invalid columns type. #{columns}. should be array")
149
+ failed.push(
150
+ Exception::Case::Preset.new(
151
+ hash.class,
152
+ template: Exception::Case::Pattern::INVALID_COLUMN_TYPE
153
+ )
154
+ )
138
155
 
139
156
  failed
140
157
  end
@@ -144,8 +161,8 @@ module Zakuro
144
161
  # Options オプション
145
162
  # 取得内容を変更する
146
163
  #
147
- # * unit: 年/月/日
148
- # * lost_days: 没日あり
164
+ # * version:
165
+ # * dropped_days: 没日あり
149
166
  # * seasons: 四季あり
150
167
  #
151
168
  class Options
@@ -155,7 +172,7 @@ module Zakuro
155
172
  #
156
173
  # 初期化
157
174
  #
158
- # @param [Array<String>] options オプション
175
+ # @param [Hash<Symbol, Object>] options オプション
159
176
  #
160
177
  def initialize(options: [])
161
178
  @options = options
@@ -166,9 +183,9 @@ module Zakuro
166
183
  #
167
184
  # 検証する
168
185
  #
169
- # @param [Array<String>] options オプション
186
+ # @param [Hash<Symbol, Object>] options オプション
170
187
  #
171
- # @return [Array<String>] エラーメッセージ
188
+ # @return [Array<Exception::Case::Preset>] エラープリセット配列
172
189
  #
173
190
  def self.validate(options:)
174
191
  failed = []
@@ -176,8 +193,12 @@ module Zakuro
176
193
 
177
194
  return failed if options.is_a?(Hash)
178
195
 
179
- failed.push("invalid options type. #{options}. should be hash")
180
-
196
+ failed.push(
197
+ Exception::Case::Preset.new(
198
+ hash.class,
199
+ template: Exception::Case::Pattern::INVALID_OPTION_TYPE
200
+ )
201
+ )
181
202
  failed
182
203
  end
183
204
  end
@@ -193,7 +214,7 @@ module Zakuro
193
214
  attr_reader :range
194
215
  # @return [Array<String>] 列
195
216
  attr_reader :columns
196
- # @return [Array<String>] オプション
217
+ # @return [Hash<String, Object>] オプション
197
218
  attr_reader :options
198
219
 
199
220
  #
@@ -203,13 +224,13 @@ module Zakuro
203
224
  # @option hash [Date] :date 基準日
204
225
  # @option hash [Hash<Symbol, Date>] :range 範囲
205
226
  # @option hash [Array<String>] :columns 列
206
- # @option hash [Array<String>] :options オプション
227
+ # @option hash [Hash<String, Object>] :options オプション
207
228
  #
208
229
  def initialize(hash: {})
209
230
  @date = hash[:date]
210
231
  @range = hash[:range]
211
232
  @columns = hash[:columns]
212
- @options = hash[:options]
233
+ @options = hash[:options] || {}
213
234
  end
214
235
 
215
236
  # :reek:TooManyStatements { max_statements: 8 }
@@ -219,16 +240,35 @@ module Zakuro
219
240
  #
220
241
  # @param [Hash<Symbol, Object>] hash パラメータ
221
242
  #
222
- # @return [Array<String>] エラーメッセージ
243
+ # @return [Array<Exception::Case::Preset>] エラープリセット配列
223
244
  #
224
245
  def self.validate(hash:)
225
246
  failed = []
226
247
 
227
248
  unless hash.is_a?(Hash)
228
- failed.push("invalid condition type. #{hash}. should be hash")
249
+ failed.push(
250
+ Exception::Case::Preset.new(
251
+ hash.class,
252
+ template: Exception::Case::Pattern::INVALID_CONDITION_TYPE
253
+ )
254
+ )
229
255
  return failed
230
256
  end
231
257
 
258
+ failed.concat(validate_hash(hash: hash))
259
+
260
+ failed
261
+ end
262
+
263
+ #
264
+ # ハッシュ内を検証する
265
+ #
266
+ # @param [Hash<Symbol, Object>] hash パラメータ
267
+ #
268
+ # @return [Array<Exception::Case::Preset>] エラープリセット配列
269
+ #
270
+ def self.validate_hash(hash:)
271
+ failed = []
232
272
  failed.concat(Catalog::BasisDate.validate(date: hash[:date]))
233
273
  failed.concat(Catalog::Range.validate(hash: hash[:range]))
234
274
  failed.concat(Catalog::Columns.validate(columns: hash[:columns]))
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './option'
4
+
5
+ require_relative './version_class_resolver'
6
+
7
+ # :nodoc:
8
+ module Zakuro
9
+ # :nodoc:
10
+ module Context
11
+ #
12
+ # Context 暦コンテキスト
13
+ #
14
+ class Context
15
+ # @return [Option] オプション
16
+ attr_reader :option
17
+ # @return [VersionClassResolver] 暦リゾルバー
18
+ attr_reader :resolver
19
+
20
+ #
21
+ # 初期化
22
+ #
23
+ # @param [Hash<String, Object>] options オプション値
24
+ #
25
+ # @raise [ArgumentError] 引数エラー
26
+ #
27
+ def initialize(version: Option::INVALID_VERSION_NAME, options: {})
28
+ @option = Option.new(default_version: version, hash: options)
29
+
30
+ @resolver = VersionClassResolver.new(version_name: option.version)
31
+ end
32
+
33
+ #
34
+ # 不正か
35
+ #
36
+ # @return [True] 不正
37
+ # @return [False] 不正なし
38
+ #
39
+ def invalid?
40
+ !@option.version?
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nodoc:
4
+ module Zakuro
5
+ # :nodoc:
6
+ module Context
7
+ #
8
+ # Option オプション値
9
+ #
10
+ class Option
11
+ # @return [String] 無効暦名
12
+ INVALID_VERSION_NAME = ''
13
+ # @return [Array<String>] 暦名
14
+ VERSION_NAMES = %w[Genka Gihou Daien Senmyou Joukyou Kansei Tenpou Gregorio].freeze
15
+
16
+ # @return [String] 没日オプションキー名
17
+ DROPPED_DATE_KEY = 'dropped_date'
18
+
19
+ # @return [Hash<String, Object>] オプション値
20
+ attr_reader :hash
21
+ # @return [String] デフォルト暦名
22
+ attr_reader :default_version
23
+
24
+ #
25
+ # 初期化
26
+ #
27
+ # @param [String] default_version デフォルト暦名
28
+ #
29
+ # @param [Hash<String, Object>] options オプション値
30
+ #
31
+ def initialize(default_version: INVALID_VERSION_NAME, hash: {})
32
+ @default_version = default_version
33
+ @hash = hash
34
+ end
35
+
36
+ #
37
+ # 暦名を返す
38
+ #
39
+ # @return [String] 暦名
40
+ #
41
+ def version
42
+ version = self.class.version(version: @default_version)
43
+
44
+ return version if self.class.version?(version: version)
45
+
46
+ version = hash['version']
47
+
48
+ self.class.version(version: version)
49
+ end
50
+
51
+ #
52
+ # 有効なデフォルト暦名か
53
+ #
54
+ # @return [True] 有効
55
+ # @return [False] 無効
56
+ #
57
+ def default_version?
58
+ self.class.version?(version: @default_version)
59
+ end
60
+
61
+ #
62
+ # 有効な暦名か
63
+ #
64
+ # @return [True] 有効
65
+ # @return [False] 無効
66
+ #
67
+ def version?
68
+ self.class.version?(version: version)
69
+ end
70
+
71
+ #
72
+ # 没日か
73
+ #
74
+ # @return [True] 没日あり
75
+ # @return [False] 没日なし
76
+ #
77
+ def dropped_date?
78
+ value = @hash[DROPPED_DATE_KEY]
79
+
80
+ return true if value.is_a?(TrueClass)
81
+
82
+ false
83
+ end
84
+
85
+ #
86
+ # 暦名を返す
87
+ #
88
+ # @param [String] version 暦名
89
+ #
90
+ # @return [String] 暦名
91
+ #
92
+ def self.version(version: INVALID_VERSION_NAME)
93
+ return INVALID_VERSION_NAME unless version
94
+
95
+ return INVALID_VERSION_NAME if version.empty?
96
+
97
+ return INVALID_VERSION_NAME unless VERSION_NAMES.include?(version)
98
+
99
+ version
100
+ end
101
+
102
+ #
103
+ # 有効な暦か
104
+ #
105
+ # @param [String] version 暦名
106
+ #
107
+ # @return [True] 有効
108
+ # @return [False] 無効
109
+ #
110
+ def self.version?(version: INVALID_VERSION_NAME)
111
+ return false if version == INVALID_VERSION_NAME
112
+
113
+ true
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../version/genka/cycle/remainder'
4
+ require_relative '../version/genka/cycle/solar_term'
5
+ require_relative '../version/genka/range/annual_range'
6
+ require_relative '../version/genka/option/dropped_date/parameter'
7
+
8
+ require_relative '../version/gihou/cycle/remainder'
9
+ require_relative '../version/gihou/cycle/solar_term'
10
+ require_relative '../version/gihou/range/annual_range'
11
+ require_relative '../version/gihou/option/dropped_date/parameter'
12
+
13
+ require_relative '../version/daien/cycle/remainder'
14
+ require_relative '../version/daien/cycle/solar_term'
15
+ require_relative '../version/daien/range/annual_range'
16
+ require_relative '../version/daien/option/dropped_date/parameter'
17
+
18
+ require_relative '../version/senmyou/cycle/remainder'
19
+ require_relative '../version/senmyou/cycle/solar_term'
20
+ require_relative '../version/senmyou/range/annual_range'
21
+ require_relative '../version/senmyou/option/dropped_date/parameter'
22
+
23
+ # :nodoc:
24
+ module Zakuro
25
+ # :nodoc:
26
+ module Context
27
+ #
28
+ # VersionClassResolver 暦リゾルバー
29
+ #
30
+ class VersionClassResolver
31
+ # @return [String] 暦名
32
+ attr_reader :version_name
33
+
34
+ # @return [Hash<String, String>] 関連
35
+ CLASSES = {
36
+ 'remainder' => 'Zakuro::$VERSION::Cycle::Remainder',
37
+ 'solar_term' => 'Zakuro::$VERSION::Cycle::SolarTerm',
38
+ 'annual_range' => 'Zakuro::$VERSION::Range::AnnualRange',
39
+ 'dropped_date_parameter' => 'Zakuro::$VERSION::Option::DroppedDate::Parameter'
40
+ }.freeze
41
+
42
+ #
43
+ # 初期化
44
+ #
45
+ # @param [String] version_name 暦名
46
+ #
47
+ def initialize(version_name:)
48
+ @version_name = version_name
49
+ end
50
+
51
+ #
52
+ # 該当の暦のクラスを取得する
53
+ #
54
+ # @param [String] version_name 暦名
55
+ # @param [String] class_name クラス名
56
+ #
57
+ # @return [Object] 該当クラス
58
+ #
59
+ # @raise [ArgumentError] 引数エラー
60
+ #
61
+ def self.get_class(version_name:, class_name:)
62
+ constant = CLASSES.fetch(class_name, '')
63
+
64
+ raise ArgumentError.new, 'invalid class name' if constant == ''
65
+
66
+ resolved_constant = constant.gsub('$VERSION', version_name)
67
+
68
+ Object.const_get(resolved_constant)
69
+ end
70
+
71
+ #
72
+ # 大余小余(暦別)クラスを返す
73
+ #
74
+ # @return [Class] 大余小余(暦別)クラス
75
+ #
76
+ def remainder
77
+ VersionClassResolver.get_class(version_name: @version_name, class_name: 'remainder')
78
+ end
79
+
80
+ #
81
+ # 二十四節気クラスを返す
82
+ #
83
+ # @return [Class] 二十四節気クラス
84
+ #
85
+ def solar_term
86
+ VersionClassResolver.get_class(version_name: @version_name, class_name: 'solar_term')
87
+ end
88
+
89
+ #
90
+ # 年間範囲クラスを返す
91
+ #
92
+ # @return [Class] 年間範囲クラス
93
+ #
94
+ def annual_range
95
+ VersionClassResolver.get_class(version_name: @version_name, class_name: 'annual_range')
96
+ end
97
+
98
+ #
99
+ # 没日引数を返す
100
+ #
101
+ # @return [Class] 没日引数クラス
102
+ #
103
+ def dropped_date_parameter
104
+ VersionClassResolver.get_class(
105
+ version_name: @version_name, class_name: 'dropped_date_parameter'
106
+ )
107
+ end
108
+ end
109
+ end
110
+ end