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
@@ -68,6 +68,8 @@ module Zakuro
68
68
  #
69
69
  # @return [Array<LinearGengou>] 元号
70
70
  #
71
+ # @raise [ArgumentError] 引数エラー
72
+ #
71
73
  def get(line:, start_date:, last_date:)
72
74
  raise ArgumentError.new, 'invalid line number' unless LINE_INDEXES.include?(line)
73
75
 
@@ -82,6 +84,8 @@ module Zakuro
82
84
  #
83
85
  # @return [Array<LinearGengou>] 元号
84
86
  #
87
+ # @raise [ArgumentError] 引数エラー
88
+ #
85
89
  def get_by_name(line:, name:)
86
90
  raise ArgumentError.new, 'invalid line number' unless LINE_INDEXES.include?(line)
87
91
 
@@ -226,6 +226,8 @@ module Zakuro
226
226
  #
227
227
  # @return [Set] 元号セット情報
228
228
  #
229
+ # @raise [ArgumentError] 引数エラー
230
+ #
229
231
  def self.run(filepath: '')
230
232
  yaml = YAML.load_file(filepath)
231
233
 
@@ -54,6 +54,8 @@ module Zakuro
54
54
  #
55
55
  # @param [Integer] last_year 終了年
56
56
  #
57
+ # @raise [ArgumentError] 引数エラー
58
+ #
57
59
  def write_last_year(last_year:)
58
60
  unless Gengou.valid_year(year: last_year)
59
61
  raise ArgumentError, "invalid year format. [#{last_year}]"
@@ -67,6 +69,8 @@ module Zakuro
67
69
  #
68
70
  # @param [Western::Calendar] last_date 終了日
69
71
  #
72
+ # @raise [ArgumentError] 引数エラー
73
+ #
70
74
  def write_last_date(last_date:)
71
75
  unless Gengou.valid_date(date: last_date)
72
76
  raise ArgumentError, "invalid date format. [#{last_date}]"
@@ -125,6 +129,8 @@ module Zakuro
125
129
  #
126
130
  # @param [String] next_start_date 次回開始日
127
131
  #
132
+ # @raise [ArgumentError] 引数エラー
133
+ #
128
134
  def convert_next_start_date_to_last_date(next_start_date: '')
129
135
  raise ArgumentError, 'empty string cannot convert' if next_start_date.empty?
130
136
 
@@ -188,6 +188,8 @@ module Zakuro
188
188
  # @param [Integer] day 日
189
189
  # @param [Symbol] type 日付種別
190
190
  #
191
+ # @raise [ArgumentError] 引数エラー
192
+ #
191
193
  def initialize(year: -4712, month: 1, day: 1, type: Type::DEFAULT)
192
194
  start = Western.to_native_start(type: type)
193
195
  @param = Parameter.new(year: year, month: month, day: day, start: start)
@@ -386,6 +388,8 @@ module Zakuro
386
388
  #
387
389
  # @return [Calendar] 年月日情報(西暦)
388
390
  #
391
+ # @raise [ArgumentError] 引数エラー
392
+ #
389
393
  def self.parse(text: '', type: Type::DEFAULT)
390
394
  unless Calendar.valid_date_string(text: text, type: type)
391
395
  raise ArgumentError, "invalid date string: #{text}"
@@ -14,21 +14,57 @@ module Zakuro
14
14
  module Pattern
15
15
  INTERNAL_ERROR = Template.new(
16
16
  code: 'ERROR_0001',
17
- message: '致命的なエラーです。',
17
+ message: '内部エラーです。',
18
18
  length: 0
19
19
  )
20
20
 
21
+ INVALID_DATE_TYPE = Template.new(
22
+ code: 'ERROR_0101',
23
+ message: '日付の型は文字列/日付です。指定型:%s',
24
+ length: 1
25
+ )
26
+
27
+ INVALID_RANGE_TYPE = Template.new(
28
+ code: 'ERROR_0102',
29
+ message: '範囲の型はhashです。指定型:%s',
30
+ length: 1
31
+ )
32
+
33
+ INVALID_OPTION_TYPE = Template.new(
34
+ code: 'ERROR_0103',
35
+ message: 'オプションの型はhashです。指定型:%s',
36
+ length: 1
37
+ )
38
+
39
+ INVALID_COLUMN_TYPE = Template.new(
40
+ code: 'ERROR_0104',
41
+ message: '列の型は配列です。指定型:%s',
42
+ length: 1
43
+ )
44
+
45
+ INVALID_CONDITION_TYPE = Template.new(
46
+ code: 'ERROR_0105',
47
+ message: '条件の型は配列です。指定型:%s',
48
+ length: 1
49
+ )
50
+
21
51
  INVALID_DATE = Template.new(
22
- code: 'ERROR_0002',
52
+ code: 'ERROR_0201',
23
53
  message: '一日検索の日付指定が誤っています。',
24
54
  length: 0
25
55
  )
