zakuro 0.0.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +4 -0
  3. data/.gitignore +7 -1
  4. data/.rubocop.yml +3 -0
  5. data/Gemfile +2 -0
  6. data/Makefile +2 -0
  7. data/README.md +126 -33
  8. data/Rakefile +1 -1
  9. data/doc/gengou.md +315 -0
  10. data/doc/operation.md +25 -0
  11. data/doc/operation/csv/month.csv +202 -0
  12. data/doc/operation/operation.xlsx +0 -0
  13. data/doc/operation/transfer.rb +77 -0
  14. data/lib/zakuro/condition.rb +19 -15
  15. data/lib/zakuro/cycle/abstract_remainder.rb +3 -4
  16. data/lib/zakuro/era/japan/gengou.rb +106 -0
  17. data/lib/zakuro/era/japan/gengou/parser.rb +167 -0
  18. data/lib/zakuro/era/japan/gengou/type.rb +178 -0
  19. data/lib/zakuro/era/japan/gengou/validator.rb +236 -0
  20. data/lib/zakuro/era/japan/reki.rb +91 -0
  21. data/lib/zakuro/era/japan/yaml/set-001-until-south.yaml +1121 -0
  22. data/lib/zakuro/era/japan/yaml/set-002-from-north.yaml +485 -0
  23. data/lib/zakuro/era/japan/yaml/set-003-modern.yaml +28 -0
  24. data/lib/zakuro/era/western.rb +11 -1
  25. data/lib/zakuro/operation/month/parser.rb +373 -0
  26. data/lib/zakuro/operation/month/type.rb +453 -0
  27. data/lib/zakuro/operation/month/validator.rb +802 -0
  28. data/lib/zakuro/operation/operation.rb +66 -0
  29. data/lib/zakuro/operation/yaml/month.yaml +6452 -0
  30. data/lib/zakuro/output/error.rb +2 -0
  31. data/lib/zakuro/output/logger.rb +2 -0
  32. data/lib/zakuro/output/response.rb +21 -19
  33. data/lib/zakuro/result/core.rb +52 -0
  34. data/lib/zakuro/result/data.rb +187 -0
  35. data/lib/zakuro/result/operation.rb +114 -0
  36. data/lib/zakuro/result/result.rb +37 -0
  37. data/lib/zakuro/{output → tools}/stringifier.rb +16 -9
  38. data/lib/zakuro/tools/typeof.rb +33 -0
  39. data/lib/zakuro/version.rb +1 -1
  40. data/lib/zakuro/version/senmyou/README.md +3 -1
  41. data/lib/zakuro/version/senmyou/base/era.rb +3 -1
  42. data/lib/zakuro/version/senmyou/base/multi_gengou.rb +98 -0
  43. data/lib/zakuro/version/senmyou/base/multi_gengou_roller.rb +217 -0
  44. data/lib/zakuro/version/senmyou/base/remainder.rb +4 -4
  45. data/lib/zakuro/version/senmyou/base/solar_term.rb +82 -0
  46. data/lib/zakuro/version/senmyou/base/year.rb +52 -6
  47. data/lib/zakuro/version/senmyou/monthly/first_day.rb +44 -0
  48. data/lib/zakuro/version/senmyou/monthly/initialized_month.rb +119 -0
  49. data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +3 -3
  50. data/lib/zakuro/version/senmyou/monthly/month.rb +136 -67
  51. data/lib/zakuro/version/senmyou/monthly/month_label.rb +87 -0
  52. data/lib/zakuro/version/senmyou/monthly/operated_month.rb +196 -0
  53. data/lib/zakuro/version/senmyou/{summary/annual_data.rb → range/annual_range.rb} +34 -61
  54. data/lib/zakuro/version/senmyou/range/full_range.rb +194 -0
  55. data/lib/zakuro/version/senmyou/range/operated_range.rb +126 -0
  56. data/lib/zakuro/version/senmyou/range/operated_solar_terms.rb +181 -0
  57. data/lib/zakuro/version/senmyou/range/western_date_allocation.rb +68 -0
  58. data/lib/zakuro/version/senmyou/range/year_boundary.rb +138 -0
  59. data/lib/zakuro/version/senmyou/senmyou.rb +2 -2
  60. data/lib/zakuro/version/senmyou/specifier/single_day_specifier.rb +102 -0
  61. data/lib/zakuro/version/senmyou/stella/lunar_orbit.rb +2 -2
  62. data/lib/zakuro/version/senmyou/stella/solar_average.rb +105 -128
  63. data/lib/zakuro/version/senmyou/stella/solar_location.rb +213 -0
  64. data/lib/zakuro/version/senmyou/stella/solar_orbit.rb +4 -189
  65. data/lib/zakuro/version/senmyou/summary/single.rb +125 -0
  66. data/lib/zakuro/version_factory.rb +1 -1
  67. metadata +46 -15
  68. data/lib/zakuro/era/gengou/set-001-until-south.yaml +0 -375
  69. data/lib/zakuro/era/gengou/set-002-from-north.yaml +0 -166
  70. data/lib/zakuro/era/gengou/set-003-modern.yaml +0 -12
  71. data/lib/zakuro/era/japan.rb +0 -630
  72. data/lib/zakuro/output/result.rb +0 -219
  73. data/lib/zakuro/version/senmyou/base/gengou.rb +0 -210
  74. data/lib/zakuro/version/senmyou/summary/gengou_data.rb +0 -294
