zakuro 0.0.0 → 0.1.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 (73) 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 +156 -10
  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/merchant.rb +3 -1
  26. data/lib/zakuro/operation/month/parser.rb +373 -0
  27. data/lib/zakuro/operation/month/type.rb +458 -0
  28. data/lib/zakuro/operation/month/validator.rb +802 -0
  29. data/lib/zakuro/operation/operation.rb +66 -0
  30. data/lib/zakuro/operation/yaml/month.yaml +6452 -0
  31. data/lib/zakuro/output/error.rb +2 -0
  32. data/lib/zakuro/output/logger.rb +2 -0
  33. data/lib/zakuro/output/response.rb +21 -19
  34. data/lib/zakuro/result/core.rb +52 -0
  35. data/lib/zakuro/result/data.rb +187 -0
  36. data/lib/zakuro/result/operation.rb +114 -0
  37. data/lib/zakuro/result/result.rb +37 -0
  38. data/lib/zakuro/{output → tools}/stringifier.rb +16 -9
  39. data/lib/zakuro/tools/typeof.rb +33 -0
  40. data/lib/zakuro/version.rb +1 -1
  41. data/lib/zakuro/version/senmyou/README.md +3 -1
  42. data/lib/zakuro/version/senmyou/base/era.rb +3 -1
  43. data/lib/zakuro/version/senmyou/base/multi_gengou.rb +98 -0
  44. data/lib/zakuro/version/senmyou/base/multi_gengou_roller.rb +217 -0
  45. data/lib/zakuro/version/senmyou/base/remainder.rb +4 -4
  46. data/lib/zakuro/version/senmyou/base/solar_term.rb +20 -0
  47. data/lib/zakuro/version/senmyou/base/year.rb +52 -6
  48. data/lib/zakuro/version/senmyou/monthly/first_day.rb +44 -0
  49. data/lib/zakuro/version/senmyou/monthly/initialized_month.rb +48 -0
  50. data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +1 -1
  51. data/lib/zakuro/version/senmyou/monthly/month.rb +136 -67
  52. data/lib/zakuro/version/senmyou/monthly/month_label.rb +87 -0
  53. data/lib/zakuro/version/senmyou/monthly/operated_month.rb +167 -0
  54. data/lib/zakuro/version/senmyou/{summary/annual_data.rb → range/annual_range.rb} +38 -40
  55. data/lib/zakuro/version/senmyou/range/full_range.rb +324 -0
  56. data/lib/zakuro/version/senmyou/range/operated_range.rb +126 -0
  57. data/lib/zakuro/version/senmyou/range/operated_solar_terms.rb +181 -0
  58. data/lib/zakuro/version/senmyou/senmyou.rb +2 -2
  59. data/lib/zakuro/version/senmyou/specifier/single_day_specifier.rb +102 -0
  60. data/lib/zakuro/version/senmyou/stella/lunar_orbit.rb +1 -1
  61. data/lib/zakuro/version/senmyou/stella/solar_average.rb +54 -32
  62. data/lib/zakuro/version/senmyou/stella/solar_orbit.rb +3 -7
  63. data/lib/zakuro/version/senmyou/summary/single.rb +125 -0
  64. data/lib/zakuro/version_factory.rb +1 -1
  65. metadata +40 -13
  66. data/.travis.yml +0 -6
  67. data/lib/zakuro/era/gengou/set-001-until-south.yaml +0 -375
  68. data/lib/zakuro/era/gengou/set-002-from-north.yaml +0 -166
  69. data/lib/zakuro/era/gengou/set-003-modern.yaml +0 -12
  70. data/lib/zakuro/era/japan.rb +0 -630
  71. data/lib/zakuro/output/result.rb +0 -219
  72. data/lib/zakuro/version/senmyou/base/gengou.rb +0 -210
  73. data/lib/zakuro/version/senmyou/summary/gengou_data.rb +0 -294
@@ -29,8 +29,8 @@ module Zakuro
29
29
  # @param [Integer] total 繰り上げなしの小余
30
30
  #
31
31
  def initialize(day: -1, minute: -1, second: -1, total: -1)
32
- super(day: day, minute: minute, second: second, total: total,
33
- base_day: DAY, base_mitune: MINUTE)
32
+ super(base_day: DAY, base_mitune: MINUTE,
33
+ day: day, minute: minute, second: second, total: total)
34
34
  end
35
35
  end
36
36
 
