wareki 1.0.0 → 1.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8be029e4138ca6a683ff52bd0e4070db0bb2e025a9e1024b3a0ad0cd60ca34fa
4
- data.tar.gz: e8b300fd9f65529284acdb43e7dfbcd91c3a2e92f07824bcc3500fa78199c2dd
3
+ metadata.gz: 00264c0e982ca9fc5ddddf077d222e473281f09ae91d1fb4cfc5cd0b445c200a
4
+ data.tar.gz: 90d886bb8ef63e259e24134ccaeaf3df0722ebc415e15c932f5a6d770a93de55
5
5
  SHA512:
6
- metadata.gz: ef1021d0c68056c285c2095c83b66adeb8ce25ed4d7530065f9e06e41ed3129251faf094bb599a4cc5c68506586a996b87ecb67c8d72f59da8c9328c2914c876
7
- data.tar.gz: d98a3ed03d156f6a3a04931ec62ad4cce55dc008ffbd3c4529a6a41c0cd2b6e5279fce42246359177072568b22527da75dba637cf9050ff10883075934f33899
6
+ metadata.gz: 8b06ba92792afd6213be68dc40a836f1b7799e8e836052ce3ff17c036a7f33770a8319dc1e714a07168485c791b8e682622bfb5f21e2905696a35fa355a55892
7
+ data.tar.gz: ad8e3fd61fe9a697d13c90eeead0f3fdc6b973591f9cb99624e609224c326b1a3f8c775ef0d55b8ffbfc408285eb841fbee918d76bcb33fd0c7a03a45e86e766
data/ChangeLog CHANGED
@@ -1,3 +1,13 @@
1
+ 2019-12-24 Tatsuki Sugiura <sugi@nemui.org>
2
+
3
+ * Version: 1.1.0
4
+
5
+ [ by Akinori MUSHA <knu@idaemons.org> ]
6
+ * Partially traditional kanji variants support
7
+ * Compatibility fix: Date.parse with no arguement
8
+ * Provides Date._parse overrides (currently no kansuji
9
+ support for time fields at present)
10
+
1
11
  2019-04-15 Tatsuki Sugiura <sugi@nemui.org>
2
12
 
3
13
  * Verion: 1.0.0 🎉, compat with 0.x mostly.
