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
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../era/western/calendar'
4
+
5
+ require_relative '../month'
6
+
7
+ require_relative './all_solar_term'
8
+
9
+ # :nodoc:
10
+ module Zakuro
11
+ # :nodoc:
12
+ module Calculation
13
+ # :nodoc:
14
+ module Monthly
15
+ #
16
+ # MetaCollector メタ情報の収集
17
+ #
18
+ # 前月データを次のように扱う
19
+ # 1. 範囲内の最初の月は無視する
20
+ # * 元号範囲は常に余裕を持って取っている
21
+ # * 求めたい日付よりは常に1ヶ月以上を計算範囲にしている
22
+ # * 元嘉暦の最初の月は無視する
23
+ # * 元嘉暦は正月始まり
24
+ # * 初めの月は手前の月がないため前月がない
25
+ # * 没日・滅日の対象外のため不要とする
26
+ # 2. 年境界を解決した後の1年データで再度移行する
27
+ # * 冬至データの最初の月には前月がない
28
+ # * 1年データにすることで前月が生まれるので再度移行する
29
+ # 3. 暦の切り替えを考慮する
30
+ # * 手前の月が異なる暦であれば、その月のデータを参照する
31
+ module MetaCollector
32
+ class << self
33
+ #
34
+ # メタ情報を取得する
35
+ #
36
+ # @param [Monthly::Month] before_month 前月
37
+ # @param [Monthly::Month] current_month 当月
38
+ #
39
+ # @return [Monthly::Meta] 当月のメタ情報
40
+ #
41
+ def get(before_month:, current_month:)
42
+ Monthly::Meta.new(
43
+ all_solar_terms: all_solar_terms(
44
+ before_month: before_month, current_month: current_month
45
+ ),
46
+ last_average_remainder: last_average_remainder(
47
+ before_month: before_month
48
+ )
49
+ )
50
+ end
51
+
52
+ private
53
+
54
+ #
55
+ # 全ての二十四節気を取得する
56
+ #
57
+ # @param [Monthly::Month] before_month 前月
58
+ # @param [Monthly::Month] current_month 当月
59
+ #
60
+ # @return [Array<Cycle::AbstractSolarTerm>] その月の全ての二十四節気
61
+ #
62
+ def all_solar_terms(before_month:, current_month:)
63
+ AllSolarTerm.get(before_month: before_month, current_month: current_month)
64
+ end
65
+
66
+ #
67
+ # 前月の経朔を取得する
68
+ #
69
+ # @param [Monthly::Month] before_month 前月
70
+ #
71
+ # @return [Cycle::AbstractRemainder] 前月の経朔
72
+ #
73
+ def last_average_remainder(before_month:)
74
+ before_month.first_day.average_remainder
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../cycle/abstract_remainder'
4
+
5
+ # :nodoc:
6
+ module Zakuro
7
+ # :nodoc:
8
+ module Calculation
9
+ # :nodoc:
10
+ module Monthly
11
+ #
12
+ # Meta 付加情報
13
+ #
14
+ class Meta
15
+ # @return [Array<Cycle::AbstractSolarTerm>] 月の全ての二十四節気
16
+ # @note 前提として、『日本暦日原典』にある月ごとの二十四節気は、その月の全ての二十四節気ではない
17
+ #
18
+ # 下表を例に取った場合、『日本暦日原典』の二十四節気連番のうち、2と3がその月の二十四節気となる
19
+ # ここで、当月のうち2より手前の日は前月の1の二十四節気に属しており、当月だけでは参照できない
20
+ # この参照を可能とするための情報となる
21
+ #
22
+ # |No| 項目 | 前月 | 当月 | 次月 |
23
+ # |1 | 月 | month[index - 1] | month[index] | month[index + 1] |
24
+ # |2 | 考えられる範囲 | |-------------------| |
25
+ # |3 | 二十四節気連番 | 0 1 | 2 3 | 4 5 |
26
+ # |4 | 二十四節気大余 | 55 10 | 25 40 | 55 5 |
27
+ #
28
+ attr_reader :all_solar_terms
29
+
30
+ # @return [Cycle::AbstractRemainder] 前月の平朔
31
+ # @note 滅日計算に用いる
32
+ #
33
+ # 月の1日目で前月からの平朔が用いられている
34
+ #
35
+ attr_reader :last_average_remainder
36
+
37
+ #
38
+ # 初期化
39
+ #
40
+ # @param [Array<AbstractSolarTerm>] all_solar_terms 月の全ての二十四節気
41
+ # @param [Cycle::AbstractRemainder] last_average_remainder 前月の平朔
42
+ #
43
+ def initialize(all_solar_terms: [], last_average_remainder: Cycle::AbstractRemainder.new)
44
+ @all_solar_terms = all_solar_terms
45
+ @last_average_remainder = last_average_remainder
46
+ end
47
+
48
+ #
49
+ # ディープコピー
50
+ #
51
+ # @param [Meta] obj 自身
52
+ #
53
+ def initialize_copy(obj)
54
+ @all_solar_terms = obj.all_solar_terms.clone
55
+ @last_average_remainder = obj.last_average_remainder.clone
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -1,8 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../cycle/abstract_solar_term'
4
+
3
5
  require_relative '../base/gengou'
