warekky 0.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.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +26 -0
- data/Rakefile +49 -0
- data/VERSION +1 -0
- data/lib/warekky/core_ext.rb +49 -0
- data/lib/warekky/era.rb +44 -0
- data/lib/warekky/era_group.rb +138 -0
- data/lib/warekky/ja.rb +36 -0
- data/lib/warekky.rb +49 -0
- data/spec/core_ext/with_date_spec.rb +152 -0
- data/spec/core_ext/with_date_time_spec.rb +156 -0
- data/spec/core_ext/with_time_spec.rb +156 -0
- data/spec/ja/with_date_spec.rb +142 -0
- data/spec/ja/with_date_time_spec.rb +133 -0
- data/spec/ja/with_time_spec.rb +133 -0
- data/spec/rcov.opts +1 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/warekky/era_group_spec.rb +121 -0
- data/spec/warekky/era_spec.rb +100 -0
- data/spec/warekky_spec.rb +32 -0
- data/warekky.gemspec +76 -0
- metadata +115 -0
data/.document
ADDED
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Takeshi AKIMA
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
= warekky
|
2
|
+
|
3
|
+
warekkyは和暦サポートのためのライブラリです。
|
4
|
+
和暦の日付と西暦の日付を相互に変換できます。
|
5
|
+
|
6
|
+
== Install
|
7
|
+
$ [sudo] gem install warekky
|
8
|
+
|
9
|
+
== Simple Usage
|
10
|
+
$ irb
|
11
|
+
require 'warekky'
|
12
|
+
#=> true
|
13
|
+
|
14
|
+
Date.new(2010, 6, 10).strftime("%g%n/%m/%d")
|
15
|
+
#=> "H22/06/10"
|
16
|
+
|
17
|
+
Time.parse("H22/06/10 19:07:20")
|
18
|
+
#=> Thu Jun 10 19:07:20 0900 2010
|
19
|
+
|
20
|
+
Time.now.era.name
|
21
|
+
#=> "heisei"
|
22
|
+
|
23
|
+
|
24
|
+
== Copyright
|
25
|
+
|
26
|
+
Copyright (c) 2010 Takeshi AKIMA. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'rubygems'
|
3
|
+
require 'rake'
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'jeweler'
|
7
|
+
Jeweler::Tasks.new do |gem|
|
8
|
+
gem.name = "warekky"
|
9
|
+
gem.summary = %Q{Japanese Era(年号) library and Time, Date, DateTime extensions.}
|
10
|
+
gem.description = %Q{Japanese Era(年号) library and Time, Date, DateTime extensions.}
|
11
|
+
gem.email = "akm2000@gmail.com"
|
12
|
+
gem.homepage = "http://github.com/akm/warekky"
|
13
|
+
gem.authors = ["Takeshi AKIMA"]
|
14
|
+
gem.add_development_dependency "rspec", ">= 1.2.9"
|
15
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
16
|
+
end
|
17
|
+
Jeweler::GemcutterTasks.new
|
18
|
+
rescue LoadError
|
19
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
20
|
+
end
|
21
|
+
|
22
|
+
require 'spec/rake/spectask'
|
23
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
24
|
+
spec.libs << 'lib' << 'spec'
|
25
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
26
|
+
end
|
27
|
+
|
28
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
29
|
+
spec.libs << 'lib' << 'spec'
|
30
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
31
|
+
spec.rcov = true
|
32
|
+
spec.rcov_opts = lambda do
|
33
|
+
IO.readlines("spec/rcov.opts").map {|l| l.chomp.split " "}.flatten
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
task :spec => :check_dependencies
|
38
|
+
|
39
|
+
task :default => :spec
|
40
|
+
|
41
|
+
require 'rake/rdoctask'
|
42
|
+
Rake::RDocTask.new do |rdoc|
|
43
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
44
|
+
|
45
|
+
rdoc.rdoc_dir = 'rdoc'
|
46
|
+
rdoc.title = "warekky #{version}"
|
47
|
+
rdoc.rdoc_files.include('README*')
|
48
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
49
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'warekky'
|
2
|
+
|
3
|
+
module Warekky
|
4
|
+
module CoreExt
|
5
|
+
def self.included(klass)
|
6
|
+
klass.extend(ClassMethods)
|
7
|
+
unless klass.respond_to?(:parse_without_warekky)
|
8
|
+
klass.instance_eval do
|
9
|
+
alias :parse_without_warekky :parse
|
10
|
+
alias :parse :parse_with_warekky
|
11
|
+
end
|
12
|
+
end
|
13
|
+
unless klass.instance_methods.include?('strftime_without_warekky')
|
14
|
+
klass.module_eval do
|
15
|
+
alias_method :strftime_without_warekky, :strftime
|
16
|
+
alias_method :strftime, :strftime_with_warekky
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
module ClassMethods
|
22
|
+
def eras
|
23
|
+
Warekky.era_group
|
24
|
+
end
|
25
|
+
|
26
|
+
def parse_with_warekky(str)
|
27
|
+
eras.parse(str, :class => self)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def strftime_with_warekky(format)
|
32
|
+
self.class.eras.strftime(self, format)
|
33
|
+
end
|
34
|
+
|
35
|
+
def era
|
36
|
+
self.class.eras[self]
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.setup
|
40
|
+
[::Time, ::Date].each do |klass|
|
41
|
+
klass.send(:include, self)
|
42
|
+
end
|
43
|
+
::DateTime.instance_eval do
|
44
|
+
alias :parse :parse_with_warekky
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
data/lib/warekky/era.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'warekky'
|
2
|
+
|
3
|
+
module Warekky
|
4
|
+
class Era
|
5
|
+
attr_reader :key, :sign, :first, :last, :options
|
6
|
+
def initialize(key, sign, first, last, options = {})
|
7
|
+
@key, @sign = key.to_sym, sign.to_s.freeze
|
8
|
+
@first, @last = to_date(first), to_date(last)
|
9
|
+
@options = (options || {}).freeze
|
10
|
+
end
|
11
|
+
|
12
|
+
def name
|
13
|
+
key.to_s
|
14
|
+
end
|
15
|
+
|
16
|
+
def match?(d)
|
17
|
+
d = to_date(d)
|
18
|
+
(@first ? @first <= d : true) && (@last ? @last >= d : true)
|
19
|
+
end
|
20
|
+
|
21
|
+
def [](option_key)
|
22
|
+
@options[option_key]
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_ad_year(era_year)
|
26
|
+
era_year = era_year.to_i
|
27
|
+
@first.year - 1 + era_year
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_era_year(ad_year)
|
31
|
+
ad_year = ad_year.to_i
|
32
|
+
ad_year - @first.year + 1
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
def to_date(obj)
|
37
|
+
return nil unless obj
|
38
|
+
return obj if obj.is_a?(Date)
|
39
|
+
return Date.new(obj.year, obj.month, obj.day) if obj.is_a?(Time)
|
40
|
+
return obj.to_date if respond_to?(:to_date)
|
41
|
+
Warekky.try_without(Date, :parse, obj.to_s)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'warekky'
|
3
|
+
|
4
|
+
module Warekky
|
5
|
+
class EraGroup
|
6
|
+
def initialize
|
7
|
+
@formats = self.class.formats.dup
|
8
|
+
end
|
9
|
+
|
10
|
+
class_method_proxy_methods = %w[eras name_to_era era_replacements
|
11
|
+
formats formats_regexp replacements_before_parse]
|
12
|
+
class_method_proxy_methods.each do |method_name|
|
13
|
+
module_eval(<<-"EOS")
|
14
|
+
def #{method_name}
|
15
|
+
self.class.#{method_name}
|
16
|
+
end
|
17
|
+
EOS
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse(str, options = {})
|
21
|
+
options = {
|
22
|
+
:class => Date
|
23
|
+
}.update(options || {})
|
24
|
+
str = str.dup
|
25
|
+
replacements_before_parse.each_with_index do |dic, idx|
|
26
|
+
str.gsub!(replacements_regexp_before_parse[idx]){|s| dic[s]}
|
27
|
+
end
|
28
|
+
era_dic = name_to_era
|
29
|
+
str.gsub!(era_replacements) do
|
30
|
+
md = Regexp.last_match
|
31
|
+
h = Hash[*md.captures]
|
32
|
+
h.delete(nil)
|
33
|
+
s = h.keys.first
|
34
|
+
era = era_dic[s]
|
35
|
+
raise ArgumentError, "Era not found for #{s.inspect}" unless era
|
36
|
+
era.to_ad_year(h[s]).to_s
|
37
|
+
end
|
38
|
+
Warekky.try_without(options[:class], :parse, str)
|
39
|
+
end
|
40
|
+
|
41
|
+
def strftime(d, format)
|
42
|
+
return Warekky.try_without(d, :strftime, format) unless formats_regexp.match(format)
|
43
|
+
era = self[d]
|
44
|
+
era_year = era ? era.to_era_year(d.year) : d.year
|
45
|
+
format = format.dup
|
46
|
+
format.gsub!(formats_regexp) do
|
47
|
+
md = Regexp.last_match
|
48
|
+
s = md.captures.compact.first
|
49
|
+
rep = formats[s]
|
50
|
+
raise ArgumentError, "replacement not found for #{s.inspect}" unless rep
|
51
|
+
res = rep.call(era, era_year)
|
52
|
+
res
|
53
|
+
end
|
54
|
+
Warekky.try_without(d, :strftime, format)
|
55
|
+
end
|
56
|
+
|
57
|
+
def [](era_name_or_date_or_time)
|
58
|
+
return nil unless era_name_or_date_or_time
|
59
|
+
case era_name_or_date_or_time
|
60
|
+
when Symbol, String then
|
61
|
+
name_to_era[era_name_or_date_or_time]
|
62
|
+
when Time, Date then
|
63
|
+
eras.detect{|era| era.match?(era_name_or_date_or_time)}
|
64
|
+
else
|
65
|
+
raise ArgumentError, "#{self.class.name}#[] doesn't support #{era_name_or_date_or_time.inspect}"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def replacements_regexp_before_parse
|
70
|
+
@replacements_regexp_before_parse ||=
|
71
|
+
replacements_before_parse.map{|replacements|
|
72
|
+
Regexp.union(*replacements.keys.map{|s| /(#{Regexp.escape(s)})/})}
|
73
|
+
end
|
74
|
+
|
75
|
+
class << self
|
76
|
+
def eras
|
77
|
+
@eras ||= []
|
78
|
+
end
|
79
|
+
def name_to_era
|
80
|
+
unless @name_to_era
|
81
|
+
@name_to_era = eras.inject({}) do |d, era|
|
82
|
+
d[era.key] = era
|
83
|
+
d[era.key.to_s] = era
|
84
|
+
d[era.sign] = era
|
85
|
+
era_extra_names.each do |extra_name|
|
86
|
+
d[era[extra_name]] = era
|
87
|
+
end
|
88
|
+
d
|
89
|
+
end
|
90
|
+
end
|
91
|
+
@name_to_era
|
92
|
+
end
|
93
|
+
|
94
|
+
def era(first, last, key, sign, options = {})
|
95
|
+
key = key.to_sym
|
96
|
+
result = Era.new(key, sign, first, last, options).freeze
|
97
|
+
eras << result
|
98
|
+
result
|
99
|
+
end
|
100
|
+
|
101
|
+
def era_extra_names
|
102
|
+
eras.map{|era| era.options.keys}.flatten.uniq
|
103
|
+
end
|
104
|
+
|
105
|
+
attr_accessor :parse_regexp_builder
|
106
|
+
def parse_regexp(&block)
|
107
|
+
@parse_regexp_builder = block
|
108
|
+
end
|
109
|
+
|
110
|
+
def replacements_before_parse
|
111
|
+
@replacements_before_parse ||= []
|
112
|
+
end
|
113
|
+
|
114
|
+
def replace_before_parse(*replacements)
|
115
|
+
@replacements_before_parse = replacements
|
116
|
+
end
|
117
|
+
|
118
|
+
def era_replacements
|
119
|
+
@era_replacements ||= Regexp.union(eras.map(&parse_regexp_builder).flatten)
|
120
|
+
end
|
121
|
+
|
122
|
+
def formats
|
123
|
+
@formats ||= {}
|
124
|
+
end
|
125
|
+
|
126
|
+
def format(pattern, &block)
|
127
|
+
formats[pattern] = block
|
128
|
+
end
|
129
|
+
|
130
|
+
def formats_regexp
|
131
|
+
@formats_regexp ||=
|
132
|
+
Regexp.union(*formats.map{|(k,v)| /(#{Regexp.escape(k)})/})
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
end
|
data/lib/warekky/ja.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'warekky'
|
3
|
+
|
4
|
+
module Warekky
|
5
|
+
class Ja < EraGroup
|
6
|
+
# http://ja.wikipedia.org/wiki/明治
|
7
|
+
# 明治(めいじ)は、日本の元号の一つ。慶応の後、大正の前。明治元年1月1日(1868年1月25日)から
|
8
|
+
# 明治45年(大正元年、1912年)7月30日までの期間を指す。明治天皇在位期間とほぼ一致する。
|
9
|
+
# ただし、実際に改元の詔書が出されたのは慶応4年9月8日(1868年10月23日)で、同年1月1日に遡って明治元年とすると定めた。
|
10
|
+
#
|
11
|
+
# ※明治5年までは旧暦を使用していたため、西暦(グレゴリオ暦)の年とは厳密には一致しない。詳細は明治元年〜5年の各年の項目を参照。
|
12
|
+
era('1868/01/01', '1912/07/29', :meiji , 'M', :long => '明治', :short => "明") # 1 - 45
|
13
|
+
era('1912/07/30', '1926/12/24', :taisho, 'T', :long => '大正', :short => "大") # 1 - 15
|
14
|
+
era('1926/12/25', '1989/01/07', :showa , 'S', :long => '昭和', :short => "昭") # 1 - 64
|
15
|
+
era('1989/01/08', nil , :heisei, 'H', :long => '平成', :short => "平") # 1 -
|
16
|
+
|
17
|
+
# strftimeで使える記号
|
18
|
+
format('%G'){|era, era_year| era[:long] if era} # 明治/大正/昭和/平成
|
19
|
+
format('%g'){|era, era_year| era.sign if era} # M/T/S/H
|
20
|
+
format('%n'){|era, era_year| '%02d' % era_year} # (元号での)年度
|
21
|
+
|
22
|
+
# parseで使われる元号毎の正規表現
|
23
|
+
parse_regexp do |era|
|
24
|
+
[ /(#{Regexp.escape(era.name)})(\d{1,2})/,
|
25
|
+
/(#{Regexp.escape(era.sign)})(\d{1,2})/,
|
26
|
+
/(#{Regexp.escape(era[:short])})(\d{1,2})/,
|
27
|
+
/(#{Regexp.escape(era[:long])})(\d{1,2})/]
|
28
|
+
end
|
29
|
+
|
30
|
+
# parseを実行前に適用される置換
|
31
|
+
replace_before_parse(
|
32
|
+
{"元年" => "1年"},
|
33
|
+
{"年" => ".", "月" => ".", "日" => "", "時" => ":", "分" => ":", "秒" => ""}
|
34
|
+
)
|
35
|
+
end
|
36
|
+
end
|
data/lib/warekky.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'time'
|
3
|
+
|
4
|
+
module Warekky
|
5
|
+
autoload :Era, 'warekky/era'
|
6
|
+
autoload :EraGroup, 'warekky/era_group'
|
7
|
+
autoload :Ja, 'warekky/ja'
|
8
|
+
autoload :CoreExt, 'warekky/core_ext'
|
9
|
+
|
10
|
+
class << self
|
11
|
+
attr_writer :era_group
|
12
|
+
attr_writer :era_group_class
|
13
|
+
|
14
|
+
def era_group
|
15
|
+
@era_group ||= (era_group_class ? era_group_class.new : nil)
|
16
|
+
end
|
17
|
+
|
18
|
+
def era_group_class
|
19
|
+
@era_group_class = ::Warekky::Ja unless defined?(@era_group_class)
|
20
|
+
@era_group_class
|
21
|
+
end
|
22
|
+
|
23
|
+
# d: Date or Time
|
24
|
+
def strftime(d, format)
|
25
|
+
era_group ?
|
26
|
+
era_group.strftime(d, format) :
|
27
|
+
d.strftime(format)
|
28
|
+
end
|
29
|
+
|
30
|
+
def parse(str, options = {})
|
31
|
+
era_group ?
|
32
|
+
era_group.parse(str, options) :
|
33
|
+
try_without(DateTime, :parse, str)
|
34
|
+
end
|
35
|
+
|
36
|
+
def [](era_name_or_date_or_time)
|
37
|
+
era_group[era_name_or_date_or_time]
|
38
|
+
end
|
39
|
+
|
40
|
+
def try_without(obj, method_name, *args, &block)
|
41
|
+
without_m = "#{method_name}_without_warekky"
|
42
|
+
return obj.send(without_m, *args, &block) if obj.respond_to?(without_m)
|
43
|
+
obj.send(method_name, *args, &block)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
Warekky::CoreExt.setup
|
@@ -0,0 +1,152 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require File.expand_path('../spec_helper', File.dirname(__FILE__))
|
3
|
+
|
4
|
+
describe "Warekky" do
|
5
|
+
|
6
|
+
before :all do
|
7
|
+
Warekky.era_group_class = Warekky::Ja
|
8
|
+
end
|
9
|
+
|
10
|
+
describe :strftime do
|
11
|
+
it "without era name (元号の指定なし)" do
|
12
|
+
Date.new(1867,12,31).strftime('%Y.%m.%d').should == "1867.12.31"
|
13
|
+
Date.new(1868, 1, 1).strftime('%Y.%m.%d').should == "1868.01.01"
|
14
|
+
end
|
15
|
+
|
16
|
+
it "with alphabet era name (アルファベット表記の元号)" do
|
17
|
+
fmt = '%g%n/%m/%d'
|
18
|
+
Date.new(1867,12,31).strftime(fmt).should == "1867/12/31"
|
19
|
+
Date.new(1868, 1, 1).strftime(fmt).should == "M01/01/01"
|
20
|
+
Date.new(1912, 7,29).strftime(fmt).should == "M45/07/29"
|
21
|
+
Date.new(1912, 7,30).strftime(fmt).should == "T01/07/30"
|
22
|
+
Date.new(1926,12,24).strftime(fmt).should == "T15/12/24"
|
23
|
+
Date.new(1926,12,25).strftime(fmt).should == "S01/12/25"
|
24
|
+
Date.new(1989, 1, 7).strftime(fmt).should == "S64/01/07"
|
25
|
+
Date.new(1989, 1, 8).strftime(fmt).should == "H01/01/08"
|
26
|
+
Date.new(2010, 6, 9).strftime(fmt).should == "H22/06/09"
|
27
|
+
Date.new(2050,12,31).strftime(fmt).should == "H62/12/31"
|
28
|
+
end
|
29
|
+
|
30
|
+
it "with chinese charactor era name (漢字表記の元号)" do
|
31
|
+
fmt = '%G%n/%m/%d'
|
32
|
+
Date.new(1867,12,31).strftime(fmt).should == "1867/12/31"
|
33
|
+
Date.new(1868, 1, 1).strftime(fmt).should == "明治01/01/01"
|
34
|
+
Date.new(1912, 7,29).strftime(fmt).should == "明治45/07/29"
|
35
|
+
Date.new(1912, 7,30).strftime(fmt).should == "大正01/07/30"
|
36
|
+
Date.new(1926,12,24).strftime(fmt).should == "大正15/12/24"
|
37
|
+
Date.new(1926,12,25).strftime(fmt).should == "昭和01/12/25"
|
38
|
+
Date.new(1989, 1, 7).strftime(fmt).should == "昭和64/01/07"
|
39
|
+
Date.new(1989, 1, 8).strftime(fmt).should == "平成01/01/08"
|
40
|
+
Date.new(2010, 6, 9).strftime(fmt).should == "平成22/06/09"
|
41
|
+
Date.new(2050,12,31).strftime(fmt).should == "平成62/12/31"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
describe :era do
|
47
|
+
it "should return an era for date" do
|
48
|
+
Date.new(1867,12,31).era.should == nil
|
49
|
+
Date.new(1868, 1, 1).era.name.should == 'meiji'
|
50
|
+
Date.new(1912, 7,29).era.name.should == 'meiji'
|
51
|
+
Date.new(1912, 7,30).era.name.should == 'taisho'
|
52
|
+
Date.new(1926,12,24).era.name.should == 'taisho'
|
53
|
+
Date.new(1926,12,25).era.name.should == 'showa'
|
54
|
+
Date.new(1989, 1, 7).era.name.should == 'showa'
|
55
|
+
Date.new(1989, 1, 8).era.name.should == 'heisei'
|
56
|
+
Date.new(2010, 6, 9).era.name.should == 'heisei'
|
57
|
+
Date.new(2050,12,31).era.name.should == 'heisei'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe :parse do
|
62
|
+
it "without era name (元号の指定なし)" do
|
63
|
+
Date.parse("1867/12/31").should == Date.new(1867,12,31)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "with alphabet era name (アルファベット表記の元号)" do
|
67
|
+
Date.parse("M01/01/01").should == Date.new(1868, 1, 1)
|
68
|
+
Date.parse("M45/07/29").should == Date.new(1912, 7,29)
|
69
|
+
Date.parse("T01/07/30").should == Date.new(1912, 7,30)
|
70
|
+
Date.parse("T15/12/24").should == Date.new(1926,12,24)
|
71
|
+
Date.parse("S01/12/25").should == Date.new(1926,12,25)
|
72
|
+
Date.parse("S64/01/07").should == Date.new(1989, 1, 7)
|
73
|
+
Date.parse("H01/01/08").should == Date.new(1989, 1, 8)
|
74
|
+
Date.parse("H22/06/09").should == Date.new(2010, 6, 9)
|
75
|
+
Date.parse("H62/12/31").should == Date.new(2050,12,31)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "区切りなし" do
|
79
|
+
Date.parse("M010101").should == Date.new(1868, 1, 1)
|
80
|
+
Date.parse("M450729").should == Date.new(1912, 7,29)
|
81
|
+
Date.parse("T010730").should == Date.new(1912, 7,30)
|
82
|
+
Date.parse("T151224").should == Date.new(1926,12,24)
|
83
|
+
Date.parse("S011225").should == Date.new(1926,12,25)
|
84
|
+
Date.parse("S640107").should == Date.new(1989, 1, 7)
|
85
|
+
Date.parse("H010108").should == Date.new(1989, 1, 8)
|
86
|
+
Date.parse("H220609").should == Date.new(2010, 6, 9)
|
87
|
+
Date.parse("H621231").should == Date.new(2050,12,31)
|
88
|
+
end
|
89
|
+
|
90
|
+
it "with chinese charactor era name (漢字表記の元号)" do
|
91
|
+
Date.parse("明治元年1月1日").should == Date.new(1868, 1, 1)
|
92
|
+
Date.parse("明治1年1月1日").should == Date.new(1868, 1, 1)
|
93
|
+
Date.parse("明治01年01月01日").should == Date.new(1868, 1, 1)
|
94
|
+
Date.parse("明治45年07月29日").should == Date.new(1912, 7,29)
|
95
|
+
Date.parse("大正01年07月30日").should == Date.new(1912, 7,30)
|
96
|
+
Date.parse("大正15年12月24日").should == Date.new(1926,12,24)
|
97
|
+
Date.parse("昭和01年12月25日").should == Date.new(1926,12,25)
|
98
|
+
Date.parse("昭和64年01月07日").should == Date.new(1989, 1, 7)
|
99
|
+
Date.parse("平成01年01月08日").should == Date.new(1989, 1, 8)
|
100
|
+
Date.parse("平成22年06月09日").should == Date.new(2010, 6, 9)
|
101
|
+
Date.parse("平成62年12月31日").should == Date.new(2050,12,31)
|
102
|
+
end
|
103
|
+
|
104
|
+
it "with chinese charactor short era name (漢字省略表記の元号)" do
|
105
|
+
Date.parse("明元年1月1日").should == Date.new(1868, 1, 1)
|
106
|
+
Date.parse("明1年1月1日").should == Date.new(1868, 1, 1)
|
107
|
+
Date.parse("明01年01月01日").should == Date.new(1868, 1, 1)
|
108
|
+
Date.parse("明45年07月29日").should == Date.new(1912, 7,29)
|
109
|
+
Date.parse("大01年07月30日").should == Date.new(1912, 7,30)
|
110
|
+
Date.parse("大15年12月24日").should == Date.new(1926,12,24)
|
111
|
+
Date.parse("昭01年12月25日").should == Date.new(1926,12,25)
|
112
|
+
Date.parse("昭64年01月07日").should == Date.new(1989, 1, 7)
|
113
|
+
Date.parse("平01年01月08日").should == Date.new(1989, 1, 8)
|
114
|
+
Date.parse("平22年06月09日").should == Date.new(2010, 6, 9)
|
115
|
+
Date.parse("平62年12月31日").should == Date.new(2050,12,31)
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
describe :[] do
|
121
|
+
describe "should return an Era object" do
|
122
|
+
it "for era_name" do
|
123
|
+
[:meiji, :taisho, :showa, :heisei].each do |era|
|
124
|
+
Date.eras[era].class.should == Warekky::Era
|
125
|
+
Date.eras[era.to_s].class.should == Warekky::Era
|
126
|
+
end
|
127
|
+
Date.eras[nil].should == nil
|
128
|
+
Date.eras[''].should == nil
|
129
|
+
Date.eras[:unexist_era].should == nil
|
130
|
+
end
|
131
|
+
|
132
|
+
it "for era_name with kanji" do
|
133
|
+
%w[M T S H 明治 大正 昭和 平成 明 大 昭 平].each do |era|
|
134
|
+
Date.eras[era].class.should == Warekky::Era
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
it "for date" do
|
139
|
+
Date.eras[Date.new(1867,12,31)].should == nil
|
140
|
+
Date.eras[Date.new(1868, 1, 1)].name.should == 'meiji'
|
141
|
+
Date.eras[Date.new(1912, 7,29)].name.should == 'meiji'
|
142
|
+
Date.eras[Date.new(1912, 7,30)].name.should == 'taisho'
|
143
|
+
Date.eras[Date.new(1926,12,24)].name.should == 'taisho'
|
144
|
+
Date.eras[Date.new(1926,12,25)].name.should == 'showa'
|
145
|
+
Date.eras[Date.new(1989, 1, 7)].name.should == 'showa'
|
146
|
+
Date.eras[Date.new(1989, 1, 8)].name.should == 'heisei'
|
147
|
+
Date.eras[Date.new(2010, 6, 9)].name.should == 'heisei'
|
148
|
+
Date.eras[Date.new(2050,12,31)].name.should == 'heisei'
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|