datte 0.5.1 → 0.6.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 +4 -4
- data/README.md +25 -19
- data/datte.png +0 -0
- data/lib/datte/date_parser.rb +14 -0
- data/lib/datte/datetime_table.rb +17 -0
- data/lib/datte/dattetime.rb +9 -5
- data/lib/datte/text_converter.rb +0 -1
- data/lib/datte/version.rb +1 -1
- data/spec/datte_spec.rb +1 -10
- data/spec/parser.rb +50 -0
- data/spec/text_converter.rb +17 -0
- metadata +6 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bc322b1b841443f6126d408c18bf35663c5f0553
|
4
|
+
data.tar.gz: e94da6f51a9d11c12d7f4a6cd4816fe37cb055b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cae6a971d24209a0ee4a0f272d75fe209159e03f7e722e2d5360a3c286520df1fe7dca21e232afe08ec5a80ff3df8c26c4a758dd9b8aaa235398467660d2fdfc
|
7
|
+
data.tar.gz: 80f80edb5e229985829ba43e7d09bf44ad99c86d688ac84cdc035c8843d845ff447c06ac76264a619427704484136b594e82e312cc52c397065779249c5ef52e
|
data/README.md
CHANGED
@@ -1,8 +1,6 @@
|
|
1
|
-
|
1
|
+

