zakuro 0.6.0 → 0.6.1

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 (50) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -3
  3. data/VERSION +1 -1
  4. data/lib/zakuro/calculation/base/gengou.rb +4 -4
  5. data/lib/zakuro/calculation/base/linear_gengou.rb +6 -6
  6. data/lib/zakuro/calculation/era/gengou/internal/connector.rb +107 -0
  7. data/lib/zakuro/calculation/era/gengou/internal/counter.rb +214 -0
  8. data/lib/zakuro/calculation/era/gengou/internal/publisher.rb +104 -0
  9. data/lib/zakuro/calculation/era/gengou/internal/reserve/list.rb +244 -0
  10. data/lib/zakuro/calculation/era/gengou/internal/reserve/range.rb +193 -0
  11. data/lib/zakuro/calculation/{gengou → era/gengou}/internal/reserve.rb +6 -6
  12. data/lib/zakuro/calculation/{gengou → era/gengou}/scroll.rb +44 -95
  13. data/lib/zakuro/calculation/{version → era/version}/internal/crawler.rb +7 -7
  14. data/lib/zakuro/calculation/{version → era/version}/internal/range.rb +4 -4
  15. data/lib/zakuro/calculation/{version → era/version}/version.rb +3 -3
  16. data/lib/zakuro/calculation/monthly/month.rb +2 -2
  17. data/lib/zakuro/calculation/range/full_range.rb +18 -19
  18. data/lib/zakuro/calculation/range/operated_range.rb +3 -4
  19. data/lib/zakuro/calculation/specifier/internal/month.rb +84 -0
  20. data/lib/zakuro/calculation/specifier/multiple_day.rb +162 -0
  21. data/lib/zakuro/calculation/specifier/single_day.rb +2 -2
  22. data/lib/zakuro/calculation/summary/internal/operation.rb +98 -0
  23. data/lib/zakuro/calculation/summary/range.rb +120 -0
  24. data/lib/zakuro/calculation/summary/single.rb +45 -67
  25. data/lib/zakuro/condition.rb +14 -0
  26. data/lib/zakuro/era/japan/gengou/alignment/aligner.rb +106 -0
  27. data/lib/zakuro/era/japan/gengou/alignment/division.rb +165 -0
  28. data/lib/zakuro/era/japan/gengou/alignment/line.rb +156 -0
  29. data/lib/zakuro/era/japan/gengou/alignment/linear_gengou.rb +184 -0
  30. data/lib/zakuro/era/japan/gengou/alignment.rb +42 -0
  31. data/lib/zakuro/era/japan/gengou/resource/parser.rb +242 -0
  32. data/lib/zakuro/era/japan/gengou/resource/type.rb +292 -0
  33. data/lib/zakuro/era/japan/gengou/resource/validator.rb +346 -0
  34. data/lib/zakuro/era/japan/gengou/{yaml → resource/yaml}/set-001-until-south.yaml +2 -2
  35. data/lib/zakuro/era/japan/gengou/{yaml → resource/yaml}/set-002-from-north.yaml +2 -2
  36. data/lib/zakuro/era/japan/gengou/{yaml → resource/yaml}/set-003-modern.yaml +2 -2
  37. data/lib/zakuro/era/japan/gengou/resource.rb +32 -0
  38. data/lib/zakuro/era/japan/gengou.rb +34 -73
  39. data/lib/zakuro/era/japan/version.rb +18 -18
  40. data/lib/zakuro/merchant.rb +41 -3
  41. data/lib/zakuro/operation/month/validator.rb +1 -1
  42. data/lib/zakuro/result/result.rb +17 -0
  43. data/lib/zakuro/version/senmyou/README.md +11 -7
  44. metadata +32 -20
  45. data/lib/zakuro/calculation/gengou/internal/counter.rb +0 -129
  46. data/lib/zakuro/calculation/gengou/internal/reserve/interval.rb +0 -183
  47. data/lib/zakuro/calculation/gengou/internal/reserve/list.rb +0 -382
  48. data/lib/zakuro/era/japan/gengou/parser.rb +0 -237
  49. data/lib/zakuro/era/japan/gengou/type.rb +0 -285
  50. data/lib/zakuro/era/japan/gengou/validator.rb +0 -341
