wareki 0.2.1 → 0.2.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 024750af6c60493ab9b817b2ac9e81a7cffd96f5
4
- data.tar.gz: 61981fbbe3734009c05bbaabe56370c9b083cbcf
2
+ SHA256:
3
+ metadata.gz: 790c42a6f6b07acda3701e35d179140baf9435df3866c3e4604ab5bcc484e55f
4
+ data.tar.gz: ddf6f052c60fe43faec942b48b3ffaef9ac7d801e9a8ac67c6cdd2ea9672156d
5
5
  SHA512:
6
- metadata.gz: 8bdbf8c2f81dc966ede8c24633fb8a6c541e4e2b30907d3d804da4e01a43387420b534811b79f7e7c6b8482630b59afd58eabed2f301089f2f4302c2f6d7185e
7
- data.tar.gz: 5b7093d249fad9fe6389620104f04f40aeebbd14e000a5c8c3fa120f45bbf14ad562ef48c9a57f111a7ac0a9ec779c4a8b67f54fe68eb837324bc8ae3d103586
6
+ metadata.gz: 02a4b54f5f344cb75c64bf16be764cc073d503a0c7efe9a6b6695a3aff62fb7bedbdaa1c6ef7a2e9a6e86f83e396c2b38a257e19f84034b6766bc0879c200c29
7
+ data.tar.gz: 2c8581f1e91da2535d335136fafaa55f6b8a901169a4003df570801ab8c548f2109fc0e98108b0752427e55590f88178681d9ffb41efcf17b4367ee382bfe6a3
data/ChangeLog CHANGED
@@ -1,3 +1,8 @@
1
+ 2018-09-19 Tatsuki Sugiura <sugi@nemui.org>
2
+
3
+ * Version: 0.2.2
4
+ * Tiny improvement on date validation
5
+
1
6
  2018-08-27 Tatsuki Sugiura <sugi@nemui.org>
2
7
 
3
8
  * Version: 0.2.1
data/README.rdoc CHANGED
@@ -87,11 +87,12 @@ Gemfile に以下のようにするか、
87
87
  == 仕様、限界、制限など
88
88
 
89
89
  * 作者は暦の専門家ではまったくありません。ツッコミお待ちしています。
90
- * 皇紀と旧暦が出力できますが、旧暦445年1月1日(先発グレゴリオ暦で445年1月25日)より前の日付はサポートしていません。扱おうとすると UnsupportedDateRange 例外を上げます。
90
+ * 皇紀と旧暦が出力できますが、旧暦445年1月1日(先発グレゴリオ暦で445年1月25日)より前の日付はサポートしていません。扱おうとすると Wareki::UnsupportedDateRange 例外を上げます。
91
+ * また Date 型からの変換の場合、 現状「大化」で1年1月1日扱いになる日(ユリウス暦で645年2月2日、先発グレゴリオ暦では645年2月5日)より前の日付はサポートしていません。こちらも Wareki::UnsupportedDateRange 例外がおきます。
91
92
  * 日本暦日原典の対照表が、どの暦法を元にしているのか分かっていません。単にデータだけを利用しています。
92
93
  * 内部的には全てユリウス日を経由して変換しています。
93
94
  * パース時には元号の存在しない年(例: 霊亀百年)を受け入れます。しかし現状、Date に変換した場合この情報は捨てられ、パース時の元号を復元することはできません。(Wareki::Date を直接扱えば可能です)
94
- * 改暦による存在しない日(明治5年12月3日〜31日)は基本的に例外を上げます。が、現状このチェックは完全ではありません。
95
+ * 改暦による存在しない日(明治5年12月3日〜31日)は基本的に例外(ArgumentError)を上げます。が、現状このチェックは完全ではありません。
95
96
  * 北朝の元号も解釈できます。しかし現在の所、北朝の元号で文字列にフォーマットすることはできません。
96
97
  * 10月の別名は「神無月」しかサポートしていません
97
98
  * 将来の日付に関しては、現在の元号がずっと継続しているとみなします
@@ -111,9 +112,3 @@ Gemfile に以下のようにするか、
111
112
  == 作者
112
113
 
113
114
  Tatsuki Sugiura <sugi@nemui.org>
114
-
115
- == TODO
116
- * 北朝モード
117
- * Wareki::Date で各種計算のサポート
118
- * 元号として "西暦" サポート?
119
- * 元号の切り替え日を和暦ベースで計算するようにする?
data/lib/wareki/common.rb CHANGED
@@ -1,19 +1,19 @@
1
- # coding: utf-8
2
1
  require 'wareki/calendar_def'
3
2
  require 'wareki/era_def'
4
3
  require 'date'
4
+ # Wareki module common constants definitions
5
5
  module Wareki
