lita-wit 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -0
- data/lib/lita/handlers/wit.rb +24 -1
- data/lib/lita/services/wit_client.rb +48 -0
- data/lib/lita/utils/alias_stripper.rb +10 -0
- data/lib/lita/utils/aliases.rb +9 -0
- data/lib/lita/utils/bickle.rb +14 -0
- data/lib/lita-wit.rb +10 -5
- data/lita-wit.gemspec +5 -2
- data/spec/lita/handlers/wit_spec.rb +45 -1
- data/spec/lita_config.rb +8 -0
- data/spec/spec_helper.rb +19 -4
- data/spec/support/vcr_cassettes/.gitkeep +0 -0
- data/spec/support/vcr_cassettes/wit_greeting.yml +138 -0
- metadata +55 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a6396a10176ffd117f4288900d89f9e721e08ba
|
4
|
+
data.tar.gz: 513bdf40c3b8d6913ad28272280d6df24e0c1bd5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b094722f4f49fec03c6640024265b1249fb7aba044c44c118d47be43d00f34ccd35b46dae80989408df8a9220b781e99c9cb046442bf9e49be20a1a615af61dc
|
7
|
+
data.tar.gz: a5f15301b5966e2cb334028cdf301bd1f657ba5b01d02a4f7a836c40878949f57cb7002d4cc89ae21390d6666a819a75627ea4d686c550290e5ee28fb1831b8c
|
data/README.md
CHANGED
data/lib/lita/handlers/wit.rb
CHANGED
@@ -1,7 +1,30 @@
|
|
1
1
|
module Lita
|
2
2
|
module Handlers
|
3
3
|
class Wit < Handler
|
4
|
-
|
4
|
+
on :unhandled_message, :handle
|
5
|
+
config :server_access_token, type: String, required: true
|
6
|
+
|
7
|
+
def initialize(robot)
|
8
|
+
super
|
9
|
+
@bickle = Lita::Utils::Bickle.new(robot)
|
10
|
+
@client = Lita::Services::WitClient.new(robot)
|
11
|
+
end
|
12
|
+
|
13
|
+
def handle(payload)
|
14
|
+
message = payload[:message]
|
15
|
+
return unless @bickle.you_talking_to_me?(message)
|
16
|
+
respond(message)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def respond(message)
|
22
|
+
@client.run_actions session_id, message
|
23
|
+
end
|
24
|
+
|
25
|
+
def session_id
|
26
|
+
'unique-1234'
|
27
|
+
end
|
5
28
|
|
6
29
|
Lita.register_handler(self)
|
7
30
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Lita
|
2
|
+
module Services
|
3
|
+
class WitClient
|
4
|
+
|
5
|
+
def initialize(robot)
|
6
|
+
@robot = robot
|
7
|
+
token = @robot.config.handlers.wit.server_access_token
|
8
|
+
@wit = ::Wit.new token, actions
|
9
|
+
end
|
10
|
+
|
11
|
+
def run_actions(session_id, message, context={}, max_steps=DEFAULT_MAX_STEPS)
|
12
|
+
@source = message.source
|
13
|
+
stripped = Lita::Utils::AliasStripper.strip(@robot, message)
|
14
|
+
@wit.run_actions(session_id, stripped.body, context, max_steps)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def actions
|
20
|
+
{
|
21
|
+
:say => -> (session_id, context, msg) {
|
22
|
+
@robot.send_message(@source, msg)
|
23
|
+
},
|
24
|
+
:merge => -> (session_id, context, entities, msg) {
|
25
|
+
pipe(context, entities, 'intent', 'intent')
|
26
|
+
pipe(context, entities, 'location', 'loc')
|
27
|
+
context
|
28
|
+
},
|
29
|
+
:error => -> (session_id, context, error) {
|
30
|
+
# Required, but is never ever called
|
31
|
+
},
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def first_entity_value(entities, entity)
|
36
|
+
return nil unless entities.has_key? entity
|
37
|
+
val = entities[entity][0]['value']
|
38
|
+
return nil if val.nil?
|
39
|
+
val.is_a?(Hash) ? val['value'] : val
|
40
|
+
end
|
41
|
+
|
42
|
+
def pipe(context, entities, input, output)
|
43
|
+
e = first_entity_value entities, input
|
44
|
+
context[output] = e unless e.nil?
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/lita-wit.rb
CHANGED
@@ -1,12 +1,17 @@
|
|
1
|
-
require
|
1
|
+
require 'lita'
|
2
|
+
require 'wit'
|
2
3
|
|
3
4
|
Lita.load_locales Dir[File.expand_path(
|
4
|
-
File.join(
|
5
|
+
File.join('..', '..', 'locales', '*.yml'), __FILE__
|
5
6
|
)]
|
6
7
|
|
7
|
-
require
|
8
|
+
require 'lita/handlers/wit'
|
9
|
+
require 'lita/utils/bickle'
|
10
|
+
require 'lita/utils/aliases'
|
11
|
+
require 'lita/utils/alias_stripper'
|
12
|
+
require 'lita/services/wit_client'
|
8
13
|
|
9
14
|
Lita::Handlers::Wit.template_root File.expand_path(
|
10
|
-
File.join(
|
11
|
-
|
15
|
+
File.join('..', '..', 'templates'),
|
16
|
+
__FILE__
|
12
17
|
)
|
data/lita-wit.gemspec
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = "lita-wit"
|
3
|
-
spec.version = "0.0
|
3
|
+
spec.version = "0.1.0"
|
4
4
|
spec.authors = ["Damien Bastin"]
|
5
5
|
spec.email = ["damien.bastin@gmail.com"]
|
6
|
-
spec.description = "A Lita handler for Wit"
|
6
|
+
spec.description = "A Lita handler for Wit."
|
7
7
|
spec.summary = "Receive structured intentions from unstructured sentences using a Lita bot and Wit."
|
8
8
|
spec.homepage = "https://github.com/dbastin/lita-wit"
|
9
9
|
spec.license = "MIT"
|
@@ -15,6 +15,7 @@ Gem::Specification.new do |spec|
|
|
15
15
|
spec.require_paths = ["lib"]
|
16
16
|
|
17
17
|
spec.add_runtime_dependency "lita", ">= 4.7"
|
18
|
+
spec.add_runtime_dependency "wit", ">= 3.3.1"
|
18
19
|
|
19
20
|
spec.add_development_dependency "bundler", ">= 1.3"
|
20
21
|
spec.add_development_dependency "pry-byebug"
|
@@ -23,4 +24,6 @@ Gem::Specification.new do |spec|
|
|
23
24
|
spec.add_development_dependency "rspec", ">= 3.0.0"
|
24
25
|
spec.add_development_dependency "simplecov"
|
25
26
|
spec.add_development_dependency "coveralls"
|
27
|
+
spec.add_development_dependency "webmock"
|
28
|
+
spec.add_development_dependency "vcr"
|
26
29
|
end
|
@@ -1,4 +1,48 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Lita::Handlers::Wit, lita_handler: true do
|
4
|
+
|
5
|
+
describe 'handling unhandled_message' do
|
6
|
+
let(:source) { double(:source) }
|
7
|
+
|
8
|
+
context 'unhandled directed at lita' do
|
9
|
+
it 'handles something' do
|
10
|
+
expect_any_instance_of(::Wit).to receive(:run_actions).with(SESSION_ID, 'Hi', {}, DEFAULT_MAX_STEPS) {
|
11
|
+
robot.send_message(source, 'Howdy')
|
12
|
+
}
|
13
|
+
send_message('Hi Lita')
|
14
|
+
expect(replies.last).to eq('Howdy')
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'recognizes aliases' do
|
18
|
+
expect_any_instance_of(::Wit).to receive(:run_actions).with(SESSION_ID, 'Hi', {}, DEFAULT_MAX_STEPS) {
|
19
|
+
robot.send_message(source, 'Hiya')
|
20
|
+
}
|
21
|
+
robot.alias = 'Rita'
|
22
|
+
send_message('Hi Rita')
|
23
|
+
expect(replies.last).to eq('Hiya')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'unhandled not directed at lita' do
|
28
|
+
it 'ignores the message' do
|
29
|
+
send_message('Hi')
|
30
|
+
expect(replies.last).to be_nil
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'handle' do
|
36
|
+
let(:source) { double(:source) }
|
37
|
+
let(:message) { double(:message, body: 'Hello', command?: true, source: source) }
|
38
|
+
|
39
|
+
context 'commanding lita' do
|
40
|
+
it 'calls wit.ai and responds to source' do
|
41
|
+
VCR.use_cassette('wit greeting') do
|
42
|
+
expect(subject.robot).to receive(:send_message).with(source, 'Hi. Ask me about the weather. Anywhere. Go on!')
|
43
|
+
subject.handle(message: message)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
4
48
|
end
|
data/spec/lita_config.rb
ADDED
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require 'simplecov'
|
2
2
|
|
3
|
-
require
|
3
|
+
require 'coveralls'
|
4
4
|
Coveralls.wear!
|
5
5
|
|
6
6
|
SimpleCov.start 'rails' do
|
@@ -12,9 +12,24 @@ SimpleCov.start 'rails' do
|
|
12
12
|
add_filter '/spec/'
|
13
13
|
end
|
14
14
|
|
15
|
-
require
|
16
|
-
|
15
|
+
require 'lita-wit'
|
16
|
+
Wit.logger.level = Logger::WARN
|
17
|
+
|
18
|
+
require 'lita/rspec'
|
19
|
+
require 'lita_config'
|
17
20
|
|
18
21
|
# A compatibility mode is provided for older plugins upgrading from Lita 3. Since this plugin
|
19
22
|
# was generated with Lita 4, the compatibility mode should be left disabled.
|
20
23
|
Lita.version_3_compatibility_mode = false
|
24
|
+
|
25
|
+
require 'vcr'
|
26
|
+
require 'webmock/rspec'
|
27
|
+
|
28
|
+
VCR.configure do |config|
|
29
|
+
config.cassette_library_dir = 'spec/support/vcr_cassettes'
|
30
|
+
config.ignore_localhost = true
|
31
|
+
config.hook_into :webmock
|
32
|
+
config.configure_rspec_metadata!
|
33
|
+
end
|
34
|
+
|
35
|
+
SESSION_ID = 'unique-1234'
|
File without changes
|
@@ -0,0 +1,138 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://api.wit.ai/converse?q=Hello&session_id=unique-1234
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: "{}"
|
9
|
+
headers:
|
10
|
+
Accept-Encoding:
|
11
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
Accept:
|
13
|
+
- application/vnd.wit.20160330+json
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
Host:
|
17
|
+
- api.wit.ai
|
18
|
+
Authorization:
|
19
|
+
- Bearer 72XXMP6VAKG2SAPLTXVQS6H5PBLVQIJW
|
20
|
+
Content-Type:
|
21
|
+
- application/json
|
22
|
+
response:
|
23
|
+
status:
|
24
|
+
code: 200
|
25
|
+
message: OK
|
26
|
+
headers:
|
27
|
+
Server:
|
28
|
+
- nginx/1.8.0
|
29
|
+
Date:
|
30
|
+
- Thu, 28 Apr 2016 15:14:39 GMT
|
31
|
+
Content-Type:
|
32
|
+
- application/json
|
33
|
+
Content-Length:
|
34
|
+
- '118'
|
35
|
+
Connection:
|
36
|
+
- keep-alive
|
37
|
+
body:
|
38
|
+
encoding: UTF-8
|
39
|
+
string: |-
|
40
|
+
{
|
41
|
+
"confidence" : 1,
|
42
|
+
"type" : "merge",
|
43
|
+
"entities" : {
|
44
|
+
"intent" : [ {
|
45
|
+
"value" : "greeting"
|
46
|
+
} ]
|
47
|
+
}
|
48
|
+
}
|
49
|
+
http_version:
|
50
|
+
recorded_at: Thu, 28 Apr 2016 15:14:39 GMT
|
51
|
+
- request:
|
52
|
+
method: post
|
53
|
+
uri: https://api.wit.ai/converse?session_id=unique-1234
|
54
|
+
body:
|
55
|
+
encoding: UTF-8
|
56
|
+
string: '{"intent":"greeting"}'
|
57
|
+
headers:
|
58
|
+
Accept-Encoding:
|
59
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
60
|
+
Accept:
|
61
|
+
- application/vnd.wit.20160330+json
|
62
|
+
User-Agent:
|
63
|
+
- Ruby
|
64
|
+
Host:
|
65
|
+
- api.wit.ai
|
66
|
+
Authorization:
|
67
|
+
- Bearer 72XXMP6VAKG2SAPLTXVQS6H5PBLVQIJW
|
68
|
+
Content-Type:
|
69
|
+
- application/json
|
70
|
+
response:
|
71
|
+
status:
|
72
|
+
code: 200
|
73
|
+
message: OK
|
74
|
+
headers:
|
75
|
+
Server:
|
76
|
+
- nginx/1.8.0
|
77
|
+
Date:
|
78
|
+
- Thu, 28 Apr 2016 15:14:40 GMT
|
79
|
+
Content-Type:
|
80
|
+
- application/json
|
81
|
+
Content-Length:
|
82
|
+
- '117'
|
83
|
+
Connection:
|
84
|
+
- keep-alive
|
85
|
+
body:
|
86
|
+
encoding: UTF-8
|
87
|
+
string: |-
|
88
|
+
{
|
89
|
+
"confidence" : 0.5878773927688599,
|
90
|
+
"type" : "msg",
|
91
|
+
"msg" : "Hi. Ask me about the weather. Anywhere. Go on!"
|
92
|
+
}
|
93
|
+
http_version:
|
94
|
+
recorded_at: Thu, 28 Apr 2016 15:14:40 GMT
|
95
|
+
- request:
|
96
|
+
method: post
|
97
|
+
uri: https://api.wit.ai/converse?session_id=unique-1234
|
98
|
+
body:
|
99
|
+
encoding: UTF-8
|
100
|
+
string: '{"intent":"greeting"}'
|
101
|
+
headers:
|
102
|
+
Accept-Encoding:
|
103
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
104
|
+
Accept:
|
105
|
+
- application/vnd.wit.20160330+json
|
106
|
+
User-Agent:
|
107
|
+
- Ruby
|
108
|
+
Host:
|
109
|
+
- api.wit.ai
|
110
|
+
Authorization:
|
111
|
+
- Bearer 72XXMP6VAKG2SAPLTXVQS6H5PBLVQIJW
|
112
|
+
Content-Type:
|
113
|
+
- application/json
|
114
|
+
response:
|
115
|
+
status:
|
116
|
+
code: 200
|
117
|
+
message: OK
|
118
|
+
headers:
|
119
|
+
Server:
|
120
|
+
- nginx/1.8.0
|
121
|
+
Date:
|
122
|
+
- Thu, 28 Apr 2016 15:14:41 GMT
|
123
|
+
Content-Type:
|
124
|
+
- application/json
|
125
|
+
Content-Length:
|
126
|
+
- '58'
|
127
|
+
Connection:
|
128
|
+
- keep-alive
|
129
|
+
body:
|
130
|
+
encoding: UTF-8
|
131
|
+
string: |-
|
132
|
+
{
|
133
|
+
"confidence" : 0.9979153275489807,
|
134
|
+
"type" : "stop"
|
135
|
+
}
|
136
|
+
http_version:
|
137
|
+
recorded_at: Thu, 28 Apr 2016 15:14:41 GMT
|
138
|
+
recorded_with: VCR 3.0.1
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lita-wit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Damien Bastin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lita
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '4.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: wit
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 3.3.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 3.3.1
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,7 +136,35 @@ dependencies:
|
|
122
136
|
- - ">="
|
123
137
|
- !ruby/object:Gem::Version
|
124
138
|
version: '0'
|
125
|
-
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: webmock
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: vcr
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
description: A Lita handler for Wit.
|
126
168
|
email:
|
127
169
|
- damien.bastin@gmail.com
|
128
170
|
executables: []
|
@@ -137,10 +179,17 @@ files:
|
|
137
179
|
- Rakefile
|
138
180
|
- lib/lita-wit.rb
|
139
181
|
- lib/lita/handlers/wit.rb
|
182
|
+
- lib/lita/services/wit_client.rb
|
183
|
+
- lib/lita/utils/alias_stripper.rb
|
184
|
+
- lib/lita/utils/aliases.rb
|
185
|
+
- lib/lita/utils/bickle.rb
|
140
186
|
- lita-wit.gemspec
|
141
187
|
- locales/en.yml
|
142
188
|
- spec/lita/handlers/wit_spec.rb
|
189
|
+
- spec/lita_config.rb
|
143
190
|
- spec/spec_helper.rb
|
191
|
+
- spec/support/vcr_cassettes/.gitkeep
|
192
|
+
- spec/support/vcr_cassettes/wit_greeting.yml
|
144
193
|
- templates/.gitkeep
|
145
194
|
homepage: https://github.com/dbastin/lita-wit
|
146
195
|
licenses:
|
@@ -170,4 +219,7 @@ summary: Receive structured intentions from unstructured sentences using a Lita
|
|
170
219
|
and Wit.
|
171
220
|
test_files:
|
172
221
|
- spec/lita/handlers/wit_spec.rb
|
222
|
+
- spec/lita_config.rb
|
173
223
|
- spec/spec_helper.rb
|
224
|
+
- spec/support/vcr_cassettes/.gitkeep
|
225
|
+
- spec/support/vcr_cassettes/wit_greeting.yml
|