26
56
 
27
57
  INVALID_RANGE = Template.new(
28
- code: 'ERROR_0003',
58
+ code: 'ERROR_0202',
29
59
  message: '範囲検索の日付指定が誤っています。',
30
60
  length: 0
31
61
  )
62
+
63
+ UNCOMMITTABLE_DATE = Template.new(
64
+ code: 'ERROR_0203',
65
+ message: '検索不可能な日付指定です。',
66
+ length: 0
67
+ )
32
68
  end
33
69
  end
34
70
  end
@@ -2,11 +2,11 @@
2
2
 
3
3
  require_relative '../output/logger'
4
4
 
5
- require_relative './cause'
6
-
5
+ require_relative './case/preset'
7
6
  require_relative './case/pattern'
8
7
 
9
8
  require_relative './zakuro_error'
9
+ require_relative './cause'
10
10
 
11
11
  # :nodoc:
12
12
  module Zakuro
@@ -21,7 +21,7 @@ module Zakuro
21
21
  #
22
22
  # 例外を取得する
23
23
  #
24
- # @param [Array<Template>] presets 原因プリセット
24
+ # @param [Array<Case::Preset>] presets 原因プリセット
25
25
  #
26
26
  # @return [ZakuroError] ライブラリエラー
27
27
  #
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'json'
3
4
  require_relative './cause'
4
5
 
5
6
  # :nodoc:
@@ -20,8 +21,25 @@ module Zakuro
20
21
  # @param [Array<Cause>] causes 原因
21
22
  #
22
23
  def initialize(msg: '', causes: [])
23
- super(msg)
24
24
  @causes = causes
25
+ out = "#{msg}:#{text}"
26
+ super(out)
27
+ end
28
+
29
+ private
30
+
31
+ #
32
+ # 原因をJSON文字列にする
33
+ #
34
+ # @return [String] JSON文字列
35
+ #
36
+ def text
37
+ list = []
38
+ @causes.each do |cause|
39
+ list.push(Tools::Stringifier.to_h(obj: cause, class_prefix: 'Zakuro'))
40
+ end
41
+
42
+ JSON.generate(list)
25
43
  end
26
44
  end
27
45
  end
@@ -15,7 +15,7 @@ module Zakuro
15
15
  # Range 範囲
16
16
  #
17
17
  class Range
18
- # @return [Context] 暦コンテキスト
18
+ # @return [Context::Context] 暦コンテキスト
19
19
  attr_reader :context
20
20
  # @return [Locale::Range] 範囲
21
21
  attr_reader :range
@@ -23,7 +23,7 @@ module Zakuro
23
23
  #
24
24
  # 初期化
25
25
  #
26
- # @param [Context] context 暦コンテキスト
26
+ # @param [Context::Context] context 暦コンテキスト
27
27
  # @param [Hash<Symbol, Object>] range 範囲
28
28
  #
29
29
  def initialize(context:, range:)
@@ -21,7 +21,7 @@ module Zakuro
21
21
  #
22
22
  # 初期化
23
23
  #
24
- # @param [Context] context 暦コンテキスト
24
+ # @param [Context::Context] context 暦コンテキスト
25
25
  # @param [Date, String] date 日付
26
26
  #
27
27
  def initialize(context:, date:)
@@ -6,7 +6,9 @@ require_relative './gateway/range'
6
6
 
7
7
  require_relative './condition'
8
8
 
9
- require_relative './output/error'
9
+ require_relative './exception/exception'
10
+
11
+ require_relative './calculation/type/optional'
10
12
 
11
13
  # :nodoc:
12
14
  module Zakuro
@@ -15,6 +17,8 @@ module Zakuro
15
17
  # 東西の暦を取引する、素敵な笑顔の持ち主
16
18
  #
17
19
  class Merchant
20
+ # @return [Output::Logger] ロガー
21
+ LOGGER = Output::Logger.new(location: Merchant)
18
22
  # @return [Hash<Symbol, Object>] 条件
19
23
  attr_reader :condition
20
24
 
@@ -23,11 +27,17 @@ module Zakuro
23
27
  #