6
- GREGORIAN_START = 2405160 # Date.new(1873, 1, 1, Date::GREGORIAN).jd
6
+ GREGORIAN_START = 2_405_160 # Date.new(1873, 1, 1, Date::GREGORIAN).jd
7
7
  GREGORIAN_START_YEAR = 1873
8
- IMPERIAL_START = 1480041 # Date.new(-660, 2, 11, Date::GREGORIAN).jd
8
+ IMPERIAL_START = 1_480_041 # Date.new(-660, 2, 11, Date::GREGORIAN).jd
9
9
  IMPERIAL_START_YEAR = -660
10
- DATE_INFINITY = ::Date.new(280000000, 12, 31) # Use 280000000 for jruby limitation...
11
- YEAR_BY_NUM = Hash[*YEAR_DEFS.map{|y| [y.year, y]}.flatten].freeze
12
- ERA_BY_NAME = Hash[*(ERA_NORTH_DEFS + ERA_DEFS).map {|g| [g.name, g]}.flatten]
13
- ERA_BY_NAME['皇紀'] = ERA_BY_NAME['神武天皇即位紀元'] = Era.new('皇紀', -660, 1480041, DATE_INFINITY.jd)
14
- ERA_BY_NAME['西暦'] = ERA_BY_NAME[''] = Era.new('西暦', 1, 1721424, DATE_INFINITY.jd)
10
+ DATE_INFINITY = ::Date.new(280_000_000, 12, 31) # Use 280000000 for jruby limitation...
11
+ YEAR_BY_NUM = Hash[*YEAR_DEFS.map { |y| [y.year, y] }.flatten].freeze
12
+ ERA_BY_NAME = Hash[*(ERA_NORTH_DEFS + ERA_DEFS).map { |g| [g.name, g] }.flatten]
13
+ ERA_BY_NAME['皇紀'] = ERA_BY_NAME['神武天皇即位紀元'] = Era.new('皇紀', -660, 1_480_041, DATE_INFINITY.jd)
14
+ ERA_BY_NAME['西暦'] = ERA_BY_NAME[''] = Era.new('西暦', 1, 1_721_424, DATE_INFINITY.jd)
15
15
  ERA_BY_NAME.keys.each do |era_name|
16
- alt_era_name = era_name.tr("宝霊神応暦祥寿斎観寛徳禄万福禎国亀", "寳靈神應曆祥壽斉觀寬德祿萬福禎國龜")
16
+ alt_era_name = era_name.tr('宝霊神応暦祥寿斎観寛徳禄万福禎国亀', '寳靈神應曆祥壽斉觀寬德祿萬福禎國龜')
17
17
  alt_era_name == era_name and next
18
18
  ERA_BY_NAME[alt_era_name] = ERA_BY_NAME[era_name]
19
19
  end
@@ -21,7 +21,7 @@ module Wareki
21
21
  ERA_BY_NAME[short] = ERA_BY_NAME[canon]
22
22
  end
23
23
  ERA_BY_NAME.freeze
24
- NUM_CHARS = "零〇一二三四五六七八九十卄廿卅丗卌肆百皕千万億兆01234567890123456789"
24
+ NUM_CHARS = '零〇一二三四五六七八九十卄廿卅丗卌肆百皕千万億兆01234567890123456789'.freeze
25
25
  ALT_MONTH_NAME = %w(睦月 如月 弥生 卯月 皐月 水無月 文月 葉月 長月 神無月 霜月 師走).freeze
