zakuro 0.9.1 → 0.9.3

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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +20 -18
  3. data/VERSION +1 -1
  4. data/doc/condition.md +3 -1
  5. data/doc/dropped_date.md +25 -0
  6. data/doc/expection.md +11 -0
  7. data/doc/operation/csv/month.csv +5 -5
  8. data/doc/operation/operation.xlsx +0 -0
  9. data/doc/vanished_date.md +26 -0
  10. data/lib/zakuro/calculation/cycle/abstract_remainder.rb +26 -0
  11. data/lib/zakuro/calculation/cycle/abstract_solar_term.rb +1 -1
  12. data/lib/zakuro/calculation/era/gengou/abstract_scroll.rb +2 -2
  13. data/lib/zakuro/calculation/era/gengou/dated_scroll.rb +6 -2
  14. data/lib/zakuro/calculation/era/gengou/internal/counter.rb +5 -5
  15. data/lib/zakuro/calculation/era/gengou/internal/reserve/abstract_list.rb +12 -5
  16. data/lib/zakuro/calculation/era/gengou/internal/reserve/abstract_range.rb +14 -8
  17. data/lib/zakuro/calculation/era/gengou/internal/reserve/dated_list.rb +3 -2
  18. data/lib/zakuro/calculation/era/gengou/internal/reserve/dated_range.rb +4 -2
  19. data/lib/zakuro/calculation/era/gengou/internal/reserve/named_list.rb +5 -3
  20. data/lib/zakuro/calculation/era/gengou/internal/reserve/named_range.rb +10 -5
  21. data/lib/zakuro/calculation/era/gengou/named_scroll.rb +5 -2
  22. data/lib/zakuro/calculation/monthly/initialized_month.rb +4 -2
  23. data/lib/zakuro/calculation/monthly/meta/all_solar_term.rb +64 -0
  24. data/lib/zakuro/calculation/monthly/meta/meta_collector.rb +80 -0
  25. data/lib/zakuro/calculation/monthly/meta.rb +60 -0
  26. data/lib/zakuro/calculation/monthly/month.rb +60 -5
  27. data/lib/zakuro/calculation/monthly/operated_month.rb +6 -3
  28. data/lib/zakuro/calculation/option/dropped_date/location.rb +12 -23
  29. data/lib/zakuro/calculation/option/vanished_date/location.rb +9 -2
  30. data/lib/zakuro/calculation/range/abstract_full_range.rb +19 -2
  31. data/lib/zakuro/calculation/range/abstract_operation_range.rb +20 -2
  32. data/lib/zakuro/calculation/range/dated_full_range.rb +3 -1
  33. data/lib/zakuro/calculation/range/dated_operation_range.rb +3 -1
  34. data/lib/zakuro/calculation/range/medieval_annual_range.rb +1 -1
  35. data/lib/zakuro/calculation/range/named_full_range.rb +3 -1
  36. data/lib/zakuro/calculation/range/named_operation_range.rb +3 -1
  37. data/lib/zakuro/calculation/range/transfer/gengou_scroller.rb +2 -1
  38. data/lib/zakuro/calculation/range/transfer/year_boundary.rb +10 -8
  39. data/lib/zakuro/calculation/stella/solar/abstract_average.rb +8 -34
  40. data/lib/zakuro/calculation/summary/internal/option.rb +51 -25
  41. data/lib/zakuro/calculation/summary/western/specifier/single_day.rb +1 -1
  42. data/lib/zakuro/era/japan/calendar.rb +2 -2
  43. data/lib/zakuro/era/japan/gengou/alignment/linear_gengou.rb +1 -1
  44. data/lib/zakuro/era/japan/gengou/alignment.rb +14 -2
  45. data/lib/zakuro/era/japan/gengou/resource/parser.rb +83 -25
  46. data/lib/zakuro/era/japan/gengou/resource/type.rb +81 -26
  47. data/lib/zakuro/era/japan/gengou/resource/validator.rb +102 -23
  48. data/lib/zakuro/era/japan/gengou/resource/yaml/set-001-until-south.yaml +1123 -375
  49. data/lib/zakuro/era/japan/gengou/resource/yaml/set-002-from-north.yaml +487 -163
  50. data/lib/zakuro/era/japan/gengou/resource/yaml/set-003-modern.yaml +30 -10
  51. data/lib/zakuro/era/japan/gengou/resource.rb +16 -0
  52. data/lib/zakuro/era/japan/gengou.rb +7 -4
  53. data/lib/zakuro/era/western/calendar.rb +5 -11
  54. data/lib/zakuro/era/western/date_text.rb +40 -0
  55. data/lib/zakuro/gateway/locale/date.rb +2 -2
  56. data/lib/zakuro/operation/month/validator.rb +7 -1
  57. data/lib/zakuro/operation/yaml/month.yaml +15 -15
  58. data/lib/zakuro/output/logger.rb +21 -3
  59. data/lib/zakuro/tools/remainder_comparer.rb +97 -0
  60. metadata +7 -2