@@ -52,8 +52,8 @@ module Zakuro
52
52
  # @param [Integer] total 繰り上げなしの小余
53
53
  #
54
54
  def initialize(day: -1, minute: -1, second: -1, total: -1)
55
- super(day: day, minute: minute, second: second, total: total,
56
- base_day: DAY, base_mitune: MINUTE)
55
+ super(base_day: DAY, base_mitune: MINUTE,
56
+ day: day, minute: minute, second: second, total: total)
57
57
  end
58
58
  end
59
59
  end
@@ -61,6 +61,26 @@ module Zakuro
61
61
  def invalid?
62
62
  (@index == -1 || @remainder.invalid?)
63
63
  end
64
+
65
+ #
66
+ # データなしかを検証する
67
+ #
68
+ # @return [True] データなし
69
+ # @return [False] データあり
70
+ #
71
+ def empty?
72
+ (@index == -1 && @remainder.invalid?)
73
+ end
74
+
75
+ #
76
+ # ディープコピー
77
+ #
78
+ # @param [SolarTerm] obj 自身
79
+ #
80
+ def initialize_copy(obj)
81
+ @index = obj.index.clone
82
+ @remainder = obj.remainder.clone
83
+ end
64
84
  end
65
85
  end
66
86
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative './era'
4
+
3
5
  # :nodoc:
4
6
  module Zakuro
5
7
  # :nodoc:
@@ -9,18 +11,63 @@ module Zakuro
9
11
  #
10
12
  class Year
11
13
  # @return [Gengou] 元号
12
- attr_reader :gengou
14
+ attr_reader :multi_gengou
13
15
  # @return [Array<Month>] 年内の全ての月
14
16
  attr_reader :months
17
+ # @return [Integer] 年の日数
18
+ attr_reader :total_days
19
+ # @return [Western::Calendar] 元旦
20
+ attr_reader :new_year_date
15
21
 
16
22
  #
17
23
  # 初期化
18
24
  #
19
- # @param [Gengou] gengou 元号
25
+ # @param [Gengou] multi_gengou 元号
26
+ #
27
+ def initialize(multi_gengou: MultiGengou.new, new_year_date: Western::Calendar.new,
28
+ months: [], total_days: 0)
29
+ @multi_gengou = multi_gengou
30
+ @months = months
31
+ @new_year_date = new_year_date
32
+ @total_days = total_days
33
+ end
34
+
35
+ #
36
+ # 年の日数を確定する
37
+ #
38
+ def commit
39
+ @total_days = 0
40
+ months.each do |month|
41
+ @total_days += month.days
42
+ end
43
+
44
+ self
45
+ end
46
+
47
+ #
48
+ # 次年にする
49
+ #
50
+ # @param [Japan::Gengou] first_line 元号(1行目)
51
+ # @param [Japan::Gengou] second_line 元号(2行目)
52
+ #
53
+ # @return [MultiGengou] 自身
54
+ #
55
+ def next_year
56
+ @multi_gengou.next_year
57
+
58
+ @new_year_date += @total_days
59
+ @total_days = 0
60
+
61
+ self
62
+ end
63
+
64
+ #
65
+ # 十干十二支を取得する
66
+ #
67
+ # @return [String] 十干十二支
20
68
  #
21
- def initialize(gengou:)
22
- @gengou = gengou
23
- @months = []
69
+ def zodiac_name
70
+ Era.zodiac_name(western_year: @new_year_date.year)
24
71
  end
25
72
 
26
73
  #
@@ -32,7 +79,6 @@ module Zakuro
32
79
  return if duplicated?(month: month)
33
80
 
34
81
  @months.push(month)
35
- @gengou.add_days(days: month.days)
36
82
 
37
83
  nil
38
84
  end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../era/western'
4
+
5
+ # TODO: moduleでMonthly とする(全暦むけに共通化したあと)
6
+
7
+ # :nodoc:
8
+ module Zakuro
9
+ # :nodoc:
10
+ module Senmyou
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
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './month'
4
+
5
+ # TODO: moduleでMonthly とする(全暦むけに共通化したあと)
6
+
7
+ # :nodoc:
8
+ module Zakuro
9
+ # :nodoc:
10
+ module Senmyou
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
+ #
41
+ # 一ヶ月戻す
42
+ #
43
+ def back_to_last_month
44
+ @is_last_year = true if month_label.back_to_last_month
45
+ end
46
+ end
47
+ end
48
+ end
@@ -145,7 +145,7 @@ module Zakuro
145
145
  # @return [Remainder] 定朔
