tokiyomi 0.0.1 → 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/README.md +17 -2
- data/Rakefile +7 -0
- data/lib/tokiyomi.rb +6 -1
- data/lib/tokiyomi/named_time.rb +29 -0
- data/lib/tokiyomi/relative_time.rb +9 -15
- data/lib/tokiyomi/time_base.rb +27 -0
- data/lib/tokiyomi/version.rb +1 -1
- data/spec/spec_helper.rb +16 -0
- data/spec/tokiyomi_named_time_spec.rb +16 -0
- data/spec/tokiyomi_relative_time_spec.rb +1 -7
- data/spec/tokiyomi_spec.rb +7 -0
- metadata +8 -2
data/README.md
CHANGED
@@ -26,9 +26,24 @@ Tokiyomi.parse('10日前') # => 2012-12-31T12:34:56
|
|
26
26
|
### Supported formats
|
27
27
|
|
28
28
|
* 年, 月, 日, 時間, 分, 秒 + [前後]
|
29
|
-
|
29
|
+
|
30
|
+
```
|
31
|
+
Tokiyomi.parse('10日前') # => 2012-12-31T12:34:56
|
32
|
+
Tokiyomi.parse('3時間後') # => 2013-01-10T15:34:56
|
33
|
+
```
|
34
|
+
|
30
35
|
* hour and minutes are also able to specified.
|
31
|
-
|
36
|
+
|
37
|
+
```
|
38
|
+
Tokiyomi.parse('2ヵ月前の20:00') # => 2012-11-10T20:00:00
|
39
|
+
Tokiyomi.parse('1週間後の0:00') # => 2013-01-17T00:00:00
|
40
|
+
```
|
41
|
+
|
42
|
+
* 今日, 明日, 明後日, 昨日, 一昨日
|
43
|
+
|
44
|
+
```
|
45
|
+
Tokiyomi.parse('明日') # => 2013-01-11T12:34:56
|
46
|
+
```
|
32
47
|
|
33
48
|
## Contributing
|
34
49
|
|
data/Rakefile
CHANGED
data/lib/tokiyomi.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
require 'tokiyomi/version'
|
2
2
|
require 'tokiyomi/relative_time'
|
3
|
+
require 'tokiyomi/named_time'
|
3
4
|
|
4
5
|
module Tokiyomi
|
5
6
|
extend self
|
6
7
|
|
7
8
|
def parse(str)
|
8
|
-
|
9
|
+
TimeBase.parser_for(str.encode('UTF-8')).calculate(Time.now)
|
10
|
+
end
|
11
|
+
|
12
|
+
def readable?(str)
|
13
|
+
TimeBase.readable?(str)
|
9
14
|
end
|
10
15
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'tokiyomi/time_base'
|
3
|
+
|
4
|
+
module Tokiyomi
|
5
|
+
class NamedTime < TimeBase
|
6
|
+
Definition = Struct.new(:duration, :direction)
|
7
|
+
|
8
|
+
NAMED_TIMES = {
|
9
|
+
'おととい' => Definition.new(2, :ago),
|
10
|
+
'一昨日' => Definition.new(2, :ago),
|
11
|
+
'昨日' => Definition.new(1, :ago),
|
12
|
+
'今日' => Definition.new(0, :ago),
|
13
|
+
'明日' => Definition.new(1, :since),
|
14
|
+
'明後日' => Definition.new(2, :since),
|
15
|
+
'あさって' => Definition.new(2, :since),
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
def self.readable?(str)
|
19
|
+
str.in?(NAMED_TIMES.keys)
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(str)
|
23
|
+
definition = NAMED_TIMES[str]
|
24
|
+
@duration = definition.duration
|
25
|
+
@unit = :days
|
26
|
+
@direction = definition.direction
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
require '
|
2
|
+
require 'tokiyomi/time_base'
|
3
3
|
|
4
4
|
module Tokiyomi
|
5
|
-
class RelativeTime
|
5
|
+
class RelativeTime < TimeBase
|
6
6
|
UNITS = {
|
7
7
|
'年' => :years,
|
8
8
|
'月' => :months,
|
@@ -18,16 +18,19 @@ module Tokiyomi
|
|
18
18
|
str =~ RELATIVE_TIME
|
19
19
|
end
|
20
20
|
|
21
|
-
attr_reader :duration, :unit, :direction, :hour_min
|
22
|
-
|
23
21
|
def initialize(str)
|
24
22
|
raise ArgumentError, "can't understand `#{str}'" unless self.class.readable?(str)
|
25
23
|
|
26
|
-
|
24
|
+
duration, unit, direction, *hour_min= str.scan(RELATIVE_TIME).first
|
25
|
+
|
26
|
+
@duration = duration.to_i
|
27
|
+
@unit = UNITS[unit]
|
28
|
+
@direction = direction == '前' ? :ago : :since
|
29
|
+
@hour_min = hour_min.all?(&:nil?) ? nil : Hash[[:hour, :min].zip(hour_min.map(&:to_i))]
|
27
30
|
end
|
28
31
|
|
29
32
|
def calculate(base)
|
30
|
-
datetime =
|
33
|
+
datetime = super
|
31
34
|
|
32
35
|
hour_min_fixable? ? datetime.change(hour_min) : datetime
|
33
36
|
end
|
@@ -37,14 +40,5 @@ module Tokiyomi
|
|
37
40
|
def hour_min_fixable?
|
38
41
|
hour_min && unit.in?([:years, :months, :days])
|
39
42
|
end
|
40
|
-
|
41
|
-
def init_from_dynamic_value(str)
|
42
|
-
duration, unit, direction, *hour_min= str.scan(RELATIVE_TIME).first
|
43
|
-
|
44
|
-
@duration = duration.to_i
|
45
|
-
@unit = UNITS[unit]
|
46
|
-
@direction = direction == '前' ? :ago : :since
|
47
|
-
@hour_min = hour_min.all?(&:nil?) ? nil : Hash[[:hour, :min].zip(hour_min.map(&:to_i))]
|
48
|
-
end
|
49
43
|
end
|
50
44
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'active_support/core_ext'
|
2
|
+
|
3
|
+
module Tokiyomi
|
4
|
+
class TimeBase
|
5
|
+
attr_reader :duration, :unit, :direction, :hour_min
|
6
|
+
|
7
|
+
class << self
|
8
|
+
def readable?(str)
|
9
|
+
!!handlable_subclass(str)
|
10
|
+
end
|
11
|
+
|
12
|
+
def parser_for(str)
|
13
|
+
handlable_subclass(str).new(str)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def handlable_subclass(str)
|
19
|
+
subclasses.detect {|klass| klass.readable?(str) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def calculate(base)
|
24
|
+
duration.send(unit).send(direction, base)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/tokiyomi/version.rb
CHANGED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
def RSpec.root
|
2
|
+
@spec_root ||= Pathname.new(File.dirname(__FILE__))
|
3
|
+
end
|
4
|
+
|
5
|
+
$: << File.expand_path('../lib', File.dirname(__FILE__))
|
6
|
+
|
7
|
+
RSpec.configure do |config|
|
8
|
+
config.mock_with :rspec
|
9
|
+
end
|
10
|
+
|
11
|
+
RSpec::Matchers.define :be_calculated_to do |expect|
|
12
|
+
match do |relative_time|
|
13
|
+
relative_time.calculate(now).should == Time.parse(expect)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
require 'time'
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'tokiyomi/named_time'
|
4
|
+
|
5
|
+
describe Tokiyomi::NamedTime do
|
6
|
+
let(:now) { Time.local(2013, 1, 10, 12, 34, 56) }
|
7
|
+
|
8
|
+
def named_time(str)
|
9
|
+
Tokiyomi::NamedTime.new(str)
|
10
|
+
end
|
11
|
+
|
12
|
+
specify { expect(named_time('昨日')).to be_calculated_to('2013/01/09 12:34:56') }
|
13
|
+
specify { expect(named_time('おととい')).to be_calculated_to('2013/01/08 12:34:56') }
|
14
|
+
specify { expect(named_time('今日')).to be_calculated_to('2013/01/10 12:34:56') }
|
15
|
+
specify { expect(named_time('明後日')).to be_calculated_to('2013/01/12 12:34:56') }
|
16
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
require '
|
2
|
+
require 'spec_helper'
|
3
3
|
require 'tokiyomi/relative_time'
|
4
4
|
|
5
5
|
describe Tokiyomi::RelativeTime do
|
@@ -9,12 +9,6 @@ describe Tokiyomi::RelativeTime do
|
|
9
9
|
Tokiyomi::RelativeTime.new(str)
|
10
10
|
end
|
11
11
|
|
12
|
-
RSpec::Matchers.define :be_calculated_to do |expect|
|
13
|
-
match do |relative_time|
|
14
|
-
relative_time.calculate(now).should == Time.parse(expect)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
12
|
specify { expect(rel_time('3日前')).to be_calculated_to('2013/01/07 12:34:56') }
|
19
13
|
specify { expect(rel_time('10分後')).to be_calculated_to('2013/01/10 12:44:56') }
|
20
14
|
|
data/spec/tokiyomi_spec.rb
CHANGED
@@ -3,4 +3,11 @@ require 'tokiyomi'
|
|
3
3
|
|
4
4
|
describe Tokiyomi do
|
5
5
|
specify { Tokiyomi.parse('10日前').should be_kind_of(Time) }
|
6
|
+
|
7
|
+
describe '.readable?' do
|
8
|
+
specify { Tokiyomi.readable?('10日前').should be_true }
|
9
|
+
specify { Tokiyomi.readable?('日後').should be_false }
|
10
|
+
specify { Tokiyomi.readable?('おっととい').should be_false }
|
11
|
+
specify { Tokiyomi.readable?('おととい').should be_true }
|
12
|
+
end
|
6
13
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tokiyomi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -72,8 +72,12 @@ files:
|
|
72
72
|
- README.md
|
73
73
|
- Rakefile
|
74
74
|
- lib/tokiyomi.rb
|
75
|
+
- lib/tokiyomi/named_time.rb
|
75
76
|
- lib/tokiyomi/relative_time.rb
|
77
|
+
- lib/tokiyomi/time_base.rb
|
76
78
|
- lib/tokiyomi/version.rb
|
79
|
+
- spec/spec_helper.rb
|
80
|
+
- spec/tokiyomi_named_time_spec.rb
|
77
81
|
- spec/tokiyomi_relative_time_spec.rb
|
78
82
|
- spec/tokiyomi_spec.rb
|
79
83
|
- tokiyomi.gemspec
|
@@ -102,5 +106,7 @@ signing_key:
|
|
102
106
|
specification_version: 3
|
103
107
|
summary: Japanese relative date/time string parser.
|
104
108
|
test_files:
|
109
|
+
- spec/spec_helper.rb
|
110
|
+
- spec/tokiyomi_named_time_spec.rb
|
105
111
|
- spec/tokiyomi_relative_time_spec.rb
|
106
112
|
- spec/tokiyomi_spec.rb
|