@@ -5,16 +5,24 @@ last_year:
5
5
  japan: 7981
6
6
  western: 9999
7
7
  last_date:
8
- japan: 令和7981年12月31日
9
- western: '9999-12-31'
8
+ calculation:
9
+ japan: ''
10
+ western: ''
11
+ operation:
12
+ japan: 令和7981年12月31日
13
+ western: '9999-12-31'
10
14
  list:
11
15
  - name: 明治
12
16
  start_year:
13
17
  japan: 1
14
18
  western: 1868
15
19
  start_date:
16
- japan: 明治01年09月08日
17
- western: '1868-10-23'
20
+ calculation:
21
+ japan: ''
22
+ western: ''
23
+ operation:
24
+ japan: 明治01年09月08日
25
+ western: '1868-10-23'
18
26
  disuse:
19
27
  new_year_date: '1868-1-25'
20
28
  note: ''
@@ -23,8 +31,12 @@ list:
23
31
  japan: 1
24
32
  western: 1912
25
33
  start_date:
26
- japan: 大正01年07月30日
27
- western: '1912-7-30'
34
+ calculation:
35
+ japan: ''
36
+ western: ''
37
+ operation:
38
+ japan: 大正01年07月30日
39
+ western: '1912-7-30'
28
40
  disuse:
29
41
  new_year_date: '1912-1-1'
30
42
  note: ''
@@ -33,8 +45,12 @@ list:
33
45
  japan: 1
34
46
  western: 1926
35
47
  start_date:
36
- japan: 昭和01年12月25日
37
- western: '1926-12-25'
48
+ calculation:
49
+ japan: ''
50
+ western: ''
51
+ operation:
52
+ japan: 昭和01年12月25日
53
+ western: '1926-12-25'
38
54
  disuse:
39
55
  new_year_date: '1926-1-1'
40
56
  note: ''
@@ -43,8 +59,12 @@ list:
43
59
  japan: 1
44
60
  western: 2019
45
61
  start_date:
46
- japan: 令和01年05月01日
47
- western: '2019-5-1'
62
+ calculation:
63
+ japan: ''
64
+ western: ''
65
+ operation:
66
+ japan: 令和01年05月01日
67
+ western: '2019-5-1'
48
68
  disuse:
49
69
  new_year_date: '2019-1-1'
50
70
  note: ''
@@ -27,6 +27,22 @@ module Zakuro
27
27
  __dir__
28
28
  ))
29
29
  ].freeze
