zakuro 0.5.0 → 0.6.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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -0
  3. data/lib/zakuro/calculation/base/gengou.rb +82 -0
  4. data/lib/zakuro/calculation/base/linear_gengou.rb +76 -0
  5. data/lib/zakuro/calculation/base/operated_year.rb +5 -15
  6. data/lib/zakuro/calculation/base/year.rb +26 -14
  7. data/lib/zakuro/calculation/gengou/internal/counter.rb +129 -0
  8. data/lib/zakuro/calculation/gengou/internal/reserve/interval.rb +183 -0
  9. data/lib/zakuro/calculation/gengou/internal/reserve/list.rb +382 -0
  10. data/lib/zakuro/calculation/gengou/internal/reserve.rb +42 -0
  11. data/lib/zakuro/calculation/gengou/scroll.rb +262 -0
  12. data/lib/zakuro/calculation/monthly/first_day.rb +3 -2
  13. data/lib/zakuro/calculation/monthly/month.rb +49 -2
  14. data/lib/zakuro/calculation/monthly/operated_month.rb +2 -2
  15. data/lib/zakuro/calculation/range/full_range.rb +65 -103
  16. data/lib/zakuro/calculation/range/operated_range.rb +13 -8
  17. data/lib/zakuro/calculation/range/operated_solar_terms.rb +36 -17
  18. data/lib/zakuro/calculation/range/transfer/gengou_scroller.rb +54 -0
  19. data/lib/zakuro/calculation/range/transfer/year_boundary.rb +25 -21
  20. data/lib/zakuro/calculation/specifier/single_day.rb +13 -35
  21. data/lib/zakuro/calculation/summary/single.rb +5 -2
  22. data/lib/zakuro/calculation/version/internal/crawler.rb +51 -0
  23. data/lib/zakuro/calculation/version/internal/range.rb +39 -0
  24. data/lib/zakuro/calculation/version/version.rb +24 -0
  25. data/lib/zakuro/era/japan/calendar.rb +133 -0
  26. data/lib/zakuro/era/japan/gengou/parser.rb +95 -25
  27. data/lib/zakuro/era/japan/gengou/type.rb +148 -41
  28. data/lib/zakuro/era/japan/gengou/validator.rb +157 -52
  29. data/lib/zakuro/era/japan/gengou/yaml/set-001-until-south.yaml +1870 -0
  30. data/lib/zakuro/era/japan/gengou/yaml/set-002-from-north.yaml +810 -0
  31. data/lib/zakuro/era/japan/gengou/yaml/set-003-modern.yaml +50 -0
  32. data/lib/zakuro/era/japan/gengou.rb +5 -5
  33. data/lib/zakuro/era/japan/version.rb +151 -0
  34. data/lib/zakuro/era/{western.rb → western/calendar.rb} +0 -0
  35. data/lib/zakuro/merchant.rb +12 -3
  36. data/lib/zakuro/operation/month/parser.rb +1 -1
  37. data/lib/zakuro/operation/month/type.rb +1 -1
  38. data/lib/zakuro/operation/month/validator.rb +1 -1
  39. data/lib/zakuro/output/response.rb +5 -5
  40. data/lib/zakuro/tools/typeconv.rb +38 -0
  41. data/lib/zakuro/tools/typeof.rb +4 -1
  42. data/lib/zakuro/version/context.rb +24 -3
  43. data/lib/zakuro/version/daien/daien.rb +1 -26
  44. data/lib/zakuro/version/genka/genka.rb +1 -26
  45. data/lib/zakuro/version/gihou/gihou.rb +1 -30
  46. data/lib/zakuro/version/gregorio/gregorio.rb +1 -9
  47. data/lib/zakuro/version/houryaku/houryaku.rb +1 -9
  48. data/lib/zakuro/version/joukyou/joukyou.rb +1 -9
  49. data/lib/zakuro/version/kansei/kansei.rb +1 -9
  50. data/lib/zakuro/version/senmyou/senmyou.rb +1 -30
  51. data/lib/zakuro/version/tenpou/tenpou.rb +1 -9
  52. data/zakuro.gemspec +1 -3
  53. metadata +25 -17
  54. data/lib/zakuro/calculation/base/multi_gengou.rb +0 -101
  55. data/lib/zakuro/calculation/base/multi_gengou_roller.rb +0 -218
  56. data/lib/zakuro/calculation/range/transfer/western_date_allocation.rb +0 -82
  57. data/lib/zakuro/era/japan/reki.rb +0 -91
  58. data/lib/zakuro/era/japan/yaml/set-001-until-south.yaml +0 -1121
  59. data/lib/zakuro/era/japan/yaml/set-002-from-north.yaml +0 -485
  60. data/lib/zakuro/era/japan/yaml/set-003-modern.yaml +0 -28
  61. data/lib/zakuro/version/abstract_version.rb +0 -29
  62. data/lib/zakuro/version.rb +0 -7
  63. data/lib/zakuro/version_factory.rb +0 -59
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../western'
3
+ require_relative '../../western/calendar'
4
4
 
