zakuro 0.6.1 → 0.7.0

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 (80) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +3 -0
  3. data/README.md +6 -4
  4. data/VERSION +1 -1
  5. data/doc/operation/transfer.rb +8 -8
  6. data/lib/zakuro/calculation/base/gengou.rb +46 -0
  7. data/lib/zakuro/calculation/era/gengou/{scroll.rb → abstract_scroll.rb} +6 -8
  8. data/lib/zakuro/calculation/era/gengou/dated_scroll.rb +30 -0
  9. data/lib/zakuro/calculation/era/gengou/internal/reserve/{list.rb → abstract_list.rb} +37 -51
  10. data/lib/zakuro/calculation/era/gengou/internal/reserve/{range.rb → abstract_range.rb} +17 -17
  11. data/lib/zakuro/calculation/era/gengou/internal/reserve/dated_list.rb +48 -0
  12. data/lib/zakuro/calculation/era/gengou/internal/reserve/dated_range.rb +30 -0
  13. data/lib/zakuro/calculation/era/gengou/internal/reserve/empty_link.rb +158 -0
  14. data/lib/zakuro/calculation/era/gengou/internal/reserve/named_list.rb +125 -0
  15. data/lib/zakuro/calculation/era/gengou/internal/reserve/named_range.rb +75 -0
  16. data/lib/zakuro/calculation/era/gengou/internal/reserve.rb +2 -3
  17. data/lib/zakuro/calculation/era/gengou/named_scroll.rb +30 -0
  18. data/lib/zakuro/calculation/monthly/month.rb +39 -0
  19. data/lib/zakuro/calculation/monthly/operated_month.rb +1 -1
  20. data/lib/zakuro/calculation/range/{full_range.rb → abstract_full_range.rb} +5 -4
  21. data/lib/zakuro/calculation/range/{operated_range.rb → abstract_operation_range.rb} +9 -11
  22. data/lib/zakuro/calculation/range/dated_full_range.rb +32 -0
  23. data/lib/zakuro/calculation/range/dated_operation_range.rb +33 -0
  24. data/lib/zakuro/calculation/range/named_full_range.rb +38 -0
  25. data/lib/zakuro/calculation/range/named_operation_range.rb +36 -0
  26. data/lib/zakuro/calculation/range/operated_solar_terms.rb +0 -2
  27. data/lib/zakuro/calculation/{specifier → summary}/internal/month.rb +1 -1
  28. data/lib/zakuro/calculation/summary/japan/range.rb +152 -0
  29. data/lib/zakuro/calculation/summary/japan/single.rb +118 -0
  30. data/lib/zakuro/calculation/summary/japan/specifier/single_day.rb +91 -0
  31. data/lib/zakuro/calculation/summary/western/range.rb +124 -0
  32. data/lib/zakuro/calculation/summary/western/single.rb +113 -0
  33. data/lib/zakuro/calculation/summary/western/specifier/multiple_day.rb +169 -0
  34. data/lib/zakuro/calculation/summary/western/specifier/single_day.rb +93 -0
  35. data/lib/zakuro/condition.rb +1 -2
  36. data/lib/zakuro/era/japan/gengou/alignment/aligner.rb +89 -74
  37. data/lib/zakuro/era/japan/gengou/alignment/division.rb +125 -122
  38. data/lib/zakuro/era/japan/gengou/alignment/line.rb +141 -122
  39. data/lib/zakuro/era/japan/gengou/alignment/linear_gengou.rb +171 -168
  40. data/lib/zakuro/era/japan/gengou/alignment.rb +38 -25
  41. data/lib/zakuro/era/japan/gengou/resource/parser.rb +183 -182
  42. data/lib/zakuro/era/japan/gengou/resource/type.rb +233 -232
  43. data/lib/zakuro/era/japan/gengou/resource/validator.rb +255 -254
  44. data/lib/zakuro/era/japan/gengou/resource.rb +23 -22
  45. data/lib/zakuro/era/japan/gengou.rb +5 -20
  46. data/lib/zakuro/era/western/calendar.rb +9 -9
  47. data/lib/zakuro/exception/case/pattern.rb +35 -0
  48. data/lib/zakuro/exception/case/preset.rb +51 -0
  49. data/lib/zakuro/exception/case/template.rb +48 -0
  50. data/lib/zakuro/exception/cause.rb +28 -0
  51. data/lib/zakuro/exception/exception.rb +37 -0
  52. data/lib/zakuro/exception/zakuro_error.rb +28 -0
  53. data/lib/zakuro/gateway/locale/date.rb +127 -0
  54. data/lib/zakuro/gateway/locale/range.rb +67 -0
  55. data/lib/zakuro/gateway/range.rb +99 -0
  56. data/lib/zakuro/gateway/single.rb +70 -0
  57. data/lib/zakuro/merchant.rb +8 -44
  58. data/lib/zakuro/operation/month/parser.rb +9 -9
  59. data/lib/zakuro/operation/month/type.rb +31 -31
  60. data/lib/zakuro/operation/month/validator.rb +49 -49
  61. data/lib/zakuro/operation/yaml/month.yaml +3736 -3736
  62. data/lib/zakuro/output/logger.rb +17 -3
  63. data/lib/zakuro/result/data/day.rb +43 -0
  64. data/lib/zakuro/result/data/gengou.rb +35 -0
  65. data/lib/zakuro/result/data/month.rb +63 -0
  66. data/lib/zakuro/result/data/single_day.rb +48 -0
  67. data/lib/zakuro/result/data/solar_term.rb +35 -0
  68. data/lib/zakuro/result/data/year.rb +45 -0
  69. data/lib/zakuro/result/operation/month/annotation.rb +40 -0
  70. data/lib/zakuro/result/operation/month/bundle.rb +36 -0
  71. data/lib/zakuro/result/operation/month/history.rb +54 -0
  72. data/lib/zakuro/result/operation/operation.rb +44 -0
  73. data/lib/zakuro/result/result.rb +4 -2
  74. metadata +46 -14
  75. data/lib/zakuro/calculation/specifier/multiple_day.rb +0 -162
  76. data/lib/zakuro/calculation/specifier/single_day.rb +0 -87
  77. data/lib/zakuro/calculation/summary/range.rb +0 -120
  78. data/lib/zakuro/calculation/summary/single.rb +0 -110
  79. data/lib/zakuro/result/data.rb +0 -187
  80. data/lib/zakuro/result/operation.rb +0 -114