@@ -1,183 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../../../../era/western/calendar'
4
-
5
- require_relative './list'
6
-
7
- # :nodoc:
8
- module Zakuro
9
- # :nodoc:
10
- module Calculation
11
- # :nodoc:
12
- module Gengou
13
- # :nodoc:
14
- module Reserve
15
- # Interval
16
- #
17
- # 予約済み計算範囲
18
- #
19
- class Interval
20
- # @return [List] 1行目元号
21
- attr_reader :first_gengou
22
- # @return [List] 2行目元号
23
- attr_reader :second_gengou
24
-
25
- #
26
- # 初期化
27
- #
28
- # @param [Western::Calendar] start_date 西暦開始日
29
- # @param [Western::Calendar] end_date 西暦終了日
30
- #
31
- def initialize(start_date: Western::Calendar.new, end_date: Western::Calendar.new)
32
- @first_gengou = List.new(first: true, start_date: start_date, end_date: end_date)
33
- @second_gengou = List.new(first: false, start_date: start_date, end_date: end_date)
34
- end
35
-
36
- #
37
- # 不正か
38
- #
39
- # @return [True] 不正
40
- # @return [False] 不正なし
41
- #
42
- def invalid?
43
- @first_gengou.invalid?
44
- end
45
-
46
- #
47
- # 1行目元号を取得する
48
- #
49
- # @param [Western::Calendar] western_date 西暦日
50
- #
51
- # @return [Gengou::Counter] 加算元号
52
- #
53
- def match_first_gengou(western_date: Western::Calendar.new)
54
- @first_gengou.get(western_date: western_date)
55
- end
56
-
57
- #
58
- # 2行目元号を取得する
59
- #
60
- # @param [Western::Calendar] western_date 西暦日
61
- #
62
- # @return [Gengou::Counter] 加算元号
63
- #
64
- def match_second_gengou(western_date: Western::Calendar.new)
65
- @second_gengou.get(western_date: western_date)
66
- end
67
-
68
- #
69
- # 範囲内元号(1行目元号)を取得する
70
- #
71
- # @param [Western::Calendar] start_date 西暦開始日
72
- # @param [Western::Calendar] end_date 西暦終了日
73
- #
74
- # @return [Array<Gengou::Counter>] 範囲内元号(1行目元号)
75
- #
76
- def collect_first_gengou(start_date: Western::Calendar.new,
77
- end_date: Western::Calendar.new)
78
- @first_gengou.collect(start_date: start_date, end_date: end_date)
79
- end
80
-
81
- #
82
- # 範囲内元号(2行目元号)を取得する
83
- #
84
- # @param [Western::Calendar] start_date 西暦開始日
85
- # @param [Western::Calendar] end_date 西暦終了日
86
- #
87
- # @return [Array<Gengou::Counter>] 範囲内元号(2行目元号)
88
- #
89
- def collect_second_gengou(start_date: Western::Calendar.new,
90
- end_date: Western::Calendar.new)
91
- @second_gengou.collect(start_date: start_date, end_date: end_date)
92
- end
93
-
94
- #
95
- # 最古の元号から和暦開始日を取得する
96
- #
97
- # @return [Japan::Calendar] 和暦開始日
98
- #
99
- def japan_start_date
100
- gengou = oldest_gengou
101
-
102
- return Japan::Calendar.new if gengou.invalid?
103
-
104
- gengou.japan_start_date
105
- end
106
-
107
- #
108
- # 最古の元号から西暦開始日を取得する
109
- #
110
- # @return [Western::Calendar] 西暦開始日
111
- #
112
- def western_start_date
113
- gengou = oldest_gengou
114
-
115
- return Western::Calendar.new if gengou.invalid?
116
-
117
- gengou.western_start_date
118
- end
119
-
120
- #
121
- # 開始西暦年を取得する
122
- #
123
- # @return [Integer] 開始西暦年
124
- #
125
- def western_start_year
126
- first_start_year = @first_gengou.western_start_year
127
- second_start_year = @second_gengou.western_start_year
128
-
129
- return first_start_year if @first_gengou.invalid?
130
-
131
- return first_start_year if @second_gengou.invalid?
132
-
133
- return first_start_year if first_start_year < second_start_year
134
-
135
- second_start_year
136
- end
137
-
138
- #
139
- # 終了西暦年を取得する
140
- #
141
- # @return [Integer] 終了西暦年
142
- #
143
- def western_end_year
144
- first_end_year = @first_gengou.western_end_year
145
- second_end_year = @second_gengou.western_end_year
146
-
147
- return first_end_year if @first_gengou.invalid?
148
-
149
- return first_end_year if @second_gengou.invalid?
150
-
151
- return first_end_year if first_end_year > second_end_year
152
-
153
- second_end_year
154
- end
155
-
156
- private
157
-
158
- #
159
- # 最古の元号を取得する
160
- #
161
- # @return [Japan::Gengou] 最古の元号
162
- #
163
- def oldest_gengou
164
- return @first_gengou if @first_gengou.invalid?
165
-
166
- return @first_gengou if @second_gengou.invalid?
167
-
168
- first_western_date = @first_gengou.western_start_date
169
- second_western_date = @second_gengou.western_start_date
170
-
171
- return @first_gengou if first_western_date.invalid?
172
-
173
- return @first_gengou if second_western_date.invalid?
174
-
175
- return @first_gengou if first_western_date < second_western_date
176
-
177
- @second_gengou
178
- end
179
- end
180
- end
181
- end
182
- end
183
- end
@@ -1,382 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../../../../era/japan/gengou'
4
- require_relative '../../../../era/japan/calendar'
5
- require_relative '../../../../era/western/calendar'
6
-
7
- require_relative '../counter'
8
-
9
- # :nodoc:
10
- module Zakuro
11
- # :nodoc:
12
- module Calculation
13
- # :nodoc:
14
- module Gengou
15
- # :nodoc:
16
- module Reserve
17
- # List
18
- #
19
- # 予約元号一覧
20
- #
21
- class List
22
- # TODO: refactor
23
-
24
- # @return [Integer] 不正年
25
- INVALID_YEAR = -1
26
- # @return [Integer] 最大試行数
27
- MAX_SEARCH_COUNT = 10_000
28
- # @return [Integer] 最大月日数
29
- MAX_MONTH_DAYS = 30
30
-
31
- # @return [Symbol] メソッド名
32
- attr_reader :method_name
33
- # @return [Western::Calendar] 開始日
34
- attr_reader :start_date
35
- # @return [Western::Calendar] 終了日
36
- attr_reader :end_date
37
- # @return [Array<Japan::Gengou>] 予約元号一覧
38
- attr_reader :list
39
-
40
- #
41
- # 初期化
42
- #
43
- # @param [True, False] first true:1行目元号, false:2行目元号
44
- # @param [Western::Calendar] start_date 開始日
45
- # @param [Western::Calendar] end_date 終了日
46
- #
47
- def initialize(first: true, start_date: Western::Calendar.new,
48
- end_date: Western::Calendar)
49
- @method_name = first ? :first_line : :second_line
50
- @start_date = start_date
51
- @end_date = end_date
52
- @list = []
53
-
54
- update
55
- end
56
-
57
- #
58
- # 元号を取得する
59
- #
60
- # @param [Western::Calendar] western_date 西暦日
61
- #
62
- # @return [Gengou::Counter] 加算元号
63
- #
64
- def get(western_date: Western::Calendar.new)
65
- @list.each do |gengou|
66
- if gengou.include?(date: western_date)
67
- return Gengou::Counter.new(gengou: gengou).clone
68
- end
69
- end
70
-
71
- Gengou::Counter.new
72
- end
73
-
74
- #
75
- # 範囲内元号を取得する
76
- #
77
- # 次のパターンが考えられる
78
- # 1. 元号の開始日から終了日まで該当元号なし(無効な元号)
79
- # 2. 元号の開始日までは該当元号なし(無効な元号、開始日以降の元号)
80
- # 3. 元号の開始日と月初日が合致し、末日まで同一元号(開始日以降の元号のみ)
81
- # 4. 月の途中で有効な元号が切り替わる(有効な元号、有効な元号...)
82
- # 5. 途中から該当元号なし(開始日以降の元号、無効な元号)
83
- #
84
- # FIXME: 有効な元号、無効な元号、有効な元号のようなストライプのパターンに対応していない
85
- #
86
- # @param [Western::Calendar] start_date 西暦開始日
87
- # @param [Western::Calendar] end_date 西暦終了日
88
- #
89
- # @return [Array<Gengou::Counter>] 範囲内元号
90
- #
91
- def collect(start_date: Western::Calendar.new, end_date: Western::Calendar.new)
92
- result = []
93
-
94
- # 開始チェック
95
- current_gengou = get(western_date: start_date)
96
- result.push(current_gengou)
97
-
98
- ## 範囲内に次の有効元号があるか
99
- if current_gengou.invalid?
100
- current_gengou = proceed(western_date: start_date)
101
-
102
- return result if suspend?(current_gengou: current_gengou, end_date: end_date)
103
-
104
- result.push(current_gengou)
105
- end
106
-
107
- return result if suspend?(current_gengou: current_gengou, end_date: end_date)
108
-
109
- # 有効元号チェック
110
- continue(result: result, current_date: current_gengou.western_end_date.clone,
111
- end_date: end_date)
112
- end
113
-
114
- #
115
- # 元号を進めて取得する
116
- #
117
- # @param [Western::Calendar] western_date 西暦日
118
- #
119
- # @return [Gengou::Counter] 加算元号
120
- #
121
- def proceed(western_date: Western::Calendar.new)
122
- current_gengou = get(western_date: western_date)
123
-
124
- # 無効な元号
125
- if current_gengou.invalid?
126
- @list.each do |gengou|
127
- next if gengou.invalid?
128
-
129
- # すでに超過している場合
130
- break if western_date > gengou.end_date
131
-
132
- return Gengou::Counter.new(gengou: gengou).clone
133
- end
134
-
135
- return Gengou::Counter.new
136
- end
137
-
138
- # 有効な元号
139
- @list.each do |gengou|
140
- next if gengou.invalid?
141
-
142
- if gengou.both_start_date.western > current_gengou.western_end_date
143
- return Gengou::Counter.new(gengou: gengou).clone
144
- end
145
- end
146
-
147
- Gengou::Counter.new
148
- end
149
-
150
- #
151
- # 和暦開始日を取得する
152
- #
153
- # @return [Japan::Calendar] 和暦開始日
154
- #
155
- def japan_start_date
156
- return Japan::Calendar.new if invalid?
157
-
158
- @list[0].both_start_date.japan.clone
159
- end
160
-
161
- #
162
- # 西暦開始日を取得する
163
- #
164
- # @return [Western::Calendar] 西暦開始日
165
- #
166
- def western_start_date
167
- return Western::Calendar.new if invalid?
168
-
169
- @list[0].both_start_date.western.clone
170
- end
171
-
172
- #
173
- # 西暦開始年を取得する
174
- #
175
- # @return [Integer] 西暦開始年
176
- #
177
- def western_start_year
178
- return INVALID_YEAR if invalid?
179
-
180
- @list[0].both_start_year.western.clone
181
- end
182
-
183
- #
184
- # 西暦終了年を取得する
185
- #
186
- # @return [Integer] 西暦終了年
187
- #
188
- def western_end_year
189
- return INVALID_YEAR if invalid?
190
-
191
- return INVALID_YEAR if @list.size.zero?
192
-
193
- @list[-1].end_year
194
- end
195
-
196
- #
197
- # 不正か
198
- #
199
- # @return [True] 不正
200
- # @return [False] 不正なし
201
- #
202
- def invalid?
203
- return true unless @list
204
-
205
- return true if @list.size.zero?
206
-
207
- false
208
- end
209
-
210
- private
211
-
212
- #
213
- # 予約元号一覧を更新する
214
- #
215
- def update
216
- result = internal
217
-
218
- return result if result.size.zero?
219
-
220
- prev_gengou(list: result)
221
-
222
- next_gengou(list: result)
223
-
224
- @list = result
225
- end
226
-
227
- #
228
- # 開始日・終了日に対応する予約元号一覧を取得する
229
- #
230
- # @return [Array<Japan::Gengou>] 予約元号一覧
231
- #
232
- def internal
233
- current_gengou = line(date: start_date)
234
- result = []
235
-
236
- return result if current_gengou.invalid?
237
-
238
- result.push(current_gengou)
239
- (0..MAX_SEARCH_COUNT).each do |_index|
240
- current_end_date = current_gengou.end_date.clone
241
- break if current_end_date > end_date
242
-
243
- current_gengou = line(date: current_end_date + 1)
244
- result.push(current_gengou)
245
- end
246
-
247
- result
248
- end
249
-
250
- #
251
- # 前の元号を設定する
252
- #
253
- # @note 開始日の30日前に前の元号がある場合は、前の元号を設定する
254
- #
255
- # @param [Array<Japan::Gengou>] list 元号一覧
256
- #
257
- def prev_gengou(list:)
258
- return unless list
259
-
260
- return if list.size.zero?
261
-
262
- first_gengou_date = list[0].both_start_date.western.clone
263
-
264
- border_date = start_date.clone - MAX_MONTH_DAYS
265
-
266
- return if first_gengou_date < border_date
267
-
268
- gengou = line(date: first_gengou_date - 1)
269
-
270
- return if gengou.invalid?
271
-
272
- list.unshift(gengou)
273
- end
274
-
275
- #
276
- # 次の元号を設定する
277
- #
278
- # @note 開始日の30日後に次の元号がある場合は、次の元号を設定する
279
- #
280
- # @param [Array<Japan::Gengou>] list 元号一覧
281
- #
282
- def next_gengou(list:)
283
- return unless list
284
-
285
- return if list.size.zero?
286
-
287
- last_gengou_date = list[-1].end_date.clone
288
-
289
- border_date = end_date.clone + MAX_MONTH_DAYS
290
-
291
- return if border_date < last_gengou_date
292
-
293
- gengou = line(date: last_gengou_date + 1)
294
-
295
- return if gengou.invalid?
296
-
297
- list.push(gengou)
298
- end
299
-
300
- #
301
- # 元号
302
- #
303
- # @param [Western::Calendar] date 日付
304
- #
305
- # @return [Japan::Gengou] 元号
306
- #
307
- def line(date:)
308
- List.send(method_name, **{ date: date })
309
- end
310
-
311
- #
312
- # 有効元号を継続する
313
- #
314
- # @param [Array<Gengou::Counter>] result 範囲内元号
315
- # @param [Gengou::Counter] current_gengou 現在元号
316
- # @param [Western::Calendar] end_date 終了日
317
- #
318
- # @return [Array<Gengou::Counter>] 範囲内元号
319
- #
320
- def continue(result:, current_date:, end_date:)
321
- (0..MAX_SEARCH_COUNT).each do |_index|
322
- current_gengou = proceed(western_date: current_date)
323
-
324
- return result if suspend?(current_gengou: current_gengou, end_date: end_date)
325
-
326
- # 範囲内元号
327
- result.push(current_gengou)
328
-
329
- current_date = current_gengou.western_end_date.clone
330
- end
331
-
332
- # 終了
333
- result
334
- end
335
-
336
- #
337
- # 中断する
338
- #
339
- # @param [Gengou::Counter] current_gengou 現在元号
340
- # @param [Western::Calendar] end_date 終了日
341
- #
342
- # @return [True] 中断
343
- # @return [False] 継続
344
- #
345
- def suspend?(current_gengou:, end_date:)
346
- ## 有効元号なし
347
- return true if current_gengou.invalid?
348
-
349
- ## 範囲内元号なし
350
- return true if current_gengou.western_start_date > end_date
351
-
352
- false
353
- end
354
-
355
- #
356
- # 1行目元号
357
- #
358
- # @param [Western::Calendar] date 日付
359
- #
360
- # @return [Japan::Gengou] 1行目元号
361
- #
362
- def self.first_line(date:)
363
- Zakuro::Japan::GengouResource.first_line(date: date)
364
- end
365
- private_class_method :first_line
366
-
367
- #
368
- # 2行目元号
369
- #
370
- # @param [Western::Calendar] date 日付
371
- #
372
- # @return [Japan::Gengou] 2行目元号
373
- #
374
- def self.second_line(date:)
375
- Zakuro::Japan::GengouResource.second_line(date: date)
376
- end
377
- private_class_method :second_line
378
- end
379
- end
380
- end
381
- end
382
- end