@@ -1,12 +0,0 @@
1
- id: 3
2
- name: "近代(一世一元)"
3
- end_date: "9999-12-31"
4
- list:
5
- - name: "明治"
6
- start_date: "1868-1-25"
7
- - name: "大正"
8
- start_date: "1912-7-30"
9
- - name: "昭和"
10
- start_date: "1926-12-25"
11
- - name: "令和"
12
- start_date: "2019-5-1"
@@ -1,630 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative './western'
4
- require 'yaml'
5
-
6
- # :nodoc:
7
- module Zakuro
8
- #
9
- # Japan 和暦
10
- #
11
- module Japan
12
- #
13
- # Reki 暦
14
- #
15
- module Reki
16
- #
17
- # Range 暦(範囲)
18
- #
19
- class Range
20
- # @return [String] 暦のクラス名
21
- # version 以下を参照
22
- attr_reader :class_name
23
- # @return [Western::Calendar] 暦の開始日
24
- attr_reader :start_date
25
-
26
- #
27
- # 初期化
28
- #
29
- # @param [String] class_name 暦のクラス名
30
- # @param [Western::Calendar] start_date 暦の開始日
31
- #
32
- def initialize(class_name:, start_date:)
33
- @class_name = class_name
34
- @start_date = start_date
35
- end
36
- end
37
-
38
- LIST = [
39
- Range.new(
40
- class_name: 'Zakuro::Genka::Gateway',
41
- start_date: Western::Calendar.new(year: 445, month: 1, day: 24)
42
- ),
43
- Range.new(
44
- class_name: 'Zakuro::Gihou::Gateway',
45
- start_date: Western::Calendar.new(year: 698, month: 2, day: 16)
46
- ),
47
- Range.new(
48
- class_name: 'Zakuro::Taien::Gateway',
49
- start_date: Western::Calendar.new(year: 764, month: 2, day: 7)
50
- ),
51
- Range.new(
52
- class_name: 'Zakuro::Senmyou::Gateway',
53
- start_date: Western::Calendar.new(year: 862, month: 2, day: 3)
54
- ),
55
- Range.new(
56
- class_name: 'Zakuro::Joukyou::Gateway',
57
- start_date: Western::Calendar.new(year: 1685, month: 2, day: 4)
58
- ),
59
- Range.new(
60
- class_name: 'Zakuro::Houryaku::Gateway',
61
- start_date: Western::Calendar.new(year: 1755, month: 2, day: 11)
62
- ),
63
- Range.new(
64
- class_name: 'Zakuro::Kansei::Gateway',
65
- start_date: Western::Calendar.new(year: 1798, month: 2, day: 16)
66
- ),
67
- Range.new(
68
- class_name: 'Zakuro::Tenpou::Gateway',
69
- start_date: Western::Calendar.new(year: 1844, month: 2, day: 18)
70
- ),
71
- Range.new(
72
- class_name: 'Zakuro::Gregorio::Gateway',
73
- start_date: Western::Calendar.new(year: 1872, month: 12, day: 9)
74
- )
75
- ].freeze
76
-
77
- #
78
- # 指定した日付から対象の暦を引き当てる
79
- #
80
- # @param [Western::Calendar] date 日付
81
- #
82
- # @return [String] 暦のクラス名
83
- #
84
- def self.class_name(date: Western::Calendar.new)
85
- LIST.reverse_each do |range|
86
- return range.class_name if date >= range.start_date
87
- end
88
- raise ArgumentError, "invalid date: #{date.format}"
89
- end
90
- end
91
-
92
- #
93
- # Gengou 元号情報
94
- #
95
- class Gengou
96
- # @return [String] 元号名
97
- attr_reader :name
98
- # @return [Western::Calendar] 開始日
99
- attr_reader :start_date
100
- # @return [Western::Calendar] 終了日
101
- attr_reader :end_date
102
- # @return [Integer] 元号年
103
- attr_reader :year
104
-
105
- #
106
- # 初期化
107
- #
108
- # @param [<Type>] name 元号名
109
- # @param [<Type>] start_date 開始日
110
- # @param [<Type>] end_date 終了日
111
- # @param [<Type>] year 元号年
112
- #
113
- def initialize(name: '', start_date: Western::Calendar.new,
114
- end_date: Western::Calendar.new, year: -1)
115
- @name = name
116
- @start_date = start_date
117
- @end_date = end_date
118
- @year = year
119
- end
120
-
121
- #
122
- # 終了日を更新する
123
- #
124
- # @param [Western::Calendar] end_date 終了日
125
- #
126
- def write_end_date(end_date:)
127
- unless Gengou.valid_date(date: end_date)
128
- raise ArgumentError, "invalid date format. [#{end_date}]"
129
- end
130
-
131
- @end_date = end_date
132
- nil
133
- end
134
-
135
- # :reek:NilCheck
136
-
137
- #
138
- # 日付が有効かどうかを確認する
139
- #
140
- # @param [Western::Calendar] date 日付
141
- #
142
- # @return [True] 有効
143
- # @return [False] 無効
144
- #
145
- def self.valid_date(date:)
146
- !date.nil? && date.is_a?(Western::Calendar)
147
- end
148
-
149
- #
150
- # 次の元号の開始日から、元号の終了日に変換する
151
- #
152
- # @param [String] next_start_date_string 次回開始日
153
- #
154
- def convert_next_start_date_to_end_date(next_start_date_string: '')
155
- raise ArgumentError, 'empty string cannot convert' if next_start_date_string.empty?
156
-
157
- start_date = Western::Calendar.parse(str: next_start_date_string)
158
- @end_date = start_date - 1
159
- nil
160
- end
161
-
162
- #
163
- # 指定した日が元号に含まれるか
164
- #
165
- # @param [Western::Calendar] date 日
166
- #
167
- # @return [True] 含まれる
168
- # @return [False] 含まれない
169
- #
170
- def include?(date:)
171
- date >= @start_date && date <= @end_date
172
- end
173
-
174
- #
175
- # 不正な元号データかを確認する
176
- #
177
- # @return [True] 正しくない
178
- # @return [True] 正しい
179
- #
180
- def invalid?
181
- @year == -1
182
- end
183
-
184
- #
185
- # 1元号年を追加する
186
- #
187
- def next_year
188
- @year += 1
189
- nil
190
- end
191
- end
192
-
193
- #
194
- # Set 元号セット
195
- #
196
- class Set
197
- # @return [Integer] 元号セットID
198
- attr_reader :id
199
- # @return [String] 元号セット名
200
- attr_reader :name
201
- # @return [Western::Calendar] 元号セットでの終了日
202
- attr_reader :end_date
203
- # @return [Array<Gengou>] 元号リスト
204
- attr_reader :list
205
-
206
- #
207
- # 初期化
208
- #
209
- # @param [Integer] id 元号セットID
210
- # @param [String] name 元号セット名
211
- # @param [Western::Calendar] end_date 元号セットでの終了日
212
- # @param [Array<Gengou>] list 元号リスト
213
- #
214
- def initialize(id: -1, name: '', end_date: Western::Calendar.new, list: [])
215
- @id = id
216
- @name = name
217
- @end_date = end_date
218
- @list = list
219
- end
220
-
221
- #
222
- # 指定した日付を含む元号を返す
223
- #
224
- # @param [Western::Calendar] date 日
225
- #
226
- # @return [Gengou] 元号
227
- #
228
- def include_item(date:)
229
- @list.each do |item|
230
- return item if item.include?(date: date)
231
- end
232
-
233
- Gengou.new
234
- end
235
-
236
- #
237
- # 元号セットが不正かどうかを確認する
238
- #
239
- # @return [True] 正しくない
240
- # @return [False] 正しい
241
- #
242
- def invalid?
243
- @id == -1
244
- end
245
- end
246
-
247
- #
248
- # Parser yaml解析
249
- #
250
- module Parser
251
- #
252
- # 検証する
253
- #
254
- # @param [Hash<String, Object>] yaml_hash yaml取得結果
255
- #
256
- # @return [Array<String>] 不正メッセージ
257
- #
258
- def self.validate(yaml_hash)
259
- SetParser.new(hash: yaml_hash).validate
260
- end
261
-
262
- #
263
- # GengouParser 元号情報の検証/展開を行う
264
- #
265
- class GengouParser
266
- # @return [Integer] 要素位置
267
- attr_reader :index
268
- # @return [String] 元号名
269
- attr_reader :name
270
- # @return [String] 開始日
271
- attr_reader :start_date
272
- # @return [String] 開始年
273
- attr_reader :start_year
274
-
275
- #
276
- # 初期化
277
- #
278
- # @param [Hash<String, Strin>] hash 元号情報
279
- # @param [Integer] index (元号セット内での)元号の要素位置
280
- #
281
- def initialize(hash:, index:)
282
- @index = index
283
- @name = hash['name']
284
- @start_date = hash['start_date']
285
- @start_year = hash['start_year']
286
- end
287
-
288
- # :reek:TooManyStatements { max_statements: 6 }
289
-
290
- #
291
- # 検証する
292
- #
293
- # @return [Array<String>] 不正メッセージ
294
- #
295
- def validate
296
- prefix = "list[#{index}]. "
297
- failed = []
298
-
299
- failed.push(prefix + "invalid name. #{@name}") unless valid_name_type?
300
-
301
- failed.push(prefix + "invalid start_date. #{@start_date}") unless valid_date_type?
302
-
303
- failed.push(prefix + "invalid start_year. #{@start_year}") unless valid_year_type?
304
- failed
305
- end
306
-
307
- # :reek:NilCheck
308
-
309
- #
310
- # 元号名を検証する
311
- #
312
- # @return [True] 正しい
313
- # @return [False] 正しくない
314
- #
315
- def valid_name_type?
316
- !(@name.nil? || !@name.is_a?(String))
317
- end
318
-
319
- #
320
- # 日付文字列を検証する
321
- #
322
- # @return [True] 正しい
323
- # @return [False] 正しくない
324
- #
325
- def valid_date_type?
326
- Western::Calendar.valid_date_string(str: @start_date)
327
- end
328
-
329
- # :reek:NilCheck
330
-
331
- #
332
- # 元号年を検証する
333
- #
334
- # @return [True] 正しい
335
- # @return [False] 正しくない
336
- #
337
- def valid_year_type?
338
- return true if @start_year.nil?
339
-
340
- @start_year.is_a?(Integer)
341
- end
342
-
343
- # :reek:NilCheck
344
-
345
- #
346
- # 元号情報を生成する
347
- #
348
- # @return [Gengou] 元号情報
349
- #
350
- def create
351
- start_date = Western::Calendar.parse(str: @start_date)
352
- start_year = @start_year.nil? ? 1 : @start_year
353
-
354
- Gengou.new(name: @name, start_date: start_date, year: start_year)
355
- end
356
- end
357
-
358
- #
359
- # SetParser 元号セット情報の検証/展開
360
- #
361
- class SetParser
362
- # @return [String] 元号セットID
363
- attr_reader :id
364
- # @return [String] 元号セット名
365
- attr_reader :name
366
- # @return [String] 終了日
367
- attr_reader :end_date
368
- # @return [Array<Hash<String, String>>] 元号情報
369
- attr_reader :list
370
-
371
- #
372
- # 初期化
373
- #
374
- # @param [Hash<String, Object>] hash 元号セット情報
375
- #
376
- def initialize(hash:)
377
- @id = hash['id']
378
- @name = hash['name']
379
- @end_date = hash['end_date']
380
- @list = hash['list']
381
- end
382
-
383
- # :reek:TooManyStatements { max_statements: 6 }
384
-
385
- #
386
- # 検証する
387
- #
388
- # @return [Array<String>] 不正メッセージ
389
- #
390
- def validate
391
- failed = []
392
- failed.push("invalid id. #{id}") unless valid_id_type?
393
-
394
- failed.push("invalid name. #{name}") unless valid_name_type?
395
-
396
- failed.push("invalid end_date. #{end_date}") unless valid_date_type?
397
-
398
- failed |= validate_list
399
- failed
400
- end
401
-
402
- # :reek:NilCheck
403
-
404
- #
405
- # IDを検証する
406
- #
407
- # @return [True] 正しい
408
- # @return [False] 正しくない
409
- #
410
- def valid_id_type?
411
- !(@id.nil? || !@id.is_a?(Integer))
412
- end
413
-
414
- #
415
- # 元号セット名を検証する
416
- #
417
- # @return [True] 正しい
418
- # @return [False] 正しくない
419
- #
420
- def valid_name_type?
421
- !(@name.nil? || !@name.is_a?(String))
422
- end
423
-
424
- #
425
- # 日付文字列を検証する
426
- #
427
- # @return [True] 正しい
428
- # @return [False] 正しくない
429
- #
430
- def valid_date_type?
431
- Western::Calendar.valid_date_string(str: @end_date)
432
- end
433
-
434
- # :reek:NilCheck
435
-
436
- #
437
- # 元号情報を検証する
438
- #
439
- # @return [True] 正しい
440
- # @return [False] 正しくない
441
- #
442
- def valid_list_type?
443
- (!@list.nil? || @list.is_a?(Array))
444
- end
445
-
446
- #
447
- # 元号情報を検証する
448
- #
449
- # @return [True] 正しい
450
- # @return [False] 正しくない
451
- #
452
- def validate_list
453
- return ["invalid list. #{@list.class}"] unless valid_list_type?
454
-
455
- failed = []
456
- list.each_with_index do |li, index|
457
- failed |= GengouParser.new(hash: li, index: index).validate
458
- end
459
- failed
460
- end
461
-
462
- #
463
- # 元号セット情報を生成する
464
- #
465
- # @return [Set] 元号セット情報
466
- #
467
- def create
468
- end_date = Western::Calendar.parse(str: @end_date)
469
- list = create_list
470
- Set.new(
471
- id: @id, name: @name, end_date: end_date, list: list
472
- )
473
- end
474
-
475
- # :reek:TooManyStatements { max_statements: 7 }
476
-
477
- #
478
- # 元号情報を生成する
479
- #
480
- # @return [Array<Gengou>] 元号情報
481
- #
482
- def create_list
483
- result = []
484
- @list.each_with_index do |li, index|
485
- gengou = GengouParser.new(hash: li, index: index).create
486
- next_index = index + 1
487
- gengou = calc_end_date_on_gengou_data(next_index: next_index,
488
- gengou: gengou)
489
- result.push(gengou)
490
- end
491
-
492
- result
493
- end
494
-
495
- # :reek:TooManyStatements { max_statements: 6 }
496
-
497
- #
498
- # 次の元号の開始日から、元号の終了日に変換する
499
- #
500
- # @param [Integer] next_index 次の元号の要素位置
501
- # @param [String] gengou 次回開始日
502
- #
503
- # @return [Gengou] 元号情報
504
- #
505
- def calc_end_date_on_gengou_data(next_index:, gengou:)
506
- if next_index >= @list.size
507
- end_date = Western::Calendar.parse(str: @end_date)
508
- gengou.write_end_date(end_date: end_date)
509
- return gengou
510
- end
511
- next_start_date = @list[next_index]['start_date']
512
- gengou.convert_next_start_date_to_end_date(
513
- next_start_date_string: next_start_date
514
- )
515
- gengou
516
- end
517
- end
518
-
519
- #
520
- # 解析/展開する
521
- #
522
- # @param [String] filepath 元号セットファイルパス
523
- #
524
- # @return [Set] 元号セット情報
525
- #
526
- def self.parse(filepath: '')
527
- yaml = YAML.load_file(filepath)
528
-
529
- parser = SetParser.new(hash: yaml)
530
- failed = parser.validate
531
- raise YAML::ParseError, failed.join('\n') unless failed.empty?
532
-
533
- parser.create
534
- end
535
- end
536
-
537
- #
538
- # GengouResource 元号情報
539
- #
540
- module GengouResource
541
- # @return [Array<Set>] 元号セット情報リスト
542
- LIST = [
543
- Parser.parse(filepath: File.expand_path(
544
- './gengou/set-001-until-south.yaml',
545
- __dir__
546
- )),
547
- Parser.parse(filepath: File.expand_path(
548
- './gengou/set-002-from-north.yaml',
549
- __dir__
550
- )),
551
- Parser.parse(filepath: File.expand_path(
552
- './gengou/set-003-modern.yaml',
553
- __dir__
554
- ))
555
- ].freeze
556
-
557
- # :reek:TooManyStatements { max_statements: 9 }
558
-
559
- #
560
- # 元号(1行目,2行目)を引き当てる
561
- #
562
- # * LINE配列の元号情報を配列順で「x行目」(1始まり)とする
563
- # * 1行目にデータがあれば、第一要素に1行目のデータが設定される
564
- # * 1行目と2行目にデータがあれば、第二要素に2行目のデータが設定される
565
- # * 1行目にデータがなく、2行目以降に1つだけデータがあれば、第一要素にそのデータを設定してそれ以外の要素は未設定
566
- # * 1行目にデータがなく、2行目以降に2つ以上のデータがあれば、第一要素に末尾行に一番近いデータを設定してそれ以外の要素は未設定
567
- #
568
- # @param [Western::Calendar] date 日
569
- #
570
- # @return [Array<Gengou>] 元号情報(1行目, 2行目)
571
- #
572
- def self.lines(date:)
573
- lines = native_lines(date: date)
574
- return lines unless lines[0].invalid?
575
-
576
- first = Japan::Gengou.new
577
- lines[1..-1].each.with_index(1) do |item, index|
578
- next if item.invalid?
579
-
580
- first = item
581
- lines[index] = Japan::Gengou.new
582
- end
583
- lines[0] = first
584
- lines
585
- end
586
-
587
- #
588
- # 元号を引き当てる
589
- #
590
- # * LISTから単純に元号を引き当てる
591
- # * 1行目,2行目といった概念は無視する
592
- #
593
- # @param [Western::Calendar] date 日
594
- #
595
- # @return [Array<Gengou>] 元号情報
596
- #
597
- def self.native_lines(date:)
598
- result = Array.new(LIST.size)
599
- LIST.each_with_index do |set, index|
600
- result[index] = set.include_item(date: date)
601
- end
602
- result
603
- end
604
-
605
- #
606
- # 「日本暦日原典」1行目の元号を返す
607
- #
608
- # @param [Western::Calendar] date 日
609
- #
610
- # @return [Gengou] 元号情報(1行目)
611
- #
612
- def self.first_line(date:)
613
- lines = lines(date: date)
614
- lines[0].clone
615
- end
616
-
617
- #
618
- # 「日本暦日原典」2行目の元号を返す
619
- #
620
- # @param [Western::Calendar] date 日
621
- #
622
- # @return [Gengou] 元号情報(2行目)
623
- #
624
- def self.second_line(date:)
625
- lines = lines(date: date)
626
- lines[1].clone
627
- end
628
- end
629
- end
630
- end