@@ -7,158 +7,161 @@ module Zakuro
7
7
  # :nodoc:
8
8
  module Japan
9
9
  # :nodoc:
10
- module Alignment
11
- #
12
- # Division 元号区分
13
- #
14
- module Division
10
+ module Gengou
11
+ # :nodoc:
12
+ module Alignment
15
13
  #
16
- # 重複した範囲を返す
14
+ # Division 元号区分
17
15
  #
18
- # @param [LinearGengou] this 残り元号
19
- # @param [LinearGengou] other 比較元号
20
- #
21
- # @return [Array<LinearGengou>] 重複分
22
- #
23
- def self.match(this:, other:)
24
- result = []
25
- if other.in?(start_date: this.start_date, last_date: this.last_date)
26
- result.push(this)
27
- return result
28
- end
29
-
30
- if other.out?(start_date: this.start_date, last_date: this.last_date)
31
- # 該当なし
32
- return result
33
- end
34
-
35
- if other.covered?(start_date: this.start_date, last_date: this.last_date)
36
- # 範囲内のみ返す
37
- result.push(trim_gengou(this: this, other: other))
38
- return result
39
- end
16
+ module Division
17
+ #
18
+ # 重複した範囲を返す
19
+ #
20
+ # @param [LinearGengou] this 残り元号
21
+ # @param [LinearGengou] other 比較元号
22
+ #
23
+ # @return [Array<LinearGengou>] 重複分
24
+ #
25
+ def self.match(this:, other:)
26
+ result = []
27
+ if other.in?(start_date: this.start_date, last_date: this.last_date)
28
+ result.push(this)
29
+ return result
30
+ end
40
31
 
41
- result.push(narrow_gengou(this: this, other: other))
32
+ if other.out?(start_date: this.start_date, last_date: this.last_date)
33
+ # 該当なし
34
+ return result
35
+ end
42
36
 
