zakuro 0.9.2 → 0.9.4

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/VERSION +1 -1
  4. data/doc/dropped_date.md +25 -0
  5. data/doc/operation/csv/month.csv +4 -5
  6. data/doc/operation/operation.xlsx +0 -0
  7. data/doc/vanished_date.md +26 -0
  8. data/lib/zakuro/calculation/cycle/abstract_remainder.rb +26 -0
  9. data/lib/zakuro/calculation/cycle/abstract_solar_term.rb +7 -1
  10. data/lib/zakuro/calculation/era/gengou/dated_scroll.rb +8 -2
  11. data/lib/zakuro/calculation/era/gengou/internal/counter.rb +5 -5
  12. data/lib/zakuro/calculation/era/gengou/internal/reserve/abstract_list.rb +18 -5
  13. data/lib/zakuro/calculation/era/gengou/internal/reserve/abstract_range.rb +24 -9
  14. data/lib/zakuro/calculation/era/gengou/internal/reserve/dated_list.rb +7 -2
  15. data/lib/zakuro/calculation/era/gengou/internal/reserve/dated_range.rb +7 -2
  16. data/lib/zakuro/calculation/era/gengou/internal/reserve/named_list.rb +13 -3
  17. data/lib/zakuro/calculation/era/gengou/internal/reserve/named_range.rb +15 -4
  18. data/lib/zakuro/calculation/era/gengou/named_scroll.rb +8 -2
  19. data/lib/zakuro/calculation/monthly/initialized_month.rb +4 -2
  20. data/lib/zakuro/calculation/monthly/meta/all_solar_term.rb +64 -0
  21. data/lib/zakuro/calculation/monthly/meta/meta_collector.rb +80 -0
  22. data/lib/zakuro/calculation/monthly/meta.rb +60 -0
  23. data/lib/zakuro/calculation/monthly/month.rb +119 -5
  24. data/lib/zakuro/calculation/monthly/operated_month.rb +7 -19
  25. data/lib/zakuro/calculation/option/dropped_date/location.rb +20 -24
  26. data/lib/zakuro/calculation/option/vanished_date/location.rb +9 -2
  27. data/lib/zakuro/calculation/range/abstract_full_range.rb +19 -2
  28. data/lib/zakuro/calculation/range/abstract_operation_range.rb +20 -2
  29. data/lib/zakuro/calculation/range/dated_full_range.rb +8 -3
  30. data/lib/zakuro/calculation/range/dated_operation_range.rb +4 -1
  31. data/lib/zakuro/calculation/range/medieval_annual_range.rb +1 -1
  32. data/lib/zakuro/calculation/range/named_full_range.rb +3 -1
  33. data/lib/zakuro/calculation/range/named_operation_range.rb +3 -1
  34. data/lib/zakuro/calculation/range/transfer/gengou_scroller.rb +2 -1
  35. data/lib/zakuro/calculation/range/transfer/year_boundary.rb +10 -8
  36. data/lib/zakuro/calculation/stella/solar/abstract_average.rb +8 -34
  37. data/lib/zakuro/calculation/summary/internal/option.rb +24 -5
  38. data/lib/zakuro/calculation/summary/western/range.rb +8 -1
  39. data/lib/zakuro/calculation/summary/western/single.rb +12 -5
  40. data/lib/zakuro/calculation/summary/western/specifier/single_day.rb +1 -1
  41. data/lib/zakuro/era/japan/gengou/alignment/linear_gengou.rb +1 -1
  42. data/lib/zakuro/era/japan/gengou/alignment.rb +41 -2
  43. data/lib/zakuro/era/japan/gengou/resource/parser.rb +83 -25
  44. data/lib/zakuro/era/japan/gengou/resource/type.rb +81 -26
  45. data/lib/zakuro/era/japan/gengou/resource/validator.rb +100 -21
  46. data/lib/zakuro/era/japan/gengou/resource/yaml/set-001-until-south.yaml +1123 -375
  47. data/lib/zakuro/era/japan/gengou/resource/yaml/set-002-from-north.yaml +487 -163
  48. data/lib/zakuro/era/japan/gengou/resource/yaml/set-003-modern.yaml +30 -10
  49. data/lib/zakuro/era/japan/gengou/resource.rb +16 -0
  50. data/lib/zakuro/era/japan/gengou.rb +11 -6
  51. data/lib/zakuro/operation/yaml/month.yaml +4 -36
  52. data/lib/zakuro/output/logger.rb +21 -3
  53. data/lib/zakuro/tools/gengou_range_comparer.rb +82 -0
  54. data/lib/zakuro/tools/remainder_comparer.rb +100 -0
  55. metadata +11 -6
