zakuro 0.0.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/README.md +102 -42
  4. data/doc/operation.md +25 -0
  5. data/doc/operation/csv/month.csv +202 -0
  6. data/doc/operation/operation.xlsx +0 -0
  7. data/doc/operation/transfer.rb +77 -0
  8. data/lib/zakuro/calculation/base/multi_gengou.rb +101 -0
  9. data/lib/zakuro/calculation/base/multi_gengou_roller.rb +218 -0
  10. data/lib/zakuro/calculation/base/year.rb +107 -0
  11. data/lib/zakuro/calculation/cycle/abstract_remainder.rb +459 -0
  12. data/lib/zakuro/calculation/cycle/abstract_solar_term.rb +151 -0
  13. data/lib/zakuro/calculation/cycle/zodiac.rb +106 -0
  14. data/lib/zakuro/calculation/monthly/first_day.rb +45 -0
  15. data/lib/zakuro/calculation/monthly/initialized_month.rb +120 -0
  16. data/lib/zakuro/calculation/monthly/month.rb +184 -0
  17. data/lib/zakuro/calculation/monthly/month_label.rb +88 -0
  18. data/lib/zakuro/calculation/monthly/operated_month.rb +201 -0
  19. data/lib/zakuro/calculation/range/full_range.rb +210 -0
  20. data/lib/zakuro/calculation/range/operated_range.rb +134 -0
  21. data/lib/zakuro/calculation/range/operated_solar_terms.rb +201 -0
  22. data/lib/zakuro/calculation/range/transfer/western_date_allocation.rb +76 -0
  23. data/lib/zakuro/calculation/range/transfer/year_boundary.rb +142 -0
  24. data/lib/zakuro/calculation/specifier/single_day.rb +109 -0
  25. data/lib/zakuro/calculation/summary/single.rb +129 -0
  26. data/lib/zakuro/condition.rb +17 -13
  27. data/lib/zakuro/era/japan/gengou.rb +106 -0
  28. data/lib/zakuro/era/japan/gengou/parser.rb +167 -0
  29. data/lib/zakuro/era/japan/gengou/type.rb +178 -0
  30. data/lib/zakuro/era/japan/gengou/validator.rb +236 -0
  31. data/lib/zakuro/era/japan/reki.rb +91 -0
  32. data/lib/zakuro/era/{gengou → japan/yaml}/set-001-until-south.yaml +0 -0
  33. data/lib/zakuro/era/{gengou → japan/yaml}/set-002-from-north.yaml +0 -0
  34. data/lib/zakuro/era/{gengou → japan/yaml}/set-003-modern.yaml +1 -1
  35. data/lib/zakuro/era/western.rb +1 -1
  36. data/lib/zakuro/merchant.rb +2 -2
  37. data/lib/zakuro/operation/month/parser.rb +373 -0
  38. data/lib/zakuro/operation/month/type.rb +453 -0
  39. data/lib/zakuro/operation/month/validator.rb +802 -0
  40. data/lib/zakuro/operation/operation.rb +66 -0
  41. data/lib/zakuro/operation/yaml/month.yaml +6452 -0
  42. data/lib/zakuro/output/error.rb +7 -4
  43. data/lib/zakuro/output/logger.rb +50 -47
  44. data/lib/zakuro/output/response.rb +146 -143
  45. data/lib/zakuro/result/core.rb +52 -0
  46. data/lib/zakuro/result/data.rb +187 -0
  47. data/lib/zakuro/result/operation.rb +114 -0
  48. data/lib/zakuro/result/result.rb +37 -0
  49. data/lib/zakuro/{output → tools}/stringifier.rb +16 -9
  50. data/lib/zakuro/tools/typeof.rb +33 -0
  51. data/lib/zakuro/version.rb +1 -1
  52. data/lib/zakuro/version/abstract_version.rb +1 -1
  53. data/lib/zakuro/version/context.rb +23 -0
  54. data/lib/zakuro/version/senmyou/cycle/remainder.rb +63 -0
  55. data/lib/zakuro/version/senmyou/cycle/solar_term.rb +31 -0
  56. data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +186 -182
  57. data/lib/zakuro/version/senmyou/range/annual_range.rb +164 -0
  58. data/lib/zakuro/version/senmyou/senmyou.rb +10 -4
  59. data/lib/zakuro/version/senmyou/stella/lunar_orbit.rb +7 -7
  60. data/lib/zakuro/version/senmyou/stella/solar_average.rb +103 -138
  61. data/lib/zakuro/version/senmyou/stella/solar_location.rb +213 -0
  62. data/lib/zakuro/version/senmyou/stella/solar_orbit.rb +6 -191
  63. data/lib/zakuro/version/senmyou/stella/winter_solstice.rb +4 -4
  64. data/lib/zakuro/version/version_class_resolver.rb +62 -0
  65. data/lib/zakuro/version_factory.rb +3 -3
  66. metadata +49 -20
  67. data/lib/zakuro/cycle/abstract_remainder.rb +0 -457
  68. data/lib/zakuro/cycle/zodiac.rb +0 -103
  69. data/lib/zakuro/era/japan.rb +0 -660
  70. data/lib/zakuro/output/result.rb +0 -219
  71. data/lib/zakuro/version/senmyou/base/era.rb +0 -83
  72. data/lib/zakuro/version/senmyou/base/multi_gengou.rb +0 -98
  73. data/lib/zakuro/version/senmyou/base/multi_gengou_roller.rb +0 -205
  74. data/lib/zakuro/version/senmyou/base/remainder.rb +0 -60
  75. data/lib/zakuro/version/senmyou/base/solar_term.rb +0 -66
  76. data/lib/zakuro/version/senmyou/base/year.rb +0 -104
  77. data/lib/zakuro/version/senmyou/monthly/month.rb +0 -122
  78. data/lib/zakuro/version/senmyou/summary/annual_range.rb +0 -186
  79. data/lib/zakuro/version/senmyou/summary/full_range.rb +0 -216
  80. data/lib/zakuro/version/senmyou/summary/specifier.rb +0 -100