26
26
  REGEX = %r{^
27
27
  (?<era_name>西暦|紀元前|#{ERA_BY_NAME.keys.join('|')})?
@@ -35,11 +35,10 @@ module Wareki
35
35
  class UnsupportedDateRange < StandardError; end
36
36
 
37
37
  module_function
38
+
38
39
  def parse_to_date(str, start = ::Date::ITALY)
39
- begin
40
- Date.parse(str).to_date(start)
41
- rescue ArgumentError => e
42
- ::Date.parse(str, true, start)
43
- end
40
+ Date.parse(str).to_date(start)
41
+ rescue ArgumentError
42
+ ::Date.parse(str, true, start)
44
43
  end
45
44
  end
data/lib/wareki/date.rb CHANGED
@@ -1,10 +1,10 @@
1
- # coding: utf-8
2
1
  require 'date'
3
2
  require 'wareki/common'
4
3
  require 'wareki/utils'
4
+ require 'wareki/kansuji'
5
5
  module Wareki
6
+ # Wareki date handling class, main implementation.
6
7
  class Date
7
- attr_reader :jd
8
8
  attr_accessor :year, :month, :day, :era_year, :era_name
9
9
 
10
10
  def self.today
@@ -14,27 +14,26 @@ module Wareki
14
14
  def self._check_invalid_date(era, year, month, day)
15
15
  month == 12 or return true
16
16
  day > 2 or return true
17
- (era == "明治" && year == 5 ||
18
- era.to_s == "" && year == GREGORIAN_START_YEAR - 1 ||
17
+ (era == '明治' && year == 5 ||
19
18
  %w(皇紀 神武天皇即位紀元).member?(era) &&
20
- year == GREGORIAN_START_YEAR - IMPERIAL_START_YEAR - 1) or
21
- return true
22
- false
19
+ year == GREGORIAN_START_YEAR - IMPERIAL_START_YEAR - 1) and
20
+ return false
21
+ true
23
22
  end
24
23
 
25
24
  def self._parse(str)
26
- match = REGEX.match(str.to_s.gsub(/[[:space:]]/, '')) or
25
+ match = REGEX.match(str.to_s.gsub(/[[:space:]]/, '')) or
27
26
  raise ArgumentError, "Invaild Date: #{str}"
28
27
  era = match[:era_name]
29
- (year = Utils.kan_to_i(match[:year])) > 0 or
28
+ (year = Kansuji.k2i(match[:year])) > 0 or
30
29
  raise ArgumentError, "Invalid year: #{str}"
31
30
  month = day = 1
32
31
 
33
- era.to_s != "" && era.to_s != "紀元前" && !ERA_BY_NAME[era] and
32
+ era.to_s != '' && era.to_s != '紀元前' && !ERA_BY_NAME[era] and
34
33
  raise ArgumentError, "Date parse failed: Invalid era name '#{match[:era_name]}'"
35
34
 
36
35
  if match[:month]
37
- month = Utils.kan_to_i(match[:month])
36
+ month = Kansuji.k2i(match[:month])
38
37
  elsif match[:alt_month]
39
38
  month = Utils.alt_month_name_to_i(match[:alt_month])
40
39
  end
@@ -43,10 +42,10 @@ module Wareki
43
42
  raise ArgumentError, "Invalid month: #{str}"
44
43
 
45
44
  if match[:day]
46
- if match[:day] == ""
47
- day = Utils.last_day_of_month(ERA_BY_NAME[era].year + year -1, month, match[:is_leap])
45
+ if match[:day] == ''
46
+ day = Utils.last_day_of_month(ERA_BY_NAME[era].year + year - 1, month, match[:is_leap])
48
47
  else
49
- day = Utils.kan_to_i(match[:day])
48
+ day = Kansuji.k2i(match[:day])
50
49
  end
51
50
  end
52
51
 
@@ -75,24 +74,24 @@ module Wareki
75
74
  end
76
75
 
77
76
  def self.imperial(year, month = 1, day = 1, is_leap_month = false)
78
- new("皇紀", year, month, day, is_leap_month)
77
+ new('皇紀', year, month, day, is_leap_month)
79
78
  end
80
79
 
81
80
  def initialize(era_name, era_year, month = 1, day = 1, is_leap_month = false)
82
- if era_name.to_s != "" && era_name != "紀元前" && !ERA_BY_NAME[era_name]
83
- raise ArgumentError, "Undefined era '#{era_name}'"
84
- end
81
+ raise ArgumentError, "Undefined era '#{era_name}'" if
82
+ era_name.to_s != '' && era_name != '紀元前' && !ERA_BY_NAME[era_name]
83
+
85
84
  @month = month
86
85
  @day = day
87
86
  @is_leap_month = is_leap_month
88
87
  @era_name = era_name
89
88
  @era_year = era_year
90
- if era_name.to_s == "" || era_name == "西暦"
89
+ if era_name.to_s == '' || era_name == '西暦'
91
90
  @year = @era_year
92
- elsif era_name == "皇紀" || era_name == "神武天皇即位紀元"
93
- @year = era_year + IMPERIAL_START_YEAR
94
- elsif era_name.to_s == "紀元前"
91
+ elsif era_name.to_s == '紀元前'
95
92
  @year = -@era_year
93
+ elsif %w(皇紀 神武天皇即位紀元).include? era_name
94
+ @year = era_year + IMPERIAL_START_YEAR
96
95
  else
97
96
  @year = ERA_BY_NAME[era_name].year + era_year - 1
98
97
  end
@@ -119,30 +118,27 @@ module Wareki
119
118
  end
120
119
 
121
120
  def month_index
122
- if @era_name == "" || @era_name == "西暦" || @era_name == "紀元前" || @year >= GREGORIAN_START_YEAR
123
- return month -1
124
- end
121
+ return month - 1 if
122
+ ['', '西暦', '紀元前'].include?(@era_name) || @year >= GREGORIAN_START_YEAR
125
123
 
126
124
  yobj = YEAR_BY_NUM[@year] or
127
- raise UnsupportedDateRange, "Cannot get year info of #{self.inspect}"
125
+ raise UnsupportedDateRange, "Cannot get year info of #{inspect}"
128
126
  idx = month - 1
129
- if leap_month? || yobj.leap_month && month > yobj.leap_month
130
- idx += 1
131
- end
127
+ idx += 1 if leap_month? || yobj.leap_month && month > yobj.leap_month
132
128
  idx
133
129
  end
134
130
 
135
131
  def jd
136
132
  @jd and return @jd
137
133
 
138
- if @era_name == "西暦" || @era_name == "" || @era_name == "紀元前"
134
+ ['', '西暦', '紀元前'].include?(@era_name) and
139
135
  return @jd = ::Date.new(@year, month, day, ::Date::ITALY).jd
140
- elsif @year >= GREGORIAN_START_YEAR
136
+
137
+ @year >= GREGORIAN_START_YEAR and
141
138
  return @jd = ::Date.new(@year, month, day, ::Date::GREGORIAN).jd
142
- end
143
139
 
144
140
  yobj = YEAR_BY_NUM[@year] or
145
- raise UnsupportedDateRange, "Cannot convert to jd #{self.inspect}"
141
+ raise UnsupportedDateRange, "Cannot convert to jd #{inspect}"
146
142
  @jd = yobj.month_starts[month_index] + day - 1
147
143
  end
148
144
 
@@ -154,83 +150,81 @@ module Wareki
154
150
  to_date.to_time
155
151
  end
156
152
 
157
- def strftime(format_str = "%JF")
153
+ def strftime(format_str = '%JF')
158
154
  ret = format_str.to_str.gsub(/%J([fFyYegGoOiImMsSlLdD][kK]?)/) { format($1) || $& }
159
- ret.index("%") or return ret
155
+ ret.index('%') or return ret
160
156
  d = to_date
161
157
  d.respond_to?(:_wareki_strftime_orig) ? d._wareki_strftime_orig(ret) : d.strftime(ret)
162
158
  end
163
159
 
164
160
  def format(key)
165
161
  case key.to_sym
166
- when :e; era_name
167
- when :g; era_name.to_s == "" ? '' : era_year
168
- when :G; era_name.to_s == "" ? '' : Utils.i_to_zen(era_year)
169
- when :Gk; era_name.to_s == "" ? '' : Utils.i_to_kan(era_year)
162
+ when :e then era_name
163
+ when :g then era_name.to_s == '' ? '' : era_year
164
+ when :G then era_name.to_s == '' ? '' : Kansuji.i2z(era_year)
165
+ when :Gk then era_name.to_s == '' ? '' : Kansuji.i2k(era_year)
170
166
  when :GK
171
- if era_name.to_s == ""
167
+ if era_name.to_s == ''
172
168
  ''
173
169
  elsif era_year == 1
174
- ""
170
+ ''
175
171
  else
176
- Utils.i_to_kan(era_year)
172
+ Kansuji.i2k(era_year)
177
173
  end
178
- when :o; year
179
- when :O; Utils.i_to_zen(year)
180
- when :Ok; Utils.i_to_kan(year)
181
- when :i; imperial_year
182
- when :I; Utils.i_to_zen(imperial_year)
183
- when :Ik; Utils.i_to_kan(imperial_year)
184
- when :s; month
185
- when :S; Utils.i_to_zen(month)
186
- when :Sk; Utils.i_to_kan(month)
187
- when :SK; Utils.alt_month_name(month)
188
- when :l; leap_month? ? "'" : ""
189
- when :L; leap_month? ? "" : ""
190
- when :Lk; leap_month? ? "" : ""
191
- when :d; day
192
- when :D; Utils.i_to_zen(day)
193
- when :Dk; Utils.i_to_kan(day)
174
+ when :o then year
175
+ when :O then Kansuji.i2z(year)
176
+ when :Ok then Kansuji.i2k(year)
177
+ when :i then imperial_year
178
+ when :I then Kansuji.i2z(imperial_year)
179
+ when :Ik then Kansuji.i2k(imperial_year)
180
+ when :s then month
181
+ when :S then Kansuji.i2z(month)
182
+ when :Sk then Kansuji.i2k(month)
183
+ when :SK then Utils.alt_month_name(month)
184
+ when :l then leap_month? ? "'" : ''
185
+ when :L then leap_month? ? '' : ''
186
+ when :Lk then leap_month? ? '' : ''
187
+ when :d then day
188
+ when :D then Kansuji.i2z(day)
189
+ when :Dk then Kansuji.i2k(day)
194
190
  when :DK
195
191
  if month == 1 && !leap_month? && day == 1
196
- ""
192
+ ''
197
193
  elsif day == 1
198
- ""
194
+ ''
199
195
  elsif day == Utils.last_day_of_month(year, month, leap_month?)
200
- ""
196
+ ''
201
197
  else
202
- Utils.i_to_kan(day)
198
+ Kansuji.i2k(day)
203
199
  end
204
- when :m; "#{format(:s)}#{format(:l)}"
205
- when :M; "#{format(:Lk)}#{format(:S)}"
206
- when :Mk; "#{format(:Lk)}#{format(:Sk)}"
207
- when :y; "#{format(:e)}#{format(:g)}"
208
- when :Y; "#{format(:e)}#{format(:G)}"
209
- when :Yk; "#{format(:e)}#{format(:Gk)}"
210
- when :YK; "#{format(:e)}#{format(:GK)}"
211
- when :f; "#{format(:e)}#{format(:g)}年#{format(:s)}#{format(:l)}月#{format(:d)}日"
212
- when :F; "#{format(:e)}#{format(:GK)}年#{format(:Lk)}#{format(:Sk)}月#{format(:Dk)}日"
213
- else
214
- nil
200
+ when :m then "#{format(:s)}#{format(:l)}"
201
+ when :M then "#{format(:Lk)}#{format(:S)}"
202
+ when :Mk then "#{format(:Lk)}#{format(:Sk)}"
203
+ when :y then "#{format(:e)}#{format(:g)}"
204
+ when :Y then "#{format(:e)}#{format(:G)}"
205
+ when :Yk then "#{format(:e)}#{format(:Gk)}"
206
+ when :YK then "#{format(:e)}#{format(:GK)}"
207
+ when :f then "#{format(:e)}#{format(:g)}年#{format(:s)}#{format(:l)}月#{format(:d)}日"
208
+ when :F then "#{format(:e)}#{format(:GK)}年#{format(:Lk)}#{format(:Sk)}月#{format(:Dk)}日"
215
209
  end
216
210
  end
217
211
 
218
212
  def eql?(other)
219
213
  begin
220
- [:year, :month, :day, :era_year, :era_name, :leap_month?].each do |attr|
214
+ %i[year month day era_year era_name leap_month?].each do |attr|
221
215
  other.public_send(attr) == public_send(attr) or return false
222
216
  end
223
- rescue => e
217
+ rescue NoMethodError, NotImplementedError
224
218
  return false
225
219
  end
226
220
  true
227
221
  end
228
- alias_method :==, :eql?
222
+ alias == eql?
229
223
 
230
224
  def ===(other)
231
225
  begin
232
226
  other.jd == jd or return false
233
- rescue => e
227
+ rescue NoMethodError, NotImplementedError
234
228
  return false
235
229
  end
236
230
  true
@@ -245,8 +239,8 @@ module Wareki
245
239
  end
246
240
 
247
241
  def _to_jd_for_calc(other)
248
- other.class.to_s == "ActiveSupport::Duration" and
249
- raise NotImplementedError, "Date calcration with ActiveSupport::Duration currently is not supported. Please use numeric."
242
+ other.class.to_s == 'ActiveSupport::Duration' and
243
+ raise NotImplementedError, 'Date calcration with ActiveSupport::Duration currently is not supported. Please use numeric.'
250
244
  other.respond_to?(:to_date) and other = other.to_date
251
245
  other.respond_to?(:jd) and other = other.jd
252
246
  other
@@ -0,0 +1,108 @@
1
+ module Wareki
2
+ # Utilities of kansuji/integer converter.
3
+ module Kansuji
4
+ UNIT_SUFFIX1 = {
5
+ '千' => 1000,
6
+ '百' => 100,
7
+ '十' => 10,
8
+ '' => 1,
9
+ }.freeze
10
+ UNIT_SUFFIX2 = {
11
+ '京' => 10_000_000_000_000_000,
12
+ '兆' => 1_000_000_000_000,
13
+ '億' => 100_000_000,
14
+ '万' => 10_000,
15
+ '' => 1,
16
+ }.freeze
17
+
18
+ module_function
19
+
20
+ def kan_to_i(str)
21
+ ret3 = 0
22
+ ret4 = 0
23
+ curnum = nil
24
+ str == '零' and return 0
25
+ str.to_s.each_char do |c|
26
+ case c
27
+ when '正', '元', '朔',
28
+ '一', '二', '三', '四', '五', '六', '七', '八', '九', '肆',
29
+ '1', '2', '3', '4', '5', '6', '7', '8', '9',
30
+ '1', '2', '3', '4', '5', '6', '7', '8', '9'
31
+ if curnum
32
+ curnum *= 10
33
+ else
34
+ curnum = 0
35
+ end
36
+ curnum += c.tr('一二三四五六七八九123456789肆元朔正', '1234567891234567894111').to_i
37
+ when '〇', '0', '0'
38
+ curnum and curnum *= 10
39
+ when '卄', '廿'
40
+ ret3 += 20
41
+ curnum = nil
42
+ when '卅', '丗'
43
+ ret3 += 30
44
+ curnum = nil
45
+ when '卌'
46
+ ret3 += 40
47
+ curnum = nil
48
+ when '皕'
49
+ ret3 += 200
50
+ curnum = nil
51
+ when '万', '億', '兆', '京', '垓'
52
+ if curnum
53
+ ret3 += curnum
54
+ curnum = nil
55
+ end
56
+ ret3 = 1 if ret3.zero?
57
+ ret4 += ret3 * 10**((%w[万 億 兆 京 垓].index(c) + 1) * 4)
58
+ ret3 = 0
59
+ when '十', '百', '千'
60
+ curnum ||= 1
61
+ ret3 += curnum * 10**(%w[十 百 千].index(c) + 1)
62
+ curnum = nil
63
+ end
64
+ end
65
+ if curnum
66
+ ret3 += curnum
67
+ curnum = nil
68
+ end
69
+ ret4 + ret3
70
+ end
71
+
72
+ def i_to_kan(num)
73
+ ret = ''
74
+ UNIT_SUFFIX2.each do |unit4, rank4|
75
+ i4 = (num / rank4).to_i % 10_000
76
+ next if i4.zero?
77
+
78
+ if i4 == 1
79
+ ret += "一#{unit4}"
80
+ next
81
+ end
82
+
83
+ UNIT_SUFFIX1.each do |unit1, rank1|
84
+ i1 = (i4 / rank1).to_i % 10
85
+ next if i1.zero?
86
+
87
+ if i1 == 1 && unit1 != ''
88
+ ret += unit1
89
+ else
90
+ ret += i1.to_s.tr('123456789', '一二三四五六七八九') + unit1
91
+ end
92
+ end
93
+ ret += unit4
94
+ end
95
+ ret
96
+ end
97
+
98
+ def i_to_zen(num)
99
+ num.to_s.tr('0123456789', '0123456789')
100
+ end
101
+
102
+ class << self
103
+ alias i2k i_to_kan
104
+ alias k2i kan_to_i
105
+ alias i2z i_to_zen
106
+ end
107
+ end
108
+ end
@@ -1,19 +1,21 @@
1
1
  require 'date'
2
2
  require 'wareki/date'
3
3
  module Wareki
4
+ # :nodoc:
4
5
  module StdExt
5
6
  end
6
7
  end
8
+ # :nodoc:
7
9
  class Date
8
10
  JAPAN = Wareki::GREGORIAN_START
9
11
 
10
12
  def to_wareki_date
11
- Wareki::Date.jd(self.jd)
13
+ Wareki::Date.jd(jd)
12
14
  end
13
15
 
14
- alias_method :_wareki_strftime_orig, :strftime
15
- def strftime(format = "%F")
16
- if format.index("%J")
16
+ alias _wareki_strftime_orig strftime
17
+ def strftime(format = '%F')
18
+ if format.index('%J')
17
19
  to_wareki_date.strftime(format)
18
20
  else
19
21
  _wareki_strftime_orig(format)
@@ -21,13 +23,11 @@ class Date
21
23
  end
22
24
 
23
25
  class << self
24
- alias_method :_wareki_parse_orig, :parse
26
+ alias _wareki_parse_orig parse
25
27
  def parse(str, comp = true, start = ::Date::ITALY)
26
- begin
27
- Wareki::Date.parse(str).to_date(start)
28
- rescue => e
29
- ::Date._wareki_parse_orig(str, comp, start)
30
- end
28
+ Wareki::Date.parse(str).to_date(start)
29
+ rescue ArgumentError, Wareki::UnsupportedDateRange
30
+ ::Date._wareki_parse_orig(str, comp, start)
31
31
  end
32
32
  end
33
33
  end
data/lib/wareki/utils.rb CHANGED
@@ -1,107 +1,17 @@
1
- # coding: utf-8
2
1
  module Wareki
2
+ # Static utility methods.
3
3
  module Utils
4
- UNIT_SUFFIX1 = {
5
- '千' => 1000,
6
- '百' => 100,
7
- '十' => 10,
8
- '' => 1,
9
- }
10
- UNIT_SUFFIX2 = {
11
- '京' => 10000000000000000,
12
- '兆' => 1000000000000,
13
- '億' => 100000000,
14
- '万' => 10000,
15
- '' => 1,
16
- }
17
4
  module_function
18
- def kan_to_i(str)
19
- ret3 = 0
20
- ret4 = 0
21
- curnum = nil
22
- str == "零" and return 0
23
- str.to_s.each_char do |c|
24
- case c
25
- when *%w(正 元 朔 一 二 三 四 五 六 七 八 九 肆 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9)
26
- if curnum
27
- curnum *= 10
28
- else
29
- curnum = 0
30
- end
31
- curnum += c.tr("一二三四五六七八九123456789肆元朔正", "1234567891234567894111").to_i
32
- when "〇", "0", "0"
33
- curnum and curnum *= 10
34
- when "卄", "廿"
35
- ret3 += 20
36
- curnum = nil
37
- when "卅", "丗"
38
- ret3 += 30
39
- curnum = nil
40
- when "卌"
41
- ret3 += 40
42
- curnum = nil
43
- when "皕"
44
- ret3 += 200
45
- curnum = nil
46
- when "万", "億", "兆", "京", "垓"
47
- if curnum
48
- ret3 += curnum
49
- curnum = nil
50
- end
51
- ret3 = 1 if ret3 == 0
52
- ret4 += ret3 * 10 ** ((["万", "億", "兆", "京", "垓"].index(c)+1)*4)
53
- ret3 = 0
54
- when "十", "百", "千"
55
- curnum ||= 1
56
- ret3 += curnum * 10 ** (["十", "百", "千"].index(c)+1)
57
- curnum = nil
58
- end
59
- end
60
- if curnum
61
- ret3 += curnum
62
- curnum = nil
63
- end
64
- ret4 + ret3
65
- end
66
-
67
- def i_to_kan(num, opts = {})
68
- ret = ''
69
- UNIT_SUFFIX2.each do |unit4, rank4|
70
- i4 = (num / rank4).to_i % 10000
71
- if i4 == 0
72
- next
73
- elsif i4 == 1
74
- ret += "一#{unit4}"
75
- next
76
- end
77
- UNIT_SUFFIX1.each do |unit1, rank1|
78
- i1 = (i4 / rank1).to_i % 10
79
- if i1 == 0
80
- next
81
- elsif i1 == 1 && unit1 != ""
82
- ret += unit1
83
- else
84
- ret += i1.to_s.tr('123456789', '一二三四五六七八九') + unit1
85
- end
86
- end
87
- ret += unit4
88
- end
89
- ret
90
- end
91
-
92
- def i_to_zen(num)
93
- num.to_s.tr('0123456789', '0123456789')
94
- end
95
5
 
96
6
  def last_day_of_month(year, month, is_leap)
97
7
  if year >= GREGORIAN_START_YEAR
98
- _last_day_of_month_gregorian(year, month, is_leap)
8
+ _last_day_of_month_gregorian(year, month)
99
9
  else
100
10
  _last_day_of_month_from_defs(year, month, is_leap)
101
11
  end
102
12
  end
103
13
 
104
- def _last_day_of_month_gregorian(year, month, is_leap)
14
+ def _last_day_of_month_gregorian(year, month)
105
15
  tmp_y = year
106
16
  tmp_m = month
107
17
  if month == 12
@@ -110,16 +20,14 @@ module Wareki
110
20
  else
111
21
  tmp_m += 1
112
22
  end
113
- (::Date.new(tmp_y, tmp_m, 1, ::Date::GREGORIAN)-1).day
23
+ (::Date.new(tmp_y, tmp_m, 1, ::Date::GREGORIAN) - 1).day
114
24
  end
115
25
 
116
26
  def _last_day_of_month_from_defs(year, month, is_leap)
117
27
  yobj = YEAR_BY_NUM[year] or
118
- raise UnsupportedDateRange, "Cannot find year #{self.inspect}"
28
+ raise UnsupportedDateRange, "Cannot find year #{inspect}"
119
29
  month_idx = month - 1
120
- if is_leap || yobj.leap_month && yobj.leap_month < month
121
- month_idx += 1
122
- end
30
+ month_idx += 1 if is_leap || yobj.leap_month && yobj.leap_month < month
123
31
  yobj.month_days[month_idx]
124
32
  end
125
33
 
@@ -133,9 +41,9 @@ module Wareki
133
41
  end
134
42
 
135
43
  def _to_date(d)
136
- if d.kind_of? ::Date
44
+ if d.is_a? ::Date
137
45
  d # nothing to do
138
- elsif d.kind_of?(Time)
46
+ elsif d.is_a?(Time)
139
47
  d.to_date
140
48
  else
141
49
  ::Date.jd(d.to_i)
@@ -143,9 +51,9 @@ module Wareki
143
51
  end
144
52
 
145
53
  def _to_jd(d)
146
- if d.kind_of? ::Date
54
+ if d.is_a? ::Date
147
55
  d.jd
148
- elsif d.kind_of?(Time)
56
+ elsif d.is_a?(Time)
149
57
  d.to_date.jd
150
58
  else
151
59
  d.to_i
@@ -159,32 +67,31 @@ module Wareki
159
67
 
160
68
  yobj = find_year(d) or raise UnsupportedDateRange, "Unsupported date: #{d.inspect}"
161
69
  month = 0
162
- is_leap = false
163
70
  if yobj.month_starts.last <= d.jd
164
71
  month = yobj.month_starts.count
165
72
  else
166
- month = yobj.month_starts.find_index {|m| d.jd <= (m - 1) }
73
+ month = yobj.month_starts.find_index { |m| d.jd <= (m - 1) }
167
74
  end
168
- month_start = yobj.month_starts[month-1]
75
+ month_start = yobj.month_starts[month - 1]
169
76
  is_leap = (yobj.leap_month == (month - 1))
170
77
  yobj.leap_month && yobj.leap_month < month and
171
78
  month -= 1
172
- [yobj.year, month, d.jd - month_start +1, is_leap]
79
+ [yobj.year, month, d.jd - month_start + 1, is_leap]
173
80
  end
174
81
 
175
82
  def find_year(d)
176
83
  jd = _to_jd(d)
177
- YEAR_DEFS.bsearch{|y| y.end >= jd }
84
+ YEAR_DEFS.bsearch { |y| y.end >= jd }
178
85
  end
179
86
 
180
87
  def find_era(d)
181
88
  jd = _to_jd(d)
182
- ERA_DEFS.reverse_each { |e|
89
+ ERA_DEFS.reverse_each do |e|
183
90
  e.start > jd and next
184
91
  e.end < jd and next
185
92
  return e
186
- }
187
- return nil
93
+ end
94
+ nil
188
95
  end
189
96
  end
190
97
  end
@@ -1,3 +1,3 @@
1
1
  module Wareki
2
- VERSION = "0.2.1"
2
+ VERSION = '0.2.2'.freeze
3
3
  end
metadata CHANGED
@@ -1,59 +1,60 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wareki
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tatsuki Sugiura
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-27 00:00:00.000000000 Z
11
+ date: 2018-09-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
- - - "~>"
16
+ - - ">="
18
17
  - !ruby/object:Gem::Version
19
- version: '1.9'
20
- type: :development
18
+ version: '0'
19
+ name: bundler
21
20
  prerelease: false
21
+ type: :development
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.9'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
30
  - - "~>"
32
31
  - !ruby/object:Gem::Version
33
32
  version: '10.0'
34
- type: :development
33
+ name: rake
35
34
  prerelease: false
35
+ type: :development
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rspec
43
42
  requirement: !ruby/object:Gem::Requirement
44
43
  requirements:
45
44
  - - ">="
46
45
  - !ruby/object:Gem::Version
47
46
  version: '0'
48
- type: :development
47
+ name: rspec
49
48
  prerelease: false
49
+ type: :development
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
- description: Pure ruby library of Wareki (Japanese calendar date) that supports string
56
- parsing, formatting, and bi-directional convertion with standard Date class.
55
+ description: |
56
+ Pure ruby library of Wareki (Japanese calendar date) that supports string parsing,
57
+ formatting, and bi-directional convertion with standard Date class.
57
58
  email:
58
59
  - sugi@nemui.org
59
60
  executables: []
@@ -68,6 +69,7 @@ files:
68
69
  - lib/wareki/common.rb
69
70
  - lib/wareki/date.rb
70
71
  - lib/wareki/era_def.rb
72
+ - lib/wareki/kansuji.rb
71
73
  - lib/wareki/std_ext.rb
72
74
  - lib/wareki/utils.rb
73
75
  - lib/wareki/version.rb
@@ -75,7 +77,7 @@ homepage: https://github.com/sugi/wareki
75
77
  licenses:
76
78
  - BSD
77
79
  metadata: {}
78
- post_install_message:
80
+ post_install_message:
79
81
  rdoc_options: []
80
82
  require_paths:
81
83
  - lib
@@ -90,9 +92,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
92
  - !ruby/object:Gem::Version
91
93
  version: '0'
92
94
  requirements: []
93
- rubyforge_project:
94
- rubygems_version: 2.5.2.2
95
- signing_key:
95
+ rubyforge_project:
96
+ rubygems_version: 2.7.6
97
+ signing_key:
96
98
  specification_version: 4
97
99
  summary: Pure ruby library of Wareki (Japanese calendar date)
98
100
  test_files: []