24
28
  # @param [Hash<Symbol, Object>] condition 条件
25
29
  #
30
+ # @raise [Exception::ZakuroError] ライブラリ内エラー
31
+ #
26
32
  def initialize(condition: {})
27
33
  failed = Condition.validate(hash: condition)
28
- raise Output::ZakuroError, failed.join('\n') unless failed.empty?
34
+ raise Exception.get(presets: failed) unless failed.empty?
29
35
 
30
36
  @condition = Condition.new(hash: condition)
37
+ rescue Exception::ZakuroError => e
38
+ raise e
39
+ rescue StandardError => e
40
+ make_internal_error(error: e)
31
41
  end
32
42
 
33
43
  #
@@ -37,13 +47,19 @@ module Zakuro
37
47
  #
38
48
  # @return [Merchant] 自インスタンス
39
49
  #
50
+ # @raise [Exception::ZakuroError] ライブラリ内エラー
51
+ #
40
52
  def offer(condition: {})
41
53
  failed = Condition.validate(hash: condition)
42
- raise Output::ZakuroError, failed.join('\n') unless failed.empty?
54
+ raise Exception.get(presets: failed) unless failed.empty?
43
55
 
44
56
  @condition.rewrite(hash: condition)
45
57
 
46
58
  self
59
+ rescue Exception::ZakuroError => e
60
+ raise e
61
+ rescue StandardError => e
62
+ make_internal_error(error: e)
47
63
  end
48
64
 
49
65
  #
@@ -52,19 +68,73 @@ module Zakuro
52
68
  # @return [Result::SingleDay] 和暦日
53
69
  # @return [Result::Range] 和暦日範囲
54
70
  #
71
+ # @raise [Exception::ZakuroError] ライブラリ内エラー
72
+ #
55
73
  def commit
56
- # TODO: condition で設定する
57
- context = Context.new(version_name: '')
74
+ context = Context::Context.new(options: condition.options)
75
+
76
+ result = get(context: context)
77
+
78
+ return result.get unless result.invalid?
58
79
 
80
+ make_uncommitable_error
81
+ rescue Exception::ZakuroError => e
82
+ raise e
83
+ rescue StandardError => e
84
+ make_internal_error(error: e)
85
+ end
86
+
87
+ private
88
+
89
+ #
90
+ # 結果取得する
91
+ #
92
+ # @param [Context::Context] context 暦コンテキスト
93
+ #
94
+ # @return [Calculation::Type::Optional] 参照
95
+ #
96
+ def get(context:)
59
97
  single = Gateway::Single.new(context: context, date: condition.date)
60
98
 
61
- return single.get unless single.invalid?
99
+ return Calculation::Type::Optional.new(obj: single.get) unless single.invalid?
62
100
 
63
101
  range = Gateway::Range.new(context: context, range: condition.range)
64
102
 
65
- return range.get unless range.invalid?
103
+ return Calculation::Type::Optional.new(obj: range.get) unless range.invalid?
104
+
105
+ Calculation::Type::Optional.new
106
+ end
107
+
108
+ #
109
+ # 内部エラーを生成する
110
+ #
111
+ # @param [StandardError] error 内部エラー
112
+ #
113
+ # @raise [Exception::ZakuroError] ライブラリ内エラー
114
+ #
115
+ def make_internal_error(error:)
116
+ LOGGER.error(error)
117
+ presets = [
118
+ Exception::Case::Preset.new(
119
+ template: Exception::Case::Pattern::INTERNAL_ERROR
120
+ )
121
+ ]
122
+ raise Exception.get(presets: presets)
123
+ end
66
124
 
67
- {}
125
+ #
126
+ # 内部エラーを生成する
127
+ #
128
+ # @raise [Exception::ZakuroError] ライブラリ内エラー
129
+ #
130
+ def make_uncommitable_error
131
+ raise Exception.get(
132
+ presets: [
133
+ Exception::Case::Preset.new(
134
+ template: Exception::Case::Pattern::UNCOMMITTABLE_DATE
135
+ )
136
+ ]
137
+ )
68
138
  end
69
139
  end
70
140
  end
@@ -112,6 +112,8 @@ module Zakuro
112
112
  #
113
113
  # @return [Array<MonthHistory>] 変更履歴
114
114
  #
115
+ # @raise [ArgumentError] 引数エラー
116
+ #
115
117
  def self.run(filepath:)
116
118
  hash = YAML.load_file(filepath)
117
119
 
@@ -14,63 +14,37 @@ module Zakuro
14
14
  # SingleDay 1日データ
