zakuro 0.0.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 (80) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/README.md +102 -42
  4. data/doc/operation.md +25 -0
  5. data/doc/operation/csv/month.csv +202 -0
  6. data/doc/operation/operation.xlsx +0 -0
  7. data/doc/operation/transfer.rb +77 -0
  8. data/lib/zakuro/calculation/base/multi_gengou.rb +101 -0
  9. data/lib/zakuro/calculation/base/multi_gengou_roller.rb +218 -0
  10. data/lib/zakuro/calculation/base/year.rb +107 -0
  11. data/lib/zakuro/calculation/cycle/abstract_remainder.rb +459 -0
  12. data/lib/zakuro/calculation/cycle/abstract_solar_term.rb +151 -0
  13. data/lib/zakuro/calculation/cycle/zodiac.rb +106 -0
  14. data/lib/zakuro/calculation/monthly/first_day.rb +45 -0
  15. data/lib/zakuro/calculation/monthly/initialized_month.rb +120 -0
  16. data/lib/zakuro/calculation/monthly/month.rb +184 -0
  17. data/lib/zakuro/calculation/monthly/month_label.rb +88 -0
  18. data/lib/zakuro/calculation/monthly/operated_month.rb +201 -0
  19. data/lib/zakuro/calculation/range/full_range.rb +210 -0
  20. data/lib/zakuro/calculation/range/operated_range.rb +134 -0
  21. data/lib/zakuro/calculation/range/operated_solar_terms.rb +201 -0
  22. data/lib/zakuro/calculation/range/transfer/western_date_allocation.rb +76 -0
  23. data/lib/zakuro/calculation/range/transfer/year_boundary.rb +142 -0
  24. data/lib/zakuro/calculation/specifier/single_day.rb +109 -0
  25. data/lib/zakuro/calculation/summary/single.rb +129 -0
  26. data/lib/zakuro/condition.rb +17 -13
  27. data/lib/zakuro/era/japan/gengou.rb +106 -0
  28. data/lib/zakuro/era/japan/gengou/parser.rb +167 -0
  29. data/lib/zakuro/era/japan/gengou/type.rb +178 -0
  30. data/lib/zakuro/era/japan/gengou/validator.rb +236 -0
  31. data/lib/zakuro/era/japan/reki.rb +91 -0
  32. data/lib/zakuro/era/{gengou → japan/yaml}/set-001-until-south.yaml +0 -0
  33. data/lib/zakuro/era/{gengou → japan/yaml}/set-002-from-north.yaml +0 -0
  34. data/lib/zakuro/era/{gengou → japan/yaml}/set-003-modern.yaml +1 -1
  35. data/lib/zakuro/era/western.rb +1 -1
  36. data/lib/zakuro/merchant.rb +2 -2
  37. data/lib/zakuro/operation/month/parser.rb +373 -0
  38. data/lib/zakuro/operation/month/type.rb +453 -0
  39. data/lib/zakuro/operation/month/validator.rb +802 -0
  40. data/lib/zakuro/operation/operation.rb +66 -0
  41. data/lib/zakuro/operation/yaml/month.yaml +6452 -0
  42. data/lib/zakuro/output/error.rb +7 -4
  43. data/lib/zakuro/output/logger.rb +50 -47
  44. data/lib/zakuro/output/response.rb +146 -143
  45. data/lib/zakuro/result/core.rb +52 -0
  46. data/lib/zakuro/result/data.rb +187 -0
  47. data/lib/zakuro/result/operation.rb +114 -0
  48. data/lib/zakuro/result/result.rb +37 -0
  49. data/lib/zakuro/{output → tools}/stringifier.rb +16 -9
  50. data/lib/zakuro/tools/typeof.rb +33 -0
  51. data/lib/zakuro/version.rb +1 -1
  52. data/lib/zakuro/version/abstract_version.rb +1 -1
  53. data/lib/zakuro/version/context.rb +23 -0
  54. data/lib/zakuro/version/senmyou/cycle/remainder.rb +63 -0
  55. data/lib/zakuro/version/senmyou/cycle/solar_term.rb +31 -0
  56. data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +186 -182
  57. data/lib/zakuro/version/senmyou/range/annual_range.rb +164 -0
  58. data/lib/zakuro/version/senmyou/senmyou.rb +10 -4
  59. data/lib/zakuro/version/senmyou/stella/lunar_orbit.rb +7 -7
  60. data/lib/zakuro/version/senmyou/stella/solar_average.rb +103 -138
  61. data/lib/zakuro/version/senmyou/stella/solar_location.rb +213 -0
  62. data/lib/zakuro/version/senmyou/stella/solar_orbit.rb +6 -191
  63. data/lib/zakuro/version/senmyou/stella/winter_solstice.rb +4 -4
  64. data/lib/zakuro/version/version_class_resolver.rb +62 -0
  65. data/lib/zakuro/version_factory.rb +3 -3
  66. metadata +49 -20
  67. data/lib/zakuro/cycle/abstract_remainder.rb +0 -457
  68. data/lib/zakuro/cycle/zodiac.rb +0 -103
  69. data/lib/zakuro/era/japan.rb +0 -660
  70. data/lib/zakuro/output/result.rb +0 -219
  71. data/lib/zakuro/version/senmyou/base/era.rb +0 -83
  72. data/lib/zakuro/version/senmyou/base/multi_gengou.rb +0 -98
  73. data/lib/zakuro/version/senmyou/base/multi_gengou_roller.rb +0 -205
  74. data/lib/zakuro/version/senmyou/base/remainder.rb +0 -60
  75. data/lib/zakuro/version/senmyou/base/solar_term.rb +0 -66
  76. data/lib/zakuro/version/senmyou/base/year.rb +0 -104
  77. data/lib/zakuro/version/senmyou/monthly/month.rb +0 -122
  78. data/lib/zakuro/version/senmyou/summary/annual_range.rb +0 -186
  79. data/lib/zakuro/version/senmyou/summary/full_range.rb +0 -216
  80. data/lib/zakuro/version/senmyou/summary/specifier.rb +0 -100