30
+
31
+ # @return [Array<Set>] 元号セット情報リスト(運用値)
32
+ OPERATED_LIST = [
33
+ Parser.run(filepath: File.expand_path(
34
+ './resource/yaml/set-001-until-south.yaml',
35
+ __dir__
36
+ ), operated: true),
37
+ Parser.run(filepath: File.expand_path(
38
+ './resource/yaml/set-002-from-north.yaml',
39
+ __dir__
40
+ ), operated: true),
41
+ Parser.run(filepath: File.expand_path(
42
+ './resource/yaml/set-003-modern.yaml',
43
+ __dir__
44
+ ), operated: true)
45
+ ].freeze
30
46
  end
31
47
  end
32
48
  end
@@ -26,13 +26,15 @@ module Zakuro
26
26
  # @param [Integer] line 行番号
27
27
  # @param [Western::Calendar] start_date 開始日
28
28
  # @param [Western::Calendar] last_date 終了日
29
+ # @param [True, False] operated 運用値設定
29
30
  #
30
31
  # @return [Array<LinearGengou>] 該当行の元号
31
32
  #
32
33
  def line(line: FIRST_LINE,
33
- start_date: Western::Calendar.new, last_date: Western::Calendar.new)
34
+ start_date: Western::Calendar.new, last_date: Western::Calendar.new,
35
+ operated: false)
34
36
  Alignment.get(
35
- line: line, start_date: start_date, last_date: last_date
37
+ line: line, start_date: start_date, last_date: last_date, operated: operated
36
38
  )
37
39
  end
38
40
 
@@ -42,11 +44,12 @@ module Zakuro
42
44
  # @param [Integer] line 行番号
43
45
  # @param [Western::Calendar] start_date 開始日
44
46
  # @param [Western::Calendar] last_date 終了日
47
+ # @param [True, False] operated 運用値設定
45
48
  #
46
49
  # @return [Array<LinearGengou>] 該当行の元号
47
50
  #
48
- def line_by_name(line: FIRST_LINE, name:)
49
- Alignment.get_by_name(line: line, name: name)
51
+ def line_by_name(line: FIRST_LINE, name:, operated: false)
52
+ Alignment.get_by_name(line: line, name: name, operated: operated)
50
53
  end
51
54
  end
52
55
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative './date_text'
4
+
3
5
  require 'date'
4
6
 
5
7
  # :nodoc:
@@ -402,9 +404,7 @@ module Zakuro
402
404
  # @raise [ArgumentError] 引数エラー
403
405
  #
404
406
  def parse(text: '', type: Type::DEFAULT)
405
- unless valid_date_string(text: text, type: type)
406
- raise ArgumentError, "invalid date string: #{text}"
407
- end
407
+ raise ArgumentError, "invalid date string: #{text}" unless valid_date_text(text: text)
408
408
 
409
409
  start = DATE_START.fetch(type, DATE_START[Type::DEFAULT])
410
410
  date = Date.parse(text, start)
@@ -423,14 +423,8 @@ module Zakuro
423
423
  # @return [True] 正しい
424
424
  # @return [True] 正しくない
425
425
  #
426
- def valid_date_string(text: '', type: Type::DEFAULT)
427
- start = DATE_START.fetch(type, DATE_START[Type::DEFAULT])
428
- begin
429
- Date.parse(text, start)
430
- rescue ArgumentError => _e
431
- return false
432
- end
433
- true
426
+ def valid_date_text(text: '')
427
+ DateText.validate(text: text)
434
428
  end
435
429
  end
436
430
  end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nodoc:
