zakuro 0.1.2 → 0.1.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/lib/zakuro/calculation/base/multi_gengou.rb +101 -0
  3. data/lib/zakuro/calculation/base/multi_gengou_roller.rb +218 -0
  4. data/lib/zakuro/calculation/base/year.rb +107 -0
  5. data/lib/zakuro/calculation/cycle/abstract_remainder.rb +459 -0
  6. data/lib/zakuro/calculation/cycle/abstract_solar_term.rb +151 -0
  7. data/lib/zakuro/calculation/cycle/zodiac.rb +106 -0
  8. data/lib/zakuro/calculation/monthly/first_day.rb +45 -0
  9. data/lib/zakuro/calculation/monthly/initialized_month.rb +120 -0
  10. data/lib/zakuro/calculation/monthly/month.rb +184 -0
  11. data/lib/zakuro/calculation/monthly/month_label.rb +88 -0
  12. data/lib/zakuro/calculation/monthly/operated_month.rb +201 -0
  13. data/lib/zakuro/calculation/range/full_range.rb +210 -0
  14. data/lib/zakuro/calculation/range/operated_range.rb +134 -0
  15. data/lib/zakuro/calculation/range/operated_solar_terms.rb +201 -0
  16. data/lib/zakuro/calculation/range/transfer/western_date_allocation.rb +76 -0
  17. data/lib/zakuro/calculation/range/transfer/year_boundary.rb +142 -0
  18. data/lib/zakuro/calculation/specifier/single_day.rb +109 -0
  19. data/lib/zakuro/calculation/summary/single.rb +129 -0
  20. data/lib/zakuro/merchant.rb +2 -2
  21. data/lib/zakuro/output/error.rb +7 -6
  22. data/lib/zakuro/output/logger.rb +50 -49
  23. data/lib/zakuro/output/response.rb +145 -144
  24. data/lib/zakuro/tools/typeof.rb +2 -2
  25. data/lib/zakuro/version.rb +1 -1
  26. data/lib/zakuro/version/abstract_version.rb +1 -1
  27. data/lib/zakuro/version/context.rb +23 -0
  28. data/lib/zakuro/version/senmyou/cycle/remainder.rb +63 -0
  29. data/lib/zakuro/version/senmyou/cycle/solar_term.rb +31 -0
  30. data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +186 -182
  31. data/lib/zakuro/version/senmyou/range/annual_range.rb +134 -129
  32. data/lib/zakuro/version/senmyou/senmyou.rb +10 -4
  33. data/lib/zakuro/version/senmyou/stella/lunar_orbit.rb +5 -5
  34. data/lib/zakuro/version/senmyou/stella/solar_average.rb +4 -4
  35. data/lib/zakuro/version/senmyou/stella/solar_location.rb +27 -27
  36. data/lib/zakuro/version/senmyou/stella/solar_orbit.rb +2 -2
  37. data/lib/zakuro/version/senmyou/stella/winter_solstice.rb +4 -4
  38. data/lib/zakuro/version/version_class_resolver.rb +62 -0
  39. data/lib/zakuro/version_factory.rb +2 -2
  40. metadata +24 -22
  41. data/lib/zakuro/cycle/abstract_remainder.rb +0 -456
  42. data/lib/zakuro/cycle/zodiac.rb +0 -103
  43. data/lib/zakuro/version/senmyou/base/era.rb +0 -83
  44. data/lib/zakuro/version/senmyou/base/multi_gengou.rb +0 -98
  45. data/lib/zakuro/version/senmyou/base/multi_gengou_roller.rb +0 -217
  46. data/lib/zakuro/version/senmyou/base/remainder.rb +0 -60
  47. data/lib/zakuro/version/senmyou/base/solar_term.rb +0 -148
  48. data/lib/zakuro/version/senmyou/base/year.rb +0 -104
  49. data/lib/zakuro/version/senmyou/monthly/first_day.rb +0 -44
  50. data/lib/zakuro/version/senmyou/monthly/initialized_month.rb +0 -119
  51. data/lib/zakuro/version/senmyou/monthly/month.rb +0 -181
  52. data/lib/zakuro/version/senmyou/monthly/month_label.rb +0 -87
  53. data/lib/zakuro/version/senmyou/monthly/operated_month.rb +0 -196
  54. data/lib/zakuro/version/senmyou/range/full_range.rb +0 -194
  55. data/lib/zakuro/version/senmyou/range/operated_range.rb +0 -126
  56. data/lib/zakuro/version/senmyou/range/operated_solar_terms.rb +0 -181
  57. data/lib/zakuro/version/senmyou/range/western_date_allocation.rb +0 -68
  58. data/lib/zakuro/version/senmyou/range/year_boundary.rb +0 -138
  59. data/lib/zakuro/version/senmyou/specifier/single_day_specifier.rb +0 -102
  60. data/lib/zakuro/version/senmyou/summary/single.rb +0 -125