5
5
  # :nodoc:
6
6
  module Zakuro
@@ -8,40 +8,52 @@ module Zakuro
8
8
  # Japan 和暦
9
9
  #
10
10
  module Japan
11
- # :reek:TooManyInstanceVariables { max_instance_variables: 5 }
12
-
13
11
  #
14
12
  # Gengou 元号情報
15
13
  #
16
14
  class Gengou
17
15
  # @return [String] 元号名
18
16
  attr_reader :name
19
- # @return [Western::Calendar] 開始日
20
- attr_reader :start_date
21
- # @return [Western::Calendar] 元旦
22
- attr_reader :new_year_date
17
+ # @return [Both::Year] 開始年(和暦/西暦)
18
+ attr_reader :both_start_year
19
+ # @return [Both::Date] 開始日(和暦/西暦)
20
+ attr_reader :both_start_date
21
+ # @return [Integer] 終了年
22
+ attr_reader :end_year
23
23
  # @return [Western::Calendar] 終了日
24
24
  attr_reader :end_date
25
- # @return [Integer] 元号年
26
- attr_reader :year
27
25
 
28
26
  #
29
27
  # 初期化
30
28
  #
31
29
  # @param [String] name 元号名
32
- # @param [Western::Calendar] start_date 開始日
33
- # @param [Western::Calendar] new_year_date 元旦
30
+ # @param [Both::Year] both_start_year 開始年(和暦/西暦)
31
+ # @param [Both::Date] both_start_date 開始日(和暦/西暦)
32
+ # @param [Integer] end_date 終了年
34
33
  # @param [Western::Calendar] end_date 終了日
35
- # @param [Integer] year 元号年
36
34
  #
37
- def initialize(name: '', start_date: Western::Calendar.new,
38
- new_year_date: Western::Calendar.new,
39
- end_date: Western::Calendar.new, year: -1)
35
+ def initialize(name: '', both_start_year: Both::Year.new,
36
+ both_start_date: Both::Date.new,
37
+ end_date: Western::Calendar.new,
38
+ end_year: Both::Year::INVALID)
40
39
  @name = name
41
- @start_date = start_date
42
- @new_year_date = new_year_date
40
+ @both_start_year = both_start_year
41
+ @both_start_date = both_start_date
42
+ @end_year = end_year
43
43
  @end_date = end_date
44
- @year = year
44
+ end
45
+
46
+ #
47
+ # 終了年を更新する
48
+ #
49
+ # @param [Integer] end_year 終了年
50
+ #
51
+ def write_end_year(end_year:)
52
+ unless Gengou.valid_year(year: end_year)
53
+ raise ArgumentError, "invalid year format. [#{end_year}]"
54
+ end
55
+
56
+ @end_year = end_year
45
57
  end
46
58
 
47
59
  #
@@ -59,12 +71,26 @@ module Zakuro
59
71
  end
60
72
 
61
73
  #
62
- # 日付が有効かどうかを確認する
74
+ # 年が不正なしかどうかを確認する
75
+ #
76
+ # @param [Integer] year 年
77
+ #
78
+ # @return [True] 不正なし
79
+ # @return [False] 不正
80
+ #
81
+ def self.valid_year(year:)
82
+ return false unless year
83
+
84
+ year.is_a?(Integer)
85
+ end
86
+
87
+ #
88
+ # 日付が不正なしかどうかを確認する
63
89
  #