4
6
  require_relative './first_day'
7
+ require_relative './meta'
5
8
  require_relative './month_label'
9
+ require_relative './meta/meta_collector'
6
10
 
7
11
  # :nodoc:
8
12
  module Zakuro
@@ -20,10 +24,14 @@ module Zakuro
20
24
  attr_reader :month_label
21
25
  # @return [FirstDay] 月初日(朔日)
22
26
  attr_reader :first_day
23
- # @return [Array<SolarTerm>] 二十四節気
27
+ # @return [Array<Cyle::AbstractSolarTerm>] 二十四節気
24
28
  attr_reader :solar_terms
25
29
  # @return [Base::Gengou] 元号
26
30
  attr_reader :gengou
31
+ # @return [Meta] 付加情報
32
+ attr_reader :meta
33
+
34
+ # rubocop:disable Metrics/ParameterLists
27
35
 
28
36
  #
29
37
  # 初期化
@@ -31,18 +39,23 @@ module Zakuro
31
39
  # @param [Context::Context] context 暦コンテキスト
32
40
  # @param [MonthLabel] month_label 月表示名
33
41
  # @param [FirstDay] first_day 月初日(朔日)
34
- # @param [Array<SolarTerm>] solar_terms 二十四節気
42
+ # @param [Array<Cyle::AbstractSolarTerm>] solar_terms 二十四節気
35
43
  # @param [Base::Gengou] gengou 元号
44
+ # @param [Meta] meta 付加情報
36
45
  #
37
46
  def initialize(context: Context::Context.new, month_label: MonthLabel.new,
38
- first_day: FirstDay.new, solar_terms: [], gengou: Base::Gengou.new)
47
+ first_day: FirstDay.new, solar_terms: [], gengou: Base::Gengou.new,
48
+ meta: Meta.new)
39
49
  @context = context
40
50
  @month_label = month_label
41
51
  @first_day = first_day
42
52
  @solar_terms = solar_terms
43
53
  @gengou = gengou
54
+ @meta = meta
44
55
  end
45
56
 
57
+ # rubocop:enable Metrics/ParameterLists
58
+
46
59
  #
47
60
  # 不正か
48
61
  #
@@ -153,7 +166,7 @@ module Zakuro
153
166
  #
154
167
  # 中気を返す
155
168
  #
156
- # @return [SolarTerm] 中気
169
+ # @return [Cycle::AbstractSolarTerm] 中気
157
170
  #
158
171
  def even_term
159
172
  solar_terms.each do |term|
@@ -166,7 +179,7 @@ module Zakuro
166
179
  #
167
180
  # 節気を返す
168
181
  #
169
- # @return [SolarTerm] 節気
182
+ # @return [Cycle::AbstractSolarTerm] 節気
170
183
  #
171
184
  def odd_term
172
185
  solar_terms.each do |term|
@@ -250,6 +263,82 @@ module Zakuro
250
263
  same_by_japan_date?(date: date)
251
264
  end
252
265
 