4
+ module Zakuro
5
+ #
6
+ # Western 西暦
7
+ #
8
+ module Western
9
+ #
10
+ # DateText 日付文字列
11
+ #
12
+ module DateText
13
+ # @return [Regexp] ハイフン区切り
14
+ HYPHEN = /^[0-9]{1,5}-[0-9]{1,2}-[0-9]{1,2}$/.freeze
15
+ # @return [Regexp] スラッシュ区切り
16
+ SLASH = %r{^[0-9]{1,5}/[0-9]{1,2}/[0-9]{1,2}$}.freeze
17
+
18
+ #
19
+ # 有効な日付文字列か検証する
20
+ #
21
+ # * 従来は Date.parse で日付文字列を検証していた
22
+ # * [貞観4年3月20日] のような文字列でも有効扱いになっていた
23
+ # * [20] [20日] のように2桁の数字が含まれると有効な日付扱いされる
24
+ # * 特定のフォーマットのみ受け付けるように改変した
25
+ #
26
+ # @param [String] text 文字列
27
+ #
28
+ # @return [True] 有効
29
+ # @return [True] 無効
30
+ #
31
+ def self.validate(text: '')
32
+ return true if HYPHEN.match(text)
33
+
34
+ return true if SLASH.match(text)
35
+
36
+ false
37
+ end
38
+ end
39
+ end
40
+ end
@@ -112,12 +112,12 @@ module Zakuro
112
112
  # @param [String] text 日付文字列
113
113
  #
114
114
  def parse_text(text:)
115
- if Western::Calendar.valid_date_string(text: text)
115
+ if Western::Calendar.valid_date_text(text: text)
116
116
  @western_date = Western::Calendar.parse(text: text)
117
117
  return
118
118
  end
119
119
 
120
- return unless Japan::Calendar.valid_date_string(text: text)
120
+ return unless Japan::Calendar.valid_date_text(text: text)
121
121
 
122
122
  @japan_date = Japan::Calendar.parse(text: text)
123
123
  end
@@ -136,7 +136,13 @@ module Zakuro
136
136
  def western_date?(str: '')
137
137
  return Western::Calendar.new if str == EMPTY_STRING
138
138
 
139
- Western::Calendar.valid_date_string(text: str)
139
+ # 1316-11-16/1317-4-13
140
+ dates = str.split('/')
141
+ dates.each do |date|
142
+ return true if Western::Calendar.valid_date_text(text: date)
143
+ end
144
+
145
+ false
140
146
  end
141
147
  end
142
148
  end
@@ -3091,7 +3091,7 @@
3091
3091
  dest: "-"
3092
3092
  days:
3093
3093
  src: 大
3094
- dest:
3094
+ dest:
3095
3095
  solar_term:
3096
3096
  src:
3097
3097
  index: "-"
@@ -11697,11 +11697,11 @@
11697
11697
  diffs:
11698
11698
  month:
11699
11699
  number:
11700
- src: "-"
11701
- dest: "-"
11700
+ src: '8'
11701
+ dest: '7'
11702
11702
  leaped:
11703
- src: "-"
11704
- dest: "-"
11703
+ src: 'false'
11704
+ dest: 'true'
11705
11705
  days:
11706
11706
  src: 大
11707
11707
  dest: 小
@@ -11730,11 +11730,11 @@
11730
11730
  diffs:
11731
11731
  month:
11732
11732
  number:
11733
- src: "-"
11734
- dest: "-"
11733
+ src: '8'
11734
+ dest: '8'
11735
11735
  leaped:
11736
- src: "-"
11737
- dest: "-"
11736
+ src: 'true'
11737
+ dest: 'false'
11738
11738
  days:
11739
11739
  src: 大
11740
11740
  dest: 大
@@ -15070,10 +15070,10 @@
15070
15070
  diffs:
15071
15071
  month:
15072
15072
  number:
15073
- src: '11'
15073
+ src: '12'
15074
15074
  dest: '11'
15075
15075
  leaped:
15076
- src: 'true'
15076
+ src: 'false'
15077
15077
  dest: 'false'
15078
15078
  days:
15079
15079
  src: 大
@@ -15102,11 +15102,11 @@
15102
15102
  diffs:
15103
15103
  month:
15104
15104
  number:
15105
- src: "-"
15106
- dest: "-"
15105
+ src: '12'
15106
+ dest: '12'
15107
15107
  leaped:
15108
- src: "-"
15109
- dest: "-"
15108
+ src: 'true'
15109
+ dest: 'false'
15110
15110
  days:
