zakuro 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +85 -43
  3. data/doc/operation.md +25 -0
  4. data/doc/operation/csv/month.csv +202 -0
  5. data/doc/operation/operation.xlsx +0 -0
  6. data/doc/operation/transfer.rb +73 -0
  7. data/lib/zakuro/era/japan/gengou.rb +106 -0
  8. data/lib/zakuro/era/japan/gengou/parser.rb +169 -0
  9. data/lib/zakuro/era/japan/gengou/type.rb +178 -0
  10. data/lib/zakuro/era/japan/gengou/validator.rb +234 -0
  11. data/lib/zakuro/era/japan/reki.rb +91 -0
  12. data/lib/zakuro/era/{gengou → japan/yaml}/set-001-until-south.yaml +0 -0
  13. data/lib/zakuro/era/{gengou → japan/yaml}/set-002-from-north.yaml +0 -0
  14. data/lib/zakuro/era/{gengou → japan/yaml}/set-003-modern.yaml +0 -0
  15. data/lib/zakuro/era/western.rb +1 -1
  16. data/lib/zakuro/operation/month/parser.rb +277 -0
  17. data/lib/zakuro/operation/month/type.rb +452 -0
  18. data/lib/zakuro/operation/month/validator.rb +498 -0
  19. data/lib/zakuro/operation/operation.rb +45 -0
  20. data/lib/zakuro/operation/yaml/month.yaml +6452 -0
  21. data/lib/zakuro/output/error.rb +2 -0
  22. data/lib/zakuro/output/logger.rb +2 -0
  23. data/lib/zakuro/output/response.rb +17 -15
  24. data/lib/zakuro/result/core.rb +52 -0
  25. data/lib/zakuro/result/data.rb +187 -0
  26. data/lib/zakuro/result/operation.rb +86 -0
  27. data/lib/zakuro/result/result.rb +37 -0
  28. data/lib/zakuro/{output → tools}/stringifier.rb +14 -7
  29. data/lib/zakuro/tools/typeof.rb +33 -0
  30. data/lib/zakuro/version.rb +1 -1
  31. data/lib/zakuro/version/senmyou/base/era.rb +1 -1
  32. data/lib/zakuro/version/senmyou/base/multi_gengou.rb +1 -1
  33. data/lib/zakuro/version/senmyou/base/multi_gengou_roller.rb +13 -1
  34. data/lib/zakuro/version/senmyou/base/solar_term.rb +10 -0
  35. data/lib/zakuro/version/senmyou/monthly/first_day.rb +44 -0
  36. data/lib/zakuro/version/senmyou/monthly/initialized_month.rb +48 -0
  37. data/lib/zakuro/version/senmyou/monthly/month.rb +127 -68
  38. data/lib/zakuro/version/senmyou/monthly/month_label.rb +87 -0
  39. data/lib/zakuro/version/senmyou/monthly/operated_month.rb +167 -0
  40. data/lib/zakuro/version/senmyou/{summary → range}/annual_range.rb +20 -23
  41. data/lib/zakuro/version/senmyou/{summary → range}/full_range.rb +102 -2
  42. data/lib/zakuro/version/senmyou/range/operated_range.rb +105 -0
  43. data/lib/zakuro/version/senmyou/range/operated_solar_terms.rb +163 -0
  44. data/lib/zakuro/version/senmyou/senmyou.rb +2 -2
  45. data/lib/zakuro/version/senmyou/{summary/specifier.rb → specifier/single_day_specifier.rb} +13 -14
  46. data/lib/zakuro/version/senmyou/stella/solar_average.rb +3 -7
  47. data/lib/zakuro/version/senmyou/summary/single.rb +71 -0
  48. data/lib/zakuro/version_factory.rb +1 -1
  49. metadata +35 -11
  50. data/lib/zakuro/era/japan.rb +0 -664
  51. data/lib/zakuro/output/result.rb +0 -225
@@ -1,11 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative './typeof'
4
+
3
5
  # :nodoc:
4
6
  module Zakuro
5
7
  #
6
- # Result 演算結果
8
+ # Tools 汎用メソッド群
7
9
  #
8
- module Result
10
+ module Tools
9
11
  #
10
12
  # Stringifier 文字列処理
11
13
  #
@@ -18,11 +20,13 @@ module Zakuro
18
20
  #
19
21
  # @return [Hash<String, Objcet>] ハッシュ
20
22
  #
21
- def self.to_h(obj:, class_prefix:)
23
+ def self.to_h(obj:, class_prefix:, formatted: true)
22
24
  hash = {}
23
25
  obj.instance_variables.each do |var|
24
26
  key = var.to_s.delete('@')
25
- hash[key] = value_to_hash(obj: obj.instance_variable_get(var), class_prefix: class_prefix)
27
+ hash[key] = value_to_hash(
28
+ obj: obj.instance_variable_get(var), class_prefix: class_prefix, formatted: formatted
29
+ )
26
30
  end
27
31
  hash
28
32
  end
@@ -37,19 +41,22 @@ module Zakuro
37
41
  #
