wareki 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e17edc37b9e9bab6955fa886a4b2150927d75e1c
4
- data.tar.gz: cf48656bd64cbbf26a3d541af8f553e649d4757e
3
+ metadata.gz: 024750af6c60493ab9b817b2ac9e81a7cffd96f5
4
+ data.tar.gz: 61981fbbe3734009c05bbaabe56370c9b083cbcf
5
5
  SHA512:
6
- metadata.gz: 4b437da1a431d1059d5ff1a4f849e999613cb06ca94c0b6d47d86350cf7e18abc30bc993605a41432ab3f64c50a606406ee3c69dd484ee7f0d440372cb26efb5
7
- data.tar.gz: 3cfc6b10e3906c358d57c19bf179f440df2b18c2365989f7b80d66637c628875fa16cc441d53dcbea9a582855b0e5ce93582d0b379397502a5d00930a65b21ff
6
+ metadata.gz: 8bdbf8c2f81dc966ede8c24633fb8a6c541e4e2b30907d3d804da4e01a43387420b534811b79f7e7c6b8482630b59afd58eabed2f301089f2f4302c2f6d7185e
7
+ data.tar.gz: 5b7093d249fad9fe6389620104f04f40aeebbd14e000a5c8c3fa120f45bbf14ad562ef48c9a57f111a7ac0a9ec779c4a8b67f54fe68eb837324bc8ae3d103586
data/ChangeLog CHANGED
@@ -1,3 +1,8 @@
1
+ 2018-08-27 Tatsuki Sugiura <sugi@nemui.org>
2
+
3
+ * Version: 0.2.1
4
+ * Support square era name chars (㍾ ㍽ ㍼ ㍻)
5
+
1
6
  2017-07-25 Tatsuki Sugiura <sugi@nemui.org>
2
7
 
3
8
  * Version: 0.2.0