@@ -21,12 +21,13 @@ module Zakuro
21
21
  # 年間範囲内の年データの開始月を変更する
22
22
  #
23
23
  # @param [Context::Context] context 暦コンテキスト
24
- # @param [Array<Base::Year>] annual_ranges 年データ(冬至基準)
24
+ # @param [Array<Array<Monthly::Month>>] annual_ranges 年データ(冬至基準)
25
25
  #
26
26
  # @return [Array<Base::Year>] 年データ(元旦基準)
27
27
  #
28
28
  def get(context:, annual_ranges:)
29
29
  categorize(context: context, annual_ranges: annual_ranges)
30
+
30
31
  rearranged_years(context: context, annual_ranges: annual_ranges)
31
32
  end
32
33
 
@@ -36,7 +37,7 @@ module Zakuro
36
37
  # 年間範囲内の年データの開始月を変更する
37
38
  #
38
39
  # @param [Context::Context] context 暦コンテキスト
39
- # @param [Array<Base::Year>] annual_ranges 年データ(冬至基準)
40
+ # @param [Array<Array<Monthly::Month>>] annual_ranges 年データ(冬至基準)
40
41
  #
41
42
  # @return [Array<Base::Year>] 年データ(元旦基準)
42
43
  #
@@ -57,7 +58,7 @@ module Zakuro
57
58
  # 年間範囲を昨年/今年で分類する
58
59
  #
59
60
  # @param [Context::Context] context 暦コンテキスト
60
- # @param [Array<Base::Year>] annual_range 1年データ
61
+ # @param [Array<Array<Monthly::Month>>] annual_range 1年データ
61
62
  #
62
63
  def categorize(context:, annual_ranges:)
63
64
  annual_ranges.each do |annual_range|
@@ -69,7 +70,7 @@ module Zakuro
69
70
  # 各月を昨年/今年で分類する
70
71
  #
71
72
  # @param [Context::Context] context 暦コンテキスト
72
- # @param [Array<Month>] annual_range 1年データ
73
+ # @param [Array<Monthly::Month>] annual_range 1年データ
73
74
  #
74
75
  def categorize_year(context:, annual_range:)
75
76
  is_last_year = true
@@ -80,7 +81,8 @@ module Zakuro
80
81
  context: context,
81
82
  month_label: month.month_label, first_day: month.first_day,
82
83
  solar_terms: month.solar_terms, phase_index: month.phase_index,
83
- is_last_year: is_last_year
84
+ is_last_year: is_last_year,
85
+ meta: month.meta
84
86
  )
85
87
  end
86
88
  end
@@ -89,7 +91,7 @@ module Zakuro
89
91
  # 年データの開始月を変更する
90
92
  #
91
93
  # @param [Context::Context] context 暦コンテキスト
92
- # @param [Array<Base::Year>] annual_ranges 年データ(冬至基準)
94
+ # @param [Array<Array<Monthly::Month>>] annual_ranges 年データ(冬至基準)
93
95
  # @param [Integer] index 対象年の要素番号
94
96
  #
95
97
  # @return [Base::Year] 年データ(元旦基準)
@@ -108,7 +110,7 @@ module Zakuro
108
110
  # 当年データを生成する
109
111
  #
110
112
  # @param [Context::Context] context 暦コンテキスト
111
- # @param [Array<Month>] annual_range 1年データ
113
+ # @param [Array<Monthly::Month>] annual_range 1年データ
112
114
  #
113
115
  # @return [Base::Year] 当年月ありの対象年
114
116
  #
@@ -126,7 +128,7 @@ module Zakuro
126
128
  #
127
129
  # 昨年データを生成する
128
130
  #