266
+ #
267
+ # 二十四節気を正しい順序にソートする
268
+ #
269
+ def sort_solar_terms
270
+ # TODO: refactor
271
+ sorted = (solar_terms.sort do |termx, termy|
272
+ termx.index <=> termy.index
273
+ end)
274
+
275
+ unless reset_term?(solar_terms: sorted)
276
+ @solar_terms = sorted
277
+ return
278
+ end
279
+
280
+ first = []
281
+ second = []
282
+
283
+ sorted.each do |term|
284
+ if term.index >= (23 - 2)
285
+ second.push(term)
286
+ next
287
+ end
288
+
289
+ first.push(term)
290
+ end
291
+
292
+ # 0以前を先頭にする
293
+ second += first
294
+
295
+ @solar_terms = second
296
+ end
297
+
298
+ #
299
+ # 大余に対応する二十四節気
300
+ #
301
+ # @param [Integer] day 大余
302
+ #
303
+ # @return [Cycle::AbstractSolarTerm] 二十四節気
304
+ #
305
+ def solar_term_by_day(day:)
306
+ # TODO: refactor
307
+ target = context.resolver.remainder.new(day: day, minute: 0, second: 0)
308
+
309
+ meta.all_solar_terms.each_cons(2) do |current_solar_term, next_solar_term|
310
+ in_range = Tools::RemainderComparer.in_range?(
311
+ target: target, start: current_solar_term.remainder, last: next_solar_term.remainder
312
+ )
313
+ return current_solar_term if in_range
314
+ end
315
+
316
+ last_solar_term = meta.all_solar_terms[-1]
317
+
318
+ empty_solar_term = context.resolver.solar_term.new
319
+
320
+ return empty_solar_term unless last_solar_term
321
+ # NOTE: 大余20を上限として範囲チェックする
322
+ if Tools::RemainderComparer.in_limit?(target: target, start: last_solar_term.remainder,
323
+ limit: 20)
324
+ return last_solar_term
325
+ end
326
+
327
+ empty_solar_term
328
+ end
329
+
330
+ #
331
+ # メタ情報を再設定する
332
+ #
333
+ # @param [Month] last 前月
334
+ #
335
+ def reset_meta(last: Month.new)
336
+ @meta = MetaCollector.get(
337
+ before_month: last,
338
+ current_month: self
339
+ )
340
+ end
341
+
253
342
  private
254
343
 
255
344
  #
@@ -267,6 +356,31 @@ module Zakuro
267
356
 
268
357
  true
269
358
  end
359
+
360
+ #
361
+ # 二十四節気の折り返し(23 -> 0)があるか
362
+ #
363
+ # @param [Array<Cyle::AbstractSolarTerm>] solar_terms 二十四節気
364
+ #
365
+ # @return [True] 折り返しあり
366
+ # @return [False] 折り返しなし
367
+ #
368
+ def reset_term?(solar_terms: [])
369
+ first = false
370
+ last = false
371
+
372
+ solar_terms.each do |term|
373
+ index = term.index
374
+ case index
375
+ when Cycle::AbstractSolarTerm::FIRST_INDEX
376
+ first = true
377
+ when Cycle::AbstractSolarTerm::LAST_INDEX
378
+ last = true
379
+ end
380
+ end
381
+
382
+ first && last
383
+ end
270
384
  end
271
385
  end
272
386
  end
@@ -33,12 +33,13 @@ module Zakuro
33
33
  # @param [FirstDay] first_day 月初日(朔日)
34
34
  # @param [Array<SolarTerm>] solar_terms 二十四節気
35
35
  # @param [Operation::MonthHistory] history 変更履歴(月)
36
+ # @param [Meta] meta 付加情報
36
37
  #
37
38
  def initialize(context:, operated_solar_term:, month_label: MonthLabel.new,
38
39
  first_day: FirstDay.new, solar_terms: [], gengou: Base::Gengou.new,
39
- history: Operation::MonthHistory.new)
40
+ history: Operation::MonthHistory.new, meta: Meta.new)
40
41
  super(context: context, month_label: month_label, first_day: first_day,
41
- solar_terms: solar_terms, gengou: gengou)
42
+ solar_terms: solar_terms, gengou: gengou, meta: meta)
42
43
  @history = history
43
44
  @operated_solar_term = operated_solar_term
44
45
  @moved = false
@@ -53,6 +54,8 @@ module Zakuro
53
54
  rewrite_month