43
- result
44
- end
37
+ if other.covered?(start_date: this.start_date, last_date: this.last_date)
38
+ # 範囲内のみ返す
39
+ result.push(trim_gengou(this: this, other: other))
40
+ return result
41
+ end
45
42
 
46
- #
47
- # 範囲が重複しない差分を返す
48
- #
49
- # @param [LinearGengou] this 積元号
50
- # @param [LinearGengou] other 比較元号
51
- #
52
- # @return [Array<LinearGengou>] 差分
53
- #
54
- def self.mismatch(this:, other:)
55
- result = []
56
- if other.in?(start_date: this.start_date, last_date: this.last_date)
57
- # 該当なし
58
- return result
59
- end
43
+ result.push(narrow_gengou(this: this, other: other))
60
44
 
61
- if other.out?(start_date: this.start_date, last_date: this.last_date)
62
- result.push(this)
63
- return result
45
+ result
64
46
  end
65
47
 
66
- if other.covered?(start_date: this.start_date, last_date: this.last_date)
67
- result |= split_gengou(this: this, other: other)
68
- return result
69
- end
48
+ #
49
+ # 範囲が重複しない差分を返す
50
+ #
51
+ # @param [LinearGengou] this 積元号
52
+ # @param [LinearGengou] other 比較元号
53
+ #
54
+ # @return [Array<LinearGengou>] 差分
55
+ #
56
+ def self.mismatch(this:, other:)
57
+ result = []
58
+ if other.in?(start_date: this.start_date, last_date: this.last_date)
59
+ # 該当なし
60
+ return result
61
+ end
70
62
 
71
- result.push(shave_gengou(this: this, other: other))
72
- result
73
- end
63
+ if other.out?(start_date: this.start_date, last_date: this.last_date)
64
+ result.push(this)
65
+ return result
66
+ end
74
67
 
75
- #
76
- # 比較により分離した元号をつなげる
77
- #
78
- # @param [Array<LinearGengou>] list 元号
79
- #
80
- # @return [Array<LinearGengou>] 同一元号がつながった元号
81
- #
82
- def self.connect(list: []) # rubocop:disable Metrics/MethodLength
83
- result = []
84
- list.each do |linear_gengou|
85
- if result.size.zero?
86
- result.push(linear_gengou)
87
- next
68
+ if other.covered?(start_date: this.start_date, last_date: this.last_date)
69
+ result |= split_gengou(this: this, other: other)
70
+ return result
88
71
  end
89
72
 
90
- before = result[-1]
73
+ result.push(shave_gengou(this: this, other: other))
74
+ result
75
+ end
91
76
 
92
- if unconnectable?(current: linear_gengou, before: before)
93
- result.push(linear_gengou)
94
- next
77
+ #
78
+ # 比較により分離した元号をつなげる
79
+ #
80
+ # @param [Array<LinearGengou>] list 元号
81
+ #
82
+ # @return [Array<LinearGengou>] 同一元号がつながった元号
83
+ #
84
+ def self.connect(list: []) # rubocop:disable Metrics/MethodLength
85
+ result = []
86
+ list.each do |linear_gengou|
87
+ if result.size.zero?
88
+ result.push(linear_gengou)
89
+ next
90
+ end
91
+
92
+ before = result[-1]
93
+
94
+ if unconnectable?(current: linear_gengou, before: before)
95
+ result.push(linear_gengou)
96
+ next
97
+ end
98
+
99
+ result[-1] = LinearGengou.new(
100
+ start_date: before.start_date, last_date: linear_gengou.last_date,
101
+ gengou: linear_gengou.gengou
102
+ )
95
103
  end
96
104
 
97
- result[-1] = LinearGengou.new(
98
- start_date: before.start_date, last_date: linear_gengou.last_date,
99
- gengou: linear_gengou.gengou
100
- )
105
+ result
101
106
  end
102
107
 
103
- result
104
- end
105
-
106
- def self.unconnectable?(current:, before:)
107
- return true unless current.gengou.name == before.gengou.name
108
+ def self.unconnectable?(current:, before:)
109
+ return true unless current.gengou.name == before.gengou.name
108
110
 
109
- return true unless (before.last_date.clone + 1) == current.start_date
111
+ return true unless (before.last_date.clone + 1) == current.start_date
110
112
 