15
15
  #
16
16
  module SingleDay
17
- #
18
- # Param 引数
19
- #
20
- class Param
21
- # @return [Year] 年情報(各暦のデータ型)
22
- attr_reader :year
23
- # @return [Month] 月情報(各暦のデータ型)
24
- attr_reader :month
25
- # @return [Western::Calendar] 年月日情報(西暦)
26
- attr_reader :date
27
- # @return [Integer] 日数(月初日から指定日までの日数)
28
- attr_reader :days
29
-
30
- #
31
- # 初期化
32
- #
33
- # @param [Year] year 年情報(各暦のデータ型)
34
- # @param [Month] month 月情報(各暦のデータ型)
35
- # @param [Western::Calendar] date 年月日情報(西暦)
36
- # @param [Integer] days 日数(月初日から指定日までの日数)
37
- #
38
- def initialize(year:, month:, date:, days:)
39
- @year = year
40
- @month = month
41
- @date = date
42
- @days = days
43
- end
44
- end
45
-
46
17
  #
47
18
  # 1日データを生成する
48
19
  #
49
- # @param [Parameter] param 引数
20
+ # @param [Calculation::Base::Year] year 年情報(各暦のデータ型)
21
+ # @param [Calculation::Monthly::Month] month 月情報(各暦のデータ型)
22
+ # @param [Calculation::Base::Day] day 日情報
23
+ # @param [Hash<String, Result::Data::Option::AbstractOption>] options オプション
50
24
  #
51
- # @return [SingleDay] 1日データ
25
+ # @return [Result::Data::SingleDay] 1日データ
52
26
  #
53
- def self.save_single_day(param:)
54
- year = param.year
55
- month = param.month
56
- date = param.date
57
- days = param.days
27
+ def self.create(year:, month:, day:, options: {})
58
28
  Result::Data::SingleDay.new(
59
- year: save_year(year: year, month: month, date: date),
60
- month: save_month(month: month, date: date, days: days),
61
- day: save_day(month: month, date: date, days: days)
29
+ year: save_year(year: year, month: month, day: day),
30
+ month: save_month(month: month, day: day),
31
+ day: save_day(day: day),
32
+ options: options
62
33
  )
63
34
  end
64
35
 
65
36
  #
66
37
  # 年データを保存する
67
38
  #
68
- # @param [Year] year 年情報(各暦のデータ型)
39
+ # @param [Calculation::Base::Year] year 年情報(各暦のデータ型)
40
+ # @param [Calculation::Monthly::Month] month 月情報(各暦のデータ型)
41
+ # @param [Calculation::Base::Day] day 日情報
69
42
  #
70
43
  # @return [Result::Year] 年データ
71
44
  #
72
- def self.save_year(year:, month:, date:)
45
+ def self.save_year(year:, month:, day:)
73
46
  gengou = month.gengou
47
+ date = day.western_date
74
48
  first = gengou.match_first_line(date: date)
75
49
  second = gengou.match_second_line(date: date)
76
50
  Result::Data::Year.new(
@@ -86,17 +60,16 @@ module Zakuro
86
60
  #
87
61
  # 月データを保存する
88
62
  #
89
- # @param [Month] month 月情報(各暦のデータ型)
90
- # @param [Western::Calendar] date 年月日情報(西暦)
91
- # @param [Integer] days 日数(月初日から指定日までの日数)
63
+ # @param [Calculation::Monthly::Month] month 月情報(各暦のデータ型)
64
+ # @param [Calculation::Base::Day] day 日情報
92
65
  #
93
66
  # @return [Result::Month] 月データ
94
67
  #
95
- def self.save_month(month:, date:, days:)
68
+ def self.save_month(month:, day:)
96
69
  Result::Data::Month.new(
97
70
  number: month.number, leaped: month.leaped?, days_name: month.days_name,
98
71
  first_day: save_first_day(remainder: month.remainder,
99
- date: date, days: days),
72
+ date: day.western_date, days: day.number - 1),
100
73
  odd_solar_terms: save_solar_term(term: month.odd_term),
101
74
  even_solar_terms: save_solar_term(term: month.even_term)
102
75
  )
@@ -147,23 +120,17 @@ module Zakuro
147
120
  #
148
121
  # 日データを保存する
149
122
  #
150
- # @param [Month] month 月情報(各暦のデータ型)
151
- # @param [Western::Calendar] date 年月日情報(西暦)
152
- # @param [Integer] days 日数(月初日から指定日までの日数)
123
+ # @param [Calculation::Base::Day] day 日情報
153
124
  #