54
55
  rewrite_solar_terms
55
56
  rewrite_first_day
57
+
58
+ sort_solar_terms
56
59
  end
57
60
 
58
61
  #
@@ -102,7 +105,8 @@ module Zakuro
102
105
  @first_day = FirstDay.new(
103
106
  western_date: rewrite_western_date(days: days),
104
107
  remainder: rewrite_remainder(days: days),
105
- average_remainder: rewrite_average_remainder(days: days)
108
+ # NOTE: 『日本暦日便覧』では滅日を計算値で求めている。運用値への書き換えは実施しない
109
+ average_remainder: first_day.average_remainder.clone
106
110
  )
107
111
  end
108
112
 
@@ -122,22 +126,6 @@ module Zakuro
122
126
  remainder
123
127
  end
124
128
 
125
- #
126
- # 月初日の大余小余を日差分で書き換える(経朔)
127
- #
128
- # @param [Integer] days 日差分
129
- #
130
- # @return [Remainder] 月初日の大余小余
131
- #
132
- def rewrite_average_remainder(days:)
133
- remainder = first_day.average_remainder.clone
134
- remainder.add!(
135
- context.resolver.remainder.new(day: days, minute: 0, second: 0)
136
- )
137
-
138
- remainder
139
- end
140
-
141
129
  #
142
130
  # 月初日の西暦日を日差分で書き換える
143
131
  #
@@ -24,8 +24,8 @@ module Zakuro
24
24
  attr_reader :limit
25
25
  # @return [Integer] 年
26
26
  attr_reader :year
27
- # @return [Array<Cycle::AbstractSolarTerm>] 二十四節気
28
- attr_reader :solar_terms
27
+ # @return [Cycle::AbstractSolarTerm] 二十四節気
28
+ attr_reader :solar_term
29
29
  # @return [Class] 没余クラス
30
30
  attr_reader :remainder_class
31
31
 
@@ -33,16 +33,16 @@ module Zakuro
33
33
  # 初期化
34
34
  #
35
35
  # @param [Context::Context] context 暦コンテキスト
36
- # @param [Array<Cycle::AbstractSolarTerm>] solar_terms 二十四節気
36
+ # @param [Cycle::AbstractSolarTerm] solar_term 二十四節気
37
37
  #
38
- def initialize(context:, solar_terms: [])
38
+ def initialize(context:, solar_term:)
39
39
  parameter = context.resolver.dropped_date_parameter.new
40
40
  @context = context
41
41
  @valid = parameter.valid
42
42
  @limit = parameter.limit
43
43
  @year = parameter.year
44
44
  @remainder_class = parameter.remainder_class
45
- @solar_terms = solar_terms
45
+ @solar_term = solar_term
46
46
  end
47
47
 
48
48
  #
@@ -62,7 +62,14 @@ module Zakuro
62
62
  # @return [False] 存在なし
63
63
  #
64
64
  def exist?
65
- !solar_term_remainder.invalid?
65
+ remainder = solar_term_remainder
66
+
67
+ return false if remainder.invalid?
68
+
69
+ minute_later = remainder.class.new(
70
+ day: 0, minute: remainder.minute, second: remainder.second
71
+ )
72
+ minute_later >= limit
66
73
  end
67
74
 
68
75
  #
@@ -73,36 +80,25 @@ module Zakuro
73
80
  def get
74
81
  # 1. 二十四節気の大余小余を取り出す
75
82
  remainder = solar_term_remainder
83
+
84
+ # p "remainder: #{remainder.format(form: '%d-%d.%.5f')}"
85
+
76
86
  # 2. 小余360、秒45(360/8)で乗算する
77
87
  total = multiple_ideal_year(remainder: remainder)
88
+ # p "total: #{total}"
78
89
  # 3. 上記2と章歳(3068055)の差を求める
79
90
  diff = (year - total).abs
91
+ # p "year: #{year}"
92
+ # p "diff: #{diff}"
80
93
  # 4. 上記3を通余で徐算する
81
94
  result = remainder_class.new(total: diff)
95
+ # p "result: #{result.format(form: '%d-%d.%.5f')}"
82
96
  # 5. 上記4の商と上記1の大余が没日大余、余りが小余(没余)
