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 ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
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
@@ -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