@@ -0,0 +1,167 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../western'
4
+ require_relative './type'
5
+ require_relative './validator'
6
+ require 'yaml'
7
+
8
+ # :nodoc:
9
+ module Zakuro
10
+ #
11
+ # Japan 和暦
12
+ #
13
+ module Japan
14
+ # :reek:TooManyInstanceVariables { max_instance_variables: 5 }
15
+
16
+ #
17
+ # Parser yaml解析
18
+ #
19
+ module Parser
20
+ # :reek:TooManyInstanceVariables { max_instance_variables: 5 }
21
+
22
+ #
23
+ # GengouParser 元号情報の検証/展開を行う
24
+ #
25
+ class GengouParser
26
+ # @return [Integer] 要素位置
27
+ attr_reader :index
28
+ # @return [String] 元号名
29
+ attr_reader :name
30
+ # @return [String] 開始日
31
+ attr_reader :start_date
32
+ # @return [String] 元旦
33
+ attr_reader :new_year_date
34
+ # @return [String] 開始年
35
+ attr_reader :start_year
36
+
37
+ #
38
+ # 初期化
39
+ #
40
+ # @param [Hash<String, Strin>] hash 元号情報
41
+ # @param [Integer] index (元号セット内での)元号の要素位置
42
+ #
43
+ def initialize(hash:, index:)
44
+ @index = index
45
+ @name = hash['name']
46
+ @start_date = hash['start_date']
47
+ @new_year_date = hash['new_year_date']
48
+ @start_year = hash['start_year']
49
+ end
50
+
51
+ #
52
+ # 元号情報を生成する
53
+ #
54
+ # @return [Gengou] 元号情報
55
+ #
56
+ def create
57
+ start_date = Western::Calendar.parse(str: @start_date)
58
+ new_year_date = Western::Calendar.parse(str: @new_year_date)
59
+ start_year = @start_year || 1
60
+
61
+ Gengou.new(name: @name, start_date: start_date, new_year_date: new_year_date,
62
+ year: start_year)
63
+ end
64
+ end
65
+
66
+ #
67
+ # SetParser 元号セット情報の検証/展開
68
+ #
69
+ class SetParser
70
+ # @return [String] 元号セットID
71
+ attr_reader :id
72
+ # @return [String] 元号セット名
73
+ attr_reader :name
74
+ # @return [String] 終了日
75
+ attr_reader :end_date
76
+ # @return [Array<Hash<String, String>>] 元号情報
77
+ attr_reader :list
78
+
79
+ #
80
+ # 初期化
81
+ #
82
+ # @param [Hash<String, Object>] hash 元号セット情報
83
+ #
84
+ def initialize(hash:)
85
+ @id = hash['id']
86
+ @name = hash['name']
87
+ @end_date = hash['end_date']
88
+ @list = hash['list']
89
+ end
90
+
91
+ #
92
+ # 元号セット情報を生成する
93
+ #
94
+ # @return [Set] 元号セット情報
95
+ #
96
+ def create
97
+ end_date = Western::Calendar.parse(str: @end_date)
98
+ list = create_list
99
+ Set.new(
100
+ id: @id, name: @name, end_date: end_date, list: list
101
+ )
102
+ end
103
+
104
+ # :reek:TooManyStatements { max_statements: 7 }
105
+
106
+ #
107
+ # 元号情報を生成する
108
+ #
109
+ # @return [Array<Gengou>] 元号情報
110
+ #
111
+ def create_list
112
+ result = []
113
+ @list.each_with_index do |li, index|
114
+ gengou = GengouParser.new(hash: li, index: index).create
115
+ next_index = index + 1
116
+ gengou = calc_end_date_on_gengou_data(next_index: next_index,
117
+ gengou: gengou)
118
+ result.push(gengou)
119
+ end
120
+
121
+ result
122
+ end
123
+
124
+ # :reek:TooManyStatements { max_statements: 6 }
125
+
126
+ #
127
+ # 次の元号の開始日から、元号の終了日に変換する
128
+ #
129
+ # @param [Integer] next_index 次の元号の要素位置
130
+ # @param [String] gengou 次回開始日
131
+ #
132
+ # @return [Gengou] 元号情報
133
+ #
134
+ def calc_end_date_on_gengou_data(next_index:, gengou:)
135
+ if next_index >= @list.size
136
+ end_date = Western::Calendar.parse(str: @end_date)
137
+ gengou.write_end_date(end_date: end_date)
138
+ return gengou
139
+ end
140
+ next_start_date = @list[next_index]['start_date']
141
+ gengou.convert_next_start_date_to_end_date(
142
+ next_start_date_string: next_start_date
143
+ )
144
+ gengou
145
+ end
146
+ end
147
+
148
+ #
149
+ # 解析/展開する
150
+ #
151
+ # @param [String] filepath 元号セットファイルパス
152
+ #
153
+ # @return [Set] 元号セット情報
154
+ #
155
+ def self.run(filepath: '')
156
+ yaml = YAML.load_file(filepath)
157
+
158
+ failed = Validator.run(yaml_hash: yaml)
159
+
160
+ raise ArgumentError, failed.join("\n") unless failed.empty?
161
+
162
+ parser = SetParser.new(hash: yaml)
163
+ parser.create
164
+ end
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,178 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../western'
4
+
5
+ # :nodoc:
6
+ module Zakuro
7
+ #
8
+ # Japan 和暦
9
+ #
10
+ module Japan
11
+ # :reek:TooManyInstanceVariables { max_instance_variables: 5 }
12
+
13
+ #
14
+ # Gengou 元号情報
15
+ #
16
+ class Gengou
17
+ # @return [String] 元号名
18
+ attr_reader :name
19
+ # @return [Western::Calendar] 開始日
20
+ attr_reader :start_date
21
+ # @return [Western::Calendar] 元旦
22
+ attr_reader :new_year_date
23
+ # @return [Western::Calendar] 終了日
24
+ attr_reader :end_date
25
+ # @return [Integer] 元号年
26
+ attr_reader :year
27
+
28
+ #
29
+ # 初期化
30
+ #
31
+ # @param [String] name 元号名
32
+ # @param [Western::Calendar] start_date 開始日
33
+ # @param [Western::Calendar] new_year_date 元旦
34
+ # @param [Western::Calendar] end_date 終了日
35
+ # @param [Integer] year 元号年
36
+ #
37
+ def initialize(name: '', start_date: Western::Calendar.new,
38
+ new_year_date: Western::Calendar.new,
39
+ end_date: Western::Calendar.new, year: -1)
40
+ @name = name
41
+ @start_date = start_date
42
+ @new_year_date = new_year_date
43
+ @end_date = end_date
44
+ @year = year
45
+ end
46
+
47
+ #
48
+ # 終了日を更新する
49
+ #
50
+ # @param [Western::Calendar] end_date 終了日
51
+ #
52
+ def write_end_date(end_date:)
53
+ unless Gengou.valid_date(date: end_date)
54
+ raise ArgumentError, "invalid date format. [#{end_date}]"
55
+ end
56
+
57
+ @end_date = end_date
58
+ nil
59
+ end
60
+
61
+ #
62
+ # 日付が有効かどうかを確認する
63
+ #
64
+ # @param [Western::Calendar] date 日付
65
+ #
66
+ # @return [True] 有効
67
+ # @return [False] 無効
68
+ #
69
+ def self.valid_date(date:)
70
+ return false unless date
71
+
72
+ date.is_a?(Western::Calendar)
73
+ end
74
+
75
+ #
76
+ # 次の元号の開始日から、元号の終了日に変換する
77
+ #
78
+ # @param [String] next_start_date_string 次回開始日
79
+ #
80
+ def convert_next_start_date_to_end_date(next_start_date_string: '')
81
+ raise ArgumentError, 'empty string cannot convert' if next_start_date_string.empty?
82
+
83
+ start_date = Western::Calendar.parse(str: next_start_date_string)
84
+ @end_date = start_date - 1
85
+ nil
86
+ end
87
+
88
+ #
89
+ # 指定した日が元号に含まれるか
90
+ #
91
+ # @param [Western::Calendar] date 日
92
+ #
93
+ # @return [True] 含まれる
94
+ # @return [False] 含まれない
95
+ #
96
+ def include?(date:)
97
+ date >= @start_date && date <= @end_date
98
+ end
99
+
100
+ #
101
+ # 不正な元号データかを確認する
102
+ #
103
+ # @return [True] 正しくない
104
+ # @return [True] 正しい
105
+ #
106
+ def invalid?
107
+ @year == -1
108
+ end
109
+
110
+ #
111
+ # 1元号年を追加する
112
+ #
113
+ def next_year
114
+ @year += 1 unless invalid?
115
+ nil
116
+ end
117
+
118
+ def to_s
119
+ "name: #{@name}, start_date: #{@start_date.format}, " \
120
+ "end_date: #{@end_date.format}, year: #{@year}"
121
+ end
122
+ end
123
+
124
+ #
125
+ # Set 元号セット
126
+ #
127
+ class Set
128
+ # @return [Integer] 元号セットID
129
+ attr_reader :id
130
+ # @return [String] 元号セット名
131
+ attr_reader :name
132
+ # @return [Western::Calendar] 元号セットでの終了日
133
+ attr_reader :end_date
134
+ # @return [Array<Gengou>] 元号リスト
135
+ attr_reader :list
136
+
137
+ #
138
+ # 初期化
139
+ #
140
+ # @param [Integer] id 元号セットID
141
+ # @param [String] name 元号セット名
142
+ # @param [Western::Calendar] end_date 元号セットでの終了日
143
+ # @param [Array<Gengou>] list 元号リスト
144
+ #
145
+ def initialize(id: -1, name: '', end_date: Western::Calendar.new, list: [])
146
+ @id = id
147
+ @name = name
148
+ @end_date = end_date
149
+ @list = list
150
+ end
151
+
152
+ #
153
+ # 指定した日付を含む元号を返す
154
+ #
155
+ # @param [Western::Calendar] date 日
156
+ #
157
+ # @return [Gengou] 元号
158
+ #
159
+ def include_item(date:)
160
+ @list.each do |item|
161
+ return item if item.include?(date: date)
162
+ end
163
+
164
+ Gengou.new
165
+ end
166
+
167
+ #
168
+ # 元号セットが不正かどうかを確認する
169
+ #
170
+ # @return [True] 正しくない
171
+ # @return [False] 正しい
172
+ #
173
+ def invalid?
174
+ @id == -1
175
+ end
176
+ end
177
+ end
178
+ end
@@ -0,0 +1,236 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../western'
4
+ require_relative './type'
5
+ require 'yaml'
6
+
7
+ # :nodoc:
8
+ module Zakuro
9
+ #
10
+ # Japan 和暦
11
+ #
12
+ module Japan
13
+ #
14
+ # Validator yaml解析
15
+ #
16
+ module Validator
17
+ # :reek:TooManyInstanceVariables { max_instance_variables: 5 }
18
+
19
+ #
20
+ # Set 元号セット情報の検証/展開
21
+ #
22
+ class Set
23
+ # @return [String] 元号セットID
24
+ attr_reader :id
25
+ # @return [String] 元号セット名
26
+ attr_reader :name
27
+ # @return [String] 終了日
28
+ attr_reader :end_date
29
+ # @return [Array<Hash<String, String>>] 元号情報
30
+ attr_reader :list
31
+
32
+ #
33
+ # 初期化
34
+ #
35
+ # @param [Hash<String, Object>] hash 元号セット情報
36
+ #
37
+ def initialize(hash:)
38
+ @id = hash['id']
39
+ @name = hash['name']
40
+ @end_date = hash['end_date']
41
+ @list = hash['list']
42
+ end
43
+
44
+ # :reek:TooManyStatements { max_statements: 6 }
45
+
46
+ #
47
+ # 検証する
48
+ #
49
+ # @return [Array<String>] 不正メッセージ
50
+ #
51
+ def validate
52
+ failed = []
53
+ failed.push("invalid id. #{id}") unless id?
54
+
55
+ failed.push("invalid name. #{name}") unless name?
56
+
57
+ failed.push("invalid end_date. #{end_date}") unless western_date?
58
+
59
+ failed |= validate_list
60
+ failed
61
+ end
62
+
63
+ #
64
+ # IDを検証する
65
+ #
66
+ # @return [True] 正しい
67
+ # @return [False] 正しくない
68
+ #
69
+ def id?
70
+ return false unless @id
71
+
72
+ @id.is_a?(Integer)
73
+ end
74
+
75
+ #
76
+ # 元号セット名を検証する
77
+ #
78
+ # @return [True] 正しい
79
+ # @return [False] 正しくない
80
+ #
81
+ def name?
82
+ return false unless @name
83
+
84
+ @name.is_a?(String)
85
+ end
86
+
87
+ #
88
+ # 日付文字列を検証する
89
+ #
90
+ # @return [True] 正しい
91
+ # @return [False] 正しくない
92
+ #
93
+ def western_date?
94
+ Western::Calendar.valid_date_string(str: @end_date)
95
+ end
96
+
97
+ #
98
+ # 元号情報を検証する
99
+ #
100
+ # @return [True] 正しい
101
+ # @return [False] 正しくない
102
+ #
103
+ def list?
104
+ return false unless @list
105
+
106
+ @list.is_a?(Array)
107
+ end
108
+
109
+ #
110
+ # 元号情報を検証する
111
+ #
112
+ # @return [True] 正しい
113
+ # @return [False] 正しくない
114
+ #
115
+ def validate_list
116
+ return ["invalid list. #{@list.class}"] unless list?
117
+
118
+ failed = []
119
+ list.each_with_index do |li, index|
120
+ failed |= Gengou.new(hash: li, index: index).validate
121
+ end
122
+ failed
123
+ end
124
+ end
125
+
126
+ # :reek:TooManyInstanceVariables { max_instance_variables: 5 }
127
+
128
+ #
129
+ # Gengou 元号情報
130
+ #
131
+ class Gengou
132
+ # @return [Integer] 要素位置
133
+ attr_reader :index
134
+ # @return [String] 元号名
135
+ attr_reader :name
136
+ # @return [String] 開始日
137
+ attr_reader :start_date
138
+ # @return [String] 元旦
139
+ attr_reader :new_year_date
140
+ # @return [String] 開始年
141
+ attr_reader :start_year
142
+
143
+ #
144
+ # 初期化
145
+ #
146
+ # @param [Hash<String, Strin>] hash 元号情報
147
+ # @param [Integer] index (元号セット内での)元号の要素位置
148
+ #
149
+ def initialize(hash:, index:)
150
+ @index = index
151
+ @name = hash['name']
152
+ @start_date = hash['start_date']
153
+ @new_year_date = hash['new_year_date']
154
+ @start_year = hash['start_year']
155
+ end
156
+
157
+ # :reek:TooManyStatements { max_statements: 7 }
158
+
159
+ #
160
+ # 検証する
161
+ #
162
+ # @return [Array<String>] 不正メッセージ
163
+ #
164
+ def validate
165
+ prefix = "list[#{index}]. "
166
+ failed = []
167
+
168
+ failed.push(prefix + "invalid name. #{@name}") unless name?
169
+
170
+ failed.push(prefix + "invalid start_date. #{@start_date}") unless start_date?
171
+
172
+ failed.push(prefix + "invalid start_year. #{@start_year}") unless year?
173
+
174
+ failed.push(prefix + "invalid new_year_date. #{@new_year_date}") unless new_year_date?
175
+
176
+ failed
177
+ end
178
+
179
+ #
180
+ # 元号名を検証する
181
+ #
182
+ # @return [True] 正しい
183
+ # @return [False] 正しくない
184
+ #
185
+ def name?
186
+ return false unless @name
187
+
188
+ @name.is_a?(String)
189
+ end
190
+
191
+ #
192
+ # 開始日文字列を検証する
193
+ #
194
+ # @return [True] 正しい
195
+ # @return [False] 正しくない
196
+ #
197
+ def start_date?
198
+ Western::Calendar.valid_date_string(str: @start_date)
199
+ end
200
+
201
+ #
202
+ # 元旦文字列を検証する
203
+ #
204
+ # @return [True] 正しい
205
+ # @return [False] 正しくない
206
+ #
207
+ def new_year_date?
208
+ Western::Calendar.valid_date_string(str: @new_year_date)
209
+ end
210
+
211
+ #
212
+ # 元号年を検証する
213
+ #
214
+ # @return [True] 正しい
215
+ # @return [False] 正しくない
216
+ #
217
+ def year?
218
+ return true unless @start_year
219
+
220
+ @start_year.is_a?(Integer)
221
+ end
222
+ end
223
+
224
+ #
225
+ # 検証する
226
+ #
227
+ # @param [Hash<String, Object>] yaml_hash yaml取得結果
228
+ #
229
+ # @return [Array<String>] 不正メッセージ
230
+ #
231
+ def self.run(yaml_hash:)
232
+ Set.new(hash: yaml_hash).validate
233
+ end
234
+ end
235
+ end
236
+ end