@@ -2,9 +2,12 @@
2
2
 
3
3
  # :nodoc:
4
4
  module Zakuro
5
- #
6
- # ZakuroError ライブラリ内エラー
7
- #
8
- class ZakuroError < StandardError
5
+ # :nodoc:
6
+ module Output
7
+ #
8
+ # ZakuroError ライブラリ内エラー
9
+ #
10
+ class ZakuroError < StandardError
11
+ end
9
12
  end
10
13
  end
@@ -2,62 +2,65 @@
2
2
 
3
3
  # :nodoc:
4
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
5
+ # :nodoc:
6
+ module Output
7
+ #
8
+ # 軽量なロガー
9
+ # @note 本番では使用しない
10
+ #
11
+ class Logger
12
+ LEVELS = {
13
+ none: -1,
14
+ debug: 0,
15
+ info: 1
16
+ # warn : 2,
17
+ # error : 3,
18
+ }.freeze
17
19
 
18
- LEVEL = LEVELS[:none]
20
+ LEVEL = LEVELS[:none]
19
21
 
20
- # @return [String] 呼び出し位置
21
- attr_reader :location
22
+ # @return [String] 呼び出し位置
23
+ attr_reader :location
22
24
 
23
- def initialize(location:)
24
- @location = location
25
- end
25
+ def initialize(location:)
26
+ @location = location
27
+ end
26
28
 
27
- #
28
- # DEBUGレベルの標準出力を行う
29
- #
30
- # @param [String] messages メッセージ
31
- #
32
- def debug(*messages)
33
- return if LEVEL < LEVELS[:debug]
29
+ #
30
+ # DEBUGレベルの標準出力を行う
31
+ #
32
+ # @param [String] messages メッセージ
33
+ #
34
+ def debug(*messages)
35
+ return if LEVEL < LEVELS[:debug]
34
36
 
35
- output('DEBUG', *messages)
36
- end
37
+ output('DEBUG', *messages)
38
+ end
37
39
 
38
- #
39
- # INFOレベルの標準出力を行う
40
- #
41
- # @param [String] messages メッセージ
42
- #
43
- def info(*messages)
44
- return if LEVEL < LEVELS[:info]
40
+ #
41
+ # INFOレベルの標準出力を行う
42
+ #
43
+ # @param [String] messages メッセージ
44
+ #
45
+ def info(*messages)
46
+ return if LEVEL < LEVELS[:info]
45
47
 
46
- output('INFO', *messages)
47
- end
48
+ output('INFO', *messages)
49
+ end
48
50
 