@@ -3,6 +3,7 @@
3
3
  {<img src="https://badge.fury.io/rb/wareki.svg" alt="Gem Version" />}[https://badge.fury.io/rb/wareki]
4
4
  {<img src="https://travis-ci.org/sugi/wareki.svg?branch=master" alt="Build Status" />}[https://travis-ci.org/sugi/wareki]
5
5
  {<img src="https://coveralls.io/repos/sugi/wareki/badge.svg?branch=master&service=github" alt="Coverage Status" />}[https://coveralls.io/github/sugi/wareki?branch=master]
6
+ {<img src="https://api.codeclimate.com/v1/badges/c9209422700b526d2b45/maintainability" />}[https://codeclimate.com/github/sugi/wareki/maintainability]
6
7
 
7
8
  == 概要
8
9
 
@@ -13,13 +14,13 @@
13
14
  == 機能
14
15
 
15
16
  * 和暦文字列のパース
16
- * 旧字体を含む元号のサポート (慶應、萬延など)
17
- * 漢数字サポート
17
+ * 旧字体、1文字元号のサポート (慶應、萬延、㍻ など)
18
+ * 全角数字、漢数字、全角ゼロのサポート (10月、十月、一〇月)
18
19
  * 閏月サポート
19
- * 月の別名(如月、弥生、師走など)のサポート
20
+ * 月の別名のサポート (如月、弥生、師走など)
20
21
  * 元年、正月、朔日、晦日、廿一日、卅日 などの特殊な表記の日付サポート
21
22
  * Date クラスの拡張
22
- * strftime に和暦フォーマット文字列を追加
23
+ * 標準の strftime に和暦へのフォーマット文字列を追加
23
24
  * to_wareki_date を追加
24
25
  * Date::JAPAN (明治改暦日)の追加
25
26
 
@@ -37,14 +38,17 @@ Gemfile に以下のようにするか、
37
38
 
38
39
  require 'wareki'
39
40
 
41
+ # 和暦へのフォーマット
40
42
  Date.today.strftime("%JF") # => "平成二十七年八月二十二日"
41
43
  Date.civil(1311, 7, 20).strftime("%JF") # => "応長元年閏六月四日"
42
44
 
43
- Date.today.to_wareki_date # => Wareki::Date インスタンス
44
- Wareki::Date.new("明治", 8, 2, 1).to_date # => 標準 Date インスタンス 1875-02-01
45
+ # 和暦のパース
46
+ Date.parse("正嘉元年 うるう3月 12日") # => 標準 Date インスタンス 1257-04-27
45
47
 
48
+ # Wareki::Date を直接扱う場合
49
+ Date.today.to_wareki_date # => Wareki::Date インスタンス
46
50
  Wareki::Date.parse("正嘉元年 うるう3月 12日") # => Wareki::Date インスタンス
47
- Date.parse("正嘉元年 うるう3月 12日)" # => 標準 Date インスタンス 1257-04-27
51
+ Wareki::Date.new("明治", 8, 2, 1).to_date # => 標準 Date インスタンス 1875-02-01
48
52
 
49
53
  == フォーマット文字列
50
54
 
@@ -17,6 +17,9 @@ module Wareki
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
20
+ {'㍾' => '明治', '㍽' => '大正', '㍼' => '昭和', '㍻' => '平成'}.each do |short, canon|
21
+ ERA_BY_NAME[short] = ERA_BY_NAME[canon]
22
+ end
20
23
  ERA_BY_NAME.freeze
21
24
  NUM_CHARS = "零〇一二三四五六七八九十卄廿卅丗卌肆百皕千万億兆01234567890123456789"
22
25
  ALT_MONTH_NAME = %w(睦月 如月 弥生 卯月 皐月 水無月 文月 葉月 長月 神無月 霜月 師走).freeze
@@ -11,19 +11,27 @@ module Wareki
11
11
  jd(::Date.today.jd)
12
12
  end
13
13
 
14
+ def self._check_invalid_date(era, year, month, day)
15
+ month == 12 or return true
16
+ day > 2 or return true
17
+ (era == "明治" && year == 5 ||
18
+ era.to_s == "" && year == GREGORIAN_START_YEAR - 1 ||
19
+ %w(皇紀 神武天皇即位紀元).member?(era) &&
20
+ year == GREGORIAN_START_YEAR - IMPERIAL_START_YEAR - 1) or
21
+ return true
22
+ false
23
+ end
24
+
14
25
  def self._parse(str)
15
- match = REGEX.match(str.to_s.gsub(/[[:space:]]/, ''))
16
- if !match || !match[:year]
26
+ match = REGEX.match(str.to_s.gsub(/[[:space:]]/, '')) or
17
27
  raise ArgumentError, "Invaild Date: #{str}"
18
- end
19
28
  era = match[:era_name]
20
- year = Utils.kan_to_i(match[:year])
21
- month = 1
22
- day = 1
29
+ (year = Utils.kan_to_i(match[:year])) > 0 or
30
+ raise ArgumentError, "Invalid year: #{str}"
31
+ month = day = 1
23
32
 
24
- if era.to_s != "" && era.to_s != "紀元前" && !ERA_BY_NAME[era]
33
+ era.to_s != "" && era.to_s != "紀元前" && !ERA_BY_NAME[era] and
25
34
  raise ArgumentError, "Date parse failed: Invalid era name '#{match[:era_name]}'"
26
- end
27
35
 
28
36
  if match[:month]
29
37
  month = Utils.kan_to_i(match[:month])
@@ -31,7 +39,7 @@ module Wareki
31
39
  month = Utils.alt_month_name_to_i(match[:alt_month])
32
40
  end
33
41
 
34
- month > 12 || month < 0 and
42
+ month > 12 || month < 1 and
35
43
  raise ArgumentError, "Invalid month: #{str}"
36
44
 
37
45
  if match[:day]
@@ -42,13 +50,8 @@ module Wareki
42
50
  end
43
51
  end
44
52
 
45
- if (era == "明治" && year == 5 ||
46
- era.to_s == "" && year == GREGORIAN_START_YEAR - 1 ||
47
- (era == "皇紀" || era == "神武天皇即位紀元") &&
48
- year == GREGORIAN_START_YEAR - IMPERIAL_START_YEAR - 1) &&
49
- month == 12 && day > 2
53
+ _check_invalid_date(era, year, month, day) or
50
54
  raise ArgumentError, "Invaild Date: #{str}"
51
- end
52
55
 
53
56
  {era: era, year: year, month: month, day: day, is_leap: !!match[:is_leap]}
54
57
  end
@@ -234,23 +237,19 @@ module Wareki
234
237
  end
235
238
 
236
239
  def -(other)
237
- if other.class.to_s == "ActiveSupport::Duration"
238
- raise NotImplementedError, "Date calcration with ActiveSupport::Duration currently is not supported. Please use numeric."
239
- else
240
- other.respond_to?(:to_date) and other = other.to_date
241
- other.respond_to?(:jd) and other = other.jd
242
- self.class.jd jd - other
243
- end
240
+ self.class.jd jd - _to_jd_for_calc(other)
244
241
  end
245
242
 
246
243
  def +(other)
247
- if other.class.to_s == "ActiveSupport::Duration"
244
+ self.class.jd jd + _to_jd_for_calc(other)
245
+ end
246
+
247
+ def _to_jd_for_calc(other)
248
+ other.class.to_s == "ActiveSupport::Duration" and
248
249
  raise NotImplementedError, "Date calcration with ActiveSupport::Duration currently is not supported. Please use numeric."
249
- else
250
- other.respond_to?(:to_date) and other = other.to_date
251
- other.respond_to?(:jd) and other = other.jd
252
- self.class.jd jd + other
253
- end
250
+ other.respond_to?(:to_date) and other = other.to_date
251
+ other.respond_to?(:jd) and other = other.jd
252
+ other
254
253
  end
255
254
  end
256
255
  end
@@ -1,6 +1,19 @@
1
1
  # coding: utf-8
2
2
  module Wareki
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
+ }
4
17
  module_function
5
18
  def kan_to_i(str)
6
19
  ret3 = 0
@@ -53,13 +66,7 @@ module Wareki
53
66
 
54
67
  def i_to_kan(num, opts = {})
55
68
  ret = ''
56
- {
57
- '京' => 10000000000000000,
58
- '兆' => 1000000000000,
59
- '億' => 100000000,
60
- '万' => 10000,
61
- '' => 1,
62
- }.each do |unit4, rank4|
69
+ UNIT_SUFFIX2.each do |unit4, rank4|
63
70
  i4 = (num / rank4).to_i % 10000
64
71
  if i4 == 0
65
72
  next
@@ -67,12 +74,7 @@ module Wareki
67
74
  ret += "一#{unit4}"
68
75
  next
69
76
  end
70
- {
71
- '千' => 1000,
72
- '百' => 100,
73
- '十' => 10,
74
- '' => 1,
75
- }.each do |unit1, rank1|
77
+ UNIT_SUFFIX1.each do |unit1, rank1|
76
78
  i1 = (i4 / rank1).to_i % 10
77
79
  if i1 == 0
78
80
  next
@@ -93,25 +95,32 @@ module Wareki
93
95
 
94
96
  def last_day_of_month(year, month, is_leap)
95
97
  if year >= GREGORIAN_START_YEAR
96
- tmp_y = year
97
- tmp_m = month
98
- if month == 12
99
- tmp_y += 1
100
- tmp_m = 1
101
- else
102
- tmp_m += 1
103
- end
104
- day = (::Date.new(tmp_y, tmp_m, 1, ::Date::GREGORIAN)-1).day
98
+ _last_day_of_month_gregorian(year, month, is_leap)
105
99
  else
106
- yobj = YEAR_BY_NUM[year] or
107
- raise UnsupportedDateRange, "Cannot find year #{self.inspect}"
108
- month_idx = month - 1
109
- if is_leap || yobj.leap_month && yobj.leap_month < month
110
- month_idx += 1
111
- end
112
- day = yobj.month_days[month_idx]
100
+ _last_day_of_month_from_defs(year, month, is_leap)
101
+ end
102
+ end
103
+
104
+ def _last_day_of_month_gregorian(year, month, is_leap)
105
+ tmp_y = year
106
+ tmp_m = month
107
+ if month == 12
108
+ tmp_y += 1
109
+ tmp_m = 1
110
+ else
111
+ tmp_m += 1
113
112
  end
114
- day
113
+ (::Date.new(tmp_y, tmp_m, 1, ::Date::GREGORIAN)-1).day
114
+ end
115
+
116
+ def _last_day_of_month_from_defs(year, month, is_leap)
117
+ yobj = YEAR_BY_NUM[year] or
118
+ raise UnsupportedDateRange, "Cannot find year #{self.inspect}"
119
+ month_idx = month - 1
120
+ if is_leap || yobj.leap_month && yobj.leap_month < month
121
+ month_idx += 1
122
+ end
123
+ yobj.month_days[month_idx]
115
124
  end
116
125
 
117
126
  def alt_month_name_to_i(name)
@@ -145,9 +154,8 @@ module Wareki
145
154
 
146
155
  def find_date_ary(d)
147
156
  d = _to_date(d).new_start(::Date::GREGORIAN)
148
- if d.jd >= GREGORIAN_START
157
+ d.jd >= GREGORIAN_START and
149
158
  return [d.year, d.month, d.day, false]
150
- end
151
159
 
152
160
  yobj = find_year(d) or raise UnsupportedDateRange, "Unsupported date: #{d.inspect}"
153
161
  month = 0
@@ -159,9 +167,8 @@ module Wareki
159
167
  end
160
168
  month_start = yobj.month_starts[month-1]
161
169
  is_leap = (yobj.leap_month == (month - 1))
162
- if yobj.leap_month && yobj.leap_month < month
170
+ yobj.leap_month && yobj.leap_month < month and
163
171
  month -= 1
164
- end
165
172
  [yobj.year, month, d.jd - month_start +1, is_leap]
166
173
  end
167
174
 
@@ -1,3 +1,3 @@
1
1
  module Wareki
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wareki
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tatsuki Sugiura
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-25 00:00:00.000000000 Z
11
+ date: 2018-08-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -91,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
91
91
  version: '0'
92
92
  requirements: []
93
93
  rubyforge_project:
94
- rubygems_version: 2.2.2
94
+ rubygems_version: 2.5.2.2
95
95
  signing_key:
96
96
  specification_version: 4
97
97
  summary: Pure ruby library of Wareki (Japanese calendar date)