zakuro 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +9 -0
  3. data/.gitignore +69 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +14 -0
  6. data/.travis.yml +6 -0
  7. data/Gemfile +19 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +44 -0
  10. data/Rakefile +20 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. 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
  14. 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
  15. data/images/source/description.numbers +0 -0
  16. data/images//345/205/245/345/256/232/346/260/227/343/201/256/350/265/267/347/256/227.png +0 -0
  17. data/images//345/220/204/346/234/210/343/201/256/346/261/202/343/202/201/346/226/271.png +0 -0
  18. data/images//345/244/252/351/231/275/343/201/250/346/234/210.png +0 -0
  19. data/lib/zakuro.rb +9 -0
  20. data/lib/zakuro/condition.rb +239 -0
  21. data/lib/zakuro/cycle/abstract_remainder.rb +457 -0
  22. data/lib/zakuro/cycle/zodiac.rb +103 -0
  23. data/lib/zakuro/era/gengou/set-001-until-south.yaml +375 -0
  24. data/lib/zakuro/era/gengou/set-002-from-north.yaml +166 -0
  25. data/lib/zakuro/era/gengou/set-003-modern.yaml +12 -0
  26. data/lib/zakuro/era/japan.rb +630 -0
  27. data/lib/zakuro/era/western.rb +412 -0
  28. data/lib/zakuro/merchant.rb +57 -0
  29. data/lib/zakuro/output/error.rb +10 -0
  30. data/lib/zakuro/output/logger.rb +64 -0
  31. data/lib/zakuro/output/response.rb +170 -0
  32. data/lib/zakuro/output/result.rb +219 -0
  33. data/lib/zakuro/output/stringifier.rb +62 -0
  34. data/lib/zakuro/version.rb +7 -0
  35. data/lib/zakuro/version/abstract_version.rb +29 -0
  36. data/lib/zakuro/version/genka/genka.rb +19 -0
  37. data/lib/zakuro/version/gihou/gihou.rb +19 -0
  38. data/lib/zakuro/version/gregorio/gregorio.rb +19 -0
  39. data/lib/zakuro/version/houryaku/houryaku.rb +19 -0
  40. data/lib/zakuro/version/joukyou/joukyou.rb +19 -0
  41. data/lib/zakuro/version/kansei/kansei.rb +19 -0
  42. data/lib/zakuro/version/senmyou/README.md +586 -0
  43. data/lib/zakuro/version/senmyou/base/era.rb +81 -0
  44. data/lib/zakuro/version/senmyou/base/gengou.rb +210 -0
  45. data/lib/zakuro/version/senmyou/base/remainder.rb +60 -0
  46. data/lib/zakuro/version/senmyou/base/solar_term.rb +66 -0
  47. data/lib/zakuro/version/senmyou/base/year.rb +58 -0
  48. data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +220 -0
  49. data/lib/zakuro/version/senmyou/monthly/month.rb +112 -0
  50. data/lib/zakuro/version/senmyou/senmyou.rb +34 -0
  51. data/lib/zakuro/version/senmyou/stella/lunar_orbit.rb +332 -0
  52. data/lib/zakuro/version/senmyou/stella/solar_average.rb +192 -0
  53. data/lib/zakuro/version/senmyou/stella/solar_orbit.rb +398 -0
  54. data/lib/zakuro/version/senmyou/stella/winter_solstice.rb +106 -0
  55. data/lib/zakuro/version/senmyou/summary/annual_data.rb +186 -0
  56. data/lib/zakuro/version/senmyou/summary/gengou_data.rb +294 -0
  57. data/lib/zakuro/version/taien/taien.rb +19 -0
  58. data/lib/zakuro/version/tenpou/tenpou.rb +19 -0
  59. data/lib/zakuro/version_factory.rb +59 -0
  60. data/zakuro.gemspec +31 -0
  61. metadata +106 -0
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nodoc:
4
+ module Zakuro
5
+ #
6
+ # ZakuroError ライブラリ内エラー
7
+ #
8
+ class ZakuroError < StandardError
9
+ end
10
+ end
@@ -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