49
- private
51
+ private
50
52
 
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}"
53
+ #
54
+ # 標準出力を行う
55
+ #
56
+ # @param [String] level ログレベル
57
+ # @param [String] messages メッセージ
58
+ #
59
+ def output(level, *messages)
60
+ messages.each do |message|
61
+ # :#{Thread.current.backtrace[5]}
62
+ p "[#{level}] #{@location}: #{message}"
63
+ end
61
64
  end
62
65
  end
63
66
  end
@@ -1,170 +1,173 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'result'
3
+ require_relative '../result/result'
4
4
 
5
5
  # :nodoc:
6
6
  module Zakuro
7
- #
8
- # Response 返却値
9
- #
10
- module Response
7
+ # :nodoc:
8
+ module Output
11
9
  #
12
- # SingleDay 1日データ
10
+ # Response 返却値
13
11
  #
14
- module SingleDay
12
+ module Response
15
13
  #
16
- # Param 引数
14
+ # SingleDay 1日データ
17
15
  #
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
16
+ module SingleDay
17
+ #
18
+ # Param 引数
19
+ #
20
+ class Param
21
+ # @return [Year] 年情報(各暦のデータ型)
22
+ attr_reader :year
23
+ # @return [Month] 月情報(各暦のデータ型)
24
+ attr_reader :month
25
+ # @return [Western::Calendar] 年月日情報(西暦)
26
+ attr_reader :date
27
+ # @return [Integer] 日数(月初日から指定日までの日数)
28
+ attr_reader :days
29
+
30
+ #
31
+ # 初期化
32
+ #
33
+ # @param [Year] year 年情報(各暦のデータ型)
34
+ # @param [Month] month 月情報(各暦のデータ型)
35
+ # @param [Western::Calendar] date 年月日情報(西暦)
36
+ # @param [Integer] days 日数(月初日から指定日までの日数)
37
+ #
38
+ def initialize(year:, month:, date:, days:)
39
+ @year = year
40
+ @month = month
41
+ @date = date
42
+ @days = days
43
+ end
44
+ end
45
+
46
+ #
47
+ # 1日データを生成する
48
+ #
49
+ # @param [Parameter] param 引数
50
+ #
51
+ # @return [SingleDay] 1日データ
52
+ #
53
+ def self.save_single_day(param:)
54
+ year = param.year
55
+ month = param.month
56
+ date = param.date
57
+ days = param.days
58
+ Result::Data::SingleDay.new(
59
+ year: save_year(year: year),
60
+ month: save_month(month: month, date: date, days: days),
61
+ day: save_day(month: month, date: date, days: days)
62
+ )
63
+ end
27
64
 
28
65
  #
29
- # 初期化
66
+ # 年データを保存する
30
67
  #
31
68
  # @param [Year] year 年情報(各暦のデータ型)
69
+ #
70
+ # @return [Result::Year] 年データ
71
+ #
72
+ def self.save_year(year:)
73
+ multi_gengou = year.multi_gengou
74
+ first = multi_gengou.first_line
75
+ second = multi_gengou.second_line
76
+ Result::Data::Year.new(
77
+ first_gengou:
78
+ Result::Data::Gengou.new(name: first.name, number: first.year),
79
+ second_gengou:
80
+ Result::Data::Gengou.new(name: second.name, number: second.year),
81
+ zodiac_name: year.zodiac_name, total_days: year.total_days
82
+ )
83
+ end
84
+ private_class_method :save_year
85
+
86
+ #
87
+ # 月データを保存する
88
+ #
32
89
  # @param [Month] month 月情報(各暦のデータ型)
33
90
  # @param [Western::Calendar] date 年月日情報(西暦)
34
91
  # @param [Integer] days 日数(月初日から指定日までの日数)
35
92
  #
36
- def initialize(year:, month:, date:, days:)
37
- @year = year
38
- @month = month
39
- @date = date
40
- @days = days
93
+ # @return [Result::Month] 月データ
94
+ #
95
+ def self.save_month(month:, date:, days:)
96
+ Result::Data::Month.new(
97
+ number: month.number, leaped: month.leaped?, days_name: month.days_name,
98
+ first_day: save_first_day(remainder: month.remainder,
99
+ date: date, days: days),
100
+ odd_solar_terms: save_solar_term(term: month.odd_term),
101
+ even_solar_terms: save_solar_term(term: month.even_term)
102
+ )
41
103
  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
