RecastAI 2.1.1 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +5 -6
- data/README.md +19 -19
- data/lib/recastai.rb +18 -8
- data/lib/recastai/apis/connect/connect.rb +16 -0
- data/lib/recastai/apis/connect/message.rb +44 -0
- data/lib/recastai/apis/connect/models/message.rb +20 -0
- data/lib/recastai/apis/connect/utils.rb +9 -0
- data/lib/recastai/{errors.rb → apis/errors.rb} +1 -1
- data/lib/recastai/apis/request/analyse.rb +45 -0
- data/lib/recastai/apis/request/converse.rb +50 -0
- data/lib/recastai/{action.rb → apis/request/models/action.rb} +0 -2
- data/lib/recastai/apis/request/models/conversation.rb +105 -0
- data/lib/recastai/{entity.rb → apis/request/models/entity.rb} +0 -4
- data/lib/recastai/{intent.rb → apis/request/models/intent.rb} +0 -2
- data/lib/recastai/apis/request/models/response.rb +119 -0
- data/lib/recastai/apis/request/request.rb +18 -0
- data/lib/recastai/apis/request/utils.rb +30 -0
- data/lib/recastai/utils.rb +7 -26
- metadata +17 -10
- data/lib/recastai/client.rb +0 -104
- data/lib/recastai/conversation.rb +0 -182
- data/lib/recastai/response.rb +0 -227
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e0d9d38204152540d567fca3d5d666bc1074bff
|
4
|
+
data.tar.gz: 6c75863441add341d3832dc812ed281088d68da7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fd45c6c44cfd34dd279b9a45399284c6085a61404b98e08b308b24220085510f5d60be5d5bf9de0969e3318c10719e29dd3876af0f9d73535c5ed8feab34ff83
|
7
|
+
data.tar.gz: 4c8f99a187d5db0885f10b1166602ce0e52a7d1142c00eb3c3fc8697e4b885d931fa5d171e2a5e6dc560aba8c3543b78eb07cfa5b5cd9917bec1fb0ea10b1c1f
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
RecastAI (
|
4
|
+
RecastAI (3.0.0)
|
5
5
|
httmultiparty (~> 0.3)
|
6
6
|
httparty (~> 0.13)
|
7
7
|
|
@@ -19,12 +19,11 @@ GEM
|
|
19
19
|
httparty (>= 0.7.3)
|
20
20
|
mimemagic
|
21
21
|
multipart-post
|
22
|
-
httparty (0.
|
23
|
-
json (~> 1.8)
|
22
|
+
httparty (0.14.0)
|
24
23
|
multi_xml (>= 0.5.2)
|
25
24
|
json (1.8.3)
|
26
|
-
mimemagic (0.3.
|
27
|
-
multi_xml (0.
|
25
|
+
mimemagic (0.3.2)
|
26
|
+
multi_xml (0.6.0)
|
28
27
|
multipart-post (2.0.0)
|
29
28
|
rspec (3.4.0)
|
30
29
|
rspec-core (~> 3.4.0)
|
@@ -61,4 +60,4 @@ DEPENDENCIES
|
|
61
60
|
webmock (~> 1.24)
|
62
61
|
|
63
62
|
BUNDLED WITH
|
64
|
-
1.
|
63
|
+
1.14.5
|
data/README.md
CHANGED
@@ -9,35 +9,35 @@ Recast.AI official SDK in Ruby
|
|
9
9
|
## Synospis
|
10
10
|
|
11
11
|
This module is a wrapper around the [Recast.AI](https://recast.ai) API, and allows you to:
|
12
|
-
* [
|
13
|
-
* [
|
12
|
+
* [Analyse your text](https://github.com/RecastAI/SDK-Ruby/wiki/01---Analyse-text)
|
13
|
+
* [Manage a conversation](https://github.com/RecastAI/SDK-Ruby/wiki/02---Manage-conversation)
|
14
|
+
* [Receive and send messages](https://github.com/RecastAI/SDK-Ruby/wiki/03---Receive-and-send-messages)
|
14
15
|
|
15
16
|
## Installation
|
16
17
|
|
18
|
+
This gem supports ruby 2.3+.
|
19
|
+
|
17
20
|
```bash
|
18
|
-
gem install
|
21
|
+
gem install RecastAI
|
19
22
|
```
|
20
23
|
|
21
|
-
|
22
|
-
|
23
|
-
You can find the full documentation [here](https://github.com/RecastAI/SDK-Ruby/wiki).
|
24
|
+
You can now use the sdk in your code.
|
24
25
|
|
25
|
-
|
26
|
+
Using the entire SDK:
|
27
|
+
```ruby
|
28
|
+
require 'recastai'
|
26
29
|
|
27
|
-
|
30
|
+
client = RecastAI.new('YOUR_TOKEN')
|
31
|
+
```
|
28
32
|
|
29
|
-
|
33
|
+
Extracting one single API:
|
34
|
+
```ruby
|
35
|
+
require 'recastai'
|
30
36
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
* [Action](https://github.com/RecastAI/SDK-Ruby/wiki/Class-Action) represents an action to do when using the text_converse method.
|
35
|
-
* [Intent](https://github.com/RecastAI/SDK-Ruby/wiki/Class-Intent) represents an intent matched when using either the text_request, file_request or text_converse methods.
|
36
|
-
* [Entity](https://github.com/RecastAI/SDK-Ruby/wiki/Class-Entity) represents an entity extracted from an input.
|
37
|
-
* [RecastError](https://github.com/RecastAI/SDK-Ruby/wiki/Class-RecastError) is the error returned by the module.
|
37
|
+
request = RecastAI::Request.new('YOUR_TOKEN')
|
38
|
+
connect = RecastAI::Connect.new('YOUR_TOKEN')
|
39
|
+
```
|
38
40
|
|
39
|
-
Don't hesitate to dive into the code, it's commented ;)
|
40
|
-
`
|
41
41
|
## More
|
42
42
|
|
43
43
|
You can view the whole API reference at [man.recast.ai](https://man.recast.ai).
|
@@ -52,7 +52,7 @@ You can follow us on Twitter at [@recastai](https://twitter.com/recastai) for up
|
|
52
52
|
|
53
53
|
## License
|
54
54
|
|
55
|
-
Copyright (c) [
|
55
|
+
Copyright (c) [2017] [Recast.AI](https://recast.ai)
|
56
56
|
|
57
57
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
58
58
|
of this software and associated documentation files (the "Software"), to deal
|
data/lib/recastai.rb
CHANGED
@@ -2,15 +2,25 @@
|
|
2
2
|
|
3
3
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
4
4
|
|
5
|
+
require 'json'
|
5
6
|
require 'httparty'
|
6
7
|
require 'httmultiparty'
|
7
|
-
require 'json'
|
8
8
|
|
9
9
|
require 'recastai/utils'
|
10
|
-
require 'recastai/
|
11
|
-
require 'recastai/
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
10
|
+
require 'recastai/apis/connect/connect'
|
11
|
+
require 'recastai/apis/request/request'
|
12
|
+
|
13
|
+
module RecastAI
|
14
|
+
class Client
|
15
|
+
attr_reader :token, :language
|
16
|
+
|
17
|
+
def initialize(token = nil, language = nil)
|
18
|
+
[RecastAI::Request, RecastAI::Connect].each do |api|
|
19
|
+
i = api.name.rindex('::')
|
20
|
+
name = i.nil? ? api.name : api.name[(i + 2)..-1]
|
21
|
+
|
22
|
+
self.class.send(:define_method, name.downcase.to_sym, ->{ api.new(token, language) })
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'message'
|
4
|
+
|
5
|
+
module RecastAI
|
6
|
+
class Connect
|
7
|
+
include Message
|
8
|
+
|
9
|
+
attr_reader :token, :language
|
10
|
+
|
11
|
+
def initialize(token = nil, language = nil)
|
12
|
+
@token = token
|
13
|
+
@language = language
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'models/message'
|
4
|
+
require_relative 'utils'
|
5
|
+
|
6
|
+
module RecastAI
|
7
|
+
module Message
|
8
|
+
def handle_message(request, &block)
|
9
|
+
request.body.rewind if request.body.respond_to?(:rewind)
|
10
|
+
body = request.body.is_a?(String) ? request.body : request.body.read
|
11
|
+
message = Msg.new(body)
|
12
|
+
|
13
|
+
yield(message)
|
14
|
+
end
|
15
|
+
|
16
|
+
def send_message(payload, conversation_id, token: nil)
|
17
|
+
token ||= @token
|
18
|
+
raise RecastError.new('Token is missing') if token.nil?
|
19
|
+
|
20
|
+
response = HTTParty.post(
|
21
|
+
"#{Utils::CONVERSATION_ENDPOINT}#{conversation_id}/messages",
|
22
|
+
body: { messages: payload },
|
23
|
+
headers: { 'Authorization' => "Token #{token}" }
|
24
|
+
)
|
25
|
+
raise RecastError.new(JSON.parse(response.body)['message']) if response.code != 201
|
26
|
+
|
27
|
+
response
|
28
|
+
end
|
29
|
+
|
30
|
+
def broadcast_message(payload, token: nil)
|
31
|
+
token ||= @token
|
32
|
+
raise RecastError.new('Token is missing') if token.nil?
|
33
|
+
|
34
|
+
response = HTTParty.post(
|
35
|
+
Utils::MESSAGE_ENDPOINT,
|
36
|
+
body: { messages: payload },
|
37
|
+
headers: { 'Authorization' => "Token #{token}" }
|
38
|
+
)
|
39
|
+
raise RecastError.new(JSON.parse(response.body)['message']) if response.code != 201
|
40
|
+
|
41
|
+
response
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module RecastAI
|
4
|
+
class Msg
|
5
|
+
attr_reader :content, :type, :conversation_id
|
6
|
+
|
7
|
+
def initialize(request)
|
8
|
+
request = JSON.parse(request)
|
9
|
+
request.each do |k, v|
|
10
|
+
k = k.gsub(/(.)([A-Z])/,'\1_\2').downcase
|
11
|
+
self.instance_variable_set("@#{k}", v)
|
12
|
+
self.define_singleton_method(k.to_sym){ v }
|
13
|
+
end
|
14
|
+
|
15
|
+
@conversation_id = request['message']['conversation']
|
16
|
+
@content = request['message']['attachment']['content']
|
17
|
+
@type = request['message']['attachment']['type']
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'models/response'
|
4
|
+
require_relative 'utils'
|
5
|
+
require_relative '../errors'
|
6
|
+
|
7
|
+
module RecastAI
|
8
|
+
module Analyse
|
9
|
+
def analyse_text(text, token: nil, language: nil)
|
10
|
+
token ||= @token
|
11
|
+
raise RecastError.new('Token is missing') if token.nil?
|
12
|
+
|
13
|
+
language ||= @language
|
14
|
+
|
15
|
+
body = { text: text }
|
16
|
+
body[:language] = language unless language.nil?
|
17
|
+
response = HTTParty.post(
|
18
|
+
Utils::REQUEST_ENDPOINT,
|
19
|
+
body: body,
|
20
|
+
headers: { 'Authorization' => "Token #{token}" }
|
21
|
+
)
|
22
|
+
raise RecastError.new(JSON.parse(response.body)['message']) if response.code != 200
|
23
|
+
|
24
|
+
Response.new(response.body)
|
25
|
+
end
|
26
|
+
|
27
|
+
def analyse_file(file, token: nil, language: nil)
|
28
|
+
token ||= @token
|
29
|
+
raise RecastError.new('Token is missing') if token.nil?
|
30
|
+
|
31
|
+
language ||= @language
|
32
|
+
|
33
|
+
body = { voice: File.new(file) }
|
34
|
+
body[:language] = language unless language.nil?
|
35
|
+
response = HTTMultiParty.post(
|
36
|
+
Utils::REQUEST_ENDPOINT,
|
37
|
+
body: body,
|
38
|
+
headers: { 'Authorization' => "Token #{token}" }
|
39
|
+
)
|
40
|
+
raise RecastError.new(JSON.parse(response.body)['message']) if response.code != 200
|
41
|
+
|
42
|
+
Response.new(response.body)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'models/conversation'
|
4
|
+
require_relative 'utils'
|
5
|
+
require_relative '../errors'
|
6
|
+
|
7
|
+
module RecastAI
|
8
|
+
module Converse
|
9
|
+
def converse_text(text, token: nil, language: nil, conversation_token: nil, memory: nil)
|
10
|
+
token ||= @token
|
11
|
+
raise RecastError.new('Token is missing') if token.nil?
|
12
|
+
|
13
|
+
language ||= @language
|
14
|
+
|
15
|
+
body = { text: text }
|
16
|
+
body[:language] = language unless language.nil?
|
17
|
+
body[:conversation_token] = conversation_token unless conversation_token.nil?
|
18
|
+
body[:memory] = memory unless memory.nil?
|
19
|
+
|
20
|
+
response = HTTParty.post(
|
21
|
+
Utils::CONVERSE_ENDPOINT,
|
22
|
+
body: body,
|
23
|
+
headers: { 'Authorization' => "Token #{token}" }
|
24
|
+
)
|
25
|
+
raise RecastError.new(JSON.parse(response.body)['message']) if response.code != 200
|
26
|
+
|
27
|
+
Conversation.new(response.body, token)
|
28
|
+
end
|
29
|
+
|
30
|
+
def converse_file(file, token: nil, language: nil, conversation_token: nil, memory: nil)
|
31
|
+
token ||= @token
|
32
|
+
raise RecastError.new('Token is missing') if token.nil?
|
33
|
+
|
34
|
+
language ||= @language
|
35
|
+
|
36
|
+
body = { voice: File.new(file) }
|
37
|
+
body[:language] = language unless language.nil?
|
38
|
+
body[:conversation_token] = conversation_token unless conversation_token.nil?
|
39
|
+
body[:memory] = memory unless memory.nil?
|
40
|
+
response = HTTMultiParty.post(
|
41
|
+
Utils::CONVERSE_ENDPOINT,
|
42
|
+
body: body,
|
43
|
+
headers: { 'Authorization' => "Token #{token}" }
|
44
|
+
)
|
45
|
+
raise RecastError.new(JSON.parse(response.body)['message']) if response.code != 200
|
46
|
+
|
47
|
+
Conversation.new(response.body, token)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'action'
|
4
|
+
require_relative 'entity'
|
5
|
+
require_relative 'intent'
|
6
|
+
|
7
|
+
module RecastAI
|
8
|
+
class Conversation
|
9
|
+
attr_reader :raw, :uuid, :source, :replies, :action, :next_actions, :memory, :entities, :intents,
|
10
|
+
:conversation_token, :language, :version, :timestamp, :status
|
11
|
+
|
12
|
+
def initialize(response, token)
|
13
|
+
@token = token
|
14
|
+
|
15
|
+
@raw = response
|
16
|
+
|
17
|
+
response = JSON.parse(response)
|
18
|
+
response = response['results']
|
19
|
+
|
20
|
+
@uuid = response['uuid']
|
21
|
+
@source = response['source']
|
22
|
+
@replies = response['replies']
|
23
|
+
@action = response['action'] ? Action.new(response['action']) : nil
|
24
|
+
@next_actions = response['next_actions'].map{ |i| Action.new(i) }
|
25
|
+
@memory = response['memory'].reject { |_, e| e.nil? }.map{ |n, e| Entity.new(n, e) }
|
26
|
+
@entities = response['entities'].flat_map{ |_, e| e.map{ |ee| Entity.new(n, ee) } }
|
27
|
+
@intents = response['intents'].map{ |i| Intent.new(i) }
|
28
|
+
@conversation_token = response['conversation_token']
|
29
|
+
@language = response['language']
|
30
|
+
@version = response['version']
|
31
|
+
@timestamp = response['timestamp']
|
32
|
+
@status = response['status']
|
33
|
+
end
|
34
|
+
|
35
|
+
def reply
|
36
|
+
@replies.any? ? @replies.first : nil
|
37
|
+
end
|
38
|
+
|
39
|
+
def next_action
|
40
|
+
@next_actions.any? ? @next_actions.first : nil
|
41
|
+
end
|
42
|
+
|
43
|
+
def joined_replies(sep = ' ')
|
44
|
+
@replies.join(sep)
|
45
|
+
end
|
46
|
+
|
47
|
+
def get_memory(key = nil)
|
48
|
+
return @memory if key.nil?
|
49
|
+
|
50
|
+
@memory.each do |entity|
|
51
|
+
return entity if entity.name.casecmp(key.to_s).zero?
|
52
|
+
end
|
53
|
+
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
|
57
|
+
def intent
|
58
|
+
@intents.any? ? @intents.first : nil
|
59
|
+
end
|
60
|
+
|
61
|
+
def set_memory(memory)
|
62
|
+
body = { conversation_token: @conversation_token, memory: memory }
|
63
|
+
response = HTTParty.put(
|
64
|
+
Utils::CONVERSE_ENDPOINT,
|
65
|
+
body: body,
|
66
|
+
headers: { 'Authorization' => "Token #{@token}" }
|
67
|
+
)
|
68
|
+
raise RecastError.new(JSON.parse(response.body)['message']) if response.code != 200
|
69
|
+
|
70
|
+
response = JSON.parse(response.body)
|
71
|
+
response = response['results']
|
72
|
+
response['memory'].reject { |_, e| e.nil? }.map { |n, e| Entity.new(n, e) }
|
73
|
+
end
|
74
|
+
|
75
|
+
def reset_memory(name = nil)
|
76
|
+
body = { conversation_token: @conversation_token }
|
77
|
+
body[:memory] = { name => nil } unless name.nil?
|
78
|
+
|
79
|
+
response = HTTParty.put(
|
80
|
+
Utils::CONVERSE_ENDPOINT,
|
81
|
+
body: body,
|
82
|
+
headers: { 'Authorization' => "Token #{@token}" }
|
83
|
+
)
|
84
|
+
raise RecastError.new(JSON.parse(response.body)['message']) if response.code != 200
|
85
|
+
|
86
|
+
response = JSON.parse(response.body)
|
87
|
+
response = response['results']
|
88
|
+
response['memory'].reject { |_, e| e.nil? }.map { |n, e| Entity.new(n, e) }
|
89
|
+
end
|
90
|
+
|
91
|
+
def reset_conversation
|
92
|
+
body = { conversation_token: @conversation_token }
|
93
|
+
response = HTTParty.delete(
|
94
|
+
Utils::CONVERSE_ENDPOINT,
|
95
|
+
body: body,
|
96
|
+
headers: { 'Authorization' => "Token #{@token}" }
|
97
|
+
)
|
98
|
+
raise RecastError.new(JSON.parse(response.body)['message']) if response.code != 200
|
99
|
+
|
100
|
+
response = JSON.parse(response.body)
|
101
|
+
response = response['results']
|
102
|
+
response['memory'].reject { |_, e| e.nil? }.map { |n, e| Entity.new(n, e) }
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
##
|
4
|
-
# This class build an Entity used in RecastAI::Response and RecastAI::Conversation
|
5
3
|
module RecastAI
|
6
4
|
class Entity
|
7
5
|
attr_reader :name
|
@@ -9,8 +7,6 @@ module RecastAI
|
|
9
7
|
def initialize(name, data)
|
10
8
|
@name = name
|
11
9
|
|
12
|
-
# For each pair key, value, set a instance variable
|
13
|
-
# and an attr_reader named k and returning v
|
14
10
|
data.each_pair do |k, v|
|
15
11
|
self.instance_variable_set("@#{k}", v)
|
16
12
|
self.define_singleton_method(k.to_sym){ v }
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'intent'
|
4
|
+
require_relative 'entity'
|
5
|
+
require_relative '../utils'
|
6
|
+
|
7
|
+
module RecastAI
|
8
|
+
class Response
|
9
|
+
attr_reader :raw
|
10
|
+
attr_reader :uuid
|
11
|
+
attr_reader :source
|
12
|
+
attr_reader :intents
|
13
|
+
attr_reader :act
|
14
|
+
attr_reader :type
|
15
|
+
attr_reader :sentiment
|
16
|
+
attr_reader :entities
|
17
|
+
attr_reader :language
|
18
|
+
attr_reader :version
|
19
|
+
attr_reader :timestamp
|
20
|
+
attr_reader :status
|
21
|
+
|
22
|
+
def initialize(response)
|
23
|
+
@raw = response
|
24
|
+
|
25
|
+
response = JSON.parse(response)
|
26
|
+
response = response['results']
|
27
|
+
|
28
|
+
@uuid = response['uuid']
|
29
|
+
@source = response['source']
|
30
|
+
@intents = response['intents'].map{ |i| Intent.new(i) }
|
31
|
+
@act = response['act']
|
32
|
+
@type = response['type']
|
33
|
+
@sentiment = response['sentiment']
|
34
|
+
@entities = response['entities'].flat_map{ |n, e| e.map{ |ee| Entity.new(n, ee) } }
|
35
|
+
@language = response['language']
|
36
|
+
@version = response['version']
|
37
|
+
@timestamp = response['timestamp']
|
38
|
+
@status = response['status']
|
39
|
+
end
|
40
|
+
|
41
|
+
def intent
|
42
|
+
@intents.any? ? @intents.first : nil
|
43
|
+
end
|
44
|
+
|
45
|
+
def get(name)
|
46
|
+
@entities.each do |entity|
|
47
|
+
return entity if entity.name.casecmp(name.to_s).zero?
|
48
|
+
end
|
49
|
+
|
50
|
+
nil
|
51
|
+
end
|
52
|
+
|
53
|
+
def all(name)
|
54
|
+
@entities.select do |entity|
|
55
|
+
entity.name.casecmp(name.to_s).zero?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def assert?
|
60
|
+
@act == Utils::ACT_ASSERT
|
61
|
+
end
|
62
|
+
|
63
|
+
def command?
|
64
|
+
@act == Utils::ACT_COMMAND
|
65
|
+
end
|
66
|
+
|
67
|
+
def wh_query?
|
68
|
+
@act == Utils::ACT_WH_QUERY
|
69
|
+
end
|
70
|
+
|
71
|
+
def yn_query?
|
72
|
+
@act == Utils::ACT_YN_QUERY
|
73
|
+
end
|
74
|
+
|
75
|
+
def abbreviation?
|
76
|
+
!@type.index(Utils::TYPE_ABBREVIATION).nil?
|
77
|
+
end
|
78
|
+
|
79
|
+
def entity?
|
80
|
+
!@type.index(Utils::TYPE_ENTITY).nil?
|
81
|
+
end
|
82
|
+
|
83
|
+
def description?
|
84
|
+
!@type.index(Utils::TYPE_DESCRIPTION).nil?
|
85
|
+
end
|
86
|
+
|
87
|
+
def human?
|
88
|
+
!@type.index(Utils::TYPE_HUMAN).nil?
|
89
|
+
end
|
90
|
+
|
91
|
+
def location?
|
92
|
+
!@type.index(Utils::TYPE_LOCATION).nil?
|
93
|
+
end
|
94
|
+
|
95
|
+
def number?
|
96
|
+
!@type.index(Utils::TYPE_NUMBER).nil?
|
97
|
+
end
|
98
|
+
|
99
|
+
def vpositive?
|
100
|
+
@sentiment == Utils::SENTIMENT_VPOSITIVE
|
101
|
+
end
|
102
|
+
|
103
|
+
def positive?
|
104
|
+
@sentiment == Utils::SENTIMENT_POSITIVE
|
105
|
+
end
|
106
|
+
|
107
|
+
def neutral?
|
108
|
+
@sentiment == Utils::SENTIMENT_NEUTRAL
|
109
|
+
end
|
110
|
+
|
111
|
+
def negative?
|
112
|
+
@sentiment == Utils::SENTIMENT_NEGATIVE
|
113
|
+
end
|
114
|
+
|
115
|
+
def vnegative?
|
116
|
+
@sentiment == Utils::SENTIMENT_VNEGATIVE
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'analyse'
|
4
|
+
require_relative 'converse'
|
5
|
+
|
6
|
+
module RecastAI
|
7
|
+
class Request
|
8
|
+
include Converse
|
9
|
+
include Analyse
|
10
|
+
|
11
|
+
attr_reader :token, :language
|
12
|
+
|
13
|
+
def initialize(token = nil, language = nil)
|
14
|
+
@token = token
|
15
|
+
@language = language
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module RecastAI
|
4
|
+
class Utils
|
5
|
+
# Endpoints
|
6
|
+
REQUEST_ENDPOINT = 'https://api.recast.ai/v2/request/'.freeze
|
7
|
+
CONVERSE_ENDPOINT = 'https://api.recast.ai/v2/converse/'.freeze
|
8
|
+
|
9
|
+
# Act constants
|
10
|
+
ACT_ASSERT = 'assert'.freeze
|
11
|
+
ACT_COMMAND = 'command'.freeze
|
12
|
+
ACT_WH_QUERY = 'wh-query'.freeze
|
13
|
+
ACT_YN_QUERY = 'yn-query'.freeze
|
14
|
+
|
15
|
+
# Type constants
|
16
|
+
TYPE_ABBREVIATION = 'abbr:'.freeze
|
17
|
+
TYPE_ENTITY = 'enty:'.freeze
|
18
|
+
TYPE_DESCRIPTION = 'desc:'.freeze
|
19
|
+
TYPE_HUMAN = 'hum:'.freeze
|
20
|
+
TYPE_LOCATION = 'loc:'.freeze
|
21
|
+
TYPE_NUMBER = 'num:'.freeze
|
22
|
+
|
23
|
+
# Sentiment constants
|
24
|
+
SENTIMENT_VPOSITIVE = 'vpositive'.freeze
|
25
|
+
SENTIMENT_POSITIVE = 'positive'.freeze
|
26
|
+
SENTIMENT_NEUTRAL = 'neutral'.freeze
|
27
|
+
SENTIMENT_NEGATIVE = 'negative'.freeze
|
28
|
+
SENTIMENT_VNEGATIVE = 'vnegative'.freeze
|
29
|
+
end
|
30
|
+
end
|
data/lib/recastai/utils.rb
CHANGED
@@ -3,34 +3,15 @@
|
|
3
3
|
module RecastAI
|
4
4
|
class Utils
|
5
5
|
# Versioning
|
6
|
-
MAJOR = '
|
7
|
-
MINOR = '
|
8
|
-
MICRO = '
|
6
|
+
MAJOR = '3'.freeze
|
7
|
+
MINOR = '0'.freeze
|
8
|
+
MICRO = '0'.freeze
|
9
9
|
VERSION = "#{MAJOR}.#{MINOR}.#{MICRO}".freeze
|
10
10
|
|
11
11
|
# Endpoints
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
ACT_ASSERT = 'assert'.freeze
|
17
|
-
ACT_COMMAND = 'command'.freeze
|
18
|
-
ACT_WH_QUERY = 'wh-query'.freeze
|
19
|
-
ACT_YN_QUERY = 'yn-query'.freeze
|
20
|
-
|
21
|
-
# Type constants
|
22
|
-
TYPE_ABBREVIATION = 'abbr:'.freeze
|
23
|
-
TYPE_ENTITY = 'enty:'.freeze
|
24
|
-
TYPE_DESCRIPTION = 'desc:'.freeze
|
25
|
-
TYPE_HUMAN = 'hum:'.freeze
|
26
|
-
TYPE_LOCATION = 'loc:'.freeze
|
27
|
-
TYPE_NUMBER = 'num:'.freeze
|
28
|
-
|
29
|
-
# Sentiment constants
|
30
|
-
SENTIMENT_VPOSITIVE = 'vpositive'.freeze
|
31
|
-
SENTIMENT_POSITIVE = 'positive'.freeze
|
32
|
-
SENTIMENT_NEUTRAL = 'neutral'.freeze
|
33
|
-
SENTIMENT_NEGATIVE = 'negative'.freeze
|
34
|
-
SENTIMENT_VNEGATIVE = 'vnegative'.freeze
|
12
|
+
TRAIN_ENDPOINT = 'https://api.recast.ai/v2/'.freeze
|
13
|
+
CONNECT_ENDPOINT = 'https://api.recast.ai/connect/v1/'.freeze
|
14
|
+
HOST_ENDPOINT = 'https://api.recast.ai/host/v1/'.freeze
|
15
|
+
MONITOR_ENDPOINT = 'https://api.recast.ai/monitor/v1/'.freeze
|
35
16
|
end
|
36
17
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: RecastAI
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Renvoisé
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-03-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -113,13 +113,20 @@ files:
|
|
113
113
|
- bin/file
|
114
114
|
- bin/text
|
115
115
|
- lib/recastai.rb
|
116
|
-
- lib/recastai/
|
117
|
-
- lib/recastai/
|
118
|
-
- lib/recastai/
|
119
|
-
- lib/recastai/
|
120
|
-
- lib/recastai/errors.rb
|
121
|
-
- lib/recastai/
|
122
|
-
- lib/recastai/
|
116
|
+
- lib/recastai/apis/connect/connect.rb
|
117
|
+
- lib/recastai/apis/connect/message.rb
|
118
|
+
- lib/recastai/apis/connect/models/message.rb
|
119
|
+
- lib/recastai/apis/connect/utils.rb
|
120
|
+
- lib/recastai/apis/errors.rb
|
121
|
+
- lib/recastai/apis/request/analyse.rb
|
122
|
+
- lib/recastai/apis/request/converse.rb
|
123
|
+
- lib/recastai/apis/request/models/action.rb
|
124
|
+
- lib/recastai/apis/request/models/conversation.rb
|
125
|
+
- lib/recastai/apis/request/models/entity.rb
|
126
|
+
- lib/recastai/apis/request/models/intent.rb
|
127
|
+
- lib/recastai/apis/request/models/response.rb
|
128
|
+
- lib/recastai/apis/request/request.rb
|
129
|
+
- lib/recastai/apis/request/utils.rb
|
123
130
|
- lib/recastai/utils.rb
|
124
131
|
- misc/.gitkeep
|
125
132
|
- misc/logo-inline.png
|
@@ -145,7 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
145
152
|
version: '0'
|
146
153
|
requirements: []
|
147
154
|
rubyforge_project:
|
148
|
-
rubygems_version: 2.5.
|
155
|
+
rubygems_version: 2.5.2
|
149
156
|
signing_key:
|
150
157
|
specification_version: 4
|
151
158
|
summary: Recast.AI official SDK for Ruby
|
data/lib/recastai/client.rb
DELETED
@@ -1,104 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
##
|
4
|
-
# This class is the main entrypoint to Recast.AI
|
5
|
-
# When using *_converse, a RecastAI::Conversation object is returned
|
6
|
-
# When using *_request, a RecastAI::Response object is returned
|
7
|
-
module RecastAI
|
8
|
-
class Client
|
9
|
-
attr_accessor :token
|
10
|
-
attr_accessor :language
|
11
|
-
|
12
|
-
def initialize(token = nil, language = nil)
|
13
|
-
@token = token
|
14
|
-
@language = language
|
15
|
-
end
|
16
|
-
|
17
|
-
##
|
18
|
-
# Perform a text converse to Recast.AI
|
19
|
-
#
|
20
|
-
# * *Args* :
|
21
|
-
# - +text+ - String, the text to process
|
22
|
-
# - +options+ - Hash, request's options
|
23
|
-
# * *Returns* :
|
24
|
-
# - An instance of Conversation
|
25
|
-
# * *Throws* :
|
26
|
-
# - RecastError
|
27
|
-
def text_converse(text, options = {})
|
28
|
-
token = options[:token] || @token
|
29
|
-
raise(RecastError.new('Token is missing')) if token.nil?
|
30
|
-
|
31
|
-
language = options[:language] || @language
|
32
|
-
|
33
|
-
body = { text: text }
|
34
|
-
body[:language] = language unless language.nil?
|
35
|
-
body[:conversation_token] = options[:conversation_token] unless options[:conversation_token].nil?
|
36
|
-
body[:memory] = options[:memory] unless options[:memory].nil?
|
37
|
-
|
38
|
-
response = HTTParty.post(
|
39
|
-
Utils::CONVERSE_ENDPOINT,
|
40
|
-
body: body,
|
41
|
-
headers: { Authorization: "Token #{token}" }
|
42
|
-
)
|
43
|
-
raise(RecastError.new(response.message)) if response.code != 200
|
44
|
-
|
45
|
-
Conversation.new(response.body)
|
46
|
-
end
|
47
|
-
|
48
|
-
##
|
49
|
-
# Perform a text request to Recast.AI
|
50
|
-
#
|
51
|
-
# * *Args* :
|
52
|
-
# - +text+ - String, the text to process
|
53
|
-
# - +options+ - Hash, request's options
|
54
|
-
# * *Returns* :
|
55
|
-
# - An instance of Response
|
56
|
-
# * *Throws* :
|
57
|
-
# - RecastError
|
58
|
-
def text_request(text, options = {})
|
59
|
-
token = options[:token] || @token
|
60
|
-
raise(RecastError.new('Token is missing')) if token.nil?
|
61
|
-
|
62
|
-
language = options[:language] || @language
|
63
|
-
|
64
|
-
body = { text: text }
|
65
|
-
body[:language] = language unless language.nil?
|
66
|
-
response = HTTParty.post(
|
67
|
-
Utils::REQUEST_ENDPOINT,
|
68
|
-
body: body,
|
69
|
-
headers: { Authorization: "Token #{token}" }
|
70
|
-
)
|
71
|
-
raise(RecastError.new(response.message)) if response.code != 200
|
72
|
-
|
73
|
-
Response.new(response.body)
|
74
|
-
end
|
75
|
-
|
76
|
-
##
|
77
|
-
# Perform a voice file request to Recast.AI
|
78
|
-
#
|
79
|
-
# * *Args* :
|
80
|
-
# - +file+ - String or File, the voice file to process
|
81
|
-
# - +options+ - Hash, request's options
|
82
|
-
# * *Returns* :
|
83
|
-
# - An instance of Response
|
84
|
-
# * *Throws* :
|
85
|
-
# - RecastError
|
86
|
-
def file_request(file, options = {})
|
87
|
-
token = options[:token] || @token
|
88
|
-
raise(RecastError.new('Token is missing')) if token.nil?
|
89
|
-
|
90
|
-
language = options[:language] || @language
|
91
|
-
|
92
|
-
body = { voice: File.new(file) }
|
93
|
-
body[:language] = language unless language.nil?
|
94
|
-
response = HTTMultiParty.post(
|
95
|
-
Utils::REQUEST_ENDPOINT,
|
96
|
-
body: body,
|
97
|
-
headers: { Authorization: "Token #{token}" }
|
98
|
-
)
|
99
|
-
raise(RecastError.new(response.message)) if response.code != 200
|
100
|
-
|
101
|
-
Response.new(response.body)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
@@ -1,182 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
##
|
4
|
-
# This class builds a conversation from *_converse
|
5
|
-
module RecastAI
|
6
|
-
class Conversation
|
7
|
-
attr_reader :raw
|
8
|
-
attr_reader :uuid
|
9
|
-
attr_reader :source
|
10
|
-
attr_reader :replies
|
11
|
-
attr_reader :action
|
12
|
-
attr_reader :next_actions
|
13
|
-
attr_reader :memory
|
14
|
-
attr_reader :entities
|
15
|
-
attr_reader :intents
|
16
|
-
attr_reader :conversation_token
|
17
|
-
attr_reader :language
|
18
|
-
attr_reader :version
|
19
|
-
attr_reader :timestamp
|
20
|
-
attr_reader :status
|
21
|
-
|
22
|
-
def initialize(response)
|
23
|
-
@raw = response
|
24
|
-
|
25
|
-
response = JSON.parse(response)
|
26
|
-
response = response['results']
|
27
|
-
|
28
|
-
@uuid = response['uuid']
|
29
|
-
@source = response['source']
|
30
|
-
@replies = response['replies']
|
31
|
-
@action = response['action'] ? Action.new(response['action']) : nil
|
32
|
-
@next_actions = response['next_actions'].map{ |i| Action.new(i) }
|
33
|
-
@memory = response['memory'].select{ |n, e| !e.nil? }.map{ |n, e| Entity.new(n, e) }
|
34
|
-
@entities = response['entities'].flat_map{ |n, e| e.map{ |ee| Entity.new(n, ee) } }
|
35
|
-
@intents = response['intents'].map{ |i| Intent.new(i) }
|
36
|
-
@conversation_token = response['conversation_token']
|
37
|
-
@language = response['language']
|
38
|
-
@version = response['version']
|
39
|
-
@timestamp = response['timestamp']
|
40
|
-
@status = response['status']
|
41
|
-
end
|
42
|
-
|
43
|
-
##
|
44
|
-
# Returns the first reply provided there is one
|
45
|
-
#
|
46
|
-
# * *Args* :
|
47
|
-
# * *Returns* :
|
48
|
-
# - A String or nil
|
49
|
-
def reply
|
50
|
-
@replies.any? ? @replies.first : nil
|
51
|
-
end
|
52
|
-
|
53
|
-
##
|
54
|
-
# Returns the first next action provided there is one
|
55
|
-
#
|
56
|
-
# * *Args* :
|
57
|
-
# * *Returns* :
|
58
|
-
# - An instance of Action or nil
|
59
|
-
def next_action
|
60
|
-
@next_actions.any? ? @next_actions.first : nil
|
61
|
-
end
|
62
|
-
|
63
|
-
##
|
64
|
-
# Returns the replies joined with sep
|
65
|
-
#
|
66
|
-
# * *Args* :
|
67
|
-
# - +sep+ - String, the separator (default: ' ')
|
68
|
-
# * *Returns* :
|
69
|
-
# - A String or nil
|
70
|
-
def joined_replies(sep=' ')
|
71
|
-
@replies.join(sep)
|
72
|
-
end
|
73
|
-
|
74
|
-
##
|
75
|
-
# Returns the first entity in the memory name matches the parameter
|
76
|
-
# If no name is provided, returns the full memory
|
77
|
-
#
|
78
|
-
# * *Args* :
|
79
|
-
# - +key+ - String, the memory's field name
|
80
|
-
# * *Returns* :
|
81
|
-
# - An instance of Entity or a Memory
|
82
|
-
def get_memory(key=nil)
|
83
|
-
return @memory if key.nil?
|
84
|
-
|
85
|
-
@memory.each do |entity|
|
86
|
-
return entity if entity.name.casecmp(key.to_s) == 0
|
87
|
-
end
|
88
|
-
|
89
|
-
nil
|
90
|
-
end
|
91
|
-
|
92
|
-
##
|
93
|
-
# Returns the first intent provided there is one
|
94
|
-
#
|
95
|
-
# * *Args* :
|
96
|
-
# * *Returns* :
|
97
|
-
# - A String or nil
|
98
|
-
def intent
|
99
|
-
@intents.any? ? @intents.first : nil
|
100
|
-
end
|
101
|
-
|
102
|
-
class << self
|
103
|
-
##
|
104
|
-
# Merges the conversation memory with the one given
|
105
|
-
#
|
106
|
-
# * *Args* :
|
107
|
-
# - +token+ - String, your request_token
|
108
|
-
# - +conversation_token+ String, the token of the conversation whose memory will be updated
|
109
|
-
# - +memory+ Hash, the memory you want to update with
|
110
|
-
# * *Returns* :
|
111
|
-
# - An updated Memory
|
112
|
-
# * *Throws* :
|
113
|
-
# - RecastError
|
114
|
-
def set_memory(token, conversation_token, memory)
|
115
|
-
body = { conversation_token: conversation_token, memory: memory }
|
116
|
-
response = HTTParty.put(
|
117
|
-
Utils::CONVERSE_ENDPOINT,
|
118
|
-
body: body,
|
119
|
-
headers: { Authorization: "Token #{token}" }
|
120
|
-
)
|
121
|
-
raise(RecastError.new(response.message)) if response.code != 200
|
122
|
-
|
123
|
-
response = JSON.parse(response.body)
|
124
|
-
response = response['results']
|
125
|
-
response['memory'].select{ |n, e| !e.nil? }.map{ |n, e| Entity.new(n, e) }
|
126
|
-
end
|
127
|
-
|
128
|
-
##
|
129
|
-
# Reset the conversation memory fully or partially with the one given
|
130
|
-
#
|
131
|
-
# * *Args* :
|
132
|
-
# - +token+ - String, your request_token
|
133
|
-
# - +conversation_token+ String, the token of the conversation whose memory will be updated
|
134
|
-
# - +memory+ Hash, the memory you want to update with
|
135
|
-
# * *Returns* :
|
136
|
-
# - A fully or partially reset Memory
|
137
|
-
# * *Throws* :
|
138
|
-
# - RecastError
|
139
|
-
def reset_memory(token, conversation_token, name=nil)
|
140
|
-
body = { conversation_token: conversation_token }
|
141
|
-
unless name.nil?
|
142
|
-
body[:memory] = { name => nil }
|
143
|
-
end
|
144
|
-
response = HTTParty.put(
|
145
|
-
Utils::CONVERSE_ENDPOINT,
|
146
|
-
body: body,
|
147
|
-
headers: { Authorization: "Token #{token}" }
|
148
|
-
)
|
149
|
-
raise(RecastError.new(response.message)) if response.code != 200
|
150
|
-
|
151
|
-
response = JSON.parse(response.body)
|
152
|
-
response = response['results']
|
153
|
-
response['memory'].select{ |n, e| !e.nil? }.map{ |n, e| Entity.new(n, e) }
|
154
|
-
end
|
155
|
-
|
156
|
-
##
|
157
|
-
# Resets the conversation state by setting every memory field to nil,
|
158
|
-
# all actions to not done, and the last action to nil
|
159
|
-
#
|
160
|
-
# * *Args* :
|
161
|
-
# - +token+ - String, your request_token
|
162
|
-
# - +conversation_token+ - String, the token of the conversation to reset
|
163
|
-
# * *Returns* :
|
164
|
-
# - A fully reset Memory
|
165
|
-
# * *Throws* :
|
166
|
-
# - RecastError
|
167
|
-
def reset_conversation(token, conversation_token)
|
168
|
-
body = { conversation_token: conversation_token }
|
169
|
-
response = HTTParty.delete(
|
170
|
-
Utils::CONVERSE_ENDPOINT,
|
171
|
-
body: body,
|
172
|
-
headers: { Authorization: "Token #{token}" }
|
173
|
-
)
|
174
|
-
raise(RecastError.new(response.message)) if response.code != 200
|
175
|
-
|
176
|
-
response = JSON.parse(response.body)
|
177
|
-
response = response['results']
|
178
|
-
response['memory'].select{ |n, e| !e.nil? }.map{ |n, e| Entity.new(n, e) }
|
179
|
-
end
|
180
|
-
end
|
181
|
-
end
|
182
|
-
end
|
data/lib/recastai/response.rb
DELETED
@@ -1,227 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
##
|
4
|
-
# This class builds a response from *_request
|
5
|
-
module RecastAI
|
6
|
-
class Response
|
7
|
-
attr_reader :raw
|
8
|
-
attr_reader :uuid
|
9
|
-
attr_reader :source
|
10
|
-
attr_reader :intents
|
11
|
-
attr_reader :act
|
12
|
-
attr_reader :type
|
13
|
-
attr_reader :sentiment
|
14
|
-
attr_reader :entities
|
15
|
-
attr_reader :language
|
16
|
-
attr_reader :version
|
17
|
-
attr_reader :timestamp
|
18
|
-
attr_reader :status
|
19
|
-
|
20
|
-
def initialize(response)
|
21
|
-
@raw = response
|
22
|
-
|
23
|
-
response = JSON.parse(response)
|
24
|
-
response = response['results']
|
25
|
-
|
26
|
-
@uuid = response['uuid']
|
27
|
-
@source = response['source']
|
28
|
-
@intents = response['intents'].map{ |i| Intent.new(i) }
|
29
|
-
@act = response['act']
|
30
|
-
@type = response['type']
|
31
|
-
@sentiment = response['sentiment']
|
32
|
-
@entities = response['entities'].flat_map{ |n, e| e.map{ |ee| Entity.new(n, ee) } }
|
33
|
-
@language = response['language']
|
34
|
-
@version = response['version']
|
35
|
-
@timestamp = response['timestamp']
|
36
|
-
@status = response['status']
|
37
|
-
end
|
38
|
-
|
39
|
-
##
|
40
|
-
# Returns the first intent provided there is one
|
41
|
-
#
|
42
|
-
# * *Args* :
|
43
|
-
# * *Returns* :
|
44
|
-
# - A String or nil
|
45
|
-
def intent
|
46
|
-
@intents.any? ? @intents.first : nil
|
47
|
-
end
|
48
|
-
|
49
|
-
##
|
50
|
-
# Returns the first entity whose name matches the parameter
|
51
|
-
#
|
52
|
-
# * *Args* :
|
53
|
-
# - +name+ - String, the entity's name
|
54
|
-
# * *Returns* :
|
55
|
-
# - An instance of Entity or nil
|
56
|
-
def get(name)
|
57
|
-
@entities.each do |entity|
|
58
|
-
return entity if entity.name.casecmp(name.to_s) == 0
|
59
|
-
end
|
60
|
-
|
61
|
-
nil
|
62
|
-
end
|
63
|
-
|
64
|
-
##
|
65
|
-
# Returns all entities whose names matches the parameter
|
66
|
-
#
|
67
|
-
# * *Args* :
|
68
|
-
# - +name+ - String, the entities' names
|
69
|
-
# * *Returns* :
|
70
|
-
# - An array of instances of Entity or an empty array
|
71
|
-
def all(name)
|
72
|
-
@entities.select do |entity|
|
73
|
-
entity.name.casecmp(name.to_s) == 0
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
##
|
78
|
-
# Return whether or not the act is an assertion
|
79
|
-
#
|
80
|
-
# + *Args* :
|
81
|
-
# + *Returns* :
|
82
|
-
# - True or False
|
83
|
-
def assert?
|
84
|
-
@act == Utils::ACT_ASSERT
|
85
|
-
end
|
86
|
-
|
87
|
-
##
|
88
|
-
# Return whether or not the act is a command
|
89
|
-
#
|
90
|
-
# + *Args* :
|
91
|
-
# + *Returns* :
|
92
|
-
# - True or False
|
93
|
-
def command?
|
94
|
-
@act == Utils::ACT_COMMAND
|
95
|
-
end
|
96
|
-
|
97
|
-
##
|
98
|
-
# Return whether or not the act is a wh-query
|
99
|
-
#
|
100
|
-
# + *Args* :
|
101
|
-
# + *Returns* :
|
102
|
-
# - True or False
|
103
|
-
def wh_query?
|
104
|
-
@act == Utils::ACT_WH_QUERY
|
105
|
-
end
|
106
|
-
|
107
|
-
##
|
108
|
-
# Return whether or not the act is a yn-query
|
109
|
-
#
|
110
|
-
# + *Args* :
|
111
|
-
# + *Returns* :
|
112
|
-
# - True or False
|
113
|
-
def yn_query?
|
114
|
-
@act == Utils::ACT_YN_QUERY
|
115
|
-
end
|
116
|
-
|
117
|
-
##
|
118
|
-
# Return whether or not the type is an abbreviation
|
119
|
-
#
|
120
|
-
# + *Args* :
|
121
|
-
# + *Returns* :
|
122
|
-
# - True or False
|
123
|
-
def abbreviation?
|
124
|
-
!@type.index(Utils::TYPE_ABBREVIATION).nil?
|
125
|
-
end
|
126
|
-
|
127
|
-
##
|
128
|
-
# Return whether or not the type is an entity
|
129
|
-
#
|
130
|
-
# + *Args* :
|
131
|
-
# + *Returns* :
|
132
|
-
# - True or False
|
133
|
-
def entity?
|
134
|
-
!@type.index(Utils::TYPE_ENTITY).nil?
|
135
|
-
end
|
136
|
-
|
137
|
-
##
|
138
|
-
# Return whether or not the type is a description
|
139
|
-
#
|
140
|
-
# + *Args* :
|
141
|
-
# + *Returns* :
|
142
|
-
# - True or False
|
143
|
-
def description?
|
144
|
-
!@type.index(Utils::TYPE_DESCRIPTION).nil?
|
145
|
-
end
|
146
|
-
|
147
|
-
##
|
148
|
-
# Return whether or not the type is a human
|
149
|
-
#
|
150
|
-
# + *Args* :
|
151
|
-
# + *Returns* :
|
152
|
-
# - True or False
|
153
|
-
def human?
|
154
|
-
!@type.index(Utils::TYPE_HUMAN).nil?
|
155
|
-
end
|
156
|
-
|
157
|
-
##
|
158
|
-
# Return whether or not the type is a location
|
159
|
-
#
|
160
|
-
# + *Args* :
|
161
|
-
# + *Returns* :
|
162
|
-
# - True or False
|
163
|
-
def location?
|
164
|
-
!@type.index(Utils::TYPE_LOCATION).nil?
|
165
|
-
end
|
166
|
-
|
167
|
-
##
|
168
|
-
# Return whether or not the type is a number
|
169
|
-
#
|
170
|
-
# + *Args* :
|
171
|
-
# + *Returns* :
|
172
|
-
# - True or False
|
173
|
-
def number?
|
174
|
-
!@type.index(Utils::TYPE_NUMBER).nil?
|
175
|
-
end
|
176
|
-
|
177
|
-
##
|
178
|
-
# Return whether or not the sentiment is very positive
|
179
|
-
#
|
180
|
-
# + *Args* :
|
181
|
-
# + *Returns* :
|
182
|
-
# - True or False
|
183
|
-
def vpositive?
|
184
|
-
@sentiment == Utils::SENTIMENT_VPOSITIVE
|
185
|
-
end
|
186
|
-
|
187
|
-
##
|
188
|
-
# Return whether or not the sentiment is positive
|
189
|
-
#
|
190
|
-
# + *Args* :
|
191
|
-
# + *Returns* :
|
192
|
-
# - True or False
|
193
|
-
def positive?
|
194
|
-
@sentiment == Utils::SENTIMENT_POSITIVE
|
195
|
-
end
|
196
|
-
|
197
|
-
##
|
198
|
-
# Return whether or not the sentiment is neutral
|
199
|
-
#
|
200
|
-
# + *Args* :
|
201
|
-
# + *Returns* :
|
202
|
-
# - True or False
|
203
|
-
def neutral?
|
204
|
-
@sentiment == Utils::SENTIMENT_NEUTRAL
|
205
|
-
end
|
206
|
-
|
207
|
-
##
|
208
|
-
# Return whether or not the sentiment is negative
|
209
|
-
#
|
210
|
-
# + *Args* :
|
211
|
-
# + *Returns* :
|
212
|
-
# - True or False
|
213
|
-
def negative?
|
214
|
-
@sentiment == Utils::SENTIMENT_NEGATIVE
|
215
|
-
end
|
216
|
-
|
217
|
-
##
|
218
|
-
# Return whether or not the sentiment is very negative
|
219
|
-
#
|
220
|
-
# + *Args* :
|
221
|
-
# + *Returns* :
|
222
|
-
# - True or False
|
223
|
-
def vnegative?
|
224
|
-
@sentiment == Utils::SENTIMENT_VNEGATIVE
|
225
|
-
end
|
226
|
-
end
|
227
|
-
end
|