83
97
  day = remainder_class.new(day: remainder.day, minute: 0, second: 0)
84
98
 
85
99
  day.add(result)
86
100
  end
87
101
 
88
- #
89
- # 該当の二十四節気を取得する
90
- #
91
- # @return [Cycle::AbstractSolarTerm] 二十四節気
92
- #
93
- def solar_term
94
- solar_terms.each do |solar_term|
95
- remainder = solar_term.remainder.clone
96
- minute_later = remainder.class.new(
97
- day: 0, minute: remainder.minute, second: remainder.second
98
- )
99
-
100
- return solar_term if minute_later >= limit
101
- end
102
-
103
- context.resolver.solar_term.new
104
- end
105
-
106
102
  private
107
103
 
108
104
  #
@@ -72,10 +72,17 @@ module Zakuro
72
72
  #
73
73
  def get
74
74
  # 経朔の小余 * 30
75
- minute = remainder_class.new(day: 0, minute: IDEAL_MONTH * average_remainder.minute, second: 0)
75
+ minute = remainder_class.new(
76
+ day: 0, minute: IDEAL_MONTH * average_remainder.minute, second: 0
77
+ )
78
+
76
79
  day = remainder_class.new(day: average_remainder.day, minute: 0, second: 0)
77
80
 
78
- minute.add(day)
81
+ minute.add!(day)
82
+
83
+ # p "location.minute: #{minute.format}"
84
+
85
+ minute
79
86
  end
80
87
  end
81
88
  end
@@ -20,8 +20,6 @@ module Zakuro
20
20
  module Calculation
21
21
  # :nodoc:
22
22
  module Range
23
- # :reek:TooManyInstanceVariables { max_instance_variables: 6 }
24
-
25
23
  #
26
24
  # FullRange 完全範囲
27
25
  # ある日からある日の範囲を計算可能な年月範囲
@@ -89,6 +87,8 @@ module Zakuro
89
87
 
90
88
  Transfer::GengouScroller.set(scroll: scroll, years: years)
91
89
 
90
+ reset_meta(years: years)
91
+
92
92
  years
93
93
  end
94
94
 
@@ -104,6 +104,7 @@ module Zakuro
104
104
  last_year = scroll.western_last_year
105
105
 
106
106
  # TODO: context にデフォルト暦名が設定されている場合は使用しない
107
+ # 現在は暦ごとの元号情報がないため使用できない
107
108
  versions = Version.get(start_year: start_year, last_year: last_year)
108
109
 
109
110
  collect_version_ranges(versions: versions, start_year: start_year, last_year: last_year)
@@ -181,6 +182,22 @@ module Zakuro
181
182
 
182
183
  result
183
184
  end
185
+
186
+ #
187
+ # メタ情報を更新する
188
+ #
189
+ # @param [Array<Base::Year>] years 完全範囲
190
+ #
191
+ def reset_meta(years: [])
192
+ months = []
193
+ years.each do |year|
194
+ months |= year.months
195
+ end
196
+
197
+ months.each_cons(2) do |last, current|
198
+ current.reset_meta(last: last)
199
+ end
200
+ end
184
201
  end
185
202
  end
186
203
  end
@@ -53,6 +53,8 @@ module Zakuro
53
53
 
54
54
  Transfer::GengouScroller.set(scroll: @scroll, years: operated_years)
55
55
 
56
+ self.class.reset_meta(years: operated_years)
57
+
56
58
  operated_years
57
59
  end
58
60
 
@@ -172,20 +174,36 @@ module Zakuro
172
174
  # @param [Operation::MonthHistory] history 変更履歴
173
175
  # @param [OperatedSolarTerm] operated_solar_term 運用時二十四節気
174
176
  #
175
- # @return [Month] 月(運用結果)
177
+ # @return [Monthly::Month] 月(運用結果)
176
178
  #
177
179
  def rewrite_month(context:, month:, history:, operated_solar_term:)
178
180
  operated_month = Monthly::OperatedMonth.new(
179
181
  context: context,
180
182
  month_label: month.month_label, first_day: month.first_day,
181
183
  solar_terms: month.solar_terms, history: history, gengou: month.gengou,
182
- operated_solar_term: operated_solar_term
184
+ operated_solar_term: operated_solar_term, meta: month.meta
183
185
  )