64
90
  # @param [Western::Calendar] date 日付
65
91
  #
66
- # @return [True] 有効
67
- # @return [False] 無効
92
+ # @return [True] 不正なし
93
+ # @return [False] 不正
68
94
  #
69
95
  def self.valid_date(date:)
70
96
  return false unless date
@@ -72,16 +98,33 @@ module Zakuro
72
98
  date.is_a?(Western::Calendar)
73
99
  end
74
100
 
101
+ #
102
+ # 次の元号の開始年から、元号の終了年に変換する
103
+ #
104
+ # @param [Integer] next_start_year 次回開始年
105
+ #
106
+ def convert_next_start_year_to_end_year(next_start_year:)
107
+ if @both_start_year.western >= next_start_year
108
+ @end_year = next_start_year
109
+ return
110
+ end
111
+
112
+ @end_year = next_start_year - 1
113
+
114
+ nil
115
+ end
116
+
75
117
  #
76
118
  # 次の元号の開始日から、元号の終了日に変換する
77
119
  #
78
- # @param [String] next_start_date_string 次回開始日
120
+ # @param [String] next_start_date 次回開始日
79
121
  #
80
- def convert_next_start_date_to_end_date(next_start_date_string: '')
81
- raise ArgumentError, 'empty string cannot convert' if next_start_date_string.empty?
122
+ def convert_next_start_date_to_end_date(next_start_date: '')
123
+ raise ArgumentError, 'empty string cannot convert' if next_start_date.empty?
82
124
 
83
- start_date = Western::Calendar.parse(str: next_start_date_string)
125
+ start_date = Western::Calendar.parse(str: next_start_date)
84
126
  @end_date = start_date - 1
127
+
85
128
  nil
86
129
  end
87
130
 
@@ -94,30 +137,31 @@ module Zakuro
94
137
  # @return [False] 含まれない
95
138
  #
96
139
  def include?(date:)
97
- date >= @start_date && date <= @end_date
140
+ date >= @both_start_date.western && date <= @end_date
98
141
  end
99
142
 
100
143
  #
101
- # 不正な元号データかを確認する
144
+ # 不正か
102
145
  #
103
- # @return [True] 正しくない
104
- # @return [True] 正しい
146
+ # @return [True] 不正
147
+ # @return [False] 不正なし
105
148
  #
106
149
  def invalid?
107
- @year == -1
150
+ @both_start_year.japan == -1 || @both_start_year.invalid? ||
151
+ @both_start_date.invalid? || @end_date.invalid?
108
152
  end
109
153
 
110
154
  #
111
155
  # 1元号年を追加する
112
156
  #
113
- def next_year
114
- @year += 1 unless invalid?
115
- nil
116
- end
157
+ # def next_year
158
+ # @year += 1 unless invalid?
159
+ # nil
160
+ # end
117
161
 
118
162
  def to_s
119
- "name: #{@name}, start_date: #{@start_date.format}, " \
120
- "end_date: #{@end_date.format}, year: #{@year}"
163
+ "name: #{@name}, both_start_year: #{@both_start_year.format}, " \
164
+ "both_start_date: #{@both_start_date.format}, end_date: #{@end_date.format}"
121
165
  end
122
166
  end
123
167
 
@@ -125,12 +169,16 @@ module Zakuro
125
169
  # Set 元号セット
126
170
  #
127
171
  class Set
172
+ # @return [Integer] 不正値
173
+ INVALID = -1
128
174
  # @return [Integer] 元号セットID
129
175
  attr_reader :id
130
176
  # @return [String] 元号セット名
131
177
  attr_reader :name
132
- # @return [Western::Calendar] 元号セットでの終了日
133
- attr_reader :end_date
178
+ # @return [Both::Date] 元号セットでの終了年
179
+ attr_reader :both_end_year
180
+ # @return [Both::Date] 元号セットでの終了日
181
+ attr_reader :both_end_date
134
182
  # @return [Array<Gengou>] 元号リスト