data/README.md CHANGED
@@ -4,6 +4,7 @@
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
6
  [<img src="https://api.codeclimate.com/v1/badges/c9209422700b526d2b45/maintainability" />](https://codeclimate.com/github/sugi/wareki/maintainability)
7
+ [![Codacy Badge](https://api.codacy.com/project/badge/Grade/9242ddf1725c404aac2d9f82b9bc1d75)](https://www.codacy.com/app/sugi/wareki?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=sugi/wareki&amp;utm_campaign=Badge_Grade)
7
8
 
8
9
  ## 概要
9
10
 
@@ -119,6 +120,8 @@ strftime が拡張されるので、 `config/locale/ja.yml` にそのままフ
119
120
 
120
121
  ## 追加フォーマット文字列一覧
121
122
 
123
+ 通常の strftime のフォーマット文字列に **加えて**、 以下が使用できます。これ以外のフォーマット文字列に関しては、そのまま strftime へ引き渡され、プラットフォーム依存で解決されます。
124
+
122
125
  * %Jf: "%Je%Jg年%Js%Jl月%Jd日" の略 (例: 平成23年3月12日)
123
126
  * %JF: "%Je%JGK年%JLk%JSk月%JDk日" の略 (例: 平成二十三年三月十二日)
124
127
  * %Jy: "%Je%Jg" の略 (元号+半角数字年)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'wareki/version'
2
4
  require 'wareki/date'
3
5
  require 'wareki/std_ext'
@@ -11,28 +11,57 @@ module Wareki
11
11
  IMPERIAL_START_YEAR = -660
12
12
  DATE_INFINITY = ::Date.new(280_000_000, 12, 31) # Use 280000000 for jruby limitation...
13
13
  YEAR_BY_NUM = Hash[*YEAR_DEFS.map { |y| [y.year, y] }.flatten].freeze
14
- ERA_BY_NAME = Hash[*(ERA_NORTH_DEFS + ERA_DEFS).map { |g| [g.name, g] }.flatten]
14
+ KANJI_VARIANTS = {
15
+ '宝' => '寳',
16
+ '霊' => '靈',
17
+ '神' => '神',
18
+ '応' => '應',
19
+ '暦' => '曆',
20
+ '祥' => '祥',
21
+ '寿' => '壽',
22
+ '斎' => '斉',
23
+ '観' => '觀',
24
+ '寛' => '寬',
25
+ '徳' => '德',
26
+ '禄' => '祿',
27
+ '万' => '萬',
28
+ '福' => '福',
29
+ '禎' => '禎',
30
+ '国' => '國',
31
+ '亀' => '龜',
32
+ '令' => '令',
33
+ }.freeze
34
+ SQUARE_ERAS = {
35
+ '㍾' => '明治',
36
+ '㍽' => '大正',
37
+ '㍼' => '昭和',
38
+ '㍻' => '平成',
39
+ '㋿' => '令和',
40
+ }.freeze
41
+ NORMALIZE_KANJI_VARIANTS_REGEX = Regexp.union(*KANJI_VARIANTS.values)
42
+ NORMALIZE_KANJI_VARIANTS_HASH = KANJI_VARIANTS.each_with_object({}) { |(n, s), h| s.each_char { |c| h[c] = n } }
43
+ NORMALIZE_KANJI_VARIANTS = ->(str) { str.gsub(NORMALIZE_KANJI_VARIANTS_REGEX, NORMALIZE_KANJI_VARIANTS_HASH) }
44
+ ERA_BY_NAME = Hash[*(ERA_NORTH_DEFS + ERA_DEFS).flat_map { |g| [g.name, g] }]
15
45
  ERA_BY_NAME['皇紀'] = ERA_BY_NAME['神武天皇即位紀元'] = Era.new('皇紀', -660, 1_480_041, DATE_INFINITY.jd)
16
46
  ERA_BY_NAME['西暦'] = ERA_BY_NAME[''] = Era.new('西暦', 1, 1_721_424, DATE_INFINITY.jd)
17
- ERA_BY_NAME.keys.each do |era_name|
18
- alt_era_name = era_name.tr('宝霊神応暦祥寿斎観寛徳禄万福禎国亀令', '寳靈神應曆祥壽斉觀寬德祿萬福禎國龜令')
19
- alt_era_name == era_name and next
20
- ERA_BY_NAME[alt_era_name] = ERA_BY_NAME[era_name]
21
- end
22
- {'㍾' => '明治', '㍽' => '大正', '㍼' => '昭和', '㍻' => '平成', '㋿' => '令和'}.each do |short, canon|
23
- ERA_BY_NAME[short] = ERA_BY_NAME[canon]
24
- end
47
+ ERA_BY_NAME.default_proc = ->(hash, key) { hash.fetch(SQUARE_ERAS[key] || NORMALIZE_KANJI_VARIANTS[key], nil) }
25
48
  ERA_BY_NAME.freeze
26
- NUM_CHARS = '零壱壹弌弐貳貮参參弎肆伍陸漆質柒捌玖〇一二三四五六七八九十拾什卄廿卅丗卌百陌佰皕阡仟千万萬億兆京垓01234567890123456789'.freeze
49
+ ERA_REGEX = Regexp.new(
50
+ Regexp.union(*ERA_BY_NAME.keys, *SQUARE_ERAS.keys).source.gsub(
51
+ Regexp.union(*KANJI_VARIANTS.keys),
52
+ KANJI_VARIANTS.each_with_object({}) { |(canon, variants), h| h[canon] = "[#{canon}#{variants}]" }
53
+ )
54
+ )
55
+ NUM_CHARS = '零壱壹弌弐貳貮参參弎肆伍陸漆質柒捌玖〇一二三四五六七八九十拾什卄廿卅丗卌百陌佰皕阡仟千万萬億兆京垓01234567890123456789'
27
56
  ALT_MONTH_NAME = %w(睦月 如月 弥生 卯月 皐月 水無月 文月 葉月 長月 神無月 霜月 師走).freeze
28
- REGEX = %r{^
29
- (?<era_name>西暦|紀元前|#{ERA_BY_NAME.keys.join('|')})?
30
- (?:(?<year>[元#{NUM_CHARS}]+)年)?
57
+ REGEX = %r{
58
+ (?:(?<era_name>紀元前|#{ERA_REGEX})?
59
+ (?:(?<year>[元#{NUM_CHARS}]+)年))?
31
60
  (?:(?<is_leap>閏|潤|うるう)?
32
61
  (?:(?<month>[正#{NUM_CHARS}]+)月 |
33
62
  (?<alt_month>#{ALT_MONTH_NAME.join('|')})))?
34
63
  (?:(?<day>[元朔晦#{NUM_CHARS}]+)日|元旦)?
35
- $}x.freeze
64
+ }x.freeze
36
65
 
37
66
  class UnsupportedDateRange < StandardError; end
38
67
 
@@ -26,7 +26,8 @@ module Wareki
26
26
 
27
27
  def self._parse(str)
28
28
  str = str.to_s.gsub(/[[:space:]]/, '')
29
- match = (!str.empty? && REGEX.match(str)) or
29
+ match = REGEX.match(str)
30
+ match && !match[0].empty? or
30
31
  raise ArgumentError, "Invaild Date: #{str}"
31
32
  era = match[:era_name]
32
33
  if (era.nil? || era == '') && match[:year].nil?
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'date'
2
4
  require 'wareki/date'
3
5
  module Wareki
@@ -24,10 +26,20 @@ class Date
24
26
 
25
27
  class << self
26
28
  alias _wareki_parse_orig parse
27
- def parse(str, comp = true, start = ::Date::ITALY)
29
+ def parse(str = '-4712-01-01', comp = true, start = ::Date::ITALY)
28
30
  Wareki::Date.parse(str).to_date(start)
29
31
  rescue ArgumentError, Wareki::UnsupportedDateRange
30
32
  ::Date._wareki_parse_orig(str, comp, start)
31
33
  end
34
+
35
+ alias _wareki__parse_orig _parse
36
+ def _parse(str, comp = true)
37
+ di = Wareki::Date._parse(str)
38
+ wdate = Wareki::Date.new(di[:era], di[:year], di[:month], di[:day], di[:is_leap])
39
+ rescue ArgumentError, Wareki::UnsupportedDateRange
40
+ ::Date._wareki__parse_orig(str, comp)
41
+ else
42
+ ::Date._wareki__parse_orig(str.sub(Wareki::REGEX, wdate.strftime('%F ')), comp)
43
+ end
32
44
  end
33
45
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Wareki
2
- VERSION = '1.0.0'.freeze
4
+ VERSION = '1.1.0'
3
5
  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: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tatsuki Sugiura
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-15 00:00:00.000000000 Z
11
+ date: 2019-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ya_kansuji