zakuro 0.0.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
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