alexa_ruby 0.2.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/alexa_ruby.rb CHANGED
@@ -1,85 +1,59 @@
1
+ # Utilities
1
2
  require 'oj'
2
-
3
- require 'alexa_ruby/request'
4
- require 'alexa_ruby/version'
5
- require 'alexa_ruby/response'
6
- require 'alexa_ruby/request/intent_request'
3
+ require 'securerandom'
4
+
5
+ # Gem core
6
+ require 'alexa_ruby/alexa'
7
+ require 'alexa_ruby/request/base_request'
8
+ require 'alexa_ruby/request/base_request/context'
9
+ require 'alexa_ruby/request/base_request/context/device'
10
+ require 'alexa_ruby/request/base_request/context/user'
11
+ require 'alexa_ruby/request/base_request/session'
12
+ require 'alexa_ruby/request/audio_player_request'
7
13
  require 'alexa_ruby/request/launch_request'
14
+ require 'alexa_ruby/request/intent_request'
15
+ require 'alexa_ruby/request/intent_request/slot'
8
16
  require 'alexa_ruby/request/session_ended_request'
9
- require 'alexa_ruby/request/audio_player_request'
17
+ require 'alexa_ruby/response'
18
+ require 'alexa_ruby/response/audio_player'
19
+ require 'alexa_ruby/response/card'
20
+ require 'alexa_ruby/version'
10
21
 
11
22
  # AlexaRuby implements a back-end service for interaction with Amazon Alexa API
12
23
  module AlexaRuby
13
24
  class << self
14
- # Prints some JSON
25
+ # Validate HTTP/S request body and initialize new Alexa Assistant
15
26
  #
16
- # @param json [JSON] some JSON object
17
- def print_json(json)
18
- p json
27
+ # @param request [Object] request from Amazon Alexa web service,
28
+ # can be hash or JSON encoded string
29
+ # @return [Object] new Request object instance
30
+ # @raise [ArgumentError] if given object isn't a valid JSON object
31
+ def new(request)
32
+ obj = build_json(request)
33
+ Alexa.new(obj)
19
34
  end
20
35
 
21
- # Prints the Gem version
22
- def print_version
23
- p AlexaRuby::VERSION
24
- end
36
+ private
25
37
 
26
- # Builds a new request for Alexa
38
+ # Build JSON from received request
27
39
  #
28
- # @param json_request [JSON] json request from Amazon Alexa
29
- # @return [Object] instance of request class
30
- def build_request(json_request)
31
- json = load_json(json_request)
32
-
33
- unless AlexaRuby.valid_request?(json)
34
- raise ArgumentError, 'Invalid Alexa Request'
35
- end
36
-
37
- @request = define_request(json)
38
- raise ArgumentError, 'Invalid Request Type' if @request.nil?
39
- @request
40
+ # @param obj [Object] request from Amazon Alexa web service,
41
+ # can be hash or JSON encoded string
42
+ # @return [Hash] valid builded JSON
43
+ # @raise [ArgumentError] if given object isn't a valid JSON object
44
+ def build_json(obj)
45
+ obj = Oj.generate(obj) if hash?(obj)
46
+ Oj.load(obj, symbol_keys: true)
47
+ rescue StandardError
48
+ raise ArgumentError, 'Request must be a valid JSON object'
40
49
  end
41
50
 
42
- # Check if it is a valid Amazon Alexa request
51
+ # Check if object is a Hash or not
43
52
  #
44
- # @param json [JSON] json request from Amazon Alexa
53
+ # @param obj [Object] some object
45
54
  # @return [Boolean]
46
- def valid_request?(json)
47
- session =
48
- if json[:request].nil? || /AudioPlayer/.match(json[:request][:type])
49
- true
50
- else
51
- !json[:session].nil?
52
- end
53
- !json.nil? && session && !json[:version].nil? && !json[:request].nil?
54
- end
55
-
56
- # Define proper request class and instantinate it
57
- #
58
- # @param json [JSON] json request from Amazon Alexa
59
- # @return [Object] instance of request class
60
- def define_request(json)
61
- case json[:request][:type]
62
- when /Launch/
63
- LaunchRequest.new(json)
64
- when /Intent/
65
- IntentRequest.new(json)
66
- when /SessionEnded/
67
- SessionEndedRequest.new(json)
68
- when /AudioPlayer/
69
- AudioPlayerRequest.new(json)
70
- end
71
- end
72
-
73
- private
74
-
75
- # Parse JSON request, validate it and convert it to hash
76
- #
77
- # @param request [String] json request from Amazon Alexa
78
- # @return [Hash] loaded and validated request
79
- def load_json(request)
80
- Oj.load(request, symbol_keys: true)
81
- rescue StandardError
82
- raise ArgumentError, 'Invalid JSON in request'
55
+ def hash?(obj)
56
+ obj.is_a? Hash
83
57
  end