15111
15111
  src: 大
15112
15112
  dest: 大
@@ -9,6 +9,7 @@ module Zakuro
9
9
  # @note 本番では使用しない
10
10
  #
11
11
  class Logger
12
+ # @return [Hash<Symbol, Integer>] ログレベル
12
13
  LEVELS = {
13
14
  none: -1,
14
15
  debug: 0,
@@ -17,6 +18,7 @@ module Zakuro
17
18
  error: 3
18
19
  }.freeze
19
20
 
21
+ # @return [Integer] 現在ログレベル
20
22
  LEVEL = LEVELS[:none]
21
23
 
22
24
  # @return [String] 呼び出し位置
@@ -32,7 +34,9 @@ module Zakuro
32
34
  # @param [String] messages メッセージ
33
35
  #
34
36
  def debug(*messages)
35
- return if LEVEL < LEVELS[:debug]
37
+ return if none?
38
+
39
+ return if LEVEL >= LEVELS[:debug]
36
40
 
37
41
  output('DEBUG', *messages)
38
42
  end
@@ -43,7 +47,9 @@ module Zakuro
43
47
  # @param [String] messages メッセージ
44
48
  #
45
49
  def info(*messages)
46
- return if LEVEL < LEVELS[:info]
50
+ return if none?
51
+
52
+ return if LEVEL >= LEVELS[:info]
47
53
 
48
54
  output('INFO', *messages)
49
55
  end
@@ -55,7 +61,9 @@ module Zakuro
55
61
  # @param [String] messages メッセージ
56
62
  #
57
63
  def error(error, *messages)
58
- return if LEVEL < LEVELS[:error]
64
+ return if none?
65
+
66
+ return if LEVEL >= LEVELS[:error]
59
67
 
60
68
  output('ERROR', *messages)
61
69
  output('ERROR', error.message)
@@ -64,6 +72,16 @@ module Zakuro
64
72
 
65
73
  private
66
74
 
75
+ #
76
+ # 出力なしか
77
+ #
78
+ # @return [True] 出力なし
79
+ # @return [False] 出力あり
80
+ #
81
+ def none?
82
+ LEVEL < LEVELS[:debug]
83
+ end
84
+
67
85
  #
68
86
  # 標準出力を行う
