zakuro 0.0.0
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.
- checksums.yaml +7 -0
- data/.editorconfig +9 -0
- data/.gitignore +69 -0
- data/.rspec +3 -0
- data/.rubocop.yml +14 -0
- data/.travis.yml +6 -0
- data/Gemfile +19 -0
- data/LICENSE.txt +21 -0
- data/README.md +44 -0
- data/Rakefile +20 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/images/12/346/234/210/344/273/245/351/231/215/343/201/256/345/205/245/345/256/232/346/260/227.png +0 -0
- data/images/12/346/234/210/344/273/245/351/231/215/343/201/256/346/234/210/343/201/256/351/200/262/351/200/200.png +0 -0
- data/images/source/description.numbers +0 -0
- data/images//345/205/245/345/256/232/346/260/227/343/201/256/350/265/267/347/256/227.png +0 -0
- data/images//345/220/204/346/234/210/343/201/256/346/261/202/343/202/201/346/226/271.png +0 -0
- data/images//345/244/252/351/231/275/343/201/250/346/234/210.png +0 -0
- data/lib/zakuro.rb +9 -0
- data/lib/zakuro/condition.rb +239 -0
- data/lib/zakuro/cycle/abstract_remainder.rb +457 -0
- data/lib/zakuro/cycle/zodiac.rb +103 -0
- data/lib/zakuro/era/gengou/set-001-until-south.yaml +375 -0
- data/lib/zakuro/era/gengou/set-002-from-north.yaml +166 -0
- data/lib/zakuro/era/gengou/set-003-modern.yaml +12 -0
- data/lib/zakuro/era/japan.rb +630 -0
- data/lib/zakuro/era/western.rb +412 -0
- data/lib/zakuro/merchant.rb +57 -0
- data/lib/zakuro/output/error.rb +10 -0
- data/lib/zakuro/output/logger.rb +64 -0
- data/lib/zakuro/output/response.rb +170 -0
- data/lib/zakuro/output/result.rb +219 -0
- data/lib/zakuro/output/stringifier.rb +62 -0
- data/lib/zakuro/version.rb +7 -0
- data/lib/zakuro/version/abstract_version.rb +29 -0
- data/lib/zakuro/version/genka/genka.rb +19 -0
- data/lib/zakuro/version/gihou/gihou.rb +19 -0
- data/lib/zakuro/version/gregorio/gregorio.rb +19 -0
- data/lib/zakuro/version/houryaku/houryaku.rb +19 -0
- data/lib/zakuro/version/joukyou/joukyou.rb +19 -0
- data/lib/zakuro/version/kansei/kansei.rb +19 -0
- data/lib/zakuro/version/senmyou/README.md +586 -0
- data/lib/zakuro/version/senmyou/base/era.rb +81 -0
- data/lib/zakuro/version/senmyou/base/gengou.rb +210 -0
- data/lib/zakuro/version/senmyou/base/remainder.rb +60 -0
- data/lib/zakuro/version/senmyou/base/solar_term.rb +66 -0
- data/lib/zakuro/version/senmyou/base/year.rb +58 -0
- data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +220 -0
- data/lib/zakuro/version/senmyou/monthly/month.rb +112 -0
- data/lib/zakuro/version/senmyou/senmyou.rb +34 -0
- data/lib/zakuro/version/senmyou/stella/lunar_orbit.rb +332 -0
- data/lib/zakuro/version/senmyou/stella/solar_average.rb +192 -0
- data/lib/zakuro/version/senmyou/stella/solar_orbit.rb +398 -0
- data/lib/zakuro/version/senmyou/stella/winter_solstice.rb +106 -0
- data/lib/zakuro/version/senmyou/summary/annual_data.rb +186 -0
- data/lib/zakuro/version/senmyou/summary/gengou_data.rb +294 -0
- data/lib/zakuro/version/taien/taien.rb +19 -0
- data/lib/zakuro/version/tenpou/tenpou.rb +19 -0
- data/lib/zakuro/version_factory.rb +59 -0
- data/zakuro.gemspec +31 -0
- metadata +106 -0
@@ -0,0 +1,166 @@
|
|
1
|
+
id: 2
|
2
|
+
name: "北朝+南北朝後"
|
3
|
+
end_date: "1868-1-24"
|
4
|
+
list:
|
5
|
+
- name: "正慶"
|
6
|
+
start_date: "1332-1-28"
|
7
|
+
- name: "建武"
|
8
|
+
start_date: "1334-2-5"
|
9
|
+
- name: "暦応"
|
10
|
+
start_date: "1338-1-22"
|
11
|
+
- name: "康永"
|
12
|
+
start_date: "1342-2-6"
|
13
|
+
- name: "貞和"
|
14
|
+
start_date: "1345-2-3"
|
15
|
+
- name: "観応"
|
16
|
+
start_date: "1350-2-8"
|
17
|
+
- name: "文和"
|
18
|
+
start_date: "1352-1-18"
|
19
|
+
- name: "延文"
|
20
|
+
start_date: "1356-2-2"
|
21
|
+
- name: "康安"
|
22
|
+
start_date: "1361-2-6"
|
23
|
+
- name: "貞治"
|
24
|
+
start_date: "1362-1-27"
|
25
|
+
- name: "応安"
|
26
|
+
start_date: "1368-1-21"
|
27
|
+
- name: "永和"
|
28
|
+
start_date: "1375-2-2"
|
29
|
+
- name: "康暦"
|
30
|
+
start_date: "1379-1-19"
|
31
|
+
- name: "永徳"
|
32
|
+
start_date: "1381-1-26"
|
33
|
+
- name: "至徳"
|
34
|
+
start_date: "1384-1-23"
|
35
|
+
- name: "嘉慶"
|
36
|
+
start_date: "1387-1-21"
|
37
|
+
- name: "康応"
|
38
|
+
start_date: "1389-1-28"
|
39
|
+
- name: "明徳"
|
40
|
+
start_date: "1390-1-17"
|
41
|
+
- name: "応永"
|
42
|
+
start_date: "1394-2-1"
|
43
|
+
- name: "正長"
|
44
|
+
start_date: "1428-1-17"
|
45
|
+
- name: "永享"
|
46
|
+
start_date: "1429-2-4"
|
47
|
+
- name: "嘉吉"
|
48
|
+
start_date: "1441-1-23"
|
49
|
+
- name: "文安"
|
50
|
+
start_date: "1444-1-20"
|
51
|
+
- name: "宝徳"
|
52
|
+
start_date: "1449-1-25"
|
53
|
+
- name: "享徳"
|
54
|
+
start_date: "1452-1-22"
|
55
|
+
- name: "康正"
|
56
|
+
start_date: "1455-1-18"
|
57
|
+
- name: "長禄"
|
58
|
+
start_date: "1457-1-26"
|
59
|
+
- name: "寛正"
|
60
|
+
start_date: "1460-1-24"
|
61
|
+
- name: "文正"
|
62
|
+
start_date: "1466-1-17"
|
63
|
+
- name: "応仁"
|
64
|
+
start_date: "1467-2-5"
|
65
|
+
- name: "文明"
|
66
|
+
start_date: "1469-2-12"
|
67
|
+
- name: "長享"
|
68
|
+
start_date: "1487-1-25"
|
69
|
+
- name: "延徳"
|
70
|
+
start_date: "1489-2-1"
|
71
|
+
- name: "明応"
|
72
|
+
start_date: "1492-1-30"
|
73
|
+
- name: "文亀"
|
74
|
+
start_date: "1501-1-19"
|
75
|
+
- name: "永正"
|
76
|
+
start_date: "1504-1-18"
|
77
|
+
- name: "大永"
|
78
|
+
start_date: "1521-2-8"
|
79
|
+
- name: "享禄"
|
80
|
+
start_date: "1528-1-22"
|
81
|
+
- name: "天文"
|
82
|
+
start_date: "1532-2-6"
|
83
|
+
- name: "弘治"
|
84
|
+
start_date: "1555-1-23"
|
85
|
+
- name: "永禄"
|
86
|
+
start_date: "1558-1-20"
|
87
|
+
- name: "元亀"
|
88
|
+
start_date: "1570-2-5"
|
89
|
+
- name: "天正"
|
90
|
+
start_date: "1573-2-3"
|
91
|
+
- name: "文禄"
|
92
|
+
start_date: "1592-2-13"
|
93
|
+
- name: "慶長"
|
94
|
+
start_date: "1596-1-30"
|
95
|
+
- name: "元和"
|
96
|
+
start_date: "1615-1-29"
|
97
|
+
- name: "寛永"
|
98
|
+
start_date: "1624-2-19"
|
99
|
+
- name: "正保"
|
100
|
+
start_date: "1644-2-8"
|
101
|
+
- name: "慶安"
|
102
|
+
start_date: "1648-1-25"
|
103
|
+
- name: "承応"
|
104
|
+
start_date: "1652-2-10"
|
105
|
+
- name: "明暦"
|
106
|
+
start_date: "1655-2-7"
|
107
|
+
- name: "万治"
|
108
|
+
start_date: "1658-2-3"
|
109
|
+
- name: "寛文"
|
110
|
+
start_date: "1661-1-31"
|
111
|
+
- name: "延宝"
|
112
|
+
start_date: "1673-2-17"
|
113
|
+
- name: "天和"
|
114
|
+
start_date: "1681-2-19"
|
115
|
+
- name: "貞享"
|
116
|
+
start_date: "1684-2-16"
|
117
|
+
|
118
|
+
|
119
|
+
- name: "元禄"
|
120
|
+
start_date: "1688-2-2"
|
121
|
+
- name: "宝永"
|
122
|
+
start_date: "1704-2-5"
|
123
|
+
- name: "正徳"
|
124
|
+
start_date: "1711-2-17"
|
125
|
+
- name: "享保"
|
126
|
+
start_date: "1716-1-25"
|
127
|
+
- name: "元文"
|
128
|
+
start_date: "1736-2-12"
|
129
|
+
- name: "寛保"
|
130
|
+
start_date: "1741-2-16"
|
131
|
+
- name: "延享"
|
132
|
+
start_date: "1744-2-14"
|
133
|
+
- name: "寛延"
|
134
|
+
start_date: "1748-1-30"
|
135
|
+
- name: "宝暦"
|
136
|
+
start_date: "1751-1-27"
|
137
|
+
- name: "明和"
|
138
|
+
start_date: "1764-2-2"
|
139
|
+
- name: "安永"
|
140
|
+
start_date: "1772-2-4"
|
141
|
+
- name: "天明"
|
142
|
+
start_date: "1781-1-24"
|
143
|
+
- name: "寛政"
|
144
|
+
start_date: "1789-1-26"
|
145
|
+
- name: "享和"
|
146
|
+
start_date: "1801-2-13"
|
147
|
+
- name: "文化"
|
148
|
+
start_date: "1804-2-11"
|
149
|
+
- name: "文政"
|
150
|
+
start_date: "1818-2-5"
|
151
|
+
- name: "天保"
|
152
|
+
start_date: "1830-1-25"
|
153
|
+
- name: "弘化"
|
154
|
+
start_date: "1844-2-18"
|
155
|
+
- name: "嘉永"
|
156
|
+
start_date: "1848-2-5"
|
157
|
+
- name: "安政"
|
158
|
+
start_date: "1854-1-29"
|
159
|
+
- name: "万延"
|
160
|
+
start_date: "1860-1-23"
|
161
|
+
- name: "文久"
|
162
|
+
start_date: "1861-2-10"
|
163
|
+
- name: "元治"
|
164
|
+
start_date: "1864-2-8"
|
165
|
+
- name: "慶応"
|
166
|
+
start_date: "1865-1-27"
|
@@ -0,0 +1,630 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './western'
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
# :nodoc:
|
7
|
+
module Zakuro
|
8
|
+
#
|
9
|
+
# Japan 和暦
|
10
|
+
#
|
11
|
+
module Japan
|
12
|
+
#
|
13
|
+
# Reki 暦
|
14
|
+
#
|
15
|
+
module Reki
|
16
|
+
#
|
17
|
+
# Range 暦(範囲)
|
18
|
+
#
|
19
|
+
class Range
|
20
|
+
# @return [String] 暦のクラス名
|
21
|
+
# version 以下を参照
|
22
|
+
attr_reader :class_name
|
23
|
+
# @return [Western::Calendar] 暦の開始日
|
24
|
+
attr_reader :start_date
|
25
|
+
|
26
|
+
#
|
27
|
+
# 初期化
|
28
|
+
#
|
29
|
+
# @param [String] class_name 暦のクラス名
|
30
|
+
# @param [Western::Calendar] start_date 暦の開始日
|
31
|
+
#
|
32
|
+
def initialize(class_name:, start_date:)
|
33
|
+
@class_name = class_name
|
34
|
+
@start_date = start_date
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
LIST = [
|
39
|
+
Range.new(
|
40
|
+
class_name: 'Zakuro::Genka::Gateway',
|
41
|
+
start_date: Western::Calendar.new(year: 445, month: 1, day: 24)
|
42
|
+
),
|
43
|
+
Range.new(
|
44
|
+
class_name: 'Zakuro::Gihou::Gateway',
|
45
|
+
start_date: Western::Calendar.new(year: 698, month: 2, day: 16)
|
46
|
+
),
|
47
|
+
Range.new(
|
48
|
+
class_name: 'Zakuro::Taien::Gateway',
|
49
|
+
start_date: Western::Calendar.new(year: 764, month: 2, day: 7)
|
50
|
+
),
|
51
|
+
Range.new(
|
52
|
+
class_name: 'Zakuro::Senmyou::Gateway',
|
53
|
+
start_date: Western::Calendar.new(year: 862, month: 2, day: 3)
|
54
|
+
),
|
55
|
+
Range.new(
|
56
|
+
class_name: 'Zakuro::Joukyou::Gateway',
|
57
|
+
start_date: Western::Calendar.new(year: 1685, month: 2, day: 4)
|
58
|
+
),
|
59
|
+
Range.new(
|
60
|
+
class_name: 'Zakuro::Houryaku::Gateway',
|
61
|
+
start_date: Western::Calendar.new(year: 1755, month: 2, day: 11)
|
62
|
+
),
|
63
|
+
Range.new(
|
64
|
+
class_name: 'Zakuro::Kansei::Gateway',
|
65
|
+
start_date: Western::Calendar.new(year: 1798, month: 2, day: 16)
|
66
|
+
),
|
67
|
+
Range.new(
|
68
|
+
class_name: 'Zakuro::Tenpou::Gateway',
|
69
|
+
start_date: Western::Calendar.new(year: 1844, month: 2, day: 18)
|
70
|
+
),
|
71
|
+
Range.new(
|
72
|
+
class_name: 'Zakuro::Gregorio::Gateway',
|
73
|
+
start_date: Western::Calendar.new(year: 1872, month: 12, day: 9)
|
74
|
+
)
|
75
|
+
].freeze
|
76
|
+
|
77
|
+
#
|
78
|
+
# 指定した日付から対象の暦を引き当てる
|
79
|
+
#
|
80
|
+
# @param [Western::Calendar] date 日付
|
81
|
+
#
|
82
|
+
# @return [String] 暦のクラス名
|
83
|
+
#
|
84
|
+
def self.class_name(date: Western::Calendar.new)
|
85
|
+
LIST.reverse_each do |range|
|
86
|
+
return range.class_name if date >= range.start_date
|
87
|
+
end
|
88
|
+
raise ArgumentError, "invalid date: #{date.format}"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
#
|
93
|
+
# Gengou 元号情報
|
94
|
+
#
|
95
|
+
class Gengou
|
96
|
+
# @return [String] 元号名
|
97
|
+
attr_reader :name
|
98
|
+
# @return [Western::Calendar] 開始日
|
99
|
+
attr_reader :start_date
|
100
|
+
# @return [Western::Calendar] 終了日
|
101
|
+
attr_reader :end_date
|
102
|
+
# @return [Integer] 元号年
|
103
|
+
attr_reader :year
|
104
|
+
|
105
|
+
#
|
106
|
+
# 初期化
|
107
|
+
#
|
108
|
+
# @param [<Type>] name 元号名
|
109
|
+
# @param [<Type>] start_date 開始日
|
110
|
+
# @param [<Type>] end_date 終了日
|
111
|
+
# @param [<Type>] year 元号年
|
112
|
+
#
|
113
|
+
def initialize(name: '', start_date: Western::Calendar.new,
|
114
|
+
end_date: Western::Calendar.new, year: -1)
|
115
|
+
@name = name
|
116
|
+
@start_date = start_date
|
117
|
+
@end_date = end_date
|
118
|
+
@year = year
|
119
|
+
end
|
120
|
+
|
121
|
+
#
|
122
|
+
# 終了日を更新する
|
123
|
+
#
|
124
|
+
# @param [Western::Calendar] end_date 終了日
|
125
|
+
#
|
126
|
+
def write_end_date(end_date:)
|
127
|
+
unless Gengou.valid_date(date: end_date)
|
128
|
+
raise ArgumentError, "invalid date format. [#{end_date}]"
|
129
|
+
end
|
130
|
+
|
131
|
+
@end_date = end_date
|
132
|
+
nil
|
133
|
+
end
|
134
|
+
|
135
|
+
# :reek:NilCheck
|
136
|
+
|
137
|
+
#
|
138
|
+
# 日付が有効かどうかを確認する
|
139
|
+
#
|
140
|
+
# @param [Western::Calendar] date 日付
|
141
|
+
#
|
142
|
+
# @return [True] 有効
|
143
|
+
# @return [False] 無効
|
144
|
+
#
|
145
|
+
def self.valid_date(date:)
|
146
|
+
!date.nil? && date.is_a?(Western::Calendar)
|
147
|
+
end
|
148
|
+
|
149
|
+
#
|
150
|
+
# 次の元号の開始日から、元号の終了日に変換する
|
151
|
+
#
|
152
|
+
# @param [String] next_start_date_string 次回開始日
|
153
|
+
#
|
154
|
+
def convert_next_start_date_to_end_date(next_start_date_string: '')
|
155
|
+
raise ArgumentError, 'empty string cannot convert' if next_start_date_string.empty?
|
156
|
+
|
157
|
+
start_date = Western::Calendar.parse(str: next_start_date_string)
|
158
|
+
@end_date = start_date - 1
|
159
|
+
nil
|
160
|
+
end
|
161
|
+
|
162
|
+
#
|
163
|
+
# 指定した日が元号に含まれるか
|
164
|
+
#
|
165
|
+
# @param [Western::Calendar] date 日
|
166
|
+
#
|
167
|
+
# @return [True] 含まれる
|
168
|
+
# @return [False] 含まれない
|
169
|
+
#
|
170
|
+
def include?(date:)
|
171
|
+
date >= @start_date && date <= @end_date
|
172
|
+
end
|
173
|
+
|
174
|
+
#
|
175
|
+
# 不正な元号データかを確認する
|
176
|
+
#
|
177
|
+
# @return [True] 正しくない
|
178
|
+
# @return [True] 正しい
|
179
|
+
#
|
180
|
+
def invalid?
|
181
|
+
@year == -1
|
182
|
+
end
|
183
|
+
|
184
|
+
#
|
185
|
+
# 1元号年を追加する
|
186
|
+
#
|
187
|
+
def next_year
|
188
|
+
@year += 1
|
189
|
+
nil
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
#
|
194
|
+
# Set 元号セット
|
195
|
+
#
|
196
|
+
class Set
|
197
|
+
# @return [Integer] 元号セットID
|
198
|
+
attr_reader :id
|
199
|
+
# @return [String] 元号セット名
|
200
|
+
attr_reader :name
|
201
|
+
# @return [Western::Calendar] 元号セットでの終了日
|
202
|
+
attr_reader :end_date
|
203
|
+
# @return [Array<Gengou>] 元号リスト
|
204
|
+
attr_reader :list
|
205
|
+
|
206
|
+
#
|
207
|
+
# 初期化
|
208
|
+
#
|
209
|
+
# @param [Integer] id 元号セットID
|
210
|
+
# @param [String] name 元号セット名
|
211
|
+
# @param [Western::Calendar] end_date 元号セットでの終了日
|
212
|
+
# @param [Array<Gengou>] list 元号リスト
|
213
|
+
#
|
214
|
+
def initialize(id: -1, name: '', end_date: Western::Calendar.new, list: [])
|
215
|
+
@id = id
|
216
|
+
@name = name
|
217
|
+
@end_date = end_date
|
218
|
+
@list = list
|
219
|
+
end
|
220
|
+
|
221
|
+
#
|
222
|
+
# 指定した日付を含む元号を返す
|
223
|
+
#
|
224
|
+
# @param [Western::Calendar] date 日
|
225
|
+
#
|
226
|
+
# @return [Gengou] 元号
|
227
|
+
#
|
228
|
+
def include_item(date:)
|
229
|
+
@list.each do |item|
|
230
|
+
return item if item.include?(date: date)
|
231
|
+
end
|
232
|
+
|
233
|
+
Gengou.new
|
234
|
+
end
|
235
|
+
|
236
|
+
#
|
237
|
+
# 元号セットが不正かどうかを確認する
|
238
|
+
#
|
239
|
+
# @return [True] 正しくない
|
240
|
+
# @return [False] 正しい
|
241
|
+
#
|
242
|
+
def invalid?
|
243
|
+
@id == -1
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
#
|
248
|
+
# Parser yaml解析
|
249
|
+
#
|
250
|
+
module Parser
|
251
|
+
#
|
252
|
+
# 検証する
|
253
|
+
#
|
254
|
+
# @param [Hash<String, Object>] yaml_hash yaml取得結果
|
255
|
+
#
|
256
|
+
# @return [Array<String>] 不正メッセージ
|
257
|
+
#
|
258
|
+
def self.validate(yaml_hash)
|
259
|
+
SetParser.new(hash: yaml_hash).validate
|
260
|
+
end
|
261
|
+
|
262
|
+
#
|
263
|
+
# GengouParser 元号情報の検証/展開を行う
|
264
|
+
#
|
265
|
+
class GengouParser
|
266
|
+
# @return [Integer] 要素位置
|
267
|
+
attr_reader :index
|
268
|
+
# @return [String] 元号名
|
269
|
+
attr_reader :name
|
270
|
+
# @return [String] 開始日
|
271
|
+
attr_reader :start_date
|
272
|
+
# @return [String] 開始年
|
273
|
+
attr_reader :start_year
|
274
|
+
|
275
|
+
#
|
276
|
+
# 初期化
|
277
|
+
#
|
278
|
+
# @param [Hash<String, Strin>] hash 元号情報
|
279
|
+
# @param [Integer] index (元号セット内での)元号の要素位置
|
280
|
+
#
|
281
|
+
def initialize(hash:, index:)
|
282
|
+
@index = index
|
283
|
+
@name = hash['name']
|
284
|
+
@start_date = hash['start_date']
|
285
|
+
@start_year = hash['start_year']
|
286
|
+
end
|
287
|
+
|
288
|
+
# :reek:TooManyStatements { max_statements: 6 }
|
289
|
+
|
290
|
+
#
|
291
|
+
# 検証する
|
292
|
+
#
|
293
|
+
# @return [Array<String>] 不正メッセージ
|
294
|
+
#
|
295
|
+
def validate
|
296
|
+
prefix = "list[#{index}]. "
|
297
|
+
failed = []
|
298
|
+
|
299
|
+
failed.push(prefix + "invalid name. #{@name}") unless valid_name_type?
|
300
|
+
|
301
|
+
failed.push(prefix + "invalid start_date. #{@start_date}") unless valid_date_type?
|
302
|
+
|
303
|
+
failed.push(prefix + "invalid start_year. #{@start_year}") unless valid_year_type?
|
304
|
+
failed
|
305
|
+
end
|
306
|
+
|
307
|
+
# :reek:NilCheck
|
308
|
+
|
309
|
+
#
|
310
|
+
# 元号名を検証する
|
311
|
+
#
|
312
|
+
# @return [True] 正しい
|
313
|
+
# @return [False] 正しくない
|
314
|
+
#
|
315
|
+
def valid_name_type?
|
316
|
+
!(@name.nil? || !@name.is_a?(String))
|
317
|
+
end
|
318
|
+
|
319
|
+
#
|
320
|
+
# 日付文字列を検証する
|
321
|
+
#
|
322
|
+
# @return [True] 正しい
|
323
|
+
# @return [False] 正しくない
|
324
|
+
#
|
325
|
+
def valid_date_type?
|
326
|
+
Western::Calendar.valid_date_string(str: @start_date)
|
327
|
+
end
|
328
|
+
|
329
|
+
# :reek:NilCheck
|
330
|
+
|
331
|
+
#
|
332
|
+
# 元号年を検証する
|
333
|
+
#
|
334
|
+
# @return [True] 正しい
|
335
|
+
# @return [False] 正しくない
|
336
|
+
#
|
337
|
+
def valid_year_type?
|
338
|
+
return true if @start_year.nil?
|
339
|
+
|
340
|
+
@start_year.is_a?(Integer)
|
341
|
+
end
|
342
|
+
|
343
|
+
# :reek:NilCheck
|
344
|
+
|
345
|
+
#
|
346
|
+
# 元号情報を生成する
|
347
|
+
#
|
348
|
+
# @return [Gengou] 元号情報
|
349
|
+
#
|
350
|
+
def create
|
351
|
+
start_date = Western::Calendar.parse(str: @start_date)
|
352
|
+
start_year = @start_year.nil? ? 1 : @start_year
|
353
|
+
|
354
|
+
Gengou.new(name: @name, start_date: start_date, year: start_year)
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
358
|
+
#
|
359
|
+
# SetParser 元号セット情報の検証/展開
|
360
|
+
#
|
361
|
+
class SetParser
|
362
|
+
# @return [String] 元号セットID
|
363
|
+
attr_reader :id
|
364
|
+
# @return [String] 元号セット名
|
365
|
+
attr_reader :name
|
366
|
+
# @return [String] 終了日
|
367
|
+
attr_reader :end_date
|
368
|
+
# @return [Array<Hash<String, String>>] 元号情報
|
369
|
+
attr_reader :list
|
370
|
+
|
371
|
+
#
|
372
|
+
# 初期化
|
373
|
+
#
|
374
|
+
# @param [Hash<String, Object>] hash 元号セット情報
|
375
|
+
#
|
376
|
+
def initialize(hash:)
|
377
|
+
@id = hash['id']
|
378
|
+
@name = hash['name']
|
379
|
+
@end_date = hash['end_date']
|
380
|
+
@list = hash['list']
|
381
|
+
end
|
382
|
+
|
383
|
+
# :reek:TooManyStatements { max_statements: 6 }
|
384
|
+
|
385
|
+
#
|
386
|
+
# 検証する
|
387
|
+
#
|
388
|
+
# @return [Array<String>] 不正メッセージ
|
389
|
+
#
|
390
|
+
def validate
|
391
|
+
failed = []
|
392
|
+
failed.push("invalid id. #{id}") unless valid_id_type?
|
393
|
+
|
394
|
+
failed.push("invalid name. #{name}") unless valid_name_type?
|
395
|
+
|
396
|
+
failed.push("invalid end_date. #{end_date}") unless valid_date_type?
|
397
|
+
|
398
|
+
failed |= validate_list
|
399
|
+
failed
|
400
|
+
end
|
401
|
+
|
402
|
+
# :reek:NilCheck
|
403
|
+
|
404
|
+
#
|
405
|
+
# IDを検証する
|
406
|
+
#
|
407
|
+
# @return [True] 正しい
|
408
|
+
# @return [False] 正しくない
|
409
|
+
#
|
410
|
+
def valid_id_type?
|
411
|
+
!(@id.nil? || !@id.is_a?(Integer))
|
412
|
+
end
|
413
|
+
|
414
|
+
#
|
415
|
+
# 元号セット名を検証する
|
416
|
+
#
|
417
|
+
# @return [True] 正しい
|
418
|
+
# @return [False] 正しくない
|
419
|
+
#
|
420
|
+
def valid_name_type?
|
421
|
+
!(@name.nil? || !@name.is_a?(String))
|
422
|
+
end
|
423
|
+
|
424
|
+
#
|
425
|
+
# 日付文字列を検証する
|
426
|
+
#
|
427
|
+
# @return [True] 正しい
|
428
|
+
# @return [False] 正しくない
|
429
|
+
#
|
430
|
+
def valid_date_type?
|
431
|
+
Western::Calendar.valid_date_string(str: @end_date)
|
432
|
+
end
|
433
|
+
|
434
|
+
# :reek:NilCheck
|
435
|
+
|
436
|
+
#
|
437
|
+
# 元号情報を検証する
|
438
|
+
#
|
439
|
+
# @return [True] 正しい
|
440
|
+
# @return [False] 正しくない
|
441
|
+
#
|
442
|
+
def valid_list_type?
|
443
|
+
(!@list.nil? || @list.is_a?(Array))
|
444
|
+
end
|
445
|
+
|
446
|
+
#
|
447
|
+
# 元号情報を検証する
|
448
|
+
#
|
449
|
+
# @return [True] 正しい
|
450
|
+
# @return [False] 正しくない
|
451
|
+
#
|
452
|
+
def validate_list
|
453
|
+
return ["invalid list. #{@list.class}"] unless valid_list_type?
|
454
|
+
|
455
|
+
failed = []
|
456
|
+
list.each_with_index do |li, index|
|
457
|
+
failed |= GengouParser.new(hash: li, index: index).validate
|
458
|
+
end
|
459
|
+
failed
|
460
|
+
end
|
461
|
+
|
462
|
+
#
|
463
|
+
# 元号セット情報を生成する
|
464
|
+
#
|
465
|
+
# @return [Set] 元号セット情報
|
466
|
+
#
|
467
|
+
def create
|
468
|
+
end_date = Western::Calendar.parse(str: @end_date)
|
469
|
+
list = create_list
|
470
|
+
Set.new(
|
471
|
+
id: @id, name: @name, end_date: end_date, list: list
|
472
|
+
)
|
473
|
+
end
|
474
|
+
|
475
|
+
# :reek:TooManyStatements { max_statements: 7 }
|
476
|
+
|
477
|
+
#
|
478
|
+
# 元号情報を生成する
|
479
|
+
#
|
480
|
+
# @return [Array<Gengou>] 元号情報
|
481
|
+
#
|
482
|
+
def create_list
|
483
|
+
result = []
|
484
|
+
@list.each_with_index do |li, index|
|
485
|
+
gengou = GengouParser.new(hash: li, index: index).create
|
486
|
+
next_index = index + 1
|
487
|
+
gengou = calc_end_date_on_gengou_data(next_index: next_index,
|
488
|
+
gengou: gengou)
|
489
|
+
result.push(gengou)
|
490
|
+
end
|
491
|
+
|
492
|
+
result
|
493
|
+
end
|
494
|
+
|
495
|
+
# :reek:TooManyStatements { max_statements: 6 }
|
496
|
+
|
497
|
+
#
|
498
|
+
# 次の元号の開始日から、元号の終了日に変換する
|
499
|
+
#
|
500
|
+
# @param [Integer] next_index 次の元号の要素位置
|
501
|
+
# @param [String] gengou 次回開始日
|
502
|
+
#
|
503
|
+
# @return [Gengou] 元号情報
|
504
|
+
#
|
505
|
+
def calc_end_date_on_gengou_data(next_index:, gengou:)
|
506
|
+
if next_index >= @list.size
|
507
|
+
end_date = Western::Calendar.parse(str: @end_date)
|
508
|
+
gengou.write_end_date(end_date: end_date)
|
509
|
+
return gengou
|
510
|
+
end
|
511
|
+
next_start_date = @list[next_index]['start_date']
|
512
|
+
gengou.convert_next_start_date_to_end_date(
|
513
|
+
next_start_date_string: next_start_date
|
514
|
+
)
|
515
|
+
gengou
|
516
|
+
end
|
517
|
+
end
|
518
|
+
|
519
|
+
#
|
520
|
+
# 解析/展開する
|
521
|
+
#
|
522
|
+
# @param [String] filepath 元号セットファイルパス
|
523
|
+
#
|
524
|
+
# @return [Set] 元号セット情報
|
525
|
+
#
|
526
|
+
def self.parse(filepath: '')
|
527
|
+
yaml = YAML.load_file(filepath)
|
528
|
+
|
529
|
+
parser = SetParser.new(hash: yaml)
|
530
|
+
failed = parser.validate
|
531
|
+
raise YAML::ParseError, failed.join('\n') unless failed.empty?
|
532
|
+
|
533
|
+
parser.create
|
534
|
+
end
|
535
|
+
end
|
536
|
+
|
537
|
+
#
|
538
|
+
# GengouResource 元号情報
|
539
|
+
#
|
540
|
+
module GengouResource
|
541
|
+
# @return [Array<Set>] 元号セット情報リスト
|
542
|
+
LIST = [
|
543
|
+
Parser.parse(filepath: File.expand_path(
|
544
|
+
'./gengou/set-001-until-south.yaml',
|
545
|
+
__dir__
|
546
|
+
)),
|
547
|
+
Parser.parse(filepath: File.expand_path(
|
548
|
+
'./gengou/set-002-from-north.yaml',
|
549
|
+
__dir__
|
550
|
+
)),
|
551
|
+
Parser.parse(filepath: File.expand_path(
|
552
|
+
'./gengou/set-003-modern.yaml',
|
553
|
+
__dir__
|
554
|
+
))
|
555
|
+
].freeze
|
556
|
+
|
557
|
+
# :reek:TooManyStatements { max_statements: 9 }
|
558
|
+
|
559
|
+
#
|
560
|
+
# 元号(1行目,2行目)を引き当てる
|
561
|
+
#
|
562
|
+
# * LINE配列の元号情報を配列順で「x行目」(1始まり)とする
|
563
|
+
# * 1行目にデータがあれば、第一要素に1行目のデータが設定される
|
564
|
+
# * 1行目と2行目にデータがあれば、第二要素に2行目のデータが設定される
|
565
|
+
# * 1行目にデータがなく、2行目以降に1つだけデータがあれば、第一要素にそのデータを設定してそれ以外の要素は未設定
|
566
|
+
# * 1行目にデータがなく、2行目以降に2つ以上のデータがあれば、第一要素に末尾行に一番近いデータを設定してそれ以外の要素は未設定
|
567
|
+
#
|
568
|
+
# @param [Western::Calendar] date 日
|
569
|
+
#
|
570
|
+
# @return [Array<Gengou>] 元号情報(1行目, 2行目)
|
571
|
+
#
|
572
|
+
def self.lines(date:)
|
573
|
+
lines = native_lines(date: date)
|
574
|
+
return lines unless lines[0].invalid?
|
575
|
+
|
576
|
+
first = Japan::Gengou.new
|
577
|
+
lines[1..-1].each.with_index(1) do |item, index|
|
578
|
+
next if item.invalid?
|
579
|
+
|
580
|
+
first = item
|
581
|
+
lines[index] = Japan::Gengou.new
|
582
|
+
end
|
583
|
+
lines[0] = first
|
584
|
+
lines
|
585
|
+
end
|
586
|
+
|
587
|
+
#
|
588
|
+
# 元号を引き当てる
|
589
|
+
#
|
590
|
+
# * LISTから単純に元号を引き当てる
|
591
|
+
# * 1行目,2行目といった概念は無視する
|
592
|
+
#
|
593
|
+
# @param [Western::Calendar] date 日
|
594
|
+
#
|
595
|
+
# @return [Array<Gengou>] 元号情報
|
596
|
+
#
|
597
|
+
def self.native_lines(date:)
|
598
|
+
result = Array.new(LIST.size)
|
599
|
+
LIST.each_with_index do |set, index|
|
600
|
+
result[index] = set.include_item(date: date)
|
601
|
+
end
|
602
|
+
result
|
603
|
+
end
|
604
|
+
|
605
|
+
#
|
606
|
+
# 「日本暦日原典」1行目の元号を返す
|
607
|
+
#
|
608
|
+
# @param [Western::Calendar] date 日
|
609
|
+
#
|
610
|
+
# @return [Gengou] 元号情報(1行目)
|
611
|
+
#
|
612
|
+
def self.first_line(date:)
|
613
|
+
lines = lines(date: date)
|
614
|
+
lines[0].clone
|
615
|
+
end
|
616
|
+
|
617
|
+
#
|
618
|
+
# 「日本暦日原典」2行目の元号を返す
|
619
|
+
#
|
620
|
+
# @param [Western::Calendar] date 日
|
621
|
+
#
|
622
|
+
# @return [Gengou] 元号情報(2行目)
|
623
|
+
#
|
624
|
+
def self.second_line(date:)
|
625
|
+
lines = lines(date: date)
|
626
|
+
lines[1].clone
|
627
|
+
end
|
628
|
+
end
|
629
|
+
end
|
630
|
+
end
|