38
42
  # @return [Hash<String, Objcet>] ハッシュ
39
43
  #
40
- def self.value_to_hash(obj:, class_prefix:)
44
+ def self.value_to_hash(obj:, class_prefix:, formatted:)
41
45
  return obj if obj.nil?
42
46
 
47
+ # 日付をフォーマットする
48
+ return obj.format if formatted && Tools::Typeof.time?(obj: obj)
49
+
43
50
  # 同じモジュール内のオブジェクトは再帰する
44
51
  if obj.class.name.start_with?(class_prefix)
45
- return to_h(obj: obj, class_prefix: class_prefix)
52
+ return to_h(obj: obj, class_prefix: class_prefix, formatted: formatted)
46
53
  end
47
54
 
48
55
  # 配列は要素一つずつで再帰する
49
56
  if obj.is_a?(Array)
50
57
  arr = []
51
58
  obj.each do |item|
52
- arr.push(to_h(obj: item, class_prefix: class_prefix))
59
+ arr.push(to_h(obj: item, class_prefix: class_prefix, formatted: formatted))
53
60
  end
54
61
  return arr
55
62
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../cycle/abstract_remainder'
4
+ require_relative '../era/western'
5
+
6
+ # :nodoc:
7
+ module Zakuro
8
+ #
9
+ # Tools 汎用メソッド群
10
+ #
11
+ module Tools
12
+ #
13
+ # Typeof 型判定
14
+ #
15
+ module Typeof
16
+ #
17
+ # 時間を表す型か
18
+ #
19
+ # @param [Object] obj 引数
20
+ #
21
+ # @return [True] 時間型である
22
+ # @return [False] 時間型ではない
23
+ #
24
+ def self.time?(obj:)
25
+ return true if obj.is_a?(Western::Calendar)
26
+
27
+ return true if obj.is_a?(Cycle::AbstractRemainder)
28
+
29
+ false
30
+ end
31
+ end
32
+ end
33
+ end
@@ -3,5 +3,5 @@
3
3
  # :nodoc:
4
4
  module Zakuro
5
5
  # @return [String] library version
6
- VERSION = '0.0.3'
6
+ VERSION = '0.1.0'
7
7
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../../era/japan'
3
+ require_relative '../../../era/japan/gengou'
4
4
  require_relative '../../../era/western'
5
5
  require_relative '../../../cycle/zodiac'
6
6
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../../era/japan'
3
+ require_relative '../../../era/japan/gengou'
4
4
  require_relative '../../../era/western'
5
5
 
6
6
  # :nodoc:
@@ -3,7 +3,7 @@
3
3
  require_relative './era'
4
4
  require_relative './multi_gengou'
5
5
 
6
- require_relative '../../../era/japan'
6
+ require_relative '../../../era/japan/gengou'
7
7
 
8
8
  # :nodoc:
9
9
  module Zakuro
@@ -200,6 +200,18 @@ module Zakuro
200
200
 
201
201
  condition.call(first_date, second_date)
202
202
  end
203
+
204
+ #
205
+ # ディープコピー
206
+ #
207
+ # @param [MultiGengou] obj 自身
208
+ #
209
+ def initialize_copy(obj)
210
+ @oldest_date = obj.oldest_date.clone
211
+ @current_date = obj.current_date.clone
212
+ @newest_date = obj.newest_date.clone
213
+ @multi_gengou = obj.multi_gengou.clone
214
+ end
203
215
  end
204
216
  end
205
217
  end
@@ -61,6 +61,16 @@ 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
64
74
  end
65
75
  end
66
76
  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
@@ -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,19 +85,39 @@ 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
+ )
97
121
  end
98
122
 
99
123
  #
@@ -103,19 +127,54 @@ module Zakuro
103
127
  # @return [False] 設定あり
104
128
  #
105
129
  def empty_solar_term?
106
- @even_term.invalid? && @odd_term.invalid?
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
157
+ end
158
+
159
+ #
160
+ # 二十四節気を追加する
161
+ #
162
+ # @param [SolarTerm] term 二十四節気
163
+ #
164
+ def add_term(term:)
165
+ @solar_terms.push(term)
107
166
  end
108
167
 
109
168
  #
110
- # 文字化する
169
+ # 同一の月情報かを検証する
111
170
  #
112
- # @return [String] 文字
171
+ # @param [Month] other 他の月情報
113
172
  #
114
- def to_s
115
- "is_last_year: #{@is_last_year}, number: #{@number}, leaped: #{@leaped}, " \
116
- "remainder: #{@remainder.format}, phase_index: #{@phase_index}, " \
117
- "even_term: #{@even_term.remainder.format}: #{@even_term.index}, " \
118
- "odd_term: #{@odd_term.remainder.format}: #{@odd_term.index}"
173
+ # @return [True] 同一の月
174
+ # @return [False] 異なる月
175
+ #
176
+ def same?(other:)
177
+ number == other.number && leaped? == other.leaped?
119
178
  end
120
179
  end
121
180
  end