84
58
  end
85
59
  end
@@ -0,0 +1,197 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe 'Amazon Alexa request handling' do
4
+ before do
5
+ @fpath = 'spec/fixtures/request'
6
+ end
7
+
8
+ describe 'General request handling' do
9
+ before do
10
+ @json = File.read("#{@fpath}/launch_request.json")
11
+ end
12
+
13
+ describe 'Request' do
14
+ it 'should build a Request object for valid JSON' do
15
+ alexa = AlexaRuby.new(@json)
16
+ alexa.request.wont_be_nil
17
+ end
18
+
19
+ it 'should build a Response object for valid JSON' do
20
+ alexa = AlexaRuby.new(@json)
21
+ alexa.response.wont_be_nil
22
+ end
23
+
24
+ it 'should build a Request object for valid Hash' do
25
+ alexa = AlexaRuby.new(Oj.load(@json))
26
+ alexa.request.wont_be_nil
27
+ end
28
+
29
+ it 'should build a Response object for valid Hash' do
30
+ alexa = AlexaRuby.new(Oj.load(@json))
31
+ alexa.response.wont_be_nil
32
+ end
33
+
34
+ it 'should raise ArgumentError in case of invalid JSON' do
35
+ err = proc { AlexaRuby.new('{"test":}') }.must_raise ArgumentError
36
+ err.message.must_equal 'Request must be a valid JSON object'
37
+ end
38
+
39
+ it 'should raise ArgumentError in case of invalid Hash' do
40
+ err = proc { AlexaRuby.new('{"test":}') }.must_raise ArgumentError
41
+ err.message.must_equal 'Request must be a valid JSON object'
42
+ end
43
+
44
+ it 'should setup all request parameters' do
45
+ alexa = AlexaRuby.new(@json)
46
+ alexa.request.version.wont_be_nil
47
+ alexa.request.type.wont_be_nil
48
+ alexa.request.context.wont_be_nil
49
+ alexa.request.id.wont_be_nil
50
+ alexa.request.timestamp.wont_be_nil
51
+ alexa.request.locale.wont_be_nil
52
+ end
53
+
54
+ it 'should raise ArgumentError if request ID is missing' do
55
+ req = Oj.load(@json, symbol_keys: true)
56
+ req[:request][:requestId] = nil
57
+ err = proc { AlexaRuby.new(req) }.must_raise ArgumentError
58
+ err.message.must_equal 'Missing request ID'
59
+ end
60
+
61
+ it 'should raise ArgumentError if request timestamp is missing' do
62
+ req = Oj.load(@json, symbol_keys: true)
63
+ req[:request][:timestamp] = nil
64
+ err = proc { AlexaRuby.new(req) }.must_raise ArgumentError
65
+ err.message.must_equal 'Missing request timestamp'
66
+ end
67
+
68
+ it 'should raise ArgumentError if request type unknown' do
69
+ req = Oj.load(@json, symbol_keys: true)
70
+ req[:request][:type] = 'dummy'
71
+ err = proc { AlexaRuby.new(req) }.must_raise ArgumentError
72
+ err.message.must_equal 'Unknown type of Alexa request'
73
+ end
74
+
75
+ it 'should raise ArgumentError if request structure isn\'t valid' do
76
+ req = Oj.load(@json, symbol_keys: true)
77
+ req[:request] = nil
78
+ msg = 'Invalid request structure, ' \
79
+ 'please, refer to the Amazon Alexa manual: ' \
80
+ 'https://developer.amazon.com/public/solutions' \
81
+ '/alexa/alexa-skills-kit/docs/alexa-skills-kit-interface-reference'
82
+ err = proc { AlexaRuby.new(req) }.must_raise ArgumentError
83
+ err.message.must_equal msg
84
+ end
85
+ end
86
+
87
+ describe 'Session' do
88
+ it 'should set correct session params' do
89
+ alexa = AlexaRuby.new(@json)
90
+ alexa.request.session.state.wont_be_nil
91
+ alexa.request.session.id.wont_be_nil
92
+ end
93
+
94
+ it 'should raise ArgumentError if session isn\'t valid' do
95
+ req = Oj.load(@json, symbol_keys: true)
96
+ req[:session] = nil
97
+ err = proc { AlexaRuby.new(req) }.must_raise ArgumentError
98
+ err.message.must_equal 'Empty user session'
99
+ end
100
+ end
101
+
102
+ describe 'Context' do
103
+ it 'should set correct context params' do
104
+ alexa = AlexaRuby.new(@json)
105
+ alexa.request.context.app_id.wont_be_nil
106
+ alexa.request.context.user.wont_be_nil
107
+ alexa.request.context.user.id.wont_be_nil
108
+ alexa.request.context.device.wont_be_nil
109
+ alexa.request.context.device.id.wont_be_nil
110
+ end
111
+
112
+ it 'should raise ArgumentError if application ID is missing' do
113
+ req = Oj.load(@json, symbol_keys: true)
114
+ req[:context][:System][:application][:applicationId] = nil
115
+ err = proc { AlexaRuby.new(req) }.must_raise ArgumentError
116
+ err.message.must_equal 'Missing application ID'
117
+ end
118
+
119
+ it 'should raise ArgumentError if user ID is missing' do
120
+ req = Oj.load(@json, symbol_keys: true)
121
+ req[:context][:System][:user][:userId] = nil
122
+ err = proc { AlexaRuby.new(req) }.must_raise ArgumentError
123
+ err.message.must_equal 'Missing user ID'
124
+ end
125
+
126
+ it 'should raise ArgumentError if device ID is missing' do
127
+ req = Oj.load(@json, symbol_keys: true)
128
+ req[:context][:System][:device][:deviceId] = nil
129
+ err = proc { AlexaRuby.new(req) }.must_raise ArgumentError
130
+ err.message.must_equal 'Missing device ID'
131
+ end
132
+ end
133
+ end
134
+
135
+ describe 'LaunchRequest' do
136
+ before do
137
+ @json = File.read("#{@fpath}/launch_request.json")
138
+ end
139
+
140
+ it 'should parse valid LaunchRequest correctly' do
141
+ alexa = AlexaRuby.new(@json)
142
+ alexa.request.type.must_equal :launch
143
+ end
144
+ end
145
+
146
+ describe 'IntentRequest' do
147
+ before do
148
+ @json = File.read("#{@fpath}/intent_request.json")
149
+ end
150
+
151
+ it 'should parse valid IntentRequest correctly' do
152
+ alexa = AlexaRuby.new(@json)
153
+ alexa.request.type.must_equal :intent
154
+ alexa.request.intent_name.must_equal 'GetZodiacHoroscopeIntent'
155
+ alexa.request.confirmation_status.must_equal :unknown
156
+ alexa.request.dialog_state.must_equal :completed
157
+ alexa.request.slots[0].name.must_equal 'ZodiacSign'
158
+ end
159
+
160
+ it 'should raise an ArgumentError if intent is undefined' do
161
+ req = Oj.load(@json, symbol_keys: true)
162
+ req[:request][:intent] = nil
163
+ err = proc { AlexaRuby.new(req) }.must_raise ArgumentError
164
+ err.message.must_equal 'Intent must be defined'
165
+ end
166
+ end
167
+
168
+ describe 'SessionEndedRequest' do
169
+ before do
170
+ @json = File.read("#{@fpath}/session_ended_request.json")
171
+ end
172
+
173
+ it 'should parse valid SessionEndedRequest correctly' do
174
+ alexa = AlexaRuby.new(@json)
175
+ alexa.request.type.must_equal :session_ended
176
+ alexa.request.session.state.must_equal :ended
177
+ alexa.request.session.end_reason.must_equal :user_quit
178
+ end
179
+ end
180
+
181
+ describe 'AudioPlayerRequest' do
182
+ before do
183
+ @json = File.read("#{@fpath}/audio_player_request.json")
184
+ end
185
+
186
+ it 'should parse valid AudioPlayerRequest correctly' do
187
+ alexa = AlexaRuby.new(@json)
188
+ alexa.request.type.must_equal :audio_player
189
+ alexa.request.playback_state.must_equal 'PlaybackFailed'
190
+ alexa.request.playback_offset.must_equal 0
191
+ alexa.request.error_type.must_equal 'string'
192
+ alexa.request.error_message.must_equal 'string'
193
+ alexa.request.error_playback_token.must_equal 'string'
194
+ alexa.request.error_player_activity.must_equal 'string'
195
+ end
196
+ end
197
+ end
@@ -0,0 +1,201 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe 'Build response to Amazon Alexa service' do
4
+ before do
5
+ @req_path = 'spec/fixtures/request'
6
+ @resp_path = 'spec/fixtures/response'
7
+ end
8
+
9
+ describe 'General response handling' do
10
+ before do
11
+ @json = File.read("#{@req_path}/launch_request.json")
12
+ @alexa = AlexaRuby.new(@json)
13
+ end
14
+
15
+ it 'should build a Response object for valid JSON' do
16
+ @alexa.response.wont_be_nil
17
+ resp = Oj.load(@alexa.response.json, symbol_keys: true)
18
+ resp[:version].wont_be_nil
19
+ resp[:response][:shouldEndSession].must_equal true
20
+ end
21
+ end
22
+
23
+ describe 'Session parameters management' do
24
+ before do
25
+ @json = File.read("#{@req_path}/launch_request.json")
26
+ @alexa = AlexaRuby.new(@json)
27
+ end
28
+
29
+ it 'should add one session attribute correctly' do
30
+ @alexa.response.add_session_attribute(:id, 'djsdhdsjhdsjhdsjh')
31
+ resp = Oj.load(@alexa.response.json, symbol_keys: true)
32
+ resp[:sessionAttributes][:id].must_equal 'djsdhdsjhdsjhdsjh'
33
+ end
34
+
35
+ it 'should add pack of session attributes correctly' do
36
+ @alexa.response.add_session_attributes(
37
+ id: 'djsdhdsjhdsjhdsjh',
38
+ test: 'test'
39
+ )
40
+ resp = Oj.load(@alexa.response.json, symbol_keys: true)
41
+ resp[:sessionAttributes][:id].must_equal 'djsdhdsjhdsjhdsjh'
42
+ resp[:sessionAttributes][:test].must_equal 'test'
43
+ end
44
+
45
+ it 'should merge pack of session attributes correctly' do
46
+ @alexa.response.add_session_attributes(
47
+ id: 'djsdhdsjhdsjhdsjh',
48
+ test: 'test'
49
+ )
50
+ @alexa.response.merge_session_attributes(token: '7783y3h43hg4ghh')
51
+ resp = Oj.load(@alexa.response.json, symbol_keys: true)
52
+ resp[:sessionAttributes][:id].must_equal 'djsdhdsjhdsjhdsjh'
53
+ resp[:sessionAttributes][:test].must_equal 'test'
54
+ resp[:sessionAttributes][:token].must_equal '7783y3h43hg4ghh'
55
+ end
56
+
57
+ it 'should raise ArgumentError if duplicate attribute found' do
58
+ @alexa.response.add_session_attribute(:id, 'djsdhdsjhdsjhdsjh')
59
+ err = proc {
60
+ @alexa.response.add_session_attribute(:id, '833hj33jh3hj')
61
+ }.must_raise ArgumentError
62
+ err.message.must_equal 'Duplicate session attributes not allowed'
63
+ end
64
+
65
+ it 'should raise ArgumentError if attributes pack isn\'t a Hash' do
66
+ err = proc {
67
+ @alexa.response.add_session_attributes('Test')
68
+ }.must_raise ArgumentError
69
+ err.message.must_equal 'Attributes must be a Hash'
70
+ end
71
+ end
72
+
73
+ describe 'Cards management' do
74
+ before do
75
+ @json = File.read("#{@req_path}/launch_request.json")
76
+ @card = Oj.load(
77
+ File.read("#{@resp_path}/sample_card.json"),
78
+ symbol_keys: true
79
+ )
80
+ @alexa = AlexaRuby.new(@json)
81
+ end
82
+
83
+ it 'should add card to response' do
84
+ @alexa.response.add_card(@card)
85
+ resp = Oj.load(@alexa.response.json, symbol_keys: true)
86
+ resp[:response][:card][:type].must_equal 'Simple'
87
+ resp[:response][:card][:title].must_equal 'title'
88
+ resp[:response][:card][:content].must_equal 'text'
89
+ end
90
+
91
+ it 'should add "text" and "image" nodes if card type is Standard' do
92
+ @card[:type] = 'Standard'
93
+ @alexa.response.add_card(@card)
94
+ resp = Oj.load(@alexa.response.json, symbol_keys: true)
95
+ small_url = 'https://test.ru/example_small.jpg'
96
+ large_url = 'https://test.ru/example_large.jpg'
97
+ resp[:response][:card][:type].must_equal 'Standard'
98
+ resp[:response][:card][:text].must_equal 'text'
99
+ resp[:response][:card][:image][:smallImageUrl].must_equal small_url
100
+ resp[:response][:card][:image][:largeImageUrl].must_equal large_url
101
+ end
102
+
103
+ it 'should raise ArgumentError if no title given' do
104
+ @card[:title] = nil
105
+ err = proc { @alexa.response.add_card(@card) }.must_raise ArgumentError
106
+ err.message.must_equal 'Card need a title'
107
+ end
108
+
109
+ it 'should raise ArgumentError if card type unknown' do
110
+ @card[:type] = 'Test'
111
+ err = proc { @alexa.response.add_card(@card) }.must_raise ArgumentError
112
+ err.message.must_equal 'Unknown card type'
113
+ end
114
+ end
115
+
116
+ describe 'Audio directives management' do
117
+ before do
118
+ @json = File.read("#{@req_path}/launch_request.json")
119
+ @audio = Oj.load(
120
+ File.read("#{@resp_path}/sample_audio.json"),
121
+ symbol_keys: true
122
+ )
123
+ @alexa = AlexaRuby.new(@json)
124
+ end
125
+
126
+ it 'should add AudioPlayer.Play directive' do
127
+ @alexa.response.add_audio_player_directive(:start, @audio)
128
+ resp = Oj.load(@alexa.response.json, symbol_keys: true)
129
+ directive = resp[:response][:directives][0]
130
+ directive[:type].must_equal 'AudioPlayer.Play'
131
+ directive[:playBehavior].must_equal 'REPLACE_ALL'
132
+ stream = directive[:audioItem][:stream]
133
+ stream[:url].must_equal @audio[:url]
134
+ stream[:token].must_equal @audio[:token]
135
+ stream[:offsetInMilliseconds].must_equal @audio[:offset]
136
+ end
137
+
138
+ it 'should add AudioPlayer.Stop directive' do
139
+ @alexa.response.add_audio_player_directive(:stop)
140
+ resp = Oj.load(@alexa.response.json, symbol_keys: true)
141
+ resp[:response][:directives][0][:type].must_equal 'AudioPlayer.Stop'
142
+ end
143
+ end
144
+
145
+ describe 'Speech management' do
146
+ before do
147
+ @json = File.read("#{@req_path}/launch_request.json")
148
+ @alexa = AlexaRuby.new(@json)
149
+ end
150
+
151
+ it 'should add plain text output to response' do
152
+ @alexa.response.tell('Test')
153
+ resp = Oj.load(@alexa.response.json, symbol_keys: true)
154
+ resp[:response][:outputSpeech][:type].must_equal 'PlainText'
155
+ resp[:response][:outputSpeech][:text].must_equal 'Test'
156
+ resp[:response][:outputSpeech][:ssml].must_be_nil
157
+ end
158
+
159
+ it 'should add SSML output to response' do
160
+ @alexa.response.tell('Test', nil, true)
161
+ resp = Oj.load(@alexa.response.json, symbol_keys: true)
162
+ resp[:response][:outputSpeech][:type].must_equal 'SSML'
163
+ resp[:response][:outputSpeech][:ssml].must_equal '<speak>Test</speak>'
164
+ resp[:response][:outputSpeech][:text].must_be_nil
165
+ end
166
+
167
+ it 'should add output with repromt' do
168
+ @alexa.response.tell('Test', 'One more test')
169
+ resp = Oj.load(@alexa.response.json, symbol_keys: true)
170
+ resp[:response][:outputSpeech][:type].must_equal 'PlainText'
171
+ resp[:response][:outputSpeech][:text].must_equal 'Test'
172
+ resp[:response][:outputSpeech][:ssml].must_be_nil
173
+ repromt = resp[:response][:reprompt][:outputSpeech]
174
+ repromt[:type].must_equal 'PlainText'
175
+ repromt[:text].must_equal 'One more test'
176
+ repromt[:ssml].must_be_nil
177
+ end
178
+
179
+ it 'should add output speech and return JSON' do
180
+ sample = Oj.to_json(
181
+ Oj.load(File.read("#{@resp_path}/sample_response.json"))
182
+ )
183
+ @alexa.response.tell!('Test').must_equal sample
184
+ end
185
+
186
+ it 'should add output speech without closing session' do
187
+ @alexa.response.ask('Test')
188
+ resp = Oj.load(@alexa.response.json, symbol_keys: true)
189
+ resp[:response][:shouldEndSession].must_equal false
190
+ end
191
+
192
+ it 'should add output speech without closing session and return JSON' do
193
+ sample = Oj.load(
194
+ File.read("#{@resp_path}/sample_response.json"),
195
+ symbol_keys: true
196
+ )
197
+ sample[:response][:shouldEndSession] = false
198
+ @alexa.response.ask!('Test').must_equal Oj.to_json(sample)
199
+ end
200
+ end
201
+ end
@@ -0,0 +1,7 @@
1
+ require 'simplecov'
2
+ require 'minitest/autorun'
3
+ require 'minitest/reporters'
4
+ require 'alexa_ruby'
5
+
6
+ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new(color: true)
7
+ SimpleCov.start
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alexa_ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Mulev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-25 00:00:00.000000000 Z
11
+ date: 2017-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
19
+ version: 1.6.9
20
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: '1.7'
26
+ version: 1.6.9
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -53,45 +53,73 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rspec
56
+ name: minitest
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '3.2'
61
+ version: '5.10'
62
62
  - - ">="