154
125
  # @return [Result::Day] 日データ
155
126
  #
156
- def self.save_day(month:, date:, days:)
157
- remainder = month.remainder
158
- remainder = remainder.add(
159
- # 常に参照元のRemainderクラスで生成する
160
- remainder.class.new(day: days, minute: 0, second: 0)
161
- )
127
+ def self.save_day(day:)
128
+ remainder = day.remainder
162
129
  Result::Data::Day.new(
163
- number: (days + 1),
130
+ number: day.number,
164
131
  zodiac_name: remainder.zodiac_name,
165
132
  remainder: remainder,
166
- western_date: date
133
+ western_date: day.western_date
167
134
  )
168
135
  end
169
136
  private_class_method :save_day
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nodoc:
4
+ module Zakuro
5
+ #
6
+ # Result 演算結果
7
+ #
8
+ module Result
9
+ #
10
+ # データ部
11
+ #
12
+ module Data
13
+ #
14
+ # Option オプション
15
+ #
16
+ module Option
17
+ #
18
+ # AbstractOption 抽象オプション結果
19
+ #
20
+ class AbstractOption
21
+ # @return [True] オプション値有
22
+ # @return [False] オプション値無
23
+ attr_reader :matched
24
+
25
+ #
26
+ # 初期化
27
+ #
28
+ # @param [True, False] matched オプション値有無
29
+ #
30
+ def initialize(matched: false)
31
+ @matched = matched
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './solar_term'
4
+
5
+ # :nodoc:
6
+ module Zakuro
7
+ #
8
+ # Result 演算結果
9
+ #
10
+ module Result
11
+ #
12
+ # データ部
13
+ #
14
+ module Data
15
+ #
16
+ # Option オプション
17
+ #
18
+ module Option
19
+ #
20
+ # DroppedDate 没日
21
+ #
22
+ module DroppedDate
23
+ #
24
+ # Calculation 演算値
25
+ #
26
+ class Calculation
27
+ # @return [String] 大余小余(没余)
28
+ attr_reader :remainder
29
+ # @return [SolarTerm] 二十四節気
30
+ attr_reader :solar_term
31
+
32
+ #
33
+ # 初期化
34
+ #
35
+ # @param [String] remainder 大余小余(没余)
36
+ # @param [SolarTerm] solar_term 二十四節気
37
+ #
38
+ def initialize(remainder: '', solar_term: SolarTerm.new)
39
+ @remainder = remainder
40
+ @solar_term = solar_term
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../abstract_option'
4
+
5
+ require_relative './calculation'
6
+
7
+ # :nodoc:
8
+ module Zakuro
9
+ #
10
+ # Result 演算結果
11
+ #
12
+ module Result
13
+ #
14
+ # データ部
15
+ #
16
+ module Data
17
+ #
18
+ # Option オプション
19
+ #
20
+ module Option
21
+ #
22
+ # DroppedDate 没日
23
+ #
24
+ module DroppedDate
25
+ #
26
+ # Option 没日集約
27
+ #
28
+ class Option < AbstractOption
29
+ # @return [Calculation] 演算値
30
+ attr_reader :calculation
31
+
32
+ #
33
+ # 初期化
34
+ #
35
+ # @param [True, False] matched オプション値有無
36
+ # @param [Calculation] calculation 演算値
37
+ #
38
+ def initialize(matched: false, calculation: Calculation.new)
39
+ super(matched: matched)
40
+ @calculation = calculation
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nodoc:
4
+ module Zakuro
5
+ #
6
+ # Result 演算結果
7
+ #
8
+ module Result
9
+ #
10
+ # データ部
11
+ #
12
+ module Data
13
+ #
14
+ # Option オプション
15
+ #
16
+ module Option
17
+ #
18
+ # DroppedDate 没日
19
+ #
20
+ module DroppedDate
21
+ #
22
+ # SolarTerm 二十四節気
23
+ #
24
+ class SolarTerm
25
+ # @return [Interger] 不正連番
26
+ INVALID = -1
27
+
28
+ # @return [Integer] 連番
29
+ attr_reader :index
30
+ # @return [String] 大余小余
31
+ attr_reader :remainder
32
+
33
+ #
34
+ # 初期化
35
+ #
36
+ # @param [Integer] index 連番
37
+ # @param [String] remainder 大余小余
38
+ #
39
+ def initialize(index: INVALID, remainder: '')
40
+ @index = index
41
+ @remainder = remainder
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end