69
87
  #
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../output/logger'
4
+
5
+ require_relative '../calculation/cycle/abstract_remainder'
6
+
7
+ # :nodoc:
8
+ module Zakuro
9
+ #
10
+ # Tools 汎用メソッド群
11
+ #
12
+ module Tools
13
+ #
14
+ # RemainderComparer 大余小余比較
15
+ #
16
+ module RemainderComparer
17
+ LOGGER = Output::Logger.new(location: 'RemainderComparer')
18
+
19
+ class << self
20
+ #
21
+ # 大余を基準に範囲チェックをする
22
+ #
23
+ # 次のパターンで用いる
24
+ # 1. 月内(当月朔日から当月末日(来月朔日の前日)の間)に二十四節気があるか
25
+ # * target: 二十四節気
26
+ # * start: 当月朔日
27
+ # * last: 次月朔日
28
+ # 2. ある二十四節気に対象の日があるか
29
+ # * target: 対象の日
30
+ # * start: 二十四節気
31
+ # * last: 次の二十四節気
32
+ #
33
+ # @param [Calcuration::Cycle::AbstractRemainder] target 対象日
34
+ # @param [Calcuration::Cycle::AbstractRemainder] start 範囲開始
35
+ # @param [Calcuration::Cycle::AbstractRemainder] last 範囲終了
36
+ #
37
+ # @return [True] 対象日がある
38
+ # @return [False] 対象日がない
39
+ #
40
+ def in_range?(target:, start:, last:)
41
+ # 『日本暦日便覧』では下記5日を没日ありとしている
42
+ # これは二十四節気の小余と秒が0の場合に限って、範囲を翌日にずらすことを指している
43
+ #
44
+ # * 貞観12年7月18日
45
+ # * 天喜5年3月11日
46
+ # * 寛元1年11月4日
47
+ # * 永享2年7月26日
48
+ # * 元和3年3月19日
49
+ #
50
+ last_day = last.only_day? ? last.day + 1 : last.day
51
+ in_range_day?(target: target.day, start: start.day, last: last_day)
52
+ end
53
+
54
+ #
55
+ # 大余を基準に範囲チェックをする
56
+ #
57
+ # @param [Calcuration::Cycle::AbstractRemainder] target 対象日
58
+ # @param [Calcuration::Cycle::AbstractRemainder] start 範囲開始
59
+ # @param [Integer] limit 大余上限
60
+ #
61
+ # @return [True] 対象日がある
62
+ # @return [False] 対象日がない
63
+ #
64
+ def in_limit?(target:, start:, limit:)
65
+ last_day = start.add_day(limit).day
66
+
67
+ in_range_day?(target: target.day, start: start.day, last: last_day)
68
+ end
69
+
70
+ private
71
+
72
+ #
73
+ # 大余を基準に範囲チェックをする
74
+ #
75
+ # @note 大余60で一巡するため 以下2パターンがある
76
+ # * start <= last : (二十四節気) >= start && (二十四節気) < last
77
+ # * start > last : (二十四節気) >= start || (二十四節気) < last
78
+ #
79
+ # @param [Integer] target 対象日
80
+ # @param [Integer] start 範囲開始
81
+ # @param [Integer] last 範囲終了
82
+ #
83
+ # @return [True] 対象日がある
84
+ # @return [False] 対象日がない
85
+ #
86
+ def in_range_day?(target:, start:, last:)
87
+ start_over = (target >= start)
88
+ last_under = (target < last)
89
+
90
+ return start_over && last_under if start <= last
91
+
92
+ start_over || last_under
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zakuro
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - pldb
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-11-25 00:00:00.000000000 Z
11
+ date: 2023-03-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: mainly lunar solar calendar
14
14
  email:
@@ -86,6 +86,9 @@ files:
86
86
  - lib/zakuro/calculation/monthly/const.rb
87
87
  - lib/zakuro/calculation/monthly/first_day.rb
88
88
  - lib/zakuro/calculation/monthly/initialized_month.rb
89
+ - lib/zakuro/calculation/monthly/meta.rb
90
+ - lib/zakuro/calculation/monthly/meta/all_solar_term.rb
91
+ - lib/zakuro/calculation/monthly/meta/meta_collector.rb
89
92
  - lib/zakuro/calculation/monthly/month.rb
90
93
  - lib/zakuro/calculation/monthly/month_label.rb
91
94
  - lib/zakuro/calculation/monthly/operated_month.rb
@@ -143,6 +146,7 @@ files:
143
146
  - lib/zakuro/era/japan/gengou/resource/yaml/set-003-modern.yaml
144
147
  - lib/zakuro/era/japan/version.rb
145
148
  - lib/zakuro/era/western/calendar.rb
149
+ - lib/zakuro/era/western/date_text.rb
146
150
  - lib/zakuro/exception/case/pattern.rb
147
151
  - lib/zakuro/exception/case/preset.rb
148
152
  - lib/zakuro/exception/case/template.rb
@@ -180,6 +184,7 @@ files:
180
184
  - lib/zakuro/result/operation/month/annotation.rb
181
185
  - lib/zakuro/result/operation/month/history.rb
182
186
  - lib/zakuro/result/result.rb
187
+ - lib/zakuro/tools/remainder_comparer.rb
183
188
  - lib/zakuro/tools/stringifier.rb
184
189
  - lib/zakuro/tools/typeconv.rb
185
190
  - lib/zakuro/tools/typeof.rb