wit_ruby 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +11 -0
- data/README.md +55 -3
- data/lib/wit_ruby/rest/client.rb +34 -13
- data/lib/wit_ruby/rest/entity.rb +36 -0
- data/lib/wit_ruby/rest/expression.rb +12 -0
- data/lib/wit_ruby/rest/intent.rb +93 -0
- data/lib/wit_ruby/rest/message.rb +54 -0
- data/lib/wit_ruby/rest/result.rb +100 -30
- data/lib/wit_ruby/rest/session.rb +50 -7
- data/lib/wit_ruby/version.rb +1 -1
- data/lib/wit_ruby.rb +4 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/wit_ruby/rest/entity_spec.rb +49 -0
- data/spec/wit_ruby/rest/expression_spec.rb +38 -0
- data/spec/wit_ruby/rest/intent_spec.rb +116 -0
- data/spec/wit_ruby/rest/message_spec.rb +63 -0
- data/spec/wit_ruby/rest/result_spec.rb +9 -4
- data/spec/wit_ruby/rest/session_spec.rb +73 -7
- data/wit_ruby.gemspec +4 -3
- metadata +29 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 971419a9504d3b3f6a033650f424daaba39f6a3b
|
4
|
+
data.tar.gz: f81c794354b97acf237ee363474b7dfb9513dff3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab3c0ab3b94f1c6b02d82ab2e4fe717d3a88641117fe4f2e1f45b21c7ef2e124995dcca013d3b38dee36176aae6051b38444aefa6ba957259ee5a9aa7d0b59ff
|
7
|
+
data.tar.gz: ec22891627f70d3d99e49abfe580c973819db15d8d6e2e052f42dc425a0fe8b9e31b13bf7b6cc05e55de23282e3a6e802030c5de20b03ae835ef4f1f5dc77ab2
|
data/CHANGELOG
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
== 0.0.2
|
2
|
+
* Implemented API call to get specific information from a sent message from it's given ID (GET).
|
3
|
+
* Intent specific API calls functional (GET).
|
4
|
+
* Changed description in gemspec.
|
5
|
+
* Change results to be returned as specific objects that inherit from the original class Result.
|
6
|
+
Message, Intent, Entity, Expression are the specific wrappers for results.
|
7
|
+
* Made error check so that only specific results can be refreshed. Refreshable objects are ones that
|
8
|
+
are directly returned from session calls.
|
9
|
+
|
10
|
+
== 0.0.1
|
11
|
+
* Implemented connection with wit.ai API and sending a text message (GET).
|
data/README.md
CHANGED
@@ -1,8 +1,12 @@
|
|
1
|
-
|
1
|
+
|
2
2
|
|
3
3
|
# WitRuby
|
4
4
|
|
5
|
-
Provides a Ruby
|
5
|
+
Provides a unofficial Ruby API Wrapper for the Wit.ai API. Still implementing most functionalities. Go over to https://rubygems.org/gems/wit_ruby for specific information and documentation.
|
6
|
+
|
7
|
+
[![Build Status](https://travis-ci.org/gching/wit_ruby.svg?branch=master)](https://travis-ci.org/gching/wit_ruby)
|
8
|
+
[![Gem Version](https://badge.fury.io/rb/wit_ruby.png)](http://badge.fury.io/rb/wit_ruby)
|
9
|
+
[![Coverage Status](https://coveralls.io/repos/gching/wit_ruby/badge.png?branch=master)](https://coveralls.io/r/gching/wit_ruby?branch=master)
|
6
10
|
|
7
11
|
## Installation
|
8
12
|
|
@@ -20,10 +24,58 @@ Or install it yourself as:
|
|
20
24
|
|
21
25
|
## Usage
|
22
26
|
|
23
|
-
|
27
|
+
Remember to put this up to access it!
|
28
|
+
|
29
|
+
$ require 'wit_ruby'
|
30
|
+
|
31
|
+
To start using the wrapper, create a client with an authorization token given from Wit.ai. Set this either in ENV["WIT_AI_TOKEN"] or pass it on it the parameters as a hash. Default settings can be overridden by this hash as well.
|
32
|
+
|
33
|
+
$ ## Default to ENV["WIT_AI_TOKEN"]
|
34
|
+
$ client = Wit::REST::Client.new()
|
35
|
+
$ ## Override token when created
|
36
|
+
$ client = Wit::REST::Client.new(token: "Insert Token Here")
|
37
|
+
|
38
|
+
The client provides also a session for you to mainly do API calls. I suggest you save the session somewhere for easy access.
|
39
|
+
|
40
|
+
$ session = client.session
|
41
|
+
|
42
|
+
As of 0.0.2, only sending a message, getting message information and intent specific calls are implemented.
|
43
|
+
|
44
|
+
## Message
|
45
|
+
|
46
|
+
To send a specific message, use the saved session to send a given string as a parameter.
|
47
|
+
|
48
|
+
$ results = session.send_message("Your Message")
|
49
|
+
|
50
|
+
To get a specific messages information from the wit.ai, pass in the message's ID and use the method below.
|
51
|
+
|
52
|
+
$ results = session.get_message("Message ID")
|
53
|
+
|
54
|
+
## Intent
|
55
|
+
|
56
|
+
To get a list of intents in the specific instance over at wit.ai.
|
57
|
+
|
58
|
+
$ ## Array of all intents used.
|
59
|
+
$ results = session.get_intents
|
60
|
+
|
61
|
+
To get a specific intent information, pass in it's ID or name.
|
62
|
+
|
63
|
+
$ ## Specific intent information.
|
64
|
+
$ results = session.get_intents("Intent ID or Name")
|
65
|
+
|
66
|
+
## Result
|
67
|
+
|
68
|
+
Every method returns a class wrapper corresponding specifically to that result. The superclass that is inherited (Wit::REST::Result) allows for you to easily access the results of the API call. The results is converted to a hash and is saved in this result class.
|
69
|
+
You can call methods on it and if it matches the result's hash, it will return it's value. For example,
|
70
|
+
|
71
|
+
$ ## results.hash = {"a" => "b"}
|
72
|
+
$ results.a
|
73
|
+
$ => "b"
|
24
74
|
|
25
75
|
## Contributing
|
26
76
|
|
77
|
+
I am a beginner developer so do contribute or help as much as possible! I definitely need to learn a lot :).
|
78
|
+
|
27
79
|
1. Fork it
|
28
80
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
29
81
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
data/lib/wit_ruby/rest/client.rb
CHANGED
@@ -8,7 +8,6 @@ module Wit
|
|
8
8
|
## Wit::Session::Client class holds the authentication parameters and
|
9
9
|
## handles making the HTTP requests to the Wit API. These methods should be
|
10
10
|
## internally called and never called directly from the user.
|
11
|
-
|
12
11
|
## An example call to instantiate client is done like this with defaults:
|
13
12
|
##
|
14
13
|
## => @client = Wit::Session:Client.new
|
@@ -31,14 +30,15 @@ module Wit
|
|
31
30
|
:retry_limit => 1,
|
32
31
|
}
|
33
32
|
|
34
|
-
|
35
|
-
|
33
|
+
# Allows for the reading of the last request, last response, and the
|
34
|
+
# current session.
|
36
35
|
attr_reader :last_req, :last_response, :session, :last_result
|
37
36
|
|
38
|
-
## Initialize the new instance with either the default parameters or
|
39
|
-
## given
|
40
|
-
##
|
41
|
-
## options.
|
37
|
+
## Initialize the new instance with either the default parameters or given parameters.
|
38
|
+
## Token can either be given in options or defaults to ENV["WIT_AI_TOKEN"]
|
39
|
+
##
|
40
|
+
## @param options [Hash] options to overide the defaults.
|
41
|
+
## @return [Wit::REST::Client] new client connection.
|
42
42
|
def initialize(options = {})
|
43
43
|
## Token is overidden if given in set params.
|
44
44
|
@params = DEFAULTS.merge options
|
@@ -49,11 +49,16 @@ module Wit
|
|
49
49
|
|
50
50
|
|
51
51
|
## Change the given auth token.
|
52
|
+
##
|
53
|
+
## @param new_auth [String] new authorization token for client.
|
52
54
|
def change_auth(new_auth)
|
53
55
|
@auth_token = new_auth.strip
|
54
56
|
end
|
55
57
|
|
56
58
|
## Defines each REST method for the given client. GET, PUT, POST and DELETE
|
59
|
+
##
|
60
|
+
## @param path [String] path for API call.
|
61
|
+
## @return [Wit::REST::Result] results from the call.
|
57
62
|
[:get, :put, :post, :delete].each do |rest_method|
|
58
63
|
## Get the given class for Net::HTTP depending on the current method.
|
59
64
|
method_rest_class = Net::HTTP.const_get rest_method.to_s.capitalize
|
@@ -66,7 +71,11 @@ module Wit
|
|
66
71
|
end
|
67
72
|
end
|
68
73
|
|
69
|
-
## Takes in a body and path and creates a net/http class and uses it to call a request to API
|
74
|
+
## Takes in a body and path and creates a net/http class and uses it to call a request to API.
|
75
|
+
##
|
76
|
+
## @param rest [String] rest code for the call.
|
77
|
+
## @param path [String] path for the call.
|
78
|
+
## @param body [Hash] body of the call.
|
70
79
|
def request_from_result(rest, path, body)
|
71
80
|
method_rest_class = Net::HTTP.const_get rest.capitalize
|
72
81
|
refresh_request = method_rest_class.new path, {"Authorization" => "Bearer #{@auth_token}"}
|
@@ -78,7 +87,7 @@ module Wit
|
|
78
87
|
#################################
|
79
88
|
private
|
80
89
|
|
81
|
-
## Setup the session that allows for calling of
|
90
|
+
## Setup the session that allows for calling of each method.
|
82
91
|
def setup_session
|
83
92
|
@session = Wit::REST::Session.new(self)
|
84
93
|
end
|
@@ -111,6 +120,9 @@ module Wit
|
|
111
120
|
end
|
112
121
|
|
113
122
|
## Connect and send the given request to Wit server.
|
123
|
+
##
|
124
|
+
## @param request [Net::HTTP] specific request class from Net::HTTP library.
|
125
|
+
## @return [Wit::REST::Result] result from request.
|
114
126
|
def connect_send(request)
|
115
127
|
## Set the last request parameter
|
116
128
|
@last_req = request
|
@@ -125,19 +137,28 @@ module Wit
|
|
125
137
|
case response.code
|
126
138
|
when "200" then save_result_and_return(request, response)
|
127
139
|
when "401" then raise Unauthorized, "Incorrect token or not set. Set ENV[\"WIT_AI_TOKEN\"] or pass into the options parameter as :token"
|
128
|
-
|
140
|
+
else raise BadResponse, "response code: #{response.code}"
|
129
141
|
end
|
130
142
|
|
131
143
|
end
|
132
144
|
end
|
133
|
-
|
145
|
+
|
134
146
|
## Save it into the instance last_result and return it.
|
147
|
+
##
|
148
|
+
## @param request [Net::HTTP] specific request class from Net::HTTP library.
|
149
|
+
## @param response [Net::HTTP] response from call to API.
|
135
150
|
def save_result_and_return(request, response)
|
136
|
-
|
137
|
-
|
151
|
+
## Parse the data
|
152
|
+
parsed_data = MultiJson.load(response.body)
|
153
|
+
## Save the last result as the super class Result
|
154
|
+
@last_result = Wit::REST::Result.new(parsed_data, request.method, request.path, request.body)
|
155
|
+
## Return it
|
156
|
+
return @last_result
|
138
157
|
end
|
139
158
|
|
140
159
|
|
141
160
|
end
|
161
|
+
|
162
|
+
class BadResponse < Exception; end
|
142
163
|
end
|
143
164
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
## entity.rb
|
2
|
+
## Wrapper for entity results.
|
3
|
+
|
4
|
+
module Wit
|
5
|
+
module REST
|
6
|
+
|
7
|
+
## Encompasses entity results.
|
8
|
+
class Entity < Result
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
## Internal wrapper for multiple entities for a given result.
|
13
|
+
class MultiEntity
|
14
|
+
## Creates an instance that holds array of intents.
|
15
|
+
##
|
16
|
+
## @param resultData [Array] array of hashes of intents.
|
17
|
+
## @return [Wit::REST::MultiEntity] with instance variable of Array of intents.
|
18
|
+
def initialize(resultData)
|
19
|
+
|
20
|
+
entity_arr = Array.new
|
21
|
+
resultData.each do |entity|
|
22
|
+
entity_arr << Entity.new(entity)
|
23
|
+
end
|
24
|
+
@entities = entity_arr
|
25
|
+
end
|
26
|
+
|
27
|
+
## Allow for index calls to the specific intents in the instance.
|
28
|
+
##
|
29
|
+
## @param num [Integer] index of the specific intent.
|
30
|
+
def [](num)
|
31
|
+
@entities[num]
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
## intent.rb
|
2
|
+
## Wrapper for the superclass Result for intent specific results
|
3
|
+
|
4
|
+
module Wit
|
5
|
+
module REST
|
6
|
+
|
7
|
+
## Intent wrapper for intent specific results
|
8
|
+
class Intent < Result
|
9
|
+
|
10
|
+
## Performs additional instance variable generation for expressions.
|
11
|
+
##
|
12
|
+
## @param resultData [Hash] data from the call.
|
13
|
+
## @param requestRest [String] rest code for the call.
|
14
|
+
## @param requestPath [String] request path for the call.
|
15
|
+
## @param requestBody [Hash] body of the call.
|
16
|
+
## @return [Wit::REST::Expression] object that holds the intent result.
|
17
|
+
def initialize(resultData, requestRest=nil, requestPath=nil, requestBody=nil)
|
18
|
+
super
|
19
|
+
@expressions = @rawdata["expressions"].map do |expression_hash|
|
20
|
+
Expression.new(expression_hash)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
## Return the list of expressions as array of expression objects
|
25
|
+
##
|
26
|
+
## @return [Array] expressions in this intent.
|
27
|
+
def expressions
|
28
|
+
return @expressions
|
29
|
+
end
|
30
|
+
|
31
|
+
## Return the expression bodies as an array of strings.
|
32
|
+
##
|
33
|
+
## @return [Array] body of each expression.
|
34
|
+
def expression_bodies
|
35
|
+
expression_bodies_arr = Array.new
|
36
|
+
@expressions.each do |expression|
|
37
|
+
expression_bodies_arr << expression.body
|
38
|
+
end
|
39
|
+
return expression_bodies_arr
|
40
|
+
end
|
41
|
+
|
42
|
+
## Return entities used with there id as an array of strings.
|
43
|
+
##
|
44
|
+
## @return [Array] entity names that are used in this intent.
|
45
|
+
def entities_used
|
46
|
+
entities_arr = Array.new
|
47
|
+
@entities.each do |entity|
|
48
|
+
entities_arr << entity.id unless entities_arr.include?(entity.id)
|
49
|
+
end
|
50
|
+
return entities_arr
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
## MultiIntent wraps around results that are an array with intents.
|
57
|
+
class MultiIntent < Result
|
58
|
+
|
59
|
+
## Generates instance variable that holds intents as Wit::REST::Result.
|
60
|
+
##
|
61
|
+
## @param resultData [Hash] data from the call.
|
62
|
+
## @param requestRest [String] rest code for the call.
|
63
|
+
## @param requestPath [String] request path for the call.
|
64
|
+
## @param requestBody [Hash] body of the call.
|
65
|
+
## @return [Wit::REST::MultiIntent] object that holds the array of intents as result objects.
|
66
|
+
def initialize(resultData, requestRest=nil, requestPath=nil, requestBody=nil)
|
67
|
+
## Pass in empty hash to default to method missing for everything not defined here.
|
68
|
+
super({}, requestRest, requestPath, requestBody)
|
69
|
+
@intents = resultData.map do |intent|
|
70
|
+
Result.new(intent)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
## Overide that assists in calling the proper index in the array of intent results.
|
75
|
+
##
|
76
|
+
## @param num [Integer] index of the array of Wit::REST::Result.
|
77
|
+
## @return [Wit::REST::Result] specific intent at the index given.
|
78
|
+
def [](num)
|
79
|
+
@intents[num]
|
80
|
+
end
|
81
|
+
|
82
|
+
## Assists in going through each intent in the instance variable.
|
83
|
+
##
|
84
|
+
## @return [Wit::REST::Result] lambda that provides each specific intent.
|
85
|
+
def each
|
86
|
+
@intents.each do |intent|
|
87
|
+
lambda{intent}
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
## message.rb
|
2
|
+
## Wraps around results, specifically messages.
|
3
|
+
module Wit
|
4
|
+
module REST
|
5
|
+
|
6
|
+
|
7
|
+
## Message wrapper for message specific results.
|
8
|
+
class Message < Result
|
9
|
+
|
10
|
+
## Returns the confidence of the message results.
|
11
|
+
##
|
12
|
+
## @return [Float] confidence in the message for the intent.
|
13
|
+
def confidence
|
14
|
+
outcome["confidence"]
|
15
|
+
end
|
16
|
+
|
17
|
+
## Returns the intent that this message corresponded to.
|
18
|
+
##
|
19
|
+
## @return [String] intent name that this message corrsponded to.
|
20
|
+
def intent
|
21
|
+
outcome["intent"]
|
22
|
+
end
|
23
|
+
|
24
|
+
## Generates Array of the names of each entity in this message.
|
25
|
+
##
|
26
|
+
## @return [Array] names of each entity
|
27
|
+
def entity_names
|
28
|
+
entity_arr = Array.new
|
29
|
+
outcome["entities"].each_key do |key|
|
30
|
+
entity_arr << key
|
31
|
+
end
|
32
|
+
return entity_arr
|
33
|
+
end
|
34
|
+
|
35
|
+
## Checks if the method is one of the keys in the hash. Overides the one
|
36
|
+
## in Wit::REST::Result as it might correspond to a given entity.
|
37
|
+
## If it is then we can return the given value.
|
38
|
+
## If not, then go to method_missing in Wit::REST::Result.
|
39
|
+
##
|
40
|
+
## @params [Symbol] possible method or key in the hash or entity.
|
41
|
+
## @return [String] [Integer] [Hash] depending on the given results in the data.
|
42
|
+
def method_missing(possible_key, *args, &block)
|
43
|
+
if @rawdata["outcome"]["entities"].has_key?(possible_key.to_s)
|
44
|
+
entity_value = @rawdata["outcome"]["entities"][possible_key.to_s]
|
45
|
+
entity_value.class == Hash ? Entity.new(entity_value) : MultiEntity.new(entity_value)
|
46
|
+
else
|
47
|
+
super
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/wit_ruby/rest/result.rb
CHANGED
@@ -1,49 +1,119 @@
|
|
1
1
|
## result.rb
|
2
|
-
## Specifies
|
2
|
+
## Specifies superclass that handles the results given from each RESTful API call.
|
3
3
|
|
4
4
|
|
5
5
|
module Wit
|
6
6
|
module REST
|
7
|
+
|
8
|
+
## Wrapper for all results that is returned by the session and API calls.
|
7
9
|
class Result
|
8
10
|
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
@
|
13
|
-
@requestRest
|
14
|
-
@requestPath
|
15
|
-
@requestBody
|
16
|
-
|
12
|
+
## Instantiates with a given hash and its REST parameters.
|
13
|
+
##
|
14
|
+
## @param resultData [Hash] data from the call.
|
15
|
+
## @param requestRest [String] rest code for the call.
|
16
|
+
## @param requestPath [String] request path for the call.
|
17
|
+
## @param requestBody [Hash] body of the call.
|
18
|
+
## @return [Wit::REST::Result] object that holds result information.
|
19
|
+
def initialize(resultData, requestRest=nil, requestPath=nil, requestBody=nil)
|
20
|
+
@rawdata = resultData
|
21
|
+
@requestRest = requestRest
|
22
|
+
@requestPath = requestPath
|
23
|
+
@requestBody = requestBody
|
24
|
+
## Sets self class to be the last index of the split class name.
|
25
|
+
@selfClass = self.class.name.split("::")[-1]
|
26
|
+
## Setup lists / instance variables given the current class that is inheriting
|
27
|
+
setup_entities if ["Intent", "Expression"].include?(@selfClass)
|
28
|
+
end
|
17
29
|
|
18
|
-
|
19
|
-
|
20
|
-
return
|
21
|
-
|
30
|
+
## Returns the orginalHash instance variable.
|
31
|
+
##
|
32
|
+
## @return [Hash] the raw data from the call.
|
33
|
+
def raw_data
|
34
|
+
return @rawdata
|
35
|
+
end
|
22
36
|
|
23
|
-
|
24
|
-
|
25
|
-
return
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
return @requestBody
|
30
|
-
end
|
37
|
+
## Returns the REST code from the given request.
|
38
|
+
##
|
39
|
+
## @return [String] request code from the call.
|
40
|
+
def restCode
|
41
|
+
return @requestRest
|
42
|
+
end
|
31
43
|
|
32
|
-
|
33
|
-
|
34
|
-
return
|
35
|
-
|
44
|
+
## Returns the request's body.
|
45
|
+
##
|
46
|
+
## @return [String] request body from the call.
|
47
|
+
def restBody
|
48
|
+
return @requestBody
|
49
|
+
end
|
36
50
|
|
51
|
+
## Returns the request's path.
|
52
|
+
##
|
53
|
+
## @return [String] request path from the call.
|
54
|
+
def restPath
|
55
|
+
return @requestPath
|
56
|
+
end
|
37
57
|
|
38
|
-
## Checks if the method is one of the keys in the hash.
|
39
|
-
## If it is then we can return the given value.
|
40
|
-
## If not, then raise a NoMethodError.
|
41
|
-
def method_missing(possible_key, *args, &block)
|
42
|
-
@originalHash.has_key?(possible_key.to_s) ? @originalHash[possible_key.to_s] : super
|
43
|
-
end
|
44
58
|
|
59
|
+
## Returns the list of entities from the given results. Only applicable
|
60
|
+
## to a few objects. If the current class is not applicable, then raise an
|
61
|
+
## error.
|
62
|
+
##
|
63
|
+
## @return [Array] array of entities.
|
64
|
+
def entities
|
65
|
+
unless ["Intent", "Expression"].include?(@selfClass)
|
66
|
+
raise NoMethodError.new(%(The current class "#{@selfClass}' does not incorporate the '#{__method__}' method.))
|
67
|
+
end
|
68
|
+
|
69
|
+
## Included so return it.
|
70
|
+
return @entities
|
71
|
+
end
|
45
72
|
|
73
|
+
## Checks if the method is one of the keys in the hash.
|
74
|
+
## If it is then we can return the given value.
|
75
|
+
## If not, then raise a NoMethodError.
|
76
|
+
##
|
77
|
+
## @params [Symbol] possible method or key in the hash
|
78
|
+
## @return [String] [Integer] [Hash] depending on the given results in the data.
|
79
|
+
def method_missing(possible_key, *args, &block)
|
80
|
+
@rawdata.has_key?(possible_key.to_s) ? @rawdata[possible_key.to_s] : super
|
81
|
+
end
|
82
|
+
|
83
|
+
## Method to check if this current object is refreshable.
|
84
|
+
## It is refresahble if the request parameters for checking is not nil;
|
85
|
+
##
|
86
|
+
## @return [Boolean] indicating if the current object is refreshable.
|
87
|
+
def refreshable?
|
88
|
+
!@requestRest.nil?
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
## Setups entities list if the current class demands it.
|
96
|
+
##
|
97
|
+
## @return [Array] entities in this current result object.
|
98
|
+
def setup_entities
|
99
|
+
## Get the current entities hash
|
100
|
+
entities_raw = @rawdata["entities"] || @rawdata["outcome"]["entities"]
|
101
|
+
## Set the intance variable to be an array containing these entities.
|
102
|
+
## If its empty, then set the instance variable to nil
|
103
|
+
unless entities_raw.empty?
|
104
|
+
entities_arr = Array.new
|
105
|
+
entities_raw.each do |entity_value|
|
106
|
+
entities_arr << Entity.new(entity_value)
|
107
|
+
end
|
108
|
+
@entities = entities_arr
|
109
|
+
else
|
110
|
+
@entities = nil
|
111
|
+
end
|
112
|
+
return @entities
|
113
|
+
|
114
|
+
end
|
46
115
|
|
47
116
|
end
|
117
|
+
|
48
118
|
end
|
49
119
|
end
|
@@ -6,29 +6,56 @@ module Wit
|
|
6
6
|
module REST
|
7
7
|
class Session
|
8
8
|
## Initialize with the given client.
|
9
|
+
##
|
10
|
+
## @param client [Wit::REST::Client] client of the connection
|
9
11
|
def initialize(client)
|
10
12
|
@client = client
|
11
13
|
end
|
12
|
-
## GET - extracted meaning
|
14
|
+
## GET - extracted meaning from a sentence.
|
15
|
+
##
|
16
|
+
## @param message [String] sentence being examined from API.
|
17
|
+
## @return [Wit::REST::Message] message results from API.
|
13
18
|
def send_message(message)
|
14
|
-
|
19
|
+
## Recieve unwrapped results
|
20
|
+
results = @client.get("/message?q=#{message}")
|
21
|
+
return Message.new(results.raw_data, results.restCode, results.restPath, results.restBody)
|
15
22
|
end
|
16
23
|
|
17
24
|
## POST - extract meaning from a audio file
|
18
25
|
## Do check the certain documentation of what the specific audio file
|
19
26
|
## should be.
|
27
|
+
##
|
28
|
+
## @param sound [String] path to sound file.
|
20
29
|
def send_sound_message(sound)
|
21
30
|
end
|
22
31
|
|
23
32
|
## GET - returns stored message for specific id.
|
24
33
|
## TODO - possibly renaming as it is ambigious compared to send_message.
|
34
|
+
## TODO - Notify Wit.ai as there documentation does not include the stats parameter
|
35
|
+
##
|
36
|
+
## @param message_id [String] message id of message in API servers.
|
37
|
+
## @return [Wit::REST::Message] message results from the given id.
|
25
38
|
def get_message(message_id)
|
39
|
+
results = @client.get("/messages/#{message_id}")
|
26
40
|
|
41
|
+
return Message.new(results.raw_data, results.restCode, results.restPath, results.restBody)
|
27
42
|
end
|
28
43
|
|
29
44
|
## GET - returns either a list of intents if no id is given.
|
30
45
|
## - returns the specific intent of the id given.
|
31
|
-
|
46
|
+
##
|
47
|
+
## @param intent_indicator [String] the id or name of the intent
|
48
|
+
## @return [Wit:REST::Intent] [Wit::REST::MultiIntent] results of intent call to API.
|
49
|
+
def get_intents(intent_indicator = nil)
|
50
|
+
## TODO - Raise error if no intents
|
51
|
+
|
52
|
+
## No spefic id, so get list of intents or specific id, return it as Intent object
|
53
|
+
results = intent_indicator.nil? ? @client.get("/intents") : @client.get("/intents/#{intent_indicator}")
|
54
|
+
|
55
|
+
## Same concept but wrap it around proper object
|
56
|
+
returnObject = intent_indicator.nil? ? MultiIntent : Intent
|
57
|
+
return returnObject.new(results.raw_data, results.restCode, results.restPath, results.restBody)
|
58
|
+
|
32
59
|
end
|
33
60
|
|
34
61
|
## TODO - look into corpus
|
@@ -76,19 +103,35 @@ module Wit
|
|
76
103
|
|
77
104
|
end
|
78
105
|
|
79
|
-
## Used to refresh the results from the given results.
|
106
|
+
## Used to refresh the results from the given results. Only applicable to result objects that directly
|
107
|
+
## came from the session.
|
108
|
+
##
|
109
|
+
## @param result [Wit::REST::Result] result from a call that is going to be refreshed.
|
110
|
+
## @return [Wit::REST::Result] result back that will be wrapped around it's specific wrapper object
|
80
111
|
def refresh_results(result)
|
81
112
|
## Call client with refresh results method
|
82
|
-
|
113
|
+
## Checks to see if its part of the specified objects in the Wit module
|
114
|
+
## Checks to see if the object is refreshable
|
115
|
+
## If it isn't part of one of these two, then raise error for not being refreshable.
|
116
|
+
result_class = result.class
|
117
|
+
unless result_class.name.split("::")[0] == "Wit" && result.refreshable?
|
118
|
+
raise NotRefreshable.new(%(The inputted object with class "#{result.class}" is not refreshable.))
|
119
|
+
end
|
120
|
+
refreshed_result = @client.request_from_result(result.restCode, result.restPath, result.restBody)
|
121
|
+
return result_class.new(refreshed_result.raw_data, refreshed_result.restCode, refreshed_result.restPath, refreshed_result.restBody)
|
83
122
|
end
|
84
123
|
|
85
124
|
## Used to refresh the last response given from the last request.
|
125
|
+
## TODO - fix wrapper
|
126
|
+
##
|
127
|
+
## @return [Wit::REST::Result] refreshed result from last result
|
86
128
|
def refresh_last
|
87
129
|
last_result = @client.last_result
|
88
|
-
return @client.request_from_result(last_result.restCode, last_result.
|
130
|
+
return @client.request_from_result(last_result.restCode, last_result.restPath, last_result.restBody)
|
89
131
|
end
|
90
132
|
|
91
|
-
|
92
133
|
end
|
134
|
+
|
135
|
+
class NotRefreshable < Exception; end
|
93
136
|
end
|
94
137
|
end
|
data/lib/wit_ruby/version.rb
CHANGED
data/lib/wit_ruby.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -7,9 +7,23 @@ require 'pry'
|
|
7
7
|
|
8
8
|
require 'webmock/rspec'
|
9
9
|
require 'vcr'
|
10
|
+
require 'timeout'
|
10
11
|
|
11
12
|
#VCR config
|
12
13
|
VCR.configure do |c|
|
13
14
|
c.cassette_library_dir = 'spec/fixtures/wit_cassettes'
|
14
15
|
c.hook_into :webmock
|
16
|
+
allow_next_request_at = nil
|
17
|
+
filters = [:real?, lambda { |r| URI(r.uri).host == 'api.wit.ai' }]
|
18
|
+
|
19
|
+
c.after_http_request(*filters) do |request, response|
|
20
|
+
allow_next_request_at = Time.now + 1
|
21
|
+
end
|
22
|
+
|
23
|
+
c.before_http_request(*filters) do |request|
|
24
|
+
if allow_next_request_at && Time.now < allow_next_request_at
|
25
|
+
sleep(allow_next_request_at - Time.now)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
15
29
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
## entity_spec.rb
|
2
|
+
## Used to test functionalities of the entity wrapper for results.
|
3
|
+
|
4
|
+
require 'spec_helper'
|
5
|
+
|
6
|
+
describe Wit::REST::Entity do
|
7
|
+
let(:json) {%({
|
8
|
+
"builtin": true,
|
9
|
+
"doc": "Temperature in degrees Celcius or Fahrenheit",
|
10
|
+
"id": "temperature",
|
11
|
+
"name": "535856ea-db8b-492b-a159-fc78cd016a4b"
|
12
|
+
})}
|
13
|
+
let(:rand_path) {"rand_path"}
|
14
|
+
let(:rand_body) {"rand_body"}
|
15
|
+
let(:rest_code) {"get"}
|
16
|
+
let(:entity_results) {Wit::REST::Entity.new(MultiJson.load(json), rand_path, rand_body, rest_code)}
|
17
|
+
|
18
|
+
it "should have builtin as true" do
|
19
|
+
expect(entity_results.builtin).to eql(true)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
describe Wit::REST::MultiEntity do
|
25
|
+
let(:json_two) {%([
|
26
|
+
{
|
27
|
+
"value": {
|
28
|
+
"from": "2013-10-21T00:00:00.000Z",
|
29
|
+
"to": "2013-10-22T00:00:00.000Z"
|
30
|
+
},
|
31
|
+
"body": "Tuesday"
|
32
|
+
},
|
33
|
+
{
|
34
|
+
"value": {
|
35
|
+
"from": "2013-10-24T00:00:00.000Z",
|
36
|
+
"to": "2013-10-25T00:00:00.000Z"
|
37
|
+
},
|
38
|
+
"body": "Friday"
|
39
|
+
}
|
40
|
+
])}
|
41
|
+
let(:entity_coll) {Wit::REST::MultiEntity.new(MultiJson.load(json_two))}
|
42
|
+
|
43
|
+
|
44
|
+
it "should be an array with entities" do
|
45
|
+
expect(entity_coll[0].class).to eql(Wit::REST::Entity)
|
46
|
+
expect(entity_coll[0].body).to eql("Tuesday")
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
## expression_spec.rb
|
2
|
+
## Used to test functionalities of internal result wrappers for expressions.
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Wit::REST::Expression do
|
6
|
+
let(:json) {%(
|
7
|
+
{
|
8
|
+
"id" : "-2385b07a3900bd-8393b722-6d4e-4185-bb18-410136cdb794",
|
9
|
+
"body" : "fly from incheon to sfo",
|
10
|
+
"entities" : [ {
|
11
|
+
"wisp" : "wit$location",
|
12
|
+
"start" : 20,
|
13
|
+
"end" : 23,
|
14
|
+
"role" : "dest",
|
15
|
+
"body" : "sfo",
|
16
|
+
"value" : "sfo"
|
17
|
+
}, {
|
18
|
+
"wisp" : "wit$location",
|
19
|
+
"start" : 9,
|
20
|
+
"end" : 16,
|
21
|
+
"role" : "orig",
|
22
|
+
"body" : "incheon ",
|
23
|
+
"value" : "incheon"
|
24
|
+
} ]
|
25
|
+
})}
|
26
|
+
let(:express_results) {Wit::REST::Expression.new(MultiJson.load(json))}
|
27
|
+
|
28
|
+
it "should have a list of entities" do
|
29
|
+
expect(express_results.entities.class).to eql(Array)
|
30
|
+
expect(express_results.entities[0].class).to eql(Wit::REST::Entity)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should have the correct indexes and values" do
|
34
|
+
expect(express_results.entities[0].start).to eql(20)
|
35
|
+
expect(express_results.entities[1].start).to eql(9)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
## intent_spec.rb
|
2
|
+
## Used to test functionalities of intent wrapper in wit_ruby/rest/intent.rb
|
3
|
+
|
4
|
+
require 'spec_helper'
|
5
|
+
|
6
|
+
describe Wit::REST::Intent do
|
7
|
+
let(:json) {%({
|
8
|
+
"expressions" : [ {
|
9
|
+
"id" : "-2385b07a3900bd-8393b722-6d4e-4185-bb18-410136cdb794",
|
10
|
+
"body" : "fly from incheon to sfo",
|
11
|
+
"entities" : [ {
|
12
|
+
"wisp" : "wit$location",
|
13
|
+
"start" : 20,
|
14
|
+
"end" : 23,
|
15
|
+
"role" : "dest",
|
16
|
+
"body" : "sfo",
|
17
|
+
"value" : "sfo"
|
18
|
+
}, {
|
19
|
+
"wisp" : "wit$location",
|
20
|
+
"start" : 9,
|
21
|
+
"end" : 16,
|
22
|
+
"role" : "orig",
|
23
|
+
"body" : "incheon ",
|
24
|
+
"value" : "incheon"
|
25
|
+
} ]
|
26
|
+
}, {
|
27
|
+
"id" : "-2385b07e09b74a-d95db384-fac2-4e41-85ca-3072778aa99c",
|
28
|
+
"body" : "i wanna fly from JFK to SFO",
|
29
|
+
"entities" : [ {
|
30
|
+
"wisp" : "wit$location",
|
31
|
+
"start" : 24,
|
32
|
+
"end" : 27,
|
33
|
+
"role" : "dest",
|
34
|
+
"body" : "SFO",
|
35
|
+
"value" : "SFO"
|
36
|
+
}, {
|
37
|
+
"wisp" : "wit$location",
|
38
|
+
"start" : 17,
|
39
|
+
"end" : 20,
|
40
|
+
"role" : "orig",
|
41
|
+
"body" : "JFK ",
|
42
|
+
"value" : "JFK"
|
43
|
+
} ]
|
44
|
+
} ],
|
45
|
+
"entities" : [ {
|
46
|
+
"role" : "dest",
|
47
|
+
"id" : "wit$location"
|
48
|
+
}, {
|
49
|
+
"role" : "orig",
|
50
|
+
"id" : "wit$location"
|
51
|
+
} ],
|
52
|
+
"id" : "52bab83b-fbef-40db-b19d-a0dccd38cfdc",
|
53
|
+
"name" : "book_flight",
|
54
|
+
"doc" : "book flight"
|
55
|
+
})}
|
56
|
+
let(:rand_path) {"rand_path"}
|
57
|
+
let(:rand_body) {"rand_body"}
|
58
|
+
let(:rest_code) {"get"}
|
59
|
+
let(:intent_results) {Wit::REST::Intent.new(MultiJson.load(json), rand_path, rand_body, rest_code)}
|
60
|
+
|
61
|
+
|
62
|
+
it "should have a list of entities" do
|
63
|
+
expect(intent_results.entities.class).to eql(Array)
|
64
|
+
expect(intent_results.entities[0].class).to eql(Wit::REST::Entity)
|
65
|
+
end
|
66
|
+
it "should have a list of expressions" do
|
67
|
+
expect(intent_results.expressions.class).to eql(Array)
|
68
|
+
expect(intent_results.expressions[0].class).to eql(Wit::REST::Expression)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should have the right values in the entities" do
|
72
|
+
expect(intent_results.entities[0].role).to eql("dest")
|
73
|
+
expect(intent_results.entities[1].role).to eql("orig")
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should have the right values for expressions" do
|
77
|
+
expect(intent_results.expressions[0].body).to eql("fly from incheon to sfo")
|
78
|
+
expect(intent_results.expressions[1].body).to eql("i wanna fly from JFK to SFO")
|
79
|
+
end
|
80
|
+
it "should return the body names for each expressions as an array of strings" do
|
81
|
+
expect(intent_results.expression_bodies).to eql(["fly from incheon to sfo", "i wanna fly from JFK to SFO"])
|
82
|
+
end
|
83
|
+
it "should return used entities as an array of strings" do
|
84
|
+
expect(intent_results.entities_used).to eql(["wit$location"])
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
describe Wit::REST::MultiIntent do
|
91
|
+
let(:json_two) {%([ {
|
92
|
+
"id" : "52bab833-e024-4f15-b927-8e0772d1540c",
|
93
|
+
"name" : "recover_password",
|
94
|
+
"doc" : "Recover password (which is different from Reset password).",
|
95
|
+
"metadata" : "password_23433253254"
|
96
|
+
}, {
|
97
|
+
"id" : "52bab833-9a1e-4bff-b659-99ee95e6c1f9",
|
98
|
+
"name" : "transfer",
|
99
|
+
"doc" : "Transfer some amount of money between two accounts."
|
100
|
+
}, {
|
101
|
+
"id" : "52bab833-3e23-4c67-9cfc-a0fed605bd77",
|
102
|
+
"name" : "show_movie",
|
103
|
+
"doc" : "Show a given movie."
|
104
|
+
} ])}
|
105
|
+
let(:rand_path) {"rand_path"}
|
106
|
+
let(:rand_body) {"rand_body"}
|
107
|
+
let(:rest_code) {"get"}
|
108
|
+
let(:multi_intent_results) {Wit::REST::MultiIntent.new(MultiJson.load(json_two), rand_path, rand_body, rest_code)}
|
109
|
+
|
110
|
+
it "should each be saved as a result object" do
|
111
|
+
multi_intent_results.each do |intent|
|
112
|
+
expect(intent.class).to eql Result
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
## message_spec.rb
|
2
|
+
## Used to test wrapper for message results
|
3
|
+
|
4
|
+
|
5
|
+
require 'spec_helper'
|
6
|
+
|
7
|
+
describe Wit::REST::Message do
|
8
|
+
let(:json) {%({
|
9
|
+
"msg_id": "ba0fcf60-44d3-4499-877e-c8d65c239730",
|
10
|
+
"msg_body": "how many people between Tuesday and Friday",
|
11
|
+
"outcome": {
|
12
|
+
"intent": "query_metrics",
|
13
|
+
"entities": {
|
14
|
+
"metric": {
|
15
|
+
"value": "metric_visitors",
|
16
|
+
"body": "people",
|
17
|
+
"metadata": "{'code' : 324}"
|
18
|
+
},
|
19
|
+
"datetime": [
|
20
|
+
{
|
21
|
+
"value": {
|
22
|
+
"from": "2013-10-21T00:00:00.000Z",
|
23
|
+
"to": "2013-10-22T00:00:00.000Z"
|
24
|
+
},
|
25
|
+
"body": "Tuesday"
|
26
|
+
},
|
27
|
+
{
|
28
|
+
"value": {
|
29
|
+
"from": "2013-10-24T00:00:00.000Z",
|
30
|
+
"to": "2013-10-25T00:00:00.000Z"
|
31
|
+
},
|
32
|
+
"body": "Friday"
|
33
|
+
}
|
34
|
+
]
|
35
|
+
},
|
36
|
+
"confidence": 0.979
|
37
|
+
}
|
38
|
+
})}
|
39
|
+
let(:rand_path) {"rand_path"}
|
40
|
+
let(:rand_body) {"rand_body"}
|
41
|
+
let(:rest_code) {"get"}
|
42
|
+
let(:message_results) {Wit::REST::Message.new(MultiJson.load(json), rand_path, rand_body, rest_code)}
|
43
|
+
|
44
|
+
|
45
|
+
it "should have the following parameters, confidence and intent and entities" do
|
46
|
+
expect(message_results.confidence).to eql(0.979)
|
47
|
+
expect(message_results.intent).to eql("query_metrics")
|
48
|
+
expect(message_results.metric.class).to eql(Wit::REST::Entity)
|
49
|
+
expect(message_results.datetime.class).to eql(Wit::REST::MultiEntity)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should have the right values in the entities" do
|
53
|
+
expect(message_results.metric.value).to eql("metric_visitors")
|
54
|
+
expect(message_results.datetime[0].body).to eql("Tuesday")
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should be able to return back an array of strings of the names of each entity" do
|
58
|
+
expect(message_results.entity_names).to eql(["metric", "datetime"])
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
end
|
@@ -8,10 +8,10 @@ describe Wit::REST::Result do
|
|
8
8
|
let(:rand_body) {"rand_body"}
|
9
9
|
let(:rest_code) {"post"}
|
10
10
|
let(:result) {Wit::REST::Result.new(randHash, rest_code, rand_path, rand_body)}
|
11
|
-
|
11
|
+
let(:not_refresh_result) {Wit::REST::Result.new(randHash)}
|
12
12
|
|
13
13
|
it "should have an instance of the original hash" do
|
14
|
-
expect(result.
|
14
|
+
expect(result.raw_data).to eql(randHash)
|
15
15
|
end
|
16
16
|
|
17
17
|
it "should raise an error for a method that is not in the attributes of the hash" do
|
@@ -31,8 +31,13 @@ describe Wit::REST::Result do
|
|
31
31
|
|
32
32
|
it "should have an optional parameters to store the original request's body and pth" do
|
33
33
|
expect(result.restCode).to eql(rest_code)
|
34
|
-
expect(result.
|
35
|
-
expect(result.
|
34
|
+
expect(result.restPath).to eql(rand_path)
|
35
|
+
expect(result.restBody).to eql(rand_body)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should be refereshable if rest parameters and path/body are given and not if it isn't given" do
|
39
|
+
expect(result.refreshable?).to be_true
|
40
|
+
expect(not_refresh_result.refreshable?).to be_false
|
36
41
|
end
|
37
42
|
|
38
43
|
end
|
@@ -7,6 +7,7 @@ describe Wit::REST::Session do
|
|
7
7
|
let(:auth) {"randomAuth"}
|
8
8
|
let(:randClient) {"randomClient"}
|
9
9
|
let(:message) {"Hi"}
|
10
|
+
let(:rand_hash) {{"a" => "a", "b" => "b"}}
|
10
11
|
let(:randSession) {Wit::REST::Session.new(randClient)}
|
11
12
|
let(:session) {Wit::REST::Client.new.session}
|
12
13
|
|
@@ -29,8 +30,8 @@ describe Wit::REST::Session do
|
|
29
30
|
randSession.should respond_to(:get_message)
|
30
31
|
end
|
31
32
|
|
32
|
-
it "
|
33
|
-
randSession.should respond_to(:
|
33
|
+
it "get_intents(intent_id = nil)" do
|
34
|
+
randSession.should respond_to(:get_intents)
|
34
35
|
end
|
35
36
|
|
36
37
|
it ".entities(entity_id = nil)" do
|
@@ -72,7 +73,7 @@ describe Wit::REST::Session do
|
|
72
73
|
|
73
74
|
describe "Sending message" do
|
74
75
|
let(:result) {session.send_message(message)}
|
75
|
-
let(:
|
76
|
+
let(:result_data){result.raw_data}
|
76
77
|
|
77
78
|
before do
|
78
79
|
VCR.insert_cassette 'message', record: :new_episodes
|
@@ -81,12 +82,12 @@ describe Wit::REST::Session do
|
|
81
82
|
VCR.eject_cassette
|
82
83
|
end
|
83
84
|
|
84
|
-
it "should return an object of class
|
85
|
-
expect(result.class).to eql(Wit::REST::
|
85
|
+
it "should return an object of class Message" do
|
86
|
+
expect(result.class).to eql(Wit::REST::Message)
|
86
87
|
end
|
87
88
|
|
88
89
|
it "should have a message id method" do
|
89
|
-
expect(result.msg_id).to eql(
|
90
|
+
expect(result.msg_id).to eql(result_data["msg_id"])
|
90
91
|
end
|
91
92
|
|
92
93
|
|
@@ -99,7 +100,7 @@ describe Wit::REST::Session do
|
|
99
100
|
@results = session.send_message(message)
|
100
101
|
stub_request(:any, /api.wit.ai/).to_timeout
|
101
102
|
end
|
102
|
-
|
103
|
+
let(:random_result) {Wit::REST::Result.new(rand_hash)}
|
103
104
|
|
104
105
|
|
105
106
|
it "must be able refresh and resend the call to the API given the result class" do
|
@@ -110,6 +111,11 @@ describe Wit::REST::Session do
|
|
110
111
|
expect{session.refresh_last}.to raise_error(Timeout::Error)
|
111
112
|
end
|
112
113
|
|
114
|
+
it "should not be able to refresh a not refreshable object" do
|
115
|
+
expect{session.refresh_results("random_class")}.to raise_error(Wit::REST::NotRefreshable)
|
116
|
+
expect{session.refresh_results(random_result)}.to raise_error(Wit::REST::NotRefreshable)
|
117
|
+
end
|
118
|
+
|
113
119
|
|
114
120
|
|
115
121
|
end
|
@@ -117,4 +123,64 @@ describe Wit::REST::Session do
|
|
117
123
|
end
|
118
124
|
|
119
125
|
|
126
|
+
describe "Geting message info" do
|
127
|
+
let(:sent_message_result) {session.send_message(message)}
|
128
|
+
let(:sent_message_id) {sent_message_result.msg_id}
|
129
|
+
before do
|
130
|
+
VCR.insert_cassette 'get_message', record: :once
|
131
|
+
end
|
132
|
+
after do
|
133
|
+
VCR.eject_cassette
|
134
|
+
end
|
135
|
+
describe "Getting back message info " do
|
136
|
+
|
137
|
+
before do
|
138
|
+
@resulting_message = session.get_message(sent_message_id)
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should get back the same message and have the same has as the sent message results" do
|
142
|
+
expect(@resulting_message.msg_id).to eql(sent_message_id)
|
143
|
+
expect(@resulting_message.msg_body).to eql(sent_message_result.msg_body)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe "Get intents" do
|
149
|
+
let(:get_intent_arr) {session.get_intents}
|
150
|
+
|
151
|
+
|
152
|
+
before do
|
153
|
+
VCR.insert_cassette 'get_intents', record: :new_episodes
|
154
|
+
end
|
155
|
+
after do
|
156
|
+
VCR.eject_cassette
|
157
|
+
end
|
158
|
+
it "should have returned an array of intents in class MultiIntent if not given an id" do
|
159
|
+
expect(get_intent_arr.class).to eql(Wit::REST::MultiIntent)
|
160
|
+
expect(get_intent_arr[0].class).to eql(Wit::REST::Result)
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|
164
|
+
|
165
|
+
describe "Get specific intent" do
|
166
|
+
let(:get_intent_arr) {session.get_intents}
|
167
|
+
let(:intent_id) {get_intent_arr[0].id}
|
168
|
+
let(:intent_name) {get_intent_arr[0].name}
|
169
|
+
let(:get_intent_id) {session.get_intents(intent_id)}
|
170
|
+
let(:get_intent_name) {session.get_intents(intent_name)}
|
171
|
+
before do
|
172
|
+
VCR.insert_cassette 'get_intent_specific', record: :new_episodes
|
173
|
+
end
|
174
|
+
after do
|
175
|
+
VCR.eject_cassette
|
176
|
+
end
|
177
|
+
|
178
|
+
it "should return an intent result if given an id or name and must be same results" do
|
179
|
+
expect(get_intent_id.class).to eql(Wit::REST::Intent)
|
180
|
+
expect(get_intent_name.class).to eql(Wit::REST::Intent)
|
181
|
+
expect(get_intent_id.id).to eql(get_intent_name.id)
|
182
|
+
end
|
183
|
+
|
184
|
+
end
|
185
|
+
|
120
186
|
end
|
data/wit_ruby.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Wit::VERSION
|
9
9
|
spec.authors = ["Gavin Ching"]
|
10
10
|
spec.email = ["gavinchingy@gmail.com"]
|
11
|
-
spec.description = %q{Provides a Ruby
|
12
|
-
spec.summary = %q{Provides a Ruby
|
11
|
+
spec.description = %q{Provides a Ruby API wrapper with the Wit.ai API.}
|
12
|
+
spec.summary = %q{Provides a Ruby API wrapper with the Wit.ai API.}
|
13
13
|
spec.homepage = ""
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
@@ -19,8 +19,9 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.required_ruby_version = ">= 1.8.7"
|
22
|
-
spec.add_development_dependency "bundler", "~> 1.3"
|
23
22
|
spec.add_dependency('multi_json', '>= 1.3.0')
|
23
|
+
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
24
25
|
spec.add_development_dependency "rake"
|
25
26
|
spec.add_development_dependency "rspec"
|
26
27
|
spec.add_development_dependency "rspec-nc"
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wit_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gavin Ching
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: multi_json
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
20
|
-
type: :
|
19
|
+
version: 1.3.0
|
20
|
+
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 1.3.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.3
|
34
|
-
type: :
|
33
|
+
version: '1.3'
|
34
|
+
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.3
|
40
|
+
version: '1.3'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -192,7 +192,7 @@ dependencies:
|
|
192
192
|
- - ">="
|
193
193
|
- !ruby/object:Gem::Version
|
194
194
|
version: '0'
|
195
|
-
description: Provides a Ruby
|
195
|
+
description: Provides a Ruby API wrapper with the Wit.ai API.
|
196
196
|
email:
|
197
197
|
- gavinchingy@gmail.com
|
198
198
|
executables: []
|
@@ -202,6 +202,7 @@ files:
|
|
202
202
|
- ".coveralls.yml"
|
203
203
|
- ".gitignore"
|
204
204
|
- ".travis.yml"
|
205
|
+
- CHANGELOG
|
205
206
|
- Gemfile
|
206
207
|
- Guardfile
|
207
208
|
- LICENSE.txt
|
@@ -210,11 +211,19 @@ files:
|
|
210
211
|
- conf/cacert.pem
|
211
212
|
- lib/wit_ruby.rb
|
212
213
|
- lib/wit_ruby/rest/client.rb
|
214
|
+
- lib/wit_ruby/rest/entity.rb
|
215
|
+
- lib/wit_ruby/rest/expression.rb
|
216
|
+
- lib/wit_ruby/rest/intent.rb
|
217
|
+
- lib/wit_ruby/rest/message.rb
|
213
218
|
- lib/wit_ruby/rest/result.rb
|
214
219
|
- lib/wit_ruby/rest/session.rb
|
215
220
|
- lib/wit_ruby/version.rb
|
216
221
|
- spec/spec_helper.rb
|
217
222
|
- spec/wit_ruby/rest/client_spec.rb
|
223
|
+
- spec/wit_ruby/rest/entity_spec.rb
|
224
|
+
- spec/wit_ruby/rest/expression_spec.rb
|
225
|
+
- spec/wit_ruby/rest/intent_spec.rb
|
226
|
+
- spec/wit_ruby/rest/message_spec.rb
|
218
227
|
- spec/wit_ruby/rest/result_spec.rb
|
219
228
|
- spec/wit_ruby/rest/session_spec.rb
|
220
229
|
- wit_ruby.gemspec
|
@@ -241,9 +250,13 @@ rubyforge_project:
|
|
241
250
|
rubygems_version: 2.1.10
|
242
251
|
signing_key:
|
243
252
|
specification_version: 4
|
244
|
-
summary: Provides a Ruby
|
253
|
+
summary: Provides a Ruby API wrapper with the Wit.ai API.
|
245
254
|
test_files:
|
246
255
|
- spec/spec_helper.rb
|
247
256
|
- spec/wit_ruby/rest/client_spec.rb
|
257
|
+
- spec/wit_ruby/rest/entity_spec.rb
|
258
|
+
- spec/wit_ruby/rest/expression_spec.rb
|
259
|
+
- spec/wit_ruby/rest/intent_spec.rb
|
260
|
+
- spec/wit_ruby/rest/message_spec.rb
|
248
261
|
- spec/wit_ruby/rest/result_spec.rb
|
249
262
|
- spec/wit_ruby/rest/session_spec.rb
|