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,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# :nodoc:
|
4
|
+
module Zakuro
|
5
|
+
#
|
6
|
+
# 軽量なロガー
|
7
|
+
# @note 本番では使用しない
|
8
|
+
#
|
9
|
+
class Logger
|
10
|
+
LEVELS = {
|
11
|
+
none: -1,
|
12
|
+
debug: 0,
|
13
|
+
info: 1
|
14
|
+
# warn : 2,
|
15
|
+
# error : 3,
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
LEVEL = LEVELS[:none]
|
19
|
+
|
20
|
+
# @return [String] 呼び出し位置
|
21
|
+
attr_reader :location
|
22
|
+
|
23
|
+
def initialize(location:)
|
24
|
+
@location = location
|
25
|
+
end
|
26
|
+
|
27
|
+
#
|
28
|
+
# DEBUGレベルの標準出力を行う
|
29
|
+
#
|
30
|
+
# @param [String] messages メッセージ
|
31
|
+
#
|
32
|
+
def debug(*messages)
|
33
|
+
return if LEVEL < LEVELS[:debug]
|
34
|
+
|
35
|
+
output('DEBUG', *messages)
|
36
|
+
end
|
37
|
+
|
38
|
+
#
|
39
|
+
# INFOレベルの標準出力を行う
|
40
|
+
#
|
41
|
+
# @param [String] messages メッセージ
|
42
|
+
#
|
43
|
+
def info(*messages)
|
44
|
+
return if LEVEL < LEVELS[:info]
|
45
|
+
|
46
|
+
output('INFO', *messages)
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
#
|
52
|
+
# 標準出力を行う
|
53
|
+
#
|
54
|
+
# @param [String] level ログレベル
|
55
|
+
# @param [String] messages メッセージ
|
56
|
+
#
|
57
|
+
def output(level, *messages)
|
58
|
+
messages.each do |message|
|
59
|
+
# :#{Thread.current.backtrace[5]}
|
60
|
+
p "[#{level}] #{@location}: #{message}"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'result'
|
4
|
+
|
5
|
+
# :nodoc:
|
6
|
+
module Zakuro
|
7
|
+
#
|
8
|
+
# Response 返却値
|
9
|
+
#
|
10
|
+
module Response
|
11
|
+
#
|
12
|
+
# SingleDay 1日データ
|
13
|
+
#
|
14
|
+
module SingleDay
|
15
|
+
#
|
16
|
+
# Param 引数
|
17
|
+
#
|
18
|
+
class Param
|
19
|
+
# @return [Year] 年情報(各暦のデータ型)
|
20
|
+
attr_reader :year
|
21
|
+
# @return [Month] 月情報(各暦のデータ型)
|
22
|
+
attr_reader :month
|
23
|
+
# @return [Western::Calendar] 年月日情報(西暦)
|
24
|
+
attr_reader :date
|
25
|
+
# @return [Integer] 日数(月初日から指定日までの日数)
|
26
|
+
attr_reader :days
|
27
|
+
|
28
|
+
#
|
29
|
+
# 初期化
|
30
|
+
#
|
31
|
+
# @param [Year] year 年情報(各暦のデータ型)
|
32
|
+
# @param [Month] month 月情報(各暦のデータ型)
|
33
|
+
# @param [Western::Calendar] date 年月日情報(西暦)
|
34
|
+
# @param [Integer] days 日数(月初日から指定日までの日数)
|
35
|
+
#
|
36
|
+
def initialize(year:, month:, date:, days:)
|
37
|
+
@year = year
|
38
|
+
@month = month
|
39
|
+
@date = date
|
40
|
+
@days = days
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
#
|
45
|
+
# 1日データを生成する
|
46
|
+
#
|
47
|
+
# @param [Parameter] param 引数
|
48
|
+
#
|
49
|
+
# @return [SingleDay] 1日データ
|
50
|
+
#
|
51
|
+
def self.save_single_day(param:)
|
52
|
+
year = param.year
|
53
|
+
month = param.month
|
54
|
+
date = param.date
|
55
|
+
days = param.days
|
56
|
+
Result::SingleDay.new(
|
57
|
+
year: save_year(year: year),
|
58
|
+
month: save_month(month: month, date: date, days: days),
|
59
|
+
day: save_day(month: month, date: date, days: days)
|
60
|
+
)
|
61
|
+
end
|
62
|
+
|
63
|
+
#
|
64
|
+
# 年データを保存する
|
65
|
+
#
|
66
|
+
# @param [Year] year 年情報(各暦のデータ型)
|
67
|
+
#
|
68
|
+
# @return [Result::Year] 年データ
|
69
|
+
#
|
70
|
+
def self.save_year(year:)
|
71
|
+
gengou = year.gengou
|
72
|
+
first = gengou.first_line
|
73
|
+
second = gengou.second_line
|
74
|
+
Result::Year.new(
|
75
|
+
first_gengou:
|
76
|
+
Result::Gengou.new(name: first.name, number: first.year),
|
77
|
+
second_gengou:
|
78
|
+
Result::Gengou.new(name: second.name, number: second.year),
|
79
|
+
zodiac_name: gengou.zodiac_name, total_days: gengou.total_days
|
80
|
+
)
|
81
|
+
end
|
82
|
+
private_class_method :save_year
|
83
|
+
|
84
|
+
#
|
85
|
+
# 月データを保存する
|
86
|
+
#
|
87
|
+
# @param [Month] month 月情報(各暦のデータ型)
|
88
|
+
# @param [Western::Calendar] date 年月日情報(西暦)
|
89
|
+
# @param [Integer] days 日数(月初日から指定日までの日数)
|
90
|
+
#
|
91
|
+
# @return [Result::Month] 月データ
|
92
|
+
#
|
93
|
+
def self.save_month(month:, date:, days:)
|
94
|
+
Result::Month.new(
|
95
|
+
number: month.number, leaped: month.leaped, days_name: month.days_name,
|
96
|
+
first_day: save_first_day(remainder: month.remainder,
|
97
|
+
date: date, days: days),
|
98
|
+
odd_solar_terms: save_solar_term(term: month.odd_term),
|
99
|
+
even_solar_terms: save_solar_term(term: month.even_term)
|
100
|
+
)
|
101
|
+
end
|
102
|
+
private_class_method :save_month
|
103
|
+
|
104
|
+
#
|
105
|
+
# 月初日データを保存する
|
106
|
+
#
|
107
|
+
# @param [Cycle::AbstractRemainder] remainder 大余小余情報
|
108
|
+
# @param [Western::Calendar] date 年月日情報(西暦)
|
109
|
+
# @param [Integer] days 日数(月初日から指定日までの日数)
|
110
|
+
#
|
111
|
+
# @return [Result::Day] 日データ
|
112
|
+
#
|
113
|
+
def self.save_first_day(remainder:, date:, days:)
|
114
|
+
western_date = date.clone - days
|
115
|
+
Result::Day.new(
|
116
|
+
number: 1,
|
117
|
+
zodiac_name: remainder.zodiac_name,
|
118
|
+
remainder: remainder.format,
|
119
|
+
western_date: western_date.format
|
120
|
+
)
|
121
|
+
end
|
122
|
+
private_class_method :save_first_day
|
123
|
+
|
124
|
+
#
|
125
|
+
# 二十四節気データを保存する
|
126
|
+
#
|
127
|
+
# @note 今は宣明暦に合わせている。江戸期以降の暦には対応していない(複数の中気節気を指定できない)
|
128
|
+
#
|
129
|
+
# @param [SolarTerm] term 二十四節気情報(各暦のデータ型)
|
130
|
+
#
|
131
|
+
# @return [Array<Result::SolarTerm>] 二十四節気データ
|
132
|
+
#
|
133
|
+
def self.save_solar_term(term:)
|
134
|
+
return [] if term.invalid?
|
135
|
+
|
136
|
+
[
|
137
|
+
Result::SolarTerm.new(
|
138
|
+
index: term.index,
|
139
|
+
remainder: term.remainder.format
|
140
|
+
)
|
141
|
+
]
|
142
|
+
end
|
143
|
+
private_class_method :save_solar_term
|
144
|
+
|
145
|
+
#
|
146
|
+
# 日データを保存する
|
147
|
+
#
|
148
|
+
# @param [Month] month 月情報(各暦のデータ型)
|
149
|
+
# @param [Western::Calendar] date 年月日情報(西暦)
|
150
|
+
# @param [Integer] days 日数(月初日から指定日までの日数)
|
151
|
+
#
|
152
|
+
# @return [Result::Day] 日データ
|
153
|
+
#
|
154
|
+
def self.save_day(month:, date:, days:)
|
155
|
+
remainder = month.remainder
|
156
|
+
remainder = remainder.add(
|
157
|
+
# 常に参照元のRemainderクラスで生成する
|
158
|
+
remainder.class.new(day: days, minute: 0, second: 0)
|
159
|
+
)
|
160
|
+
Result::Day.new(
|
161
|
+
number: (days + 1),
|
162
|
+
zodiac_name: remainder.zodiac_name,
|
163
|
+
remainder: remainder.format,
|
164
|
+
western_date: date.format
|
165
|
+
)
|
166
|
+
end
|
167
|
+
private_class_method :save_day
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
@@ -0,0 +1,219 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
require_relative './stringifier'
|
6
|
+
|
7
|
+
# :nodoc:
|
8
|
+
module Zakuro
|
9
|
+
#
|
10
|
+
# Result 演算結果
|
11
|
+
#
|
12
|
+
module Result
|
13
|
+
#
|
14
|
+
# Gengou 元号
|
15
|
+
#
|
16
|
+
class Gengou
|
17
|
+
# @return [String] 元号名
|
18
|
+
attr_reader :name
|
19
|
+
# @return [Integer] 元号年
|
20
|
+
attr_reader :number
|
21
|
+
|
22
|
+
#
|
23
|
+
# 初期化
|
24
|
+
#
|
25
|
+
# @param [String] name 元号名
|
26
|
+
# @param [Integer] number 元号年
|
27
|
+
#
|
28
|
+
def initialize(name:, number:)
|
29
|
+
@name = name
|
30
|
+
@number = number
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# Year 年
|
36
|
+
#
|
37
|
+
class Year
|
38
|
+
# @return [Gengou] 元号(1行目)
|
39
|
+
attr_reader :first_gengou
|
40
|
+
# @return [Gengou] 元号(2行目)
|
41
|
+
attr_reader :second_gengou
|
42
|
+
# @return [String] 十干十二支
|
43
|
+
attr_reader :zodiac_name
|
44
|
+
# @return [Integer] 日数
|
45
|
+
attr_reader :total_days
|
46
|
+
|
47
|
+
#
|
48
|
+
# 初期化
|
49
|
+
#
|
50
|
+
# @param [Gengou] first_gengou 元号(1行目)
|
51
|
+
# @param [Gengou] second_gengou 元号(2行目)
|
52
|
+
# @param [String] zodiac_name 十干十二支
|
53
|
+
# @param [Integer] total_days 日数
|
54
|
+
#
|
55
|
+
def initialize(first_gengou:, second_gengou:, zodiac_name:, total_days:)
|
56
|
+
@first_gengou = first_gengou
|
57
|
+
@second_gengou = second_gengou
|
58
|
+
@zodiac_name = zodiac_name
|
59
|
+
@total_days = total_days
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
#
|
64
|
+
# SolarTerm 二十四節気
|
65
|
+
#
|
66
|
+
class SolarTerm
|
67
|
+
# @return [Integer] 連番
|
68
|
+
attr_reader :index
|
69
|
+
# @return [String] 大余小余
|
70
|
+
attr_reader :remainder
|
71
|
+
|
72
|
+
#
|
73
|
+
# 初期化
|
74
|
+
#
|
75
|
+
# @param [Integer] index 連番
|
76
|
+
# @param [String] remainder 大余小余
|
77
|
+
#
|
78
|
+
def initialize(index:, remainder:)
|
79
|
+
@index = index
|
80
|
+
@remainder = remainder
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# :reek:TooManyInstanceVariables { max_instance_variables: 6 }
|
85
|
+
|
86
|
+
#
|
87
|
+
# Month 月
|
88
|
+
#
|
89
|
+
class Month
|
90
|
+
# TODO: days_name -> zodiac_name
|
91
|
+
|
92
|
+
# @return [Integer] 月順(1-12)
|
93
|
+
attr_reader :number
|
94
|
+
# @return [True] 閏月
|
95
|
+
# @return [False] 平月
|
96
|
+
attr_reader :leaped
|
97
|
+
# @return [String] 十干十二支
|
98
|
+
attr_reader :days_name
|
99
|
+
# @return [Day] 月初日データ
|
100
|
+
attr_reader :first_day
|
101
|
+
# @return [SolarTerm] 二十四節気(節気)
|
102
|
+
attr_reader :odd_solar_terms
|
103
|
+
# @return [SolarTerm] 二十四節気(中気)
|
104
|
+
attr_reader :even_solar_terms
|
105
|
+
|
106
|
+
# rubocop:disable Metrics/ParameterLists
|
107
|
+
# :reek:LongParameterList { max_params: 6 }
|
108
|
+
|
109
|
+
#
|
110
|
+
# 初期化
|
111
|
+
#
|
112
|
+
# @param [Integer] number 月順(1-12)
|
113
|
+
# @param [True, False] leaped 閏月/平月
|
114
|
+
# @param [String] days_name 十干十二支
|
115
|
+
# @param [Day] first_day 月初日データ
|
116
|
+
# @param [SolarTerm] odd_solar_terms 二十四節気(節気)
|
117
|
+
# @param [SolarTerm] even_solar_terms 二十四節気(中気)
|
118
|
+
#
|
119
|
+
def initialize(number:, leaped:, days_name:, first_day:,
|
120
|
+
odd_solar_terms:, even_solar_terms:)
|
121
|
+
@number = number
|
122
|
+
@leaped = leaped
|
123
|
+
@days_name = days_name
|
124
|
+
@first_day = first_day
|
125
|
+
@odd_solar_terms = odd_solar_terms
|
126
|
+
@even_solar_terms = even_solar_terms
|
127
|
+
end
|
128
|
+
# rubocop:enable Metrics/ParameterLists
|
129
|
+
end
|
130
|
+
|
131
|
+
#
|
132
|
+
# Day 日
|
133
|
+
#
|
134
|
+
class Day
|
135
|
+
# @return [Integer] 月初日から数えた日(M月d日のdに相当)
|
136
|
+
attr_reader :number
|
137
|
+
# @return [String] 十干十二支
|
138
|
+
attr_reader :zodiac_name
|
139
|
+
# @return [String] 大余小余
|
140
|
+
attr_reader :remainder
|
141
|
+
# @return [String] 年月日
|
142
|
+
attr_reader :western_date
|
143
|
+
|
144
|
+
#
|
145
|
+
# 初期化
|
146
|
+
#
|
147
|
+
# @param [Integer] number 月初日から数えた日(M月d日のdに相当)
|
148
|
+
# @param [String] zodiac_name 十干十二支
|
149
|
+
# @param [String] remainder 大余小余
|
150
|
+
# @param [String] western_date 年月日
|
151
|
+
#
|
152
|
+
def initialize(number:, zodiac_name:, remainder:, western_date:)
|
153
|
+
@number = number
|
154
|
+
@zodiac_name = zodiac_name
|
155
|
+
@remainder = remainder
|
156
|
+
@western_date = western_date
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
#
|
161
|
+
# Core 共通処理
|
162
|
+
#
|
163
|
+
class Core
|
164
|
+
#
|
165
|
+
# ハッシュ化する
|
166
|
+
#
|
167
|
+
# @return [Hash<String, Object>] ハッシュ
|
168
|
+
#
|
169
|
+
def to_h
|
170
|
+
Stringifier.to_h(obj: self, class_prefix: 'Zakuro::Result')
|
171
|
+
end
|
172
|
+
|
173
|
+
#
|
174
|
+
# JSON化する
|
175
|
+
#
|
176
|
+
# @param [JSON::State] _args 引数( Struct#to_json )
|
177
|
+
#
|
178
|
+
# @return [String] JSON文字列
|
179
|
+
#
|
180
|
+
def to_json(*_args)
|
181
|
+
JSON.generate(to_h)
|
182
|
+
end
|
183
|
+
|
184
|
+
#
|
185
|
+
# JSON(整形)化する
|
186
|
+
#
|
187
|
+
# @return [String] JSON(整形)文字列
|
188
|
+
#
|
189
|
+
def to_pretty_json
|
190
|
+
JSON.pretty_generate(to_h)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
#
|
195
|
+
# SingleDay 1日分情報
|
196
|
+
#
|
197
|
+
class SingleDay < Core
|
198
|
+
# @return [Year] 年
|
199
|
+
attr_reader :year
|
200
|
+
# @return [Month] 月
|
201
|
+
attr_reader :month
|
202
|
+
# @return [Day] 日
|
203
|
+
attr_reader :day
|
204
|
+
|
205
|
+
#
|
206
|
+
# 初期化
|
207
|
+
#
|
208
|
+
# @param [Year] year 年
|
209
|
+
# @param [Month] month 月
|
210
|
+
# @param [Day] day 日
|
211
|
+
#
|
212
|
+
def initialize(year:, month:, day:)
|
213
|
+
@year = year
|
214
|
+
@month = month
|
215
|
+
@day = day
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|