129
- # @param [Array<Month>] annual_range 1年データ
131
+ # @param [Array<Monthly::Month>] annual_range 1年データ
130
132
  # @param [Base::Year] year 対象年
131
133
  #
132
134
  # @return [Base::Year] 昨年月ありの対象年
@@ -1,5 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../monthly/meta/meta_collector'
4
+
5
+ require_relative '../../../tools/remainder_comparer'
6
+
3
7
  # :nodoc:
4
8
  module Zakuro
5
9
  # :nodoc:
@@ -42,36 +46,6 @@ module Zakuro
42
46
  annual_range
43
47
  end
44
48
 
45
- # :reek:TooManyStatements { max_statements: 7 }
46
-
47
- class << self
48
- #
49
- # 月内(当月朔日から当月末日(来月朔日の前日)の間)に二十四節気があるか
50
- # @note 大余60で一巡するため 以下2パターンがある
51
- # * current_month <= next_month : (二十四節気) >= current_month && (二十四節気) < next_month
52
- # * current_month > next_month : (二十四節気) >= current_month || (二十四節気) < next_month
53
- #
54
- # @param [Cycle::AbstractRemainder] solar_term 二十四節気
55
- # @param [Cycle::AbstractRemainder] current_month 月初
56
- # @param [Cycle::AbstractRemainder] next_month 月末
57
- #
58
- # @return [True] 対象の二十四節気がある
59
- # @return [False] 対象の二十四節気がない
60
- #
61
- def in_solar_term?(solar_term:, current_month:, next_month:)
62
- # 大余で比較する
63
- target_time = solar_term.day
64
- current_month_time = current_month.day
65
- next_month_time = next_month.day
66
- current_month_over = (target_time >= current_month_time)
67
- next_month_under = (target_time < next_month_time)
68
-
69
- return current_month_over && next_month_under if current_month_time <= next_month_time
70
-
71
- current_month_over || next_month_under
72
- end
73
- end
74
-
75
49
  private
76
50
 
77
51
  # :reek:TooManyStatements { max_statements: 8 }
@@ -87,10 +61,10 @@ module Zakuro
87
61
  # * 最大試行回数:4回(設定なし => 設定あり => 設定あり => 設定なし)
88
62
  # * 閏月は1回しか設定しない
89
63
  # * 最大2回設定する(中気・節気)
90
- (0..3).each do |_index|
91
- in_range = self.class.in_solar_term?(
92
- solar_term: solar_term.remainder, current_month: current_month.remainder,
93
- next_month: next_month.remainder
64
+ 4.times.each do |_index|
65
+ in_range = Tools::RemainderComparer.in_range?(
66
+ target: solar_term.remainder, start: current_month.remainder,
67
+ last: next_month.remainder
94
68
  )
95
69
 
96
70
  # 範囲外
@@ -34,17 +34,32 @@ module Zakuro
34
34
  context = month.context
35
35
 
36
36
  if context.option.dropped_date?
37
+ solar_term = month.solar_term_by_day(day: day.remainder.day)
38
+
37
39
  remainder = day.remainder
38
- solar_terms = month.solar_terms
39
40
  option = dropped_date(
40
- context: context, remainder: remainder, solar_terms: solar_terms
41
+ context: context, remainder: remainder, solar_term: solar_term
41
42
  )
42
43
  options[Context::Option::DROPPED_DATE_KEY] = option
43
44
  end
44
45
 
46
+ # TODO: refactor
45
47
  if context.option.vanished_date?
46
48
  remainder = day.remainder
47
49
  average_remainder = month.first_day.average_remainder
50
+ # p "remainder: #{remainder.format}"
51
+ # p "last_average_remainder: #{month.meta.last_average_remainder.format}"
52
+
53
+ if day.number == 1
54
+ option = vanished_date(
55
+ context: context, remainder: remainder,
56
+ average_remainder: month.meta.last_average_remainder
57
+ )
58
+ options[Context::Option::VANISHED_DATE_KEY] = option
59
+
60
+ return options if option.matched
61
+ end
62
+
48
63
  option = vanished_date(
49
64
  context: context, remainder: remainder, average_remainder: average_remainder
50
65
  )
@@ -61,19 +76,21 @@ module Zakuro
61
76
  #
62
77
  # @param [Context::Context] context 暦コンテキスト
63
78
  # @param [Cycle::AbstractRemainder] remainder 当日和暦日
64
- # @param [Array<Cycle::AbstractSolarTerm>] solar_terms 二十四節気
79
+ # @param [Cycle::AbstractSolarTerm] solar_terms 二十四節気
65
80
  #
66
81
  # @return [Result::Data::Option::DroppedDate::Option] 没日
67
82
  #
68
- def dropped_date(context:, remainder:, solar_terms:)
83
+ def dropped_date(context:, remainder:, solar_term:)
69
84
  option = Result::Data::Option::DroppedDate::Option.new
70
85
 
71
86
  return option if remainder.invalid?
72
87
 
73
88
  location = Calculation::Option::DroppedDate::Location.new(
74
- context: context, solar_terms: solar_terms
89
+ context: context, solar_term: solar_term
75
90
  )
76
91
 
92
+ return option if location.invalid?
93
+
77
94
  return option unless location.exist?
78
95
 
79
96
  dropped_date = location.get
@@ -122,6 +139,8 @@ module Zakuro
122
139
  context: context, average_remainder: average_remainder
123
140
  )