63
63
  - !ruby/object:Gem::Version
64
- version: 3.2.0
64
+ version: 5.10.2
65
65
  type: :development
66
66
  prerelease: false
67
67
  version_requirements: !ruby/object:Gem::Requirement
68
68
  requirements:
69
69
  - - "~>"
70
70
  - !ruby/object:Gem::Version
71
- version: '3.2'
71
+ version: '5.10'
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
- version: 3.2.0
74
+ version: 5.10.2
75
75
  - !ruby/object:Gem::Dependency
76
- name: rspec-mocks
76
+ name: minitest-reporters
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '3.2'
81
+ version: '1.1'
82
82
  - - ">="
83
83
  - !ruby/object:Gem::Version
84
- version: 3.2.0
84
+ version: 1.1.14
85
85
  type: :development
86
86
  prerelease: false
87
87
  version_requirements: !ruby/object:Gem::Requirement
88
88
  requirements:
89
89
  - - "~>"
90
90
  - !ruby/object:Gem::Version
91
- version: '3.2'
91
+ version: '1.1'
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 1.1.14
95
+ - !ruby/object:Gem::Dependency
96
+ name: simplecov
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
92
106
  - - ">="
93
107
  - !ruby/object:Gem::Version
94
- version: 3.2.0
108
+ version: '0'
109
+ - !ruby/object:Gem::Dependency
110
+ name: codeclimate-test-reporter
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: 1.0.0
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: 1.0.0
95
123
  description: Ruby toolkit for Amazon Alexa API