146
146
  #
147
147
  def current_remainder
148
- debug('@average_remainder.format:' + @average_remainder.format)
148
+ debug("@average_remainder.format: #{@average_remainder.format}")
149
149
 
150
150
  sum = correction_value
151
151
  adjusted = @average_remainder.add(
@@ -1,5 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative './first_day'
4
+ require_relative './month_label'
5
+
6
+ # TODO: moduleでMonthly とする(全暦むけに共通化したあと)
7
+
3
8
  # :nodoc:
4
9
  module Zakuro
5
10
  # :nodoc:
@@ -8,63 +13,62 @@ module Zakuro
8
13
  # Month 月情報
9
14
  #
10
15
  class Month
11
- # @return [True] 昨年の月
12
- # @return [False] 今年の月
13
- # @note 冬至基準で1年データを作成するため昨年の11月-12月である可能性がある
14
- attr_accessor :is_last_year
15
- # @return [True] 大の月(30日)
16
- # @return [False] 小の月(29日)
17
- attr_accessor :is_many_days
18
- # @return [Integer] 月(xx月のxx)
19
- attr_accessor :number
20
- # @return [True] 閏月
21
- # @return [False] 平月
22
- attr_accessor :leaped
23
- # @return [SolarTerm] 二十四節気(中気)
24
- attr_accessor :even_term
25
- # @return [SolarTerm] 二十四節気(節気)
26
- attr_accessor :odd_term
27
- # @return [Remainder] 月初日の大余小余
28
- attr_reader :remainder
29
- # @return [String] 月齢(朔月、上弦、望月、下弦)
30
- attr_reader :phase_index
31
-
32
- # rubocop:disable Metrics/ParameterLists
33
- # :reek:BooleanParametere
16
+ # @return [MonthLabel] 月表示名
17
+ attr_reader :month_label
18
+ # @return [FirstDay] 月初日(朔日)
19
+ attr_reader :first_day
20
+ # @return [Array<SolarTerm>] 二十四節気
21
+ attr_reader :solar_terms
34
22
 
35
23
  #
36
24
  # 初期化
37
25
  #
38
- # @param [True, False] is_last_year 昨年の月/今年の月
39
- # @param [Integer] number 月(xx月のxx)
40
- # @param [True, False] is_many_days 大の月(30日)/小の月(29日)
41
- # @param [True, False] leaped 閏月/平月
42
- # @param [Remainder] remainder 月初日の大余小余
43
- # @param [String] phase_index 月齢(朔月、上弦、望月、下弦)
44
- # @param [SolarTerm] even_term 二十四節気(中気)
45
- # @param [SolarTerm] odd_term 二十四節気(節気)
46
- #
47
- def initialize(is_last_year: -1, number: -1, is_many_days: false,
48
- leaped: false, remainder: Remainder.new, phase_index: -1,
49
- even_term: SolarTerm.new, odd_term: SolarTerm.new)
50
- #
51
- @is_last_year = is_last_year
52
- # 月の大小
53
- @is_many_days = is_many_days
54
- #
55
- @number = number
56
- # 閏
57
- @leaped = leaped
58
- #
59
- @remainder = remainder
60
- # 月齢(朔月、上弦、望月、下弦)
61
- @phase_index = phase_index
62
- # 中気(二十四節気)
63
- @even_term = even_term
64
- # 節気(二十四節気)
65
- @odd_term = odd_term
26
+ # @param [MonthLabel] month_label 月表示名
27
+ # @param [FirstDay] first_day 月初日(朔日)
28
+ # @param [Array<SolarTerm>] solar_terms 二十四節気
29
+ #
30
+ def initialize(month_label: MonthLabel.new, first_day: FirstDay.new, solar_terms: [])
31
+ @month_label = month_label
32
+ @first_day = first_day
33
+ @solar_terms = solar_terms
34
+ end
35
+
36
+ #
37
+ # 中気なしは閏月とする
38
+ #
39
+ def eval_leaped
40
+ leaped = even_term.invalid?
41
+
42
+ @month_label = MonthLabel.new(number: number, is_many_days: many_days?, leaped: leaped)
43
+ end
44
+
45
+ #
46
+ # 月初日の西暦日を返す
47
+ #
48
+ # @return [Western::Calendar] 西暦日
49
+ #
50
+ def western_date
51
+ @first_day.western_date
52
+ end
53
+
54
+ #
55
+ # 月初日の大余小余を返す
56
+ #
57
+ # @return [Remainder] 大余小余
58
+ #
59
+ def remainder
60
+ @first_day.remainder
61
+ end
62
+
63
+ #
64
+ # 月の大小を返す
65
+ #
66
+ # @return [True] 大の月(30日)
67
+ # @return [False] 小の月(29日)
68
+ #
69
+ def many_days?
70
+ @month_label.is_many_days
66
71
  end
67
- # rubocop:enable Metrics/ParameterLists
68
72
 
69
73
  #
70
74
  # 月の日数を返す
@@ -72,7 +76,7 @@ module Zakuro
72
76
  # @return [Integer] 日数
73
77
  #
74
78
  def days
75
- @is_many_days ? 30 : 29
79
+ @month_label.days
76
80
  end
77
81
 
78
82
  #
@@ -81,31 +85,96 @@ module Zakuro
81
85
  # @return [String] 月の名前(大小)
82
86
  #
83
87
  def days_name
84
- @is_many_days ? '大' : '小'
88
+ @month_label.days_name
85
89
  end
86
90
 
87
91
  #
88
- # 同一の月情報かを検証する
92
+ # 月を返す
89
93
  #
90
- # @param [Month] other 他の月情報
94
+ # @return [Integer] 月(xx月のxx)
91
95
  #
92
- # @return [True] 同一の月
93
- # @return [False] 異なる月
96
+ def number
97
+ @month_label.number
98
+ end
99
+
94
100
  #
95
- def same?(other:)
96
- @number == other.number && @leaped == other.leaped
101
+ # 閏を返す
102
+ #
103
+ # @return [True] 閏月
104
+ # @return [False] 平月
105
+ #
106
+ def leaped?
107
+ @month_label.leaped
108
+ end
109
+
110
+ #
111
+ # 次月の大余から月の日数を定める
112
+ #
113
+ # @param [Integer] next_month_day 次月の大余
114
+ #
115
+ def eval_many_days(next_month_day:)
116
+ is_many_days = remainder.same_remainder_divided_by_ten?(other: next_month_day)
117
+
118
+ @month_label = MonthLabel.new(
119
+ number: number, is_many_days: is_many_days, leaped: leaped?
120
+ )
121
+ end
122
+
123
+ #
124
+ # 二十四節気が未設定かどうかを検証する
125
+ #
126
+ # @return [True] 設定なし
127
+ # @return [False] 設定あり
128
+ #
129
+ def empty_solar_term?
130
+ @solar_terms.empty?
131
+ end
132
+
133
+ #
134
+ # 中気を返す
135
+ #
136
+ # @return [SolarTerm] 中気
137
+ #
138
+ def even_term
139
+ @solar_terms.each do |term|
140
+ return term if term.index.even?
141
+ end
142
+
143
+ SolarTerm.new
144
+ end
145
+
146
+ #
147
+ # 節気を返す
148
+ #
149
+ # @return [SolarTerm] 節気
150
+ #
151
+ def odd_term
152
+ @solar_terms.each do |term|
153
+ return term if term.index.odd?
154
+ end
155
+
156
+ SolarTerm.new
97
157
  end
98
158
 
99
159
  #
100
- # 文字化する
160
+ # 二十四節気を追加する
101
161
  #
102
- # @return [String] 文字
162
+ # @param [SolarTerm] term 二十四節気
103
163
  #
104
- def to_s
105
- "is_last_year: #{@is_last_year}, number: #{@number}, leaped: #{@leaped}, " \
106
- "remainder: #{@remainder.format}, phase_index: #{@phase_index}, " \
107
- "even_term: #{@even_term.remainder.format}: #{@even_term.index}, " \
108
- "odd_term: #{@odd_term.remainder.format}: #{@odd_term.index}"
164
+ def add_term(term:)
165
+ @solar_terms.push(term)
166
+ end
167
+
168
+ #
169
+ # 同一の月情報かを検証する
170
+ #
171
+ # @param [Month] other 他の月情報
172
+ #
173
+ # @return [True] 同一の月
174
+ # @return [False] 異なる月
175
+ #
176
+ def same?(other:)
177
+ number == other.number && leaped? == other.leaped?
109
178
  end
110
179
  end
111
180
  end