184
186
 
185
187
  operated_month.rewrite unless history.invalid?
186
188
 
187
189
  operated_month
188
190
  end
191
+
192
+ #
193
+ # メタ情報を更新する
194
+ #
195
+ # @param [Array<Base::Year>] years 完全範囲
196
+ #
197
+ def reset_meta(years: [])
198
+ months = []
199
+ years.each do |year|
200
+ months |= year.months
201
+ end
202
+
203
+ months.each_cons(2) do |last, current|
204
+ current.reset_meta(last: last)
205
+ end
206
+ end
189
207
  end
190
208
  end
191
209
  end
@@ -19,10 +19,15 @@ module Zakuro
19
19
  # @param [Context::Context] context 暦コンテキスト
20
20
  # @param [Western::Calendar] start_date 開始日
21
21
  # @param [Western::Calendar] last_date 終了日
22
+ # @param [True, False] operated 運用値設定
23
+ # @param [True, False] restored 運用値から計算値に戻すか
22
24
  #
23
- def initialize(context:,
24
- start_date: Western::Calendar.new, last_date: Western::Calendar.new)
25
- scroll = Gengou::DatedScroll.new(start_date: start_date, last_date: last_date)
25
+ def initialize(context:, start_date: Western::Calendar.new,
26
+ last_date: Western::Calendar.new, operated: false, restored: false)
27
+ scroll = Gengou::DatedScroll.new(
28
+ start_date: start_date, last_date: last_date, operated: operated,
29
+ restored: restored
30
+ )
26
31
 
27
32
  super(context: context, scroll: scroll, start_date: start_date, last_date: last_date)
28
33
  end
@@ -24,7 +24,10 @@ module Zakuro
24
24
  #
25
25
  def initialize(context:, start_date: Western::Calendar.new,
26
26
  last_date: Western::Calendar.new, years: [])
27
- scroll = Gengou::DatedScroll.new(start_date: start_date, last_date: last_date)
27
+ scroll = Gengou::DatedScroll.new(
28
+ start_date: start_date, last_date: last_date, operated: true,
29
+ restored: false
30
+ )
28
31
  super(context: context, scroll: scroll, years: years)
29
32
  end
30
33
  end
@@ -63,7 +63,7 @@ module Zakuro
63
63
  result = []
64
64
 
65
65
  # 14ヶ月分を生成する(閏年で最大13ヶ月 + 末月の大小/二十四節気を求めるために必要な月)
66
- (0..13).each do |_index|
66
+ 14.times.each do |_index|
67
67
  average_remainder = lunar_phase.average_remainder.clone
68
68
  adjusted = lunar_phase.next_month
69
69
 
@@ -24,7 +24,9 @@ module Zakuro
24
24
  # @param [String] last_name 終了元号名
25
25
  #
26
26
  def initialize(context:, start_name: INVALID_NAME, last_name: INVALID_NAME)
27
- scroll = Gengou::NamedScroll.new(start_name: start_name, last_name: last_name)
27
+ scroll = Gengou::NamedScroll.new(
28
+ start_name: start_name, last_name: last_name, operated: false, restored: false
29
+ )
28
30
  range = scroll.range
29
31
 
30
32
  super(
@@ -26,7 +26,9 @@ module Zakuro
26
26
  # @param [Array<Year>] years 年データ(完全範囲)
27
27
  #
28
28
  def initialize(context:, start_name: INVALID_NAME, last_name: INVALID_NAME, years: [])
29
- scroll = Gengou::NamedScroll.new(start_name: start_name, last_name: last_name)
29
+ scroll = Gengou::NamedScroll.new(
30
+ start_name: start_name, last_name: last_name, operated: true
31
+ )
30
32
 
31
33
  super(context: context, scroll: scroll, years: years)
32
34
  end
@@ -46,7 +46,8 @@ module Zakuro
46
46
  average_remainder: month.first_day.average_remainder,
47
47
  western_date: gengou.start_date.clone
48
48
  ),
49
- solar_terms: month.solar_terms, gengou: gengou
49
+ solar_terms: month.solar_terms, gengou: gengou,
50
+ meta: month.meta
50
51
  )
51
52
  end
52
53
  end