96
124
  email:
97
125
  - m.mulev@gmail.com
@@ -105,8 +133,13 @@ files:
105
133
  - README.md
106
134
  - Rakefile
107
135
  - lib/alexa_ruby.rb
108
- - lib/alexa_ruby/request.rb
136
+ - lib/alexa_ruby/alexa.rb
109
137
  - lib/alexa_ruby/request/audio_player_request.rb
138
+ - lib/alexa_ruby/request/base_request.rb
139
+ - lib/alexa_ruby/request/base_request/context.rb
140
+ - lib/alexa_ruby/request/base_request/context/device.rb
141
+ - lib/alexa_ruby/request/base_request/context/user.rb
142
+ - lib/alexa_ruby/request/base_request/session.rb
110
143
  - lib/alexa_ruby/request/intent_request.rb
111
144
  - lib/alexa_ruby/request/intent_request/slot.rb
112
145
  - lib/alexa_ruby/request/launch_request.rb
@@ -114,8 +147,10 @@ files:
114
147
  - lib/alexa_ruby/response.rb
115
148
  - lib/alexa_ruby/response/audio_player.rb
116
149
  - lib/alexa_ruby/response/card.rb
117
- - lib/alexa_ruby/session.rb
118
150
  - lib/alexa_ruby/version.rb
151
+ - spec/request_spec.rb
152
+ - spec/response_spec.rb
153
+ - spec/spec_helper.rb
119
154
  homepage: https://github.com/mulev/alexa-ruby
120
155
  licenses:
121
156
  - MIT
@@ -140,4 +175,7 @@ rubygems_version: 2.6.12
140
175
  signing_key:
141
176
  specification_version: 4
142
177
  summary: Ruby toolkit for Amazon Alexa API
143
- test_files: []
178
+ test_files:
179
+ - spec/request_spec.rb
180
+ - spec/response_spec.rb
181
+ - spec/spec_helper.rb