135
183
  attr_reader :list
136
184
 
@@ -142,10 +190,12 @@ module Zakuro
142
190
  # @param [Western::Calendar] end_date 元号セットでの終了日
143
191
  # @param [Array<Gengou>] list 元号リスト
144
192
  #
145
- def initialize(id: -1, name: '', end_date: Western::Calendar.new, list: [])
193
+ def initialize(id: INVALID, name: '', both_end_year: Both::Year.new,
194
+ both_end_date: Both::Date.new, list: [])
146
195
  @id = id
147
196
  @name = name
148
- @end_date = end_date
197
+ @both_end_year = both_end_year
198
+ @both_end_date = both_end_date
149
199
  @list = list
150
200
  end
151
201
 
@@ -171,7 +221,64 @@ module Zakuro
171
221
  # @return [False] 正しい
172
222
  #
173
223
  def invalid?
174
- @id == -1
224
+ @id == INVALID
225
+ end
226
+ end
227
+
228
+ #
229
+ # 和暦/西暦
230
+ #
231
+ module Both
232
+ #
233
+ # Year 年
234
+ #
235
+ class Year
236
+ # @return [Integer] 不正値
237
+ INVALID = -1
238
+ # @return [Integer] 和暦元号年
239
+ attr_reader :japan
240
+ # @return [Integer] 西暦年
241
+ attr_reader :western
242
+
243
+ def initialize(japan: INVALID, western: INVALID)
244
+ @japan = japan
245
+ @western = western
246
+ end
247
+
248
+ #
249
+ # 不正か
250
+ #
251
+ # @return [True] 不正
252
+ # @return [False] 不正なし
253
+ #
254
+ def invalid?
255
+ @japan == INVALID || @western == INVALID
256
+ end
257
+ end
258
+
259
+ #
260
+ # Date 日
261
+ #
262
+ class Date
263
+ # @return [Japan::Calendar] 和暦日
264
+ attr_reader :japan
265
+ # @return [Western::Calendar] 西暦日
266
+ attr_reader :western
267
+
268
+ def initialize(japan: Japan::Calendar.new, western: Western::Calendar.new)
269
+ @japan = japan
270
+ @western = western
271
+ end
272
+
273
+ #
274
+ # 不正か
275
+ #
276
+ # @return [True] 不正
277
+ # @return [False] 不正なし
278
+ #
279
+ def invalid?
280
+ @japan.invalid? || @western.invalid?
281
+ end
175
282
  end
176
283
  end
177
284
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../western'
3
+ require_relative '../../japan/calendar'
4
+ require_relative '../../western/calendar'
4
5
  require_relative './type'
5
6
  require 'yaml'
6
7
 
@@ -14,8 +15,6 @@ module Zakuro
14
15
  # Validator yaml解析
15
16
  #
16
17
  module Validator
17
- # :reek:TooManyInstanceVariables { max_instance_variables: 5 }
18
-
19
18
  #
20
19
  # Set 元号セット情報の検証/展開
21
20
  #
@@ -24,8 +23,10 @@ module Zakuro
24
23
  attr_reader :id
25
24
  # @return [String] 元号セット名
26
25
  attr_reader :name
27
- # @return [String] 終了日
28
- attr_reader :end_date
26
+ # @return [Hash<String, String>] 終了年
27
+ attr_reader :both_end_year
28
+ # @return [Hash<String, String>] 終了日
29
+ attr_reader :both_end_date
29
30
  # @return [Array<Hash<String, String>>] 元号情報
30
31
  attr_reader :list
31
32
 
@@ -37,12 +38,11 @@ module Zakuro
37
38
  def initialize(hash:)
38
39
  @id = hash['id']
39
40
  @name = hash['name']
40
- @end_date = hash['end_date']
41
+ @both_end_year = hash['end_year']
42
+ @both_end_date = hash['end_date']
41
43
  @list = hash['list']
42
44
  end
43
45
 
44
- # :reek:TooManyStatements { max_statements: 6 }
45
-
46
46
  #
47
47
  # 検証する
48
48
  #
