zakuro 0.9.2 → 0.9.4

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