124
141
 
142
+ return Result::Data::Option::VanishedDate::Option.new if location.invalid?
143
+
125
144
  unless location.exist?
126
145
  # 結果確認のため経朔だけは設定する
127
146
  return Result::Data::Option::VanishedDate::Option.new(
@@ -35,6 +35,7 @@ module Zakuro
35
35
  years = get_full_range_years(
36
36
  context: context, start_date: start_date, last_date: last_date
37
37
  )
38
+
38
39
  operated_years = get_operation_range_years(
39
40
  context: context, years: years, start_date: start_date, last_date: last_date
40
41
  )
@@ -66,8 +67,14 @@ module Zakuro
66
67
  #
67
68
  def get_full_range_years(context:, start_date: Western::Calendar.new,
68
69
  last_date: Western::Calendar.new)
70
+ # 年情報の再計算
71
+ # * 元号開始日に計算値と運用値のズレが見られる場合、年情報の範囲が異なる場合がある
72
+ # * 例:0781-03-01(計算値は前の元号の「宝亀」を含めるが、運用値では含まない)
73
+ #
74
+ # 運用値の範囲で日付検索するが、元号開始日は計算値のままで取る
69
75
  full_range = Calculation::Range::DatedFullRange.new(
70
- context: context, start_date: start_date, last_date: last_date
76
+ context: context, start_date: start_date, last_date: last_date,
77
+ operated: true, restored: true
71
78
  )
72
79
  full_range.get
73
80
  end
@@ -1,13 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../../tools/gengou_range_comparer'
4
+
3
5
  require_relative '../../range/dated_operation_range'
4
6
 
5
7
  require_relative '../../range/dated_full_range'
6
8
 
7
- require_relative './specifier/single_day'
8
-
9
9
  require_relative '../internal/operation'
10
10
 
11
+ require_relative './specifier/single_day'
12
+
11
13
  # :nodoc:
12
14
  module Zakuro
13
15
  # :nodoc:
@@ -53,8 +55,13 @@ module Zakuro
53
55
  # @return [Array<Calculation::Base::Year>] 完全範囲
54
56
  #
55
57
  def get_full_range_years(context:, date: Western::Calendar.new)
58
+ # 年情報の再計算
59
+ # * 元号開始日に計算値と運用値のズレが見られる場合、年情報の範囲が異なる場合がある
60
+ # * 例:0781-03-01(計算値は前の元号の「宝亀」を含めるが、運用値では含まない)
61
+ #
62
+ # 運用値の範囲で日付検索するが、元号開始日は計算値のままで取る
56
63
  full_range = Calculation::Range::DatedFullRange.new(
57
- context: context, start_date: date
64
+ context: context, start_date: date, operated: true, restored: true
58
65
  )
59
66
  full_range.get
60
67
  end
@@ -93,12 +100,12 @@ module Zakuro
93
100
  end
94
101
 
95
102
  #
96
- # 完全範囲を取得する
103
+ # 運用情報を取得する
97
104
  #
98
105
  # @param [Array<Calculation::Base::Year>] years 完全範囲
99
106
  # @param [Western::Calendar] date 西暦日
100
107
  #
101
- # @return [Array<Calculation::Base::Year>] 完全範囲
108
+ # @return [Result::Operation] 運用情報
102
109
  #
103
110
  def get_operation(years:, date: Western::Calendar.new)
104
111
  calc_date = Specifier::SingleDay.get(
@@ -30,7 +30,7 @@ module Zakuro
30
30
  #
31
31
  # 取得する
32
32
  #
33
- # @param [Array<Calculation::Base::Year>] years 範囲
33
+ # @param [Array<Base::Year>] years 範囲
34
34
  # @param [Western::Calendar] date 西暦日
35
35
  #
36
36
  # @return [Result::Data::SingleDay] 和暦日
@@ -175,7 +175,7 @@ module Zakuro
175
175
  # @return [Western::Calendar]設定された元号の開始日
176
176
  #
177
177
  def native_start_date
178
- gengou.both_start_date.western
178
+ gengou.start_date.western
179
179
  end
180
180
 
181
181
  #
@@ -23,6 +23,9 @@ module Zakuro
23
23
  # @return [Aligner] 整列結果
24
24
  SUMMARY = Aligner.new(resources: Resource::LIST)
25
25
 
26
+ # @return [Aligner] 整列結果(運用値)
27
+ OPERATED_SUMMARY = Aligner.new(resources: Resource::OPERATED_LIST)
28
+
26
29
  class << self
27
30
  #
28
31
  # 指定した範囲内の元号を取得する
@@ -30,11 +33,20 @@ module Zakuro
30
33
  # @param [Integer] line 行
31
34
  # @param [Western::Calendar] start_date 開始日
32
35
  # @param [Western::Calendar] last_date 終了日
36
+ # @param [True, False] operated 運用値設定
37
+ # @param [True, False] restored 運用値から計算値に戻すか
33
38
  #
34
39
  # @return [Array<LinearGengou>] 元号
35
40
  #
36
41
  def get(line: FIRST_LINE,
37
- start_date: Western::Calendar.new, last_date: Western::Calendar.new)
42
+ start_date: Western::Calendar.new, last_date: Western::Calendar.new,
43
+ operated: false, restored: false)
44
+ if operated
45
+ result = OPERATED_SUMMARY.get(line: line, start_date: start_date, last_date: last_date)
46
+ return result unless restored
47
+
48
+ return restore(line: line, list: result)
49
+ end
38
50
 
39
51
  SUMMARY.get(line: line, start_date: start_date, last_date: last_date)
40
52
  end
@@ -44,12 +56,39 @@ module Zakuro
44
56
  #
45
57
  # @param [Integer] line 行
46
58
  # @param [String] name 元号名
59
+ # @param [True, False] operated 運用値設定
60
+ # @param [True, False] restored 運用値から計算値に戻すか
47
61
  #
48
62
  # @return [Array<LinearGengou>] 元号
49
63
  #
50
- def get_by_name(line: FIRST_LINE, name:)
64
+ def get_by_name(line: FIRST_LINE, name:, operated: false, restored: false)
65
+ if operated
66
+ result = OPERATED_SUMMARY.get_by_name(line: line, name: name)
67
+ return result unless restored
68
+
69
+ return restore(line: line, list: result)
70
+ end
71
+
51
72
  SUMMARY.get_by_name(line: line, name: name)
52
73
  end
74
+
75
+ #
76
+ # 運用値から計算値に戻す
77
+ #
78
+ # @param [Integer] line 行
79
+ # @param [Array<LinearGengou>] list 元号
80
+ #
81
+ # @return [Array<LinearGengou>] 元号
82
+ #
83
+ def restore(line: FIRST_LINE, list: [])
84
+ result = []
85
+ list.each do |gengou|
86
+ calc = SUMMARY.get_by_name(line: line, name: gengou.name)
87
+ result |= calc
88
+ end
89
+
90
+ result
91
+ end
53
92
  end
54
93
  end
55
94
  end
@@ -30,9 +30,11 @@ module Zakuro
30
30
  # @return [String] 元号名
31
31
  attr_reader :name
32
32
  # @return [Hash<String, String>] 開始年
33
- attr_reader :both_start_year
33
+ attr_reader :start_year
34
34
  # @return [Hash<String, String>] 開始日
35
- attr_reader :both_start_date
35
+ attr_reader :start_date
36
+ # @return [True, False] 運用値
37
+ attr_reader :operated
36
38
 
37
39
  #
38
40
  # 初期化
@@ -40,11 +42,12 @@ module Zakuro
40
42
  # @param [Hash<String, Strin>] hash 元号情報
41
43
  # @param [Integer] index (元号セット内での)元号の要素位置
42
44
  #
43
- def initialize(hash:, index:)
45
+ def initialize(hash:, index:, operated: false)
44
46
  @index = index
45
47
  @name = hash['name']
46
- @both_start_year = hash['start_year']
47
- @both_start_date = hash['start_date']
48
+ @start_year = hash['start_year']
49
+ @start_date = hash['start_date']
50
+ @operated = operated
48
51
  end
49
52
 
50
53
  #
@@ -53,11 +56,11 @@ module Zakuro
53
56
  # @return [Gengou] 元号情報
54
57
  #
55
58
  def create
56
- start_year = Both::YearParser.new(hash: both_start_year).create
57
- start_date = Both::DateParser.new(hash: both_start_date).create
59
+ year = Both::YearParser.new(hash: start_year).create
60
+ date = SwitchDateParser.new(hash: start_date, operated: operated).create
58
61
 
59
- Gengou.new(name: name, both_start_year: start_year,
60
- both_start_date: start_date)
62
+ Gengou.new(name: name, start_year: year,
63
+ start_date: date)
61
64
  end
62
65
  end
63
66
 
@@ -70,23 +73,27 @@ module Zakuro
70
73
  # @return [String] 元号セット名
71
74
  attr_reader :name
72
75
  # @return [Hash<String, String>] 終了年
73
- attr_reader :both_last_year
76
+ attr_reader :last_year
74
77
  # @return [Hash<String, String>] 終了日
75
- attr_reader :both_last_date
78
+ attr_reader :last_date
76
79
  # @return [Array<Hash<String, String>>] 元号情報
77
80
  attr_reader :list
81
+ # @return [True, False] 運用値
82
+ attr_reader :operated
78
83
 
79
84
  #
80
85
  # 初期化
81
86
  #
82
87
  # @param [Hash<String, Object>] hash 元号セット情報
88
+ # @param [True, False] operated 運用値設定
83
89
  #
84
- def initialize(hash:)
90
+ def initialize(hash:, operated: false)
85
91
  @id = hash['id']
86
92
  @name = hash['name']
87
- @both_last_year = hash['last_year']
88
- @both_last_date = hash['last_date']
93
+ @last_year = hash['last_year']
94
+ @last_date = hash['last_date']
89
95
  @list = hash['list']
96
+ @operated = operated
90
97
  end
91
98
 
92
99
  #
@@ -95,10 +102,10 @@ module Zakuro
95
102
  # @return [Set] 元号セット情報
96
103
  #
97
104
  def create
98
- last_date = Both::DateParser.new(hash: both_last_date).create
105
+ date = SwitchDateParser.new(hash: last_date, operated: operated).create
99
106
  list = create_list
100
107
  Set.new(
101
- id: id, name: name, both_last_date: last_date, list: list
108
+ id: id, name: name, last_date: date, list: list
102
109
  )
103
110
  end
104
111
 
@@ -112,7 +119,9 @@ module Zakuro
112
119
  def create_list
113
120
  result = []
114
121
  list.each_with_index do |li, index|
115
- gengou = GengouParser.new(hash: li, index: index).create
122
+ gengou = GengouParser.new(
123
+ hash: li, index: index, operated: operated
124
+ ).create
116
125
  next_index = index + 1
117
126
  gengou = calc_last_date_on_gengou_data(next_index: next_index,
118
127
  gengou: gengou)
@@ -136,11 +145,15 @@ module Zakuro
136
145
  return gengou
137
146
  end
138
147
  next_item = list[next_index]
148
+ next_start_date = SwitchDateParser.new(
149
+ hash: next_item['start_date'], operated: operated
150
+ ).create
151
+
139
152
  gengou.convert_next_start_year_to_last_year(
140
153
  next_start_year: next_item['start_year']['western']
141
154
  )
142
155
  gengou.convert_next_start_date_to_last_date(
143
- next_start_date: next_item['start_date']['western']
156
+ next_start_date: next_start_date.western
144
157
  )
145
158
  gengou
146
159
  end
@@ -153,9 +166,50 @@ module Zakuro
153
166
  # @param [GengouParser] gengou 元号
154
167
  #
155
168
  def last_gengou_data(gengou:)
156
- gengou.write_last_year(last_year: both_last_year['western'])
157
- last_date = Western::Calendar.parse(text: both_last_date['western'])
158
- gengou.write_last_date(last_date: last_date)
169
+ gengou.write_last_year(last_year: last_year['western'])
170
+
171
+ date = SwitchDateParser.new(hash: last_date, operated: operated).create
172
+
173
+ gengou.write_last_date(last_date: date.western)
174
+ end
175
+ end
176
+
177
+ #
178
+ # SwitchDateParser 切替日(運用/計算)
179
+ #
180
+ class SwitchDateParser
181
+ # @return [Hash<String, Strin>] 計算値
182
+ attr_reader :calculation
183
+ # @return [Hash<String, Strin>] 運用値
184
+ attr_reader :operation
185
+ # @return [True, False] 運用値
186
+ attr_reader :operated
187
+
188
+ #
189
+ # 初期化
190
+ #
191
+ # @param [Hash<String, Strin>] hash 切替日(運用/計算)
192
+ # @param [True, False] operated 運用値設定
193
+ #
194
+ def initialize(hash:, operated: false)
195
+ @calculation = hash['calculation']
196
+ @operation = hash['operation']
197
+ @operated = operated
198
+ end
199
+
200
+ #
201
+ # 切替日(運用/計算)情報を生成する
202
+ #
203
+ # @return [SwitchDate] 切替日(運用/計算)情報
204
+ #
205
+ def create
206
+ calculation_date = Both::DateParser.new(hash: calculation).create
207
+ operation_date = Both::DateParser.new(hash: operation).create
208
+
209
+ Japan::Gengou::Resource::SwitchDate.new(
210
+ calculation: calculation_date, operation: operation_date,
211
+ operated: operated
212
+ )
159
213
  end
160
214
  end
161
215
 
@@ -222,8 +276,11 @@ module Zakuro
222
276
  # @return [Both::Date] 日情報
223
277
  #
224
278
  def create
225
- japan_date = Japan::Calendar.parse(text: japan)
226
- western_date = Western::Calendar.parse(text: western)
279
+ japan_date = Japan::Calendar.new
280
+ western_date = Western::Calendar.new
281
+
282
+ japan_date = Japan::Calendar.parse(text: japan) unless japan == ''
283
+ western_date = Western::Calendar.parse(text: western) unless western == ''
227
284
 
228
285
  Japan::Gengou::Resource::Both::Date.new(
229
286
  japan: japan_date, western: western_date
@@ -237,19 +294,20 @@ module Zakuro
237
294
  # 解析/展開する
238
295
  #
239
296
  # @param [String] filepath 元号セットファイルパス
297
+ # @param [True, False] operated 運用値設定
240
298
  #
241
299
  # @return [Set] 元号セット情報
242
300
  #
243
301
  # @raise [ArgumentError] 引数エラー
244
302
  #
245
- def run(filepath: '')
303
+ def run(filepath: '', operated: false)
246
304
  yaml = YAML.load_file(filepath)
247
305
 
248
306
  failed = Validator.run(yaml_hash: yaml)
249
307
 
250
308
  raise ArgumentError, failed.join("\n") unless failed.empty?
251
309
 
252
- parser = SetParser.new(hash: yaml)
310
+ parser = SetParser.new(hash: yaml, operated: operated)
253
311
  parser.create
254
312
  end
255
313
  end