@@ -50,11 +50,13 @@ module Zakuro
50
50
  #
51
51
  def validate
52
52
  failed = []
53
- failed.push("invalid id. #{id}") unless id?
53
+ failed.push("invalid id. #{@id}") unless id?
54
54
 
55
- failed.push("invalid name. #{name}") unless name?
55
+ failed.push("invalid name. #{@name}") unless name?
56
56
 
57
- failed.push("invalid end_date. #{end_date}") unless western_date?
57
+ failed |= validate_both_end_year
58
+
59
+ failed |= validate_both_end_date
58
60
 
59
61
  failed |= validate_list
60
62
  failed
@@ -85,13 +87,21 @@ module Zakuro
85
87
  end
86
88
 
87
89
  #
88
- # 日付文字列を検証する
90
+ # 終了年を検証する
89
91
  #
90
- # @return [True] 正しい
91
- # @return [False] 正しくない
92
+ # @return [Array<String>] 不正メッセージ
93
+ #
94
+ def validate_both_end_year
95
+ Both::Year.new(hash: @both_end_year).validate
96
+ end
97
+
92
98
  #
93
- def western_date?
94
- Western::Calendar.valid_date_string(str: @end_date)
99
+ # 終了日を検証する
100
+ #
101
+ # @return [Array<String>] 不正メッセージ
102
+ #
103
+ def validate_both_end_date
104
+ Both::Date.new(hash: @both_end_date).validate
95
105
  end
96
106
 
97
107
  #
@@ -109,8 +119,7 @@ module Zakuro
109
119
  #
110
120
  # 元号情報を検証する
111
121
  #
112
- # @return [True] 正しい
113
- # @return [False] 正しくない
122
+ # @return [Array<String>] 不正メッセージ
114
123
  #
115
124
  def validate_list
116
125
  return ["invalid list. #{@list.class}"] unless list?
@@ -123,8 +132,6 @@ module Zakuro
123
132
  end
124
133
  end
125
134
 
126
- # :reek:TooManyInstanceVariables { max_instance_variables: 5 }
127
-
128
135
  #
129
136
  # Gengou 元号情報
130
137
  #
@@ -133,12 +140,10 @@ module Zakuro
133
140
  attr_reader :index
134
141
  # @return [String] 元号名
135
142
  attr_reader :name
136
- # @return [String] 開始日
137
- attr_reader :start_date
138
- # @return [String] 元旦
139
- attr_reader :new_year_date
140
- # @return [String] 開始年
141
- attr_reader :start_year
143
+ # @return [Hash<String, String>] 開始年
144
+ attr_reader :both_start_year
145
+ # @return [Hash<String, String>] 開始日
146
+ attr_reader :both_start_date
142
147
 
143
148
  #
144
149
  # 初期化
@@ -149,13 +154,10 @@ module Zakuro
149
154
  def initialize(hash:, index:)
150
155
  @index = index
151
156
  @name = hash['name']
152
- @start_date = hash['start_date']
153
- @new_year_date = hash['new_year_date']
154
- @start_year = hash['start_year']
157
+ @both_start_year = hash['start_year']
158
+ @both_start_date = hash['start_date']
155
159
  end
156
160
 
157
- # :reek:TooManyStatements { max_statements: 7 }
158
-
159
161
  #
160
162
  # 検証する
161
163
  #
@@ -167,11 +169,9 @@ module Zakuro
167
169
 
168
170
  failed.push(prefix + "invalid name. #{@name}") unless name?
169
171
 
170
- failed.push(prefix + "invalid start_date. #{@start_date}") unless start_date?
171
-
172
- failed.push(prefix + "invalid start_year. #{@start_year}") unless year?
172
+ failed |= validate_both_start_year
173
173
 
174
- failed.push(prefix + "invalid new_year_date. #{@new_year_date}") unless new_year_date?
174
+ failed |= validate_both_start_date
175
175
 
176
176
  failed
177
177
  end
@@ -189,35 +189,140 @@ module Zakuro
189
189
  end
190
190
 
191
191
  #
192
- # 開始日文字列を検証する
192
+ # 開始年を検証する
193
193
  #
