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.
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