@@ -0,0 +1,151 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './abstract_remainder'
4
+
5
+ # :nodoc:
6
+ module Zakuro
7
+ # :nodoc:
8
+ module Calculation
9
+ # :nodoc:
10
+ module Cycle
11
+ #
12
+ # AbstractSolarTerm 二十四節気
13
+ #
14
+ class AbstractSolarTerm
15
+ # @return [Integer] 連番
16
+ attr_reader :index
17
+ # @return [AbstractRemainder] 時刻情報(大余小余)
18
+ attr_reader :remainder
19
+ # @return [AbstractRemainder] 気策(24分の1年)
20
+ attr_reader :average
21
+
22
+ # @return [Hash<Integer, Symbol>] 順序
23
+ ORDER = {
24
+ 0 => :touji,
25
+ 1 => :shoukan,
26
+ 2 => :daikan,
27
+ 3 => :risshun,
28
+ 4 => :usui,
29
+ 5 => :keichitsu,
30
+ 6 => :shunbun,
31
+ 7 => :seimei,
32
+ 8 => :kokuu,
33
+ 9 => :rikka,
34
+ 10 => :shouman,
35
+ 11 => :boushu,
36
+ 12 => :geshi,
37
+ 13 => :shousho,
38
+ 14 => :taisho,
39
+ 15 => :risshuu,
40
+ 16 => :shosho,
41
+ 17 => :hakuro,
42
+ 18 => :shuubun,
43
+ 19 => :kanro,
44
+ 20 => :soukou,
45
+ 21 => :rittou,
46
+ 22 => :shousetsu,
47
+ 23 => :taisetsu
48
+ }.freeze
49
+
50
+ #
51
+ # 初期化
52
+ #
53
+ # @param [Integer] index 連番
54
+ # @param [AbstractRemainder] remainder 時刻情報(大余小余)
55
+ #
56
+ def initialize(index: -1, remainder: AbstractRemainder.new,
57
+ average: AbstractRemainder.new)
58
+ @index = index
59
+ @remainder = remainder
60
+ @average = average
61
+ end
62
+
63
+ #
64
+ # 不正かどうか検証する
65
+ #
66
+ # @return [True] 正しくない
67
+ # @return [False] 正しい
68
+ #
69
+ def invalid?
70
+ (@index == -1 || @remainder.invalid?)
71
+ end
72
+
73
+ #
74
+ # データなしかを検証する
75
+ #
76
+ # @return [True] データなし
77
+ # @return [False] データあり
78
+ #
79
+ def empty?
80
+ (@index == -1 && @remainder.invalid?)
81
+ end
82
+
83
+ def index?(index)
84
+ result = ORDER.fetch(index, -1)
85
+
86
+ result != -1
87
+ end
88
+
89
+ #
90
+ # 次の二十四節気に進める
91
+ #
92
+ def next!
93
+ @index += 1
94
+ @index = 0 if @index >= ORDER.size
95
+
96
+ @remainder.add!(@average)
97
+ end
98
+
99
+ #
100
+ # 指定した連番の二十四節気まで進める
101
+ #
102
+ # @param [Integer] index 連番
103
+ #
104
+ def next_by_index(index)
105
+ return ArgumentError.new, 'invalid index' unless index?(index)
106
+
107
+ loop do
108
+ return if @index == index
109
+
110
+ next!
111
+ end
112
+ end
113
+
114
+ #
115
+ # 指定した連番の二十四節気まで戻す
116
+ #
117
+ # @param [Integer] index 連番
118
+ #
119
+ def prev_by_index(index)
120
+ return ArgumentError.new, 'invalid index' unless index?(index)
121
+
122
+ loop do
123
+ return if @index == index
124
+
125
+ prev!
126
+ end
127
+ end
128
+
129
+ #
130
+ # 前の二十四節気に戻る
131
+ #
132
+ def prev!
133
+ @index -= 1
134
+ @index = 23 if @index.negative?
135
+
136
+ @remainder.sub!(@average)
137
+ end
138
+
139
+ #
140
+ # ディープコピー
141
+ #
142
+ # @param [SolarTerm] obj 自身
143
+ #
144
+ def initialize_copy(obj)
145
+ @index = obj.index.clone
146
+ @remainder = obj.remainder.clone
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nodoc:
4
+ module Zakuro
5
+ # :nodoc:
6
+ module Calculation
7
+ # :nodoc:
8
+ module Cycle
9
+ #
10
+ # Zodiac 十干十二支
11
+ #
12
+ module Zodiac
13
+ # @return [Hash<Integer, String>] 十干十二支
14
+ ZODIAC_NAME_PATTERNS = {
15
+ 0 => '甲子', # きのえね
16
+ 1 => '乙丑', # きのとうし
17
+ 2 => '丙寅', # ひのえとら
18
+ 3 => '丁卯', # ひのとう
19
+ 4 => '戊辰', # つちのえたつ
20
+ 5 => '己巳', # つちのとみ
21
+ 6 => '庚午', # かのえうま
22
+ 7 => '辛未', # かのとひつじ
23
+ 8 => '壬申', # みずのえさる
24
+ 9 => '癸酉', # みずのととり
25
+ 10 => '甲戌', # きのえいぬ
26
+ 11 => '乙亥', # きのとい
27
+ 12 => '丙子', # ひのえね
28
+ 13 => '丁丑', # ひのとうし
29
+ 14 => '戊寅', # つちのえとら
30
+ 15 => '己卯', # つちのとう
31
+ 16 => '庚辰', # かのえたつ
32
+ 17 => '辛巳', # かのとみ
33
+ 18 => '壬午', # みずのえうま
34
+ 19 => '癸未', # みずのとひつじ
35
+ 20 => '甲申', # きのえさる
36
+ 21 => '乙酉', # きのととり
37
+ 22 => '丙戌', # ひのえいぬ
38
+ 23 => '丁亥', # ひのとい
39
+ 24 => '戊子', # つちのえね
40
+ 25 => '己丑', # つちのとうし
41
+ 26 => '庚寅', # かのえとら
42
+ 27 => '辛卯', # かのとう
43
+ 28 => '壬辰', # みずのえたつ
44
+ 29 => '癸巳', # みずのとみ
45
+ 30 => '甲午', # きのえうま
46
+ 31 => '乙未', # きのとひつじ
47
+ 32 => '丙申', # ひのえさる
48
+ 33 => '丁酉', # ひのととり
49
+ 34 => '戊戌', # つちのえいぬ
50
+ 35 => '己亥', # つちのとい
51
+ 36 => '庚子', # かのえね
52
+ 37 => '辛丑', # かのとうし
53
+ 38 => '壬寅', # みずのえとら
54
+ 39 => '癸卯', # みずのとう
55
+ 40 => '甲辰', # きのえたつ
56
+ 41 => '乙巳', # きのとみ
57
+ 42 => '丙午', # ひのえうま
58
+ 43 => '丁未', # ひのとひつじ
59
+ 44 => '戊申', # つちのえさる
60
+ 45 => '己酉', # つちのととり
61
+ 46 => '庚戌', # かのえいぬ
62
+ 47 => '辛亥', # かのとい
63
+ 48 => '壬子', # みずのえね
64
+ 49 => '癸丑', # みずのとうし
65
+ 50 => '甲寅', # きのえとら
66
+ 51 => '乙卯', # きのとう
67
+ 52 => '丙辰', # ひのえたつ
68
+ 53 => '丁巳', # ひのとみ
69
+ 54 => '戊午', # つちのえうま
70
+ 55 => '己未', # つちのとひつじ
71
+ 56 => '庚申', # かのえさる
72
+ 57 => '辛酉', # かのととり
73
+ 58 => '壬戌', # みずのえいぬ
74
+ 59 => '癸亥' # みずのとい
75
+ }.freeze
76
+
77
+ # @return [Integer] 組み合わせ数
78
+ LENGTH = ZODIAC_NAME_PATTERNS.length
79
+
80
+ #
81
+ # 大余を十干十二支に変換する
82
+ #
83
+ # @param [Integer] day 大余
84
+ #
85
+ # @return [String] 十干十二支
86
+ #
87
+ def self.day_name(day:)
88
+ index = day % LENGTH
89
+
90
+ ZODIAC_NAME_PATTERNS[index]
91
+ end
92
+
93
+ #
94
+ # 西暦年を十干十二支に変換する
95
+ #
96
+ # @param [Integer] western_year 西暦年
97
+ #
98
+ # @return [String] 十干十二支
99
+ #
100
+ def self.year_name(western_year: 0)
101
+ ZODIAC_NAME_PATTERNS[(western_year - 4) % LENGTH]
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../era/western'
4
+
5
+ # :nodoc:
6
+ module Zakuro
7
+ # :nodoc:
8
+ module Calculation
9
+ # :nodoc:
10
+ module Monthly
11
+ #
12
+ # FirstDay 月初日(朔日)
13
+ #
14
+ class FirstDay
15
+ # @return [Western::Calendar] 西暦日
16
+ attr_reader :western_date
17
+ # @return [Remainder] 大余小余
18
+ attr_reader :remainder
19
+
20
+ #
21
+ # 初期化
22
+ #
23
+ # @param [Remainder] remainder 西暦日
24
+ # @param [Western::Calendar] western_date 大余小余
25
+ #
26
+ def initialize(western_date: Western::Calendar.new, remainder: Remainder.new)
27
+ # 西暦日
28
+ @western_date = western_date
29
+ # 大余小余
30
+ @remainder = remainder
31
+ end
32
+
33
+ #
34
+ # ディープコピー
35
+ #
36
+ # @param [FirstDay] obj 自身
37
+ #
38
+ def initialize_copy(obj)
39
+ @western_date = obj.western_date.clone
40
+ @remainder = obj.remainder.clone
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './month'
4
+
5
+ # :nodoc:
6
+ module Zakuro
7
+ # :nodoc:
8
+ module Calculation
9
+ # :nodoc:
10
+ module Monthly
11
+ #
12
+ # InitializedMonth 初期月情報
13
+ #
14
+ class InitializedMonth < Month
15
+ # @return [True] 昨年の月
16
+ # @return [False] 今年の月
17
+ # @note 冬至基準で1年データを作成するため昨年の11月-12月である可能性がある
18
+ attr_reader :is_last_year
19
+ # @return [Integer] 月齢(朔月、上弦、望月、下弦)
20
+ attr_reader :phase_index
21
+
22
+ # :reek:ControlParameter and :reek:BooleanParameter
23
+
24
+ #
25
+ # 初期化
26
+ #
27
+ # @param [MonthLabel] month_label 月表示名
28
+ # @param [Array<SolarTerm>] solar_terms 二十四節気
29
+ # @param [FirstDay] first_day 月初日(朔日)
30
+ # @param [True, False] is_last_year 昨年の月/今年の月
31
+ # @param [Integer] phase_index 月齢(朔月、上弦、望月、下弦)
32
+ #
33
+ def initialize(month_label: MonthLabel.new, solar_terms: [], first_day: FirstDay.new,
34
+ is_last_year: false, phase_index: -1)
35
+ super(month_label: month_label, solar_terms: solar_terms, first_day: first_day)
36
+ @is_last_year = is_last_year
37
+ @phase_index = phase_index
38
+ end
39
+
40
+ # :reek:TooManyStatements { max_statements: 6 }
41
+
42
+ #
43
+ # 現在の二十四節気に合わせて月表示情報を書き換える
44
+ #
45
+ def rename_month_label_by_solar_term
46
+ return ArgumentError.new, 'solar term must not be empty.' if empty_solar_term?
47
+
48
+ even = even_term
49
+
50
+ is_many_days = month_label.is_many_days
51
+ if even.invalid?
52
+ @month_label = MonthLabel.new(
53
+ number: InitializedMonth.month_number_by_odd_term_index(odd_term.index),
54
+ leaped: true, is_many_days: is_many_days
55
+ )
56
+ return
57
+ end
58
+
59
+ @month_label = MonthLabel.new(
60
+ number: InitializedMonth.month_number_by_even_term_index(even.index),
61
+ leaped: false, is_many_days: is_many_days
62
+ )
63
+ end
64
+
65
+ #
66
+ # 中気の連番に合わせて月を返す
67
+ #
68
+ # @example
69
+ # 20: 9月
70
+ # 22: 10月
71
+ # 0: 11月
72
+ # 2: 12月
73
+ # 4: 1月
74
+ #
75
+ # @param [Integer] index 中気番号
76
+ #
77
+ # @return [Integer] 月
78
+ #
79
+ def self.month_number_by_even_term_index(index)
80
+ half_index = index / 2
81
+
82
+ # 11月、12月
83
+ return half_index + 11 if half_index < 2
84
+
85
+ # 1月~10月
86
+ half_index - 1
87
+ end
88
+
89
+ #
90
+ # 節気の連番に合わせて月を返す
91
+ #
92
+ # @param [Integer] index 節気番号
93
+ #
94
+ # @return [Integer] 月
95
+ #
96
+ def self.month_number_by_odd_term_index(index)
97
+ even_index = index - 1
98
+
99
+ month_number_by_even_term_index(even_index)
100
+ end
101
+
102
+ #
103
+ # 一ヶ月戻す
104
+ #
105
+ def back_to_last_month
106
+ @is_last_year = true if month_label.back_to_last_month
107
+ end
108
+
109
+ #
110
+ # 二十四節気の数を返す
111
+ #
112
+ # @return [Integer] 二十四節気の数
113
+ #
114
+ def solar_term_size
115
+ solar_terms.size
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,184 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../cycle/abstract_solar_term'
4
+
5
+ require_relative './first_day'
6
+ require_relative './month_label'
7
+
8
+ # :nodoc:
9
+ module Zakuro
10
+ # :nodoc:
11
+ module Calculation
12
+ # :nodoc:
13
+ module Monthly
14
+ #
15
+ # Month 月情報
16
+ #
17
+ class Month
18
+ # @return [MonthLabel] 月表示名
19
+ attr_reader :month_label
20
+ # @return [FirstDay] 月初日(朔日)
21
+ attr_reader :first_day
22
+ # @return [Array<SolarTerm>] 二十四節気
23
+ attr_reader :solar_terms
24
+
25
+ #
26
+ # 初期化
27
+ #
28
+ # @param [MonthLabel] month_label 月表示名
29
+ # @param [FirstDay] first_day 月初日(朔日)
30
+ # @param [Array<SolarTerm>] solar_terms 二十四節気
31
+ #
32
+ def initialize(month_label: MonthLabel.new, first_day: FirstDay.new, solar_terms: [])
33
+ @month_label = month_label
34
+ @first_day = first_day
35
+ @solar_terms = solar_terms
36
+ end
37
+
38
+ #
39
+ # 中気なしは閏月とする
40
+ #
41
+ def eval_leaped
42
+ leaped = even_term.invalid?
43
+
44
+ @month_label = MonthLabel.new(number: number, is_many_days: many_days?, leaped: leaped)
45
+ end
46
+
47
+ #
48
+ # 月初日の西暦日を返す
49
+ #
50
+ # @return [Western::Calendar] 西暦日
51
+ #
52
+ def western_date
53
+ @first_day.western_date
54
+ end
55
+
56
+ #
57
+ # 月初日の大余小余を返す
58
+ #
59
+ # @return [Remainder] 大余小余
60
+ #
61
+ def remainder
62
+ @first_day.remainder
63
+ end
64
+
65
+ #
66
+ # 月の大小を返す
67
+ #
68
+ # @return [True] 大の月(30日)
69
+ # @return [False] 小の月(29日)
70
+ #
71
+ def many_days?
72
+ @month_label.is_many_days
73
+ end
74
+
75
+ #
76
+ # 月の日数を返す
77
+ #
78
+ # @return [Integer] 日数
79
+ #
80
+ def days
81
+ @month_label.days
82
+ end
83
+
84
+ #
85
+ # 月の名前(大小)を返す
86
+ #
87
+ # @return [String] 月の名前(大小)
88
+ #
89
+ def days_name
90
+ @month_label.days_name
91
+ end
92
+
93
+ #
94
+ # 月を返す
95
+ #
96
+ # @return [Integer] 月(xx月のxx)
97
+ #
98
+ def number
99
+ @month_label.number
100
+ end
101
+
102
+ #
103
+ # 閏を返す
104
+ #
105
+ # @return [True] 閏月
106
+ # @return [False] 平月
107
+ #
108
+ def leaped?
109
+ @month_label.leaped
110
+ end
111
+
112
+ #
113
+ # 次月の大余から月の日数を定める
114
+ #
115
+ # @param [Integer] next_month_day 次月の大余
116
+ #
117
+ def eval_many_days(next_month_day:)
118
+ is_many_days = remainder.same_remainder_divided_by_ten?(other: next_month_day)
119
+
120
+ @month_label = MonthLabel.new(
121
+ number: number, is_many_days: is_many_days, leaped: leaped?
122
+ )
123
+ end
124
+
125
+ #
126
+ # 二十四節気が未設定かどうかを検証する
127
+ #
128
+ # @return [True] 設定なし
129
+ # @return [False] 設定あり
130
+ #
131
+ def empty_solar_term?
132
+ @solar_terms.empty?
133
+ end
134
+
135
+ #
136
+ # 中気を返す
137
+ #
138
+ # @return [SolarTerm] 中気
139
+ #
140
+ def even_term
141
+ @solar_terms.each do |term|
142
+ return term if term.index.even?
143
+ end
144
+
145
+ Cycle::AbstractSolarTerm.new
146
+ end
147
+
148
+ #
149
+ # 節気を返す
150
+ #
151
+ # @return [SolarTerm] 節気
152
+ #
153
+ def odd_term
154
+ @solar_terms.each do |term|
155
+ return term if term.index.odd?
156
+ end
157
+
158
+ Cycle::AbstractSolarTerm.new
159
+ end
160
+
161
+ #
162
+ # 二十四節気を追加する
163
+ #
164
+ # @param [SolarTerm] term 二十四節気
165
+ #
166
+ def add_term(term:)
167
+ @solar_terms.push(term)
168
+ end
169
+
170
+ #
171
+ # 同一の月情報かを検証する
172
+ #
173
+ # @param [Month] other 他の月情報
174
+ #
175
+ # @return [True] 同一の月
176
+ # @return [False] 異なる月
177
+ #
178
+ def same?(other:)
179
+ number == other.number && leaped? == other.leaped?
180
+ end
181
+ end
182
+ end
183
+ end
184
+ end