194
- # @return [True] 正しい
195
- # @return [False] 正しくない
194
+ # @return [Array<String>] 不正メッセージ
196
195
  #
197
- def start_date?
198
- Western::Calendar.valid_date_string(str: @start_date)
196
+ def validate_both_start_year
197
+ Both::Year.new(hash: @both_start_year).validate
199
198
  end
200
199
 
201
200
  #
202
- # 元旦文字列を検証する
201
+ # 開始日を検証する
203
202
  #
204
- # @return [True] 正しい
205
- # @return [False] 正しくない
203
+ # @return [Array<String>] 不正メッセージ
206
204
  #
207
- def new_year_date?
208
- Western::Calendar.valid_date_string(str: @new_year_date)
205
+ def validate_both_start_date
206
+ Both::Date.new(hash: @both_start_date).validate
207
+ end
208
+ end
209
+
210
+ #
211
+ # 和暦/西暦
212
+ #
213
+ module Both
214
+ #
215
+ # Year 年
216
+ #
217
+ class Year
218
+ # @return [String] 和暦元号年
219
+ attr_reader :japan
220
+ # @return [String] 西暦年
221
+ attr_reader :western
222
+
223
+ #
224
+ # 初期化
225
+ #
226
+ # @param [Hash<String, Strin>] hash 年情報
227
+ #
228
+ def initialize(hash:)
229
+ @japan = hash['japan']
230
+ @western = hash['western']
231
+ end
232
+
233
+ #
234
+ # 検証する
235
+ #
236
+ # @return [Array<String>] 不正メッセージ
237
+ #
238
+ def validate
239
+ failed = []
240
+
241
+ failed.push("invalid japan year. #{@japan}") unless japan?
242
+
243
+ failed.push("invalid western year. #{@western}") unless western?
244
+
245
+ failed
246
+ end
247
+
248
+ #
249
+ # 和暦元号年を検証する
250
+ #
251
+ # @return [True] 正しい
252
+ # @return [False] 正しくない
253
+ #
254
+ def japan?
255
+ return false unless @japan
256
+
257
+ @japan.is_a?(Integer)
258
+ end
259
+
260
+ #
261
+ # 和暦元号年を検証する
262
+ #
263
+ # @return [True] 正しい
264
+ # @return [False] 正しくない
265
+ #
266
+ def western?
267
+ return false unless @western
268
+
269
+ @western.is_a?(Integer)
270
+ end
209
271
  end
210
272
 
211
273
  #
212
- # 元号年を検証する
213
- #
214
- # @return [True] 正しい
215
- # @return [False] 正しくない
274
+ # Date 日
216
275
  #
217
- def year?
218
- return true unless @start_year
276
+ class Date
277
+ # @return [String] 和暦日
278
+ attr_reader :japan
279
+ # @return [String] 西暦日
280
+ attr_reader :western
281
+
282
+ #
283
+ # 初期化
284
+ #
285
+ # @param [Hash<String, Strin>] hash 日情報
286
+ #
287
+ def initialize(hash:)
288
+ @japan = hash['japan']
289
+ @western = hash['western']
290
+ end
291
+
292
+ #
293
+ # 検証する
294
+ #
295
+ # @return [Array<String>] 不正メッセージ
296
+ #
297
+ def validate
298
+ failed = []
299
+
300
+ failed.push("invalid japan date. #{@japan}") unless japan?
219
301
 
220
- @start_year.is_a?(Integer)
302
+ failed.push("invalid western date. #{@western}") unless western?
303
+
304
+ failed
305
+ end
306
+
307
+ #
308
+ # 和暦日を検証する
309
+ #
310
+ # @return [True] 正しい
311
+ # @return [False] 正しくない
312
+ #
313
+ def japan?
314
+ Japan::Calendar.valid_date_string(text: @japan)
315
+ end
316
+
317
+ #
318
+ # 西暦日を検証する
319
+ #
320
+ # @return [True] 正しい
321
+ # @return [False] 正しくない
322
+ #
323
+ def western?
324
+ Western::Calendar.valid_date_string(str: @western)
325
+ end
221
326
  end
222
327
  end
223
328