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
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../western'
4
+ require_relative './gengou/parser'
5
+ require_relative './gengou/type'
6
+
7
+ # :nodoc:
8
+ module Zakuro
9
+ #
10
+ # Japan 和暦
11
+ #
12
+ module Japan
13
+ #
14
+ # GengouResource 元号情報
15
+ #
16
+ module GengouResource
17
+ # @return [Array<Set>] 元号セット情報リスト
18
+ LIST = [
19
+ Parser.run(filepath: File.expand_path(
20
+ './yaml/set-001-until-south.yaml',
21
+ __dir__
22
+ )),
23
+ Parser.run(filepath: File.expand_path(
24
+ './yaml/set-002-from-north.yaml',
25
+ __dir__
26
+ )),
27
+ Parser.run(filepath: File.expand_path(
28
+ './yaml/set-003-modern.yaml',
29
+ __dir__
30
+ ))
31
+ ].freeze
32
+
33
+ # :reek:TooManyStatements { max_statements: 9 }
34
+
35
+ #
36
+ # 元号(1行目,2行目)を引き当てる
37
+ #
38
+ # * LINE配列の元号情報を配列順で「x行目」(1始まり)とする
39
+ # * 1行目にデータがあれば、第一要素に1行目のデータが設定される
40
+ # * 1行目と2行目にデータがあれば、第二要素に2行目のデータが設定される
41
+ # * 1行目にデータがなく、2行目以降に1つだけデータがあれば、第一要素にそのデータを設定してそれ以外の要素は未設定
42
+ # * 1行目にデータがなく、2行目以降に2つ以上のデータがあれば、第一要素に末尾行に一番近いデータを設定してそれ以外の要素は未設定
43
+ #
44
+ # @param [Western::Calendar] date 日
45
+ #
46
+ # @return [Array<Gengou>] 元号情報(1行目, 2行目)
47
+ #
48
+ def self.lines(date:)
49
+ lines = native_lines(date: date)
50
+ return lines unless lines[0].invalid?
51
+
52
+ first = Japan::Gengou.new
53
+ lines[1..].each.with_index(1) do |item, index|
54
+ next if item.invalid?
55
+
56
+ first = item
57
+ lines[index] = Japan::Gengou.new
58
+ end
59
+ lines[0] = first
60
+ lines
61
+ end
62
+
63
+ #
64
+ # 元号を引き当てる
65
+ #
66
+ # * LISTから単純に元号を引き当てる
67
+ # * 1行目,2行目といった概念は無視する
68
+ #
69
+ # @param [Western::Calendar] date 日
70
+ #
71
+ # @return [Array<Gengou>] 元号情報
72
+ #
73
+ def self.native_lines(date:)
74
+ result = Array.new(LIST.size)
75
+ LIST.each_with_index do |set, index|
76
+ result[index] = set.include_item(date: date)
77
+ end
78
+ result
79
+ end
80
+
81
+ #
82
+ # 「日本暦日原典」1行目の元号を返す
83
+ #
84
+ # @param [Western::Calendar] date 日
85
+ #
86
+ # @return [Gengou] 元号情報(1行目)
87
+ #
88
+ def self.first_line(date:)
89
+ lines = lines(date: date)
90
+ lines[0].clone
91
+ end
92
+
93
+ #
94
+ # 「日本暦日原典」2行目の元号を返す
95
+ #
96
+ # @param [Western::Calendar] date 日
97
+ #
98
+ # @return [Gengou] 元号情報(2行目)
99
+ #
100
+ def self.second_line(date:)
101
+ lines = lines(date: date)
102
+ lines[1].clone
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,169 @@
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
+ # :reek:NilCheck
52
+
53
+ #
54
+ # 元号情報を生成する
55
+ #
56
+ # @return [Gengou] 元号情報
57
+ #
58
+ def create
59
+ start_date = Western::Calendar.parse(str: @start_date)
60
+ new_year_date = Western::Calendar.parse(str: @new_year_date)
61
+ start_year = @start_year.nil? ? 1 : @start_year
62
+
63
+ Gengou.new(name: @name, start_date: start_date, new_year_date: new_year_date,
64
+ year: start_year)
65
+ end
66
+ end
67
+
68
+ #
69
+ # SetParser 元号セット情報の検証/展開
70
+ #
71
+ class SetParser
72
+ # @return [String] 元号セットID
73
+ attr_reader :id
74
+ # @return [String] 元号セット名
75
+ attr_reader :name
76
+ # @return [String] 終了日
77
+ attr_reader :end_date
78
+ # @return [Array<Hash<String, String>>] 元号情報
79
+ attr_reader :list
80
+
81
+ #
82
+ # 初期化
83
+ #
84
+ # @param [Hash<String, Object>] hash 元号セット情報
85
+ #
86
+ def initialize(hash:)
87
+ @id = hash['id']
88
+ @name = hash['name']
89
+ @end_date = hash['end_date']
90
+ @list = hash['list']
91
+ end
92
+
93
+ #
94
+ # 元号セット情報を生成する
95
+ #
96
+ # @return [Set] 元号セット情報
97
+ #
98
+ def create
99
+ end_date = Western::Calendar.parse(str: @end_date)
100
+ list = create_list
101
+ Set.new(
102
+ id: @id, name: @name, end_date: end_date, list: list
103
+ )
104
+ end
105
+
106
+ # :reek:TooManyStatements { max_statements: 7 }
107
+
108
+ #
109
+ # 元号情報を生成する
110
+ #
111
+ # @return [Array<Gengou>] 元号情報
112
+ #
113
+ def create_list
114
+ result = []
115
+ @list.each_with_index do |li, index|
116
+ gengou = GengouParser.new(hash: li, index: index).create
117
+ next_index = index + 1
118
+ gengou = calc_end_date_on_gengou_data(next_index: next_index,
119
+ gengou: gengou)
120
+ result.push(gengou)
121
+ end
122
+
123
+ result
124
+ end
125
+
126
+ # :reek:TooManyStatements { max_statements: 6 }
127
+
128
+ #
129
+ # 次の元号の開始日から、元号の終了日に変換する
130
+ #
131
+ # @param [Integer] next_index 次の元号の要素位置
132
+ # @param [String] gengou 次回開始日
133
+ #
134
+ # @return [Gengou] 元号情報
135
+ #
136
+ def calc_end_date_on_gengou_data(next_index:, gengou:)
137
+ if next_index >= @list.size
138
+ end_date = Western::Calendar.parse(str: @end_date)
139
+ gengou.write_end_date(end_date: end_date)
140
+ return gengou
141
+ end
142
+ next_start_date = @list[next_index]['start_date']
143
+ gengou.convert_next_start_date_to_end_date(
144
+ next_start_date_string: next_start_date
145
+ )
146
+ gengou
147
+ end
148
+ end
149
+
150
+ #
151
+ # 解析/展開する
152
+ #
153
+ # @param [String] filepath 元号セットファイルパス
154
+ #
155
+ # @return [Set] 元号セット情報
156
+ #
157
+ def self.run(filepath: '')
158
+ yaml = YAML.load_file(filepath)
159
+
160
+ failed = Validator.run(yaml_hash: yaml)
161
+
162
+ raise ArgumentError, failed.join("\n") unless failed.empty?
163
+
164
+ parser = SetParser.new(hash: yaml)
165
+ parser.create
166
+ end
167
+ end
168
+ end
169
+ 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
+ # :reek:NilCheck
62
+
63
+ #
64
+ # 日付が有効かどうかを確認する
65
+ #
66
+ # @param [Western::Calendar] date 日付
67
+ #
68
+ # @return [True] 有効
69
+ # @return [False] 無効
70
+ #
71
+ def self.valid_date(date:)
72
+ !date.nil? && 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