111
- false
112
- end
113
- private_class_method :unconnectable?
113
+ false
114
+ end
115
+ private_class_method :unconnectable?
116
+
117
+ def self.split_gengou(this:, other:)
118
+ [
119
+ LinearGengou.new(
120
+ start_date: this.start_date.clone, last_date: other.start_date.clone - 1,
121
+ gengou: this.gengou
122
+ ),
123
+ LinearGengou.new(
124
+ start_date: other.last_date.clone + 1, last_date: this.last_date.clone,
125
+ gengou: this.gengou
126
+ )
127
+ ]
128
+ end
129
+ private_class_method :split_gengou
114
130
 
115
- def self.split_gengou(this:, other:)
116
- [
117
- LinearGengou.new(
118
- start_date: this.start_date.clone, last_date: other.start_date.clone - 1,
119
- gengou: this.gengou
120
- ),
131
+ def self.trim_gengou(this:, other:)
121
132
  LinearGengou.new(
122
- start_date: other.last_date.clone + 1, last_date: this.last_date.clone,
133
+ start_date: other.start_date, last_date: other.last_date,
123
134
  gengou: this.gengou
124
135
  )
125
- ]
126
- end
127
- private_class_method :split_gengou
128
-
129
- def self.trim_gengou(this:, other:)
130
- LinearGengou.new(
131
- start_date: other.start_date, last_date: other.last_date,
132
- gengou: this.gengou
133
- )
134
- end
135
- private_class_method :trim_gengou
136
+ end
137
+ private_class_method :trim_gengou
136
138
 
137
- def self.narrow_gengou(this:, other:)
138
- start = this.start_date > other.start_date ? this.start_date : other.start_date
139
- last = this.last_date < other.last_date ? this.last_date : other.last_date
139
+ def self.narrow_gengou(this:, other:)
140
+ start = this.start_date > other.start_date ? this.start_date : other.start_date
141
+ last = this.last_date < other.last_date ? this.last_date : other.last_date
140
142
 
141
- LinearGengou.new(
142
- start_date: start.clone, last_date: last.clone, gengou: this.gengou
143
- )
144
- end
145
- private_class_method :narrow_gengou
143
+ LinearGengou.new(
144
+ start_date: start.clone, last_date: last.clone, gengou: this.gengou
145
+ )
146
+ end
147
+ private_class_method :narrow_gengou
146
148
 
147
- def self.shave_gengou(this:, other:) # rubocop:disable Metrics/AbcSize
148
- start = this.start_date
149
- last = this.last_date
149
+ def self.shave_gengou(this:, other:) # rubocop:disable Metrics/AbcSize
150
+ start = this.start_date
151
+ last = this.last_date
150
152
 
151
- # 開始日が比較元号の開始日より前の範囲
152
- last = other.start_date.clone - 1 if this.start_date < other.start_date
153
+ # 開始日が比較元号の開始日より前の範囲
154
+ last = other.start_date.clone - 1 if this.start_date < other.start_date
153
155
 
154
- # 終了日が比較元号の開始日より後の範囲
155
- start = other.last_date.clone + 1 if this.last_date > other.last_date
156
+ # 終了日が比較元号の開始日より後の範囲
157
+ start = other.last_date.clone + 1 if this.last_date > other.last_date
156
158
 
157
- LinearGengou.new(
158
- start_date: start.clone, last_date: last.clone, gengou: this.gengou
159
- )
159
+ LinearGengou.new(
160
+ start_date: start.clone, last_date: last.clone, gengou: this.gengou
161
+ )
162
+ end
163
+ private_class_method :shave_gengou
160
164
  end
161
- private_class_method :shave_gengou
162
165
  end
163
166
  end
164
167
  end
@@ -9,146 +9,165 @@ module Zakuro
9
9
  # :nodoc:
10
10
  module Japan
11
11
  # :nodoc:
12
- module Alignment
13
- #
14
- # Line 行
15
- #
16
- class Line
17
- # @return [Array<LinearGengou>] 元号
18
- attr_reader :list
19
-
12
+ module Gengou
13
+ # :nodoc:
14
+ module Alignment
20
15
  #