|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
3
|
+
A Fast and Easy DateTime Extractor in Japanese build with love by pokohide & sasaken.
|
6
4
|
|
7
5
|
## Installation
|
8
6
|
|
@@ -14,7 +12,9 @@ gem 'datte'
|
|
14
12
|
|
15
13
|
And then execute:
|
16
14
|
|
17
|
-
|
15
|
+
```
|
16
|
+
$ bundle
|
17
|
+
```
|
18
18
|
|
19
19
|
Or install it yourself as:
|
20
20
|
|
@@ -22,27 +22,33 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
datte.parse_date(body) do |date|
|
33
|
-
# dateには抽出した日付
|
34
|
-
# 日付が抽出出来た場合のみ実行される
|
25
|
+
```
|
26
|
+
datte = Datte::Parser.new
|
27
|
+
body = '明日の10時にxxに集合でよろしくー!'
|
28
|
+
datte.parse_date(body) do |datetime|
|
29
|
+
# if body contains datetime, this block is excuted.
|
30
|
+
p datetime
|
31
|
+
# <DateTime: 2017-01-22T10:00:00+00:00 ((2457776j,36000s,0n),+0s,2299161j)>
|
35
32
|
end
|
33
|
+
```
|
36
34
|
|
37
|
-
|
35
|
+
```
|
36
|
+
datte = Datte::Parser.new
|
37
|
+
body = '3/2まで回答お願いしますー!'
|
38
|
+
datetime = datte.parse_date(body)
|
38
39
|
if datte.nil?
|
39
|
-
|
40
|
+
puts "body doesn't contain datetime"
|
40
41
|
else
|
41
|
-
|
42
|
+
p datetime
|
43
|
+
# <DateTime: 2017-03-02T18:00:00+00:00 ((2457815j,64800s,0n),+0s,2299161j)>
|
42
44
|
end
|
45
|
+
```
|
43
46
|
|
47
|
+
## Test
|
44
48
|
|
45
|
-
|
49
|
+
```
|
50
|
+
rspec spec/*
|
51
|
+
```
|
46
52
|
|
47
53
|
## Development
|
48
54
|
|
data/datte.png
ADDED
Binary file
|
data/lib/datte/date_parser.rb
CHANGED
@@ -37,6 +37,20 @@ module Datte
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
+
WEEKS.each do |matcher_s, week|
|
41
|
+
matcher = Regexp.new(matcher_s.to_s)
|
42
|
+
if @body.match(matcher)
|
43
|
+
WDAYS.each do |wday_matcher_s, wday|
|
44
|
+
wday_matcher = Regexp.new(wday_matcher_s.to_s)
|
45
|
+
if @body.match(wday_matcher)
|
46
|
+
now_wday = DateTime.now.wday
|
47
|
+
day = 7 * (week || 1) + wday - now_wday
|
48
|
+
@date.after({day: day})
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
40
54
|
return @date.to_datetime
|
41
55
|
end
|
42
56
|
|
data/lib/datte/datetime_table.rb
CHANGED
@@ -57,6 +57,23 @@ module Datte
|
|
57
57
|
'(?<min>\d{1,2})分後'
|
58
58
|
].map { |pattern| Regexp.compile(pattern) }.freeze
|
59
59
|
|
60
|
+
WEEKS = {
|
61
|
+
'来週|らいしゅう': 1,
|
62
|
+
'再来週|さらいしゅう': 2,
|
63
|
+
'次の': 1,
|
64
|
+
'翌週': 1
|
65
|
+
}
|
66
|
+
|
67
|
+
WDAYS = {
|
68
|
+
'日曜日|にちようび': 0,
|
69
|
+
'月曜日|げつようび': 1,
|
70
|
+
'火曜日|かようび': 2,
|
71
|
+
'水曜日|すいようび': 3,
|
72
|
+
'木曜日|もくようび': 4,
|
73
|
+
'金曜日|きんようび': 5,
|
74
|
+
'土曜日|どようび': 6
|
75
|
+
}
|
76
|
+
|
60
77
|
class DatetimeTable
|
61
78
|
def initialize
|
62
79
|
end
|
data/lib/datte/dattetime.rb
CHANGED
@@ -39,13 +39,17 @@ module Datte
|
|
39
39
|
@year, @month, @day = now[:year] + md[:year].to_i, now[:month], now[:day]
|
40
40
|
end
|
41
41
|
if md.matched?(:month)
|
42
|
-
|
42
|
+
carry = (now[:month] + md[:month].to_i) / 12
|
43
|
+
@year, @month, @day = now[:year] + carry, now[:month] + md[:month].to_i , now[:day]
|
43
44
|
end
|
44
45
|
if md.matched?(:day)
|
45
|
-
|
46
|
+
days = [31,28,31,30,31,30,31,31,30,31,30,31][now[:month] - 1]
|
47
|
+
carry = (now[:day] + md[:day].to_i) / days
|
48
|
+
@year, @month, @day = now[:year], now[:month] + carry, now[:day] + md[:day].to_i - carry * days
|
46
49
|
end
|
47
50
|
if md.matched?(:hour)
|
48
|
-
|
51
|
+
carry = (now[:hour] + md[:hour].to_i) / 24
|
52
|
+
@day, @hour = now[:day] + carry, now[:hour] + md[:hour].to_i - carry * 24, now[:min]
|
49
53
|
end
|
50
54
|
# @date >> (md[:year].to_i * 12) if md.matched?(:year) # 何年後
|
51
55
|
# @date >> md[:month].to_i if md.matched?(:month) # 何ヶ月後
|
@@ -63,8 +67,8 @@ module Datte
|
|
63
67
|
def mi; @min || 0 end
|
64
68
|
|
65
69
|
def now
|
66
|
-
d
|
67
|
-
{ year: d.year, month: d.month, day: d.day, hour: d.hour, min: d.min }
|
70
|
+
@d ||= DateTime.now
|
71
|
+
{ year: @d.year, month: @d.month, day: @d.day, hour: @d.hour, min: @d.min }
|
68
72
|
end
|
69
73
|
|
70
74
|
def year!(md)
|
data/lib/datte/text_converter.rb
CHANGED
data/lib/datte/version.rb
CHANGED
data/spec/datte_spec.rb
CHANGED
@@ -1,17 +1,8 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe Datte do
|
4
|
+
|
4
5
|
it "has a version number" do
|
5
6
|
expect(Datte::VERSION).not_to be nil
|
6
7
|
end
|
7
|
-
|
8
|
-
describe "::Parser" do
|
9
|
-
datte = Datte::Parser.new
|
10
|
-
|
11
|
-
it "2016/11/1日に遊ぼー" do
|
12
|
-
body = "2016/11/1日に遊ぼー"
|
13
|
-
d = DateTime.now
|
14
|
-
expect(datte.parse_date(body)).to eq(DateTime.new(2016, 11, 1, d.hour, 0, 0))
|
15
|
-
end
|
16
|
-
end
|
17
8
|
end
|
data/spec/parser.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Datte::Parser do
|
4
|
+
parser = Datte::Parser.new
|
5
|
+
d = DateTime.now
|
6
|
+
|
7
|
+
it "日時情報を含まなければnilを返す" do
|
8
|
+
body = "ChatBotHack楽しい"
|
9
|
+
expect(parser.parse_date(body)).to eq(nil)
|
10
|
+
|
11
|
+
body = "お腹すいたなぁ"
|
12
|
+
expect(parser.parse_date(body)).to eq(nil)
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
it "y/m/d 形式での認識" do
|
17
|
+
body = "2016/11/1日に遊ぼー"
|
18
|
+
expect(parser.parse_date(body)).to eq(DateTime.new(2016, 11, 1, d.hour, 0, 0))
|
19
|
+
|
20
|
+
body = "8/10日に飲みに行かない?"
|
21
|
+
expect(parser.parse_date(body)).to eq(DateTime.new(d.year, 8, 10, d.hour, 0, 0))
|
22
|
+
end
|
23
|
+
|
24
|
+
it "何時何分のような時間の認識" do
|
25
|
+
body = "明日の朝8時集合ね!"
|
26
|
+
expect(parser.parse_date(body).day).to eq((d+1).day)
|
27
|
+
expect(parser.parse_date(body).hour).to eq(8)
|
28
|
+
|
29
|
+
body = "20日の16時集合ね!"
|
30
|
+
expect(parser.parse_date(body).day).to eq(20)
|
31
|
+
expect(parser.parse_date(body).hour).to eq(16)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "明日や明後日といった相対的な文字の認識" do
|
35
|
+
body = "明日テストだ。。。"
|
36
|
+
expect(parser.parse_date(body).day).to eq((d+1).day)
|
37
|
+
|
38
|
+
body = "でも明後日はお肉食べに行く"
|
39
|
+
expect(parser.parse_date(body).day).to eq((d+2).day)
|
40
|
+
end
|
41
|
+
|
42
|
+
# TODO この部分のテスト通らないので本体を修正
|
43
|
+
it "3日後のような相対的な数値" do
|
44
|
+
body = "もう3日後にはセンター試験"
|
45
|
+
expect(parser.parse_date(body).day).to eq((d+3).day)
|
46
|
+
|
47
|
+
body = "今日の一時間後に卓球しない?"
|
48
|
+
expect(parser.parse_date(body).hour).to eq((d+Rational(1, 24)).hour)
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Datte::TextConverter do
|
4
|
+
tc = Datte::TextConverter.new()
|
5
|
+
|
6
|
+
it '漢数字を数字に変換' do
|
7
|
+
expect(tc.kan_num('一月二日')).to eq '1月2日'
|
8
|
+
expect(tc.kan_num('十二月二十日に遊びに行こうね!')).to eq '12月20日に遊びに行こうね!'
|
9
|
+
expect(tc.kan_num('今日の一時間後くらいに飲みに行かない?')).to eq '今日の1時間後くらいに飲みに行かない?'
|
10
|
+
end
|
11
|
+
|
12
|
+
it '漢数字がなければ何もしない' do
|
13
|
+
expect(tc.kan_num('おなかすいた')).to eq 'おなかすいた'
|
14
|
+
expect(tc.kan_num('今日は夕ご飯食べるの?')).to eq '今日は夕ご飯食べるの?'
|
15
|
+
expect(tc.kan_num('就活で消耗してる。。。')).to eq '就活で消耗してる。。。'
|
16
|
+
end
|
17
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: datte
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- pokohide
|
@@ -72,6 +72,7 @@ files:
|
|
72
72
|
- bin/console
|
73
73
|
- bin/setup
|
74
74
|
- datte.gemspec
|
75
|
+
- datte.png
|
75
76
|
- lib/datte.rb
|
76
77
|
- lib/datte/data.txt
|
77
78
|
- lib/datte/date_parser.rb
|
@@ -82,7 +83,9 @@ files:
|
|
82
83
|
- lib/datte/train.rb
|
83
84
|
- lib/datte/version.rb
|
84
85
|
- spec/datte_spec.rb
|
86
|
+
- spec/parser.rb
|
85
87
|
- spec/spec_helper.rb
|
88
|
+
- spec/text_converter.rb
|
86
89
|
homepage: https://github.com/hyde2able/datte.git
|
87
90
|
licenses:
|
88
91
|
- MIT
|
@@ -109,4 +112,6 @@ specification_version: 4
|
|
109
112
|
summary: A convenient way to parse string in ruby
|
110
113
|
test_files:
|
111
114
|
- spec/datte_spec.rb
|
115
|
+
- spec/parser.rb
|
112
116
|
- spec/spec_helper.rb
|
117
|
+
- spec/text_converter.rb
|