104
+ private_class_method :save_month
62
105
 
63
- #
64
- # 年データを保存する
65
- #
66
- # @param [Year] year 年情報(各暦のデータ型)
67
- #
68
- # @return [Result::Year] 年データ
69
- #
70
- def self.save_year(year:)
71
- multi_gengou = year.multi_gengou
72
- first = multi_gengou.first_line
73
- second = multi_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: year.zodiac_name, total_days: year.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
106
+ #
107
+ # 月初日データを保存する
108
+ #
109
+ # @param [Cycle::AbstractRemainder] remainder 大余小余情報
110
+ # @param [Western::Calendar] date 年月日情報(西暦)
111
+ # @param [Integer] days 日数(月初日から指定日までの日数)
112
+ #
113
+ # @return [Result::Day] 日データ
114
+ #
115
+ def self.save_first_day(remainder:, date:, days:)
116
+ western_date = date.clone - days
117
+ Result::Data::Day.new(
118
+ number: 1,
119
+ zodiac_name: remainder.zodiac_name,
120
+ remainder: remainder,
121
+ western_date: western_date
122
+ )
123
+ end
124
+ private_class_method :save_first_day
103
125
 
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
126
+ #
127
+ # 二十四節気データを保存する
128
+ #
129
+ # @note 今は宣明暦に合わせている。江戸期以降の暦には対応していない(複数の中気節気を指定できない)
130
+ #
131
+ # @param [SolarTerm] term 二十四節気情報(各暦のデータ型)
132
+ #
133
+ # @return [Array<Result::SolarTerm>] 二十四節気データ
134
+ #
135
+ def self.save_solar_term(term:)
136
+ return [] if term.invalid?
123
137
 
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?
138
+ [
139
+ Result::Data::SolarTerm.new(
140
+ index: term.index,
141
+ remainder: term.remainder
142
+ )
143
+ ]
144
+ end
145
+ private_class_method :save_solar_term
135
146
 
136
- [
137
- Result::SolarTerm.new(
138
- index: term.index,
139
- remainder: term.remainder.format
147
+ #
148
+ # 日データを保存する
149
+ #
150
+ # @param [Month] month 月情報(各暦のデータ型)
151
+ # @param [Western::Calendar] date 年月日情報(西暦)
152
+ # @param [Integer] days 日数(月初日から指定日までの日数)
153
+ #
154
+ # @return [Result::Day] 日データ
155
+ #
156
+ def self.save_day(month:, date:, days:)
157
+ remainder = month.remainder
158
+ remainder = remainder.add(
159
+ # 常に参照元のRemainderクラスで生成する
160
+ remainder.class.new(day: days, minute: 0, second: 0)
140
161
  )
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
- )
162
+ Result::Data::Day.new(
163
+ number: (days + 1),
164
+ zodiac_name: remainder.zodiac_name,
165
+ remainder: remainder,
166
+ western_date: date
167
+ )
168
+ end
169
+ private_class_method :save_day
166
170
  end
167
- private_class_method :save_day
168
171
  end
169
172
  end
170
173
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ require_relative '../tools/stringifier'
6
+
7
+ # :nodoc:
8
+ module Zakuro
9
+ #
10
+ # Result 演算結果
11
+ #
12
+ module Result
13
+ #
14
+ # Core 共通処理
15
+ #
16
+ class Core
17
+ #
18
+ # 初期化
19
+ #
20
+ def initialize(*_args); end
21
+
22
+ #
23
+ # ハッシュ化する
24
+ #
25
+ # @return [Hash<String, Object>] ハッシュ
26
+ #
27
+ def to_h
28
+ Tools::Stringifier.to_h(obj: self, class_prefix: 'Zakuro::Result')
29
+ end
30
+
31
+ #
32
+ # JSON化する
33
+ #
34
+ # @param [JSON::State] _args 引数( Struct#to_json )
35
+ #
36
+ # @return [String] JSON文字列
37
+ #
38
+ def to_json(*_args)
39
+ JSON.generate(to_h)
40
+ end
41
+
42
+ #
43
+ # JSON(整形)化する
44
+ #
45
+ # @return [String] JSON(整形)文字列
46
+ #
47
+ def to_pretty_json
48
+ JSON.pretty_generate(to_h)
49
+ end
50
+ end
51
+ end
52
+ end