21
- # 初期化
16
+ # Line 行
22
17
  #
23
- def initialize
24
- @list = []
25
- end
18
+ class Line
19
+ # @return [Array<LinearGengou>] 元号
20
+ attr_reader :list
26
21
 
27
- #
28
- # 追加する
29
- #
30
- # 下記のパターンが存在し、戻り値は重複分となる
31
- #
32
- # 1. 完全に範囲外(開始日より前)
33
- # [@list]: |-------|-------|
34
- # [list]: |---|
35
- # 2. 前半のみ範囲外
36
- # [@list]: |-------|-------|
37
- # [list]: |------|
38
- # 3. 範囲内
39
- # [@list]: |-------|-------|
40
- # [list]: |------|
41
- # 4. 後半のみ範囲外
42
- # [@list]: |-------|-------|
43
- # [list]: |------|
44
- # 5. 完全に範囲外(開始日より後)
45
- # [@list]: |-------|-------|
46
- # [list]: |----|
47
- # 6. 両端が範囲外
48
- # [@list]: |-------|-------|
49
- # [list]: |--------------------|
50
- #
51
- # @param [Array<LinearGengou>] list 元号
52
- #
53
- # @return [Array<LinearGengou>] 未登録元号
54
- #
55
- def push(list: [])
56
- rest = rest(list: list)
57
-
58
- insert(list: list)
59
-
60
- rest
61
- end
62
-
63
- #
64
- # 範囲内の元号を取得する
65
- #
66
- # @param [Western::Calendar] start_date 開始日
67
- # @param [Western::Calendar] last_date 終了日
68
- #
69
- # @return [Array<LinearGengou>] 元号
70
- #
71
- def get(start_date:, last_date:)
72
- result = []
73
- @list.each do |gengou|
74
- next if gengou.out?(start_date: start_date, last_date: last_date)
75
-
76
- # 1日でも範囲内であれば対象とみなす
77
- result.push(gengou)
22
+ #
23
+ # 初期化
24
+ #
25
+ def initialize
26
+ @list = []
78
27
  end
79
28
 
80
- result
81
- end
82
-
83
- private
29
+ #
30
+ # 追加する
31
+ #
32
+ # 下記のパターンが存在し、戻り値は重複分となる
33
+ #
34
+ # 1. 完全に範囲外(開始日より前)
35
+ # [@list]: |-------|-------|
36
+ # [list]: |---|
37
+ # 2. 前半のみ範囲外
38
+ # [@list]: |-------|-------|
39
+ # [list]: |------|
40
+ # 3. 範囲内
41
+ # [@list]: |-------|-------|
42
+ # [list]: |------|
43
+ # 4. 後半のみ範囲外
44
+ # [@list]: |-------|-------|
45
+ # [list]: |------|
46
+ # 5. 完全に範囲外(開始日より後)
47
+ # [@list]: |-------|-------|
48
+ # [list]: |----|
49
+ # 6. 両端が範囲外
50
+ # [@list]: |-------|-------|
51
+ # [list]: |--------------------|
52
+ #
53
+ # @param [Array<LinearGengou>] list 元号
54
+ #
55
+ # @return [Array<LinearGengou>] 未登録元号
56
+ #
57
+ def push(list: [])
58
+ rest = rest(list: list)
59
+
60
+ insert(list: list)
61
+
62
+ rest
63
+ end
84
64
 
85
- #
86
- # 重複分(空きがないため追加できない範囲の元号)を返す
87
- #
88
- # @param [Array<LinearGengou>] list 元号
89
- #
90
- # @return [Array<LinearGengou>] 重複分元号
91
- #
92
- def rest(list: [])
93
- result = []
65
+ #
66
+ # 範囲内の元号を取得する
67
+ #
68
+ # @param [Western::Calendar] start_date 開始日
69
+ # @param [Western::Calendar] last_date 終了日
70
+ #
71
+ # @return [Array<LinearGengou>] 元号
72
+ #
73
+ def get(start_date:, last_date:)
74
+ result = []
75
+ @list.each do |gengou|
76
+ next if gengou.out?(start_date: start_date, last_date: last_date)
77
+
78
+ # 1日でも範囲内であれば対象とみなす
79
+ result.push(gengou)
80
+ end
81
+
82
+ result
83
+ end
94
84
 
95
- @list.each do |gengou|
96
- result |= and!(rest: list, other: gengou)
85
+ #
86
+ # 範囲内の元号を取得する(元号名)
87
+ #
88
+ # @param [String] name 元号名
89
+ #
90
+ # @return [Array<LinearGengou>] 元号
91
+ #
92
+ def get_by_name(name:)
93
+ result = []
94
+ @list.each do |gengou|
95
+ result.push(gengou) if gengou.name == name
96
+ end
97
+
98
+ result
97
99
  end
98
100
 
99
- Division.connect(list: result)
100
- end
101
+ private
101
102
 
102
- #
103
- # 空き範囲に元号を登録する
104
- #
105
- # @param [Array<LinearGengou>] list 元号
106
- #
107
- def insert(list: [])
108
- surplus_result = list.clone
109
- @list.each do |gengou|
110
- surplus_result = not!(surplus: surplus_result, other: gengou)
111
- end
103
+ #
104
+ # 重複分(空きがないため追加できない範囲の元号)を返す
105
+ #
106
+ # @param [Array<LinearGengou>] list 元号
107
+ #
108
+ # @return [Array<LinearGengou>] 重複分元号
109
+ #
110
+ def rest(list: [])
111
+ result = []
112
112
 
113
- surplus_result = Division.connect(list: surplus_result)
113
+ @list.each do |gengou|
114
+ result |= and!(rest: list, other: gengou)
115
+ end
114
116
 
115
- surplus_result.each do |gengou|
116
- @list.push(gengou)
117
+ Division.connect(list: result)
117
118
  end
118
- end
119
119
 
120
- #
121
- # 重複した範囲を返す
122
- #
123
- # @param [Array<LinearGengou>] rest 残り元号
124
- # @param [LinearGengou] other 比較元号
125
- #
126
- # @return [Array<LinearGengou>] 重複分
127
- #
128
- def and!(rest:, other:)
129
- result = []
130
- rest.each do |gengou|
131
- result |= Division.match(this: gengou, other: other)
120
+ #
121
+ # 空き範囲に元号を登録する
122
+ #
123
+ # @param [Array<LinearGengou>] list 元号
124
+ #
125
+ def insert(list: [])
126
+ surplus_result = list.clone
127
+ @list.each do |gengou|
128
+ surplus_result = not!(surplus: surplus_result, other: gengou)
129
+ end
130
+
131
+ surplus_result = Division.connect(list: surplus_result)
132
+
133
+ surplus_result.each do |gengou|
134
+ @list.push(gengou)
135
+ end
132
136
  end
133
137
 
134
- result
135
- end
136
-
137
- #
138
- # 範囲が重複しない差分を返す
139
- #
140
- # @param [Array<LinearGengou>] surplus 積元号
141
- # @param [LinearGengou] other 比較元号
142
- #
143
- # @return [Array<LinearGengou>] 差分
144
- #
145
- def not!(surplus:, other:)
146
- result = []
147
- surplus.each do |gengou|
148
- result |= Division.mismatch(this: gengou, other: other)
138
+ #
139
+ # 重複した範囲を返す
140
+ #
141
+ # @param [Array<LinearGengou>] rest 残り元号
142
+ # @param [LinearGengou] other 比較元号
143
+ #
144
+ # @return [Array<LinearGengou>] 重複分
145
+ #
146
+ def and!(rest:, other:)
147
+ result = []
148
+ rest.each do |gengou|
149
+ result |= Division.match(this: gengou, other: other)
150
+ end
151
+
152
+ result
149
153
  end
150
154
 
151
- result
155
+ #
156
+ # 範囲が重複しない差分を返す
157
+ #
158
+ # @param [Array<LinearGengou>] surplus 積元号
159
+ # @param [LinearGengou] other 比較元号
160
+ #
161
+ # @return [Array<LinearGengou>] 差分
162
+ #
163
+ def not!(surplus:, other:)
164
+ result = []
165
+ surplus.each do |gengou|
166
+ result |= Division.mismatch(this: gengou, other: other)
167
+ end
168
+
169
+ result
170
+ end
152
171
  end
153
172
  end
154
173
  end