ralyxa 1.6.2 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c3c11a61cf16f000310698095d20d5e9874e9979
4
- data.tar.gz: 5e2fbf15562e67fd80ef3980a2aac6b0cab4c3ea
3
+ metadata.gz: e2097ed5c0dd85b2f0f5d04d0f6c524b9cc90b8b
4
+ data.tar.gz: 004060b9f538e547270050bcab4a584bd243ef02
5
5
  SHA512:
6
- metadata.gz: 2117b738f0a7a247c0d202d2b733b09f08c37dbf5bac38aba9df69fa2c67266b795c4b326cdafdbe225713bbeffdc1df5b83dd7558c97dbeac32a688b4e0d2ab
7
- data.tar.gz: 761d94e0e2b39dca488f10184242bab4e2c672f56a10b9613bc83d295b842140a75e5c6b9728c8f7f194995b22480a9caf1ac82d50f5b5e737eb5082f2b3ca58
6
+ metadata.gz: ec37369ea357d04fbde3353ae06b12407eb34282b466a3895ace4a0276f9c0a63ee05c4359436141ec02db1aca8b9e40a0dfa8a9030767c851032a5075c48008
7
+ data.tar.gz: 840cf253a18ff2a3e552ea359a7ed15e9a120f869c0cf93020286394add6b86cee9d98f054f404abf83ee3c84eb73dc29b9685f41854442335d5445fcfa1758d
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  .DS_Store
2
- Gemfile.lock
2
+ Gemfile.lock
3
+ coverage
data/.rubocop.yml CHANGED
@@ -6,6 +6,9 @@ AllCops:
6
6
  Metrics/LineLength:
7
7
  Enabled: false
8
8
 
9
+ Metrics/ParameterLists:
10
+ Max: 6
11
+
9
12
  Style/FrozenStringLiteralComment:
10
13
  Enabled: false
11
14
 
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,19 @@
1
+ # Contributing to Ralyxa
2
+
3
+ 1. Have tests.
4
+
5
+ ## The basic idea
6
+
7
+ Ralyxa is in two parts:
8
+
9
+ 1. The user-facing Ruby interface which looks a bit like Sinatra.
10
+ 2. The under-the-hood Ruby-to-JSON translator which directly references Alexa structures.
11
+
12
+ This gives rise to some principles:
13
+
14
+ 1. The user-facing Ruby interface should try to provide thoughtful abstractions to the Alexa structures.
15
+ 2. The under-the-hood Ruby-to-JSON translator should contain objects which directly map onto Alexa structures.
16
+
17
+ Some other principles:
18
+
19
+ 1. Keep the user-facing Ruby interface as simple as possible. Imagine a brand-new Ruby developer using this.
data/README.md CHANGED
@@ -93,6 +93,55 @@ intent "ReadFromSession" do
93
93
  end
94
94
  ```
95
95
 
96
+ ##### Playing audio with the `AudioPlayer` directive
97
+
98
+ ###### Play
99
+
100
+ You can play an audio stream right away with:
101
+
102
+ ```ruby
103
+ intent "PlayAudio" do
104
+ audio_player.play(
105
+ 'https://s3.amazonaws.com/my-ssml-samples/Flourish.mp3',
106
+ 'flourish-token',
107
+ speech: 'Playing Audio'
108
+ )
109
+ end
110
+ ```
111
+
112
+ ###### Play Later (Enqueue)
113
+
114
+ You can queue a song to play next with:
115
+
116
+ ```ruby
117
+ intent "PlayAudioLater" do
118
+ audio_player.play_later(
119
+ 'https://s3.amazonaws.com/my-ssml-samples/Flourish.mp3',
120
+ 'flourish-token'
121
+ )
122
+ end
123
+ ```
124
+
125
+ ###### Stop
126
+
127
+ You can stop playing with:
128
+
129
+ ```ruby
130
+ intent "StopAudio" do
131
+ audio_player.stop
132
+ end
133
+ ```
134
+
135
+ ###### Clear Queued
136
+
137
+ You can clear enqueued audio with:
138
+
139
+ ```ruby
140
+ intent "ClearQueue" do
141
+ audio_player.clear_queue
142
+ end
143
+ ```
144
+
96
145
  ##### Reading the session user
97
146
 
98
147
  You can read the session user's `userId` and `accessToken`, and check that the `accessToken` exists:
@@ -148,7 +197,8 @@ end
148
197
 
149
198
  # Standard card
150
199
  intent "SendStandardCard" do
151
- standard_card = card("Hello World", "I'm alive!", "https://placehold.it/200")
200
+ standard_card = card("Hello World", "I'm alive!", "http://placehold.it/720x480", "http://placehold.it/1200x800")
201
+
152
202
  ask("What do you think of the Standard card I just sent?", card: standard_card)
153
203
  end
154
204
  ```
@@ -190,6 +240,20 @@ end
190
240
 
191
241
  > You can't actually respond to a `SessionEndedRequest`, but you might want to do some tidying in this action.
192
242
 
243
+
244
+ ### I want to serve card images, audio stream etc. over HTTP not HTTPS
245
+
246
+ In some special cases, you may be allowed to serve content over HTTP instead of HTTPS. To allow this within Ralyxa, you need to set the `require_secure_urls` configuration option to false.
247
+
248
+ > **NOTE:** In order to use HTTP sources, you must be given special approval directly from Amazon. If you use HTTP sources without getting advanced approval, your skill will not work correctly.
249
+
250
+ ```ruby
251
+ Ralyxa.configure do |config|
252
+ config.require_secure_urls = false
253
+ end
254
+ ```
255
+
256
+
193
257
  ## Testing
194
258
  Part of Amazon's requirements for Alexa skills is that they have to ensure requests are sent from Amazon. This is done in a number of ways documented [here](https://developer.amazon.com/docs/custom-skills/host-a-custom-skill-as-a-web-service.html). This verification is built into Ralyxa and can cause issues when testing your skills with stubbed data.
195
259
 
@@ -219,9 +283,10 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/sjmog/
219
283
 
220
284
  The main areas of focus are:
221
285
 
222
- - Audio directives :construction:
223
286
  - Reprompts :construction:
287
+ - Dialogue :construction:
224
288
  - Generators of built-in Intents e.g. `SessionEndedRequest`
289
+ - Automation with the `AVS` command line tool
225
290
 
226
291
  ## License
227
292
 
@@ -1,13 +1,18 @@
1
1
  module Ralyxa
2
2
  class Configuration
3
- attr_accessor :validate_requests
3
+ attr_accessor :validate_requests, :require_secure_urls
4
4
 
5
5
  def initialize
6
6
  @validate_requests = true
7
+ @require_secure_urls = true
7
8
  end
8
9
 
9
10
  def validate_requests?
10
11
  validate_requests
11
12
  end
13
+
14
+ def require_secure_urls?
15
+ require_secure_urls
16
+ end
12
17
  end
13
18
  end
data/lib/ralyxa/errors.rb CHANGED
@@ -1,2 +1,4 @@
1
- class UnsecureUrlError < StandardError
1
+ module Ralyxa
2
+ class UnsecureUrlError < StandardError
3
+ end
2
4
  end
@@ -13,7 +13,10 @@ module Ralyxa
13
13
  end
14
14
 
15
15
  def respond(response_text = '', response_details = {}, response_builder = Ralyxa::ResponseBuilder)
16
- response_builder.build(response_details.merge(response_text: response_text))
16
+ options = response_details
17
+ options[:response_text] = response_text if response_text
18
+
19
+ response_builder.build(options)
17
20
  end
18
21
 
19
22
  def tell(response_text = '', response_details = {})
@@ -24,10 +27,18 @@ module Ralyxa
24
27
  card_class.as_hash(title, body, image_url)
25
28
  end
26
29
 
30
+ def audio_player
31
+ Ralyxa::ResponseEntities::Directives::AudioPlayer
32
+ end
33
+
27
34
  def link_account_card(card_class = Ralyxa::ResponseEntities::Card)
28
35
  card_class.link_account
29
36
  end
30
37
 
38
+ def log(level, message)
39
+ puts "[#{Time.new}] [#{@request.user_id}] #{level} - #{message}"
40
+ end
41
+
31
42
  alias ask respond
32
43
 
33
44
  attr_reader :request
@@ -13,13 +13,15 @@ module Ralyxa
13
13
  def_delegator :@user, :access_token, :user_access_token
14
14
  def_delegator :@user, :access_token_exists?, :user_access_token_exists?
15
15
 
16
+ attr_reader :request
17
+
16
18
  def initialize(original_request, user_class = Ralyxa::RequestEntities::User)
19
+ validate_request(original_request) if Ralyxa.configuration.validate_requests?
20
+
17
21
  @request = JSON.parse(original_request.body.read)
18
22
  attempt_to_rewind_request_body(original_request)
19
23
 
20
24
  @user = user_class.build(@request)
21
-
22
- validate_request(original_request) if Ralyxa.configuration.validate_requests?
23
25
  end
24
26
 
25
27
  def intent_name
@@ -35,8 +37,12 @@ module Ralyxa
35
37
  @request['session']['new']
36
38
  end
37
39
 
40
+ def session_attributes
41
+ @request['session']['attributes']
42
+ end
43
+
38
44
  def session_attribute(attribute_name)
39
- @request['session']['attributes'][attribute_name]
45
+ session_attributes[attribute_name]
40
46
  end
41
47
 
42
48
  private
@@ -9,9 +9,11 @@ module Ralyxa
9
9
  end
10
10
 
11
11
  def self.build(request)
12
+ user_hash = request.dig('session', 'user') || request.dig('context', 'System', 'user') || {}
13
+
12
14
  new(
13
- id: request.dig('session', 'user', 'userId'),
14
- access_token: request.dig('session', 'user', 'accessToken')
15
+ id: user_hash['userId'],
16
+ access_token: user_hash['accessToken']
15
17
  )
16
18
  end
17
19
 
@@ -14,7 +14,7 @@ module Ralyxa
14
14
  end
15
15
 
16
16
  def build
17
- merge_output_speech
17
+ merge_output_speech if response_text_exists?
18
18
  merge_card if card_exists?
19
19
 
20
20
  @response_class.as_hash(@options).to_json
@@ -34,6 +34,10 @@ module Ralyxa
34
34
  @options[:card]
35
35
  end
36
36
 
37
+ def response_text_exists?
38
+ @options[:response_text]
39
+ end
40
+
37
41
  def output_speech
38
42
  output_speech_params = { speech: @options.delete(:response_text) }
39
43
  output_speech_params[:ssml] = @options.delete(:ssml) if @options[:ssml]
@@ -11,8 +11,8 @@ module Ralyxa
11
11
  @options = options
12
12
  end
13
13
 
14
- def self.as_hash(title, body, image_url = nil)
15
- new(title: title, body: body, image_url: image_url).to_h
14
+ def self.as_hash(title, body, small_image_url = nil, large_image_url = small_image_url)
15
+ new(title: title, body: body, small_image_url: small_image_url, large_image_url: large_image_url).to_h
16
16
  end
17
17
 
18
18
  def self.link_account
@@ -24,7 +24,7 @@ module Ralyxa
24
24
  add_type(card)
25
25
  add_title(card) if @options[:title]
26
26
  add_body(card) if @options[:body]
27
- add_image(card) if @options[:image_url]
27
+ add_image(card) if standard?
28
28
  end
29
29
  end
30
30
 
@@ -46,10 +46,14 @@ module Ralyxa
46
46
  end
47
47
 
48
48
  def add_image(card)
49
- raise UnsecureUrlError, "Card images must be available at an SSL-enabled (HTTPS) endpoint. Your current image url is: #{@options[:image_url]}" unless secure?
49
+ raise Ralyxa::UnsecureUrlError, "Card images must be available at an SSL-enabled (HTTPS) endpoint. Your current image urls are: (small: #{@options[:small_image_url]}, large: #{@options[:large_image_url]}" unless secure_images?
50
50
  card[:image] = {}
51
- card[:image][:smallImageUrl] = @options[:image_url]
52
- card[:image][:largeImageUrl] = @options[:image_url]
51
+
52
+ small_image = @options[:small_image_url] || @options[:large_image_url]
53
+ large_image = @options[:large_image_url] || @options[:small_image_url]
54
+
55
+ card[:image][:smallImageUrl] = small_image if small_image
56
+ card[:image][:largeImageUrl] = large_image if large_image
53
57
  end
54
58
 
55
59
  def link_account?
@@ -57,15 +61,28 @@ module Ralyxa
57
61
  end
58
62
 
59
63
  def simple?
60
- !@options[:image_url]
64
+ !@options[:small_image_url] && !@options[:large_image_url]
61
65
  end
62
66
 
63
67
  def standard?
64
- !@options[:image_url].nil?
68
+ @options[:small_image_url] || @options[:large_image_url]
69
+ end
70
+
71
+ def secure_images?
72
+ small_secure = secure_uri?(@options[:small_image_url])
73
+ large_secure = secure_uri?(@options[:large_image_url])
74
+
75
+ small_secure && large_secure
65
76
  end
66
77
 
67
- def secure?
68
- URI.parse(@options[:image_url]).scheme == 'https'
78
+ # Given a uri string, retutrn true if:
79
+ # * the scheme is https
80
+ # * or if we are not interested in the uri being secure
81
+ # * or if the value that has been passed is nil
82
+ def secure_uri?(uri_string)
83
+ return true if uri_string.nil?
84
+
85
+ (URI.parse(uri_string).scheme == 'https' || !Ralyxa.require_secure_urls?)
69
86
  end
70
87
  end
71
88
  end
@@ -0,0 +1,23 @@
1
+ module Ralyxa
2
+ module ResponseEntities
3
+ module Directives
4
+ module Audio
5
+ class AudioItem
6
+ def initialize(stream)
7
+ @stream = stream
8
+ end
9
+
10
+ def to_h
11
+ {}.tap do |audio_item|
12
+ audio_item['stream'] = @stream.to_h
13
+ end
14
+ end
15
+
16
+ def self.as_hash(stream)
17
+ new(stream).to_h
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,37 @@
1
+ module Ralyxa
2
+ module ResponseEntities
3
+ module Directives
4
+ module Audio
5
+ class Stream
6
+ def initialize(url, token, offset_in_milliseconds = 0, expected_previous_token = nil)
7
+ raise Ralyxa::UnsecureUrlError, "Audio streams must be served from at an SSL-enabled (HTTPS) endpoint. Your current stream url is: #{url}" unless secure?(url)
8
+
9
+ @url = url
10
+ @token = token
11
+ @offset_in_milliseconds = offset_in_milliseconds
12
+ @expected_previous_token = expected_previous_token
13
+ end
14
+
15
+ def to_h
16
+ {}.tap do |stream|
17
+ stream['url'] = @url
18
+ stream['token'] = @token
19
+ stream['offsetInMilliseconds'] = @offset_in_milliseconds
20
+ stream['expectedPreviousToken'] = @expected_previous_token if @expected_previous_token
21
+ end
22
+ end
23
+
24
+ def self.as_hash(url, token, offset_in_milliseconds = 0, expected_previous_token = nil)
25
+ new(url, token, offset_in_milliseconds, expected_previous_token).to_h
26
+ end
27
+
28
+ private
29
+
30
+ def secure?(url)
31
+ URI.parse(url).scheme == 'https' || !Ralyxa.require_secure_urls?
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,11 @@
1
+ require_relative './audio/audio_item'
2
+ require_relative './audio/stream'
3
+
4
+ module Ralyxa
5
+ module ResponseEntities
6
+ module Directives
7
+ module Audio
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,27 @@
1
+ module Ralyxa
2
+ module ResponseEntities
3
+ module Directives
4
+ class AudioPlayer
5
+ class ClearQueue
6
+ CLEAR_ENQUEUED = 'CLEAR_ENQUEUED'.freeze
7
+ CLEAR_ALL = 'CLEAR_ALL'.freeze
8
+
9
+ def initialize(behaviour = Ralyxa::ResponseEntities::Directives::AudioPlayer::ClearQueue::CLEAR_ENQUEUED)
10
+ @behaviour = behaviour
11
+ end
12
+
13
+ def to_h
14
+ {}.tap do |audio_player|
15
+ audio_player['type'] = 'AudioPlayer.ClearQueue'
16
+ audio_player['clearBehavior'] = @behaviour
17
+ end
18
+ end
19
+
20
+ def self.as_hash(behaviour = Ralyxa::ResponseEntities::Directives::AudioPlayer::ClearQueue::CLEAR_ENQUEUED)
21
+ new(behaviour).to_h
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,32 @@
1
+ module Ralyxa
2
+ module ResponseEntities
3
+ module Directives
4
+ class AudioPlayer
5
+ class Play
6
+ CLEAR_ENQUEUE = 'CLEAR_ENQUEUE'.freeze
7
+ ENQUEUE = 'ENQUEUE'.freeze
8
+ REPLACE_ALL = 'REPLACE_ALL'.freeze
9
+ REPLACE_ENQUEUED = 'REPLACE_ENQUEUED'.freeze
10
+
11
+ def initialize(stream, behaviour = Ralyxa::ResponseEntities::Directives::AudioPlayer::Play::REPLACE_ALL)
12
+ @stream = stream
13
+ @behaviour = behaviour
14
+ end
15
+
16
+ def to_h
17
+ {}.tap do |audio_player|
18
+ audio_player['type'] = 'AudioPlayer.Play'
19
+ audio_player['playBehavior'] = @behaviour
20
+
21
+ audio_player['audioItem'] = Ralyxa::ResponseEntities::Directives::Audio::AudioItem.new(@stream).to_h
22
+ end
23
+ end
24
+
25
+ def self.as_hash(stream, behaviour = nil)
26
+ new(stream, behaviour).to_h
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,19 @@
1
+ module Ralyxa
2
+ module ResponseEntities
3
+ module Directives
4
+ class AudioPlayer
5
+ class Stop
6
+ def to_h
7
+ {}.tap do |audio_player|
8
+ audio_player['type'] = 'AudioPlayer.Stop'
9
+ end
10
+ end
11
+
12
+ def self.as_hash
13
+ new.to_h
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,46 @@
1
+ require_relative './audio_player/clear_queue'
2
+ require_relative './audio_player/play'
3
+ require_relative './audio_player/stop'
4
+
5
+ module Ralyxa
6
+ module ResponseEntities
7
+ module Directives
8
+ class AudioPlayer
9
+ class << self
10
+ def play(url, token, speech: nil, card: nil, offset_in_milliseconds: 0, expected_previous_token: nil, behaviour: Ralyxa::ResponseEntities::Directives::AudioPlayer::Play::REPLACE_ALL, audio_player_class: Ralyxa::ResponseEntities::Directives::AudioPlayer::Play, response_builder: Ralyxa::ResponseBuilder)
11
+ directive = audio_player_class.as_hash(Ralyxa::ResponseEntities::Directives::Audio::Stream.new(url, token, offset_in_milliseconds, expected_previous_token), behaviour)
12
+
13
+ response_builder.build(build_options(directive, speech, card))
14
+ end
15
+
16
+ def play_later(url, token, speech: nil, card: nil, offset_in_milliseconds: 0, expected_previous_token: nil, behaviour: Ralyxa::ResponseEntities::Directives::AudioPlayer::Play::REPLACE_ENQUEUED, audio_player_class: Ralyxa::ResponseEntities::Directives::AudioPlayer::Play, response_builder: Ralyxa::ResponseBuilder)
17
+ play(url, token, speech: speech, card: card, offset_in_milliseconds: offset_in_milliseconds, expected_previous_token: expected_previous_token, behaviour: behaviour, audio_player_class: audio_player_class, response_builder: response_builder)
18
+ end
19
+
20
+ def stop(speech: nil, card: nil, audio_player_class: Ralyxa::ResponseEntities::Directives::AudioPlayer::Stop, response_builder: Ralyxa::ResponseBuilder)
21
+ directive = audio_player_class.as_hash
22
+
23
+ response_builder.build(build_options(directive, speech, card))
24
+ end
25
+
26
+ def clear_queue(speech: nil, card: nil, behaviour: Ralyxa::ResponseEntities::Directives::AudioPlayer::ClearQueue::CLEAR_ALL, audio_player_class: Ralyxa::ResponseEntities::Directives::AudioPlayer::ClearQueue, response_builder: Ralyxa::ResponseBuilder)
27
+ directive = audio_player_class.as_hash(behaviour)
28
+
29
+ response_builder.build(build_options(directive, speech, card))
30
+ end
31
+
32
+ private
33
+
34
+ def build_options(directive, speech, card)
35
+ {}.tap do |option|
36
+ option[:directives] = [directive]
37
+ option[:end_session] = false
38
+ option[:response_text] = speech if speech
39
+ option[:card] = card if card
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,9 @@
1
+ require_relative './directives/audio'
2
+ require_relative './directives/audio_player'
3
+
4
+ module Ralyxa
5
+ module ResponseEntities
6
+ module Directives
7
+ end
8
+ end
9
+ end
@@ -1,14 +1,16 @@
1
1
  require_relative './output_speech'
2
+ require_relative './directives'
2
3
 
3
4
  module Ralyxa
4
5
  module ResponseEntities
5
6
  class Response
6
- def initialize(output_speech, session_attributes, end_session, start_over, card)
7
+ def initialize(output_speech, session_attributes, end_session, start_over, card, directives)
7
8
  @output_speech = output_speech
8
9
  @session_attributes = session_attributes
9
10
  @end_session = end_session
10
11
  @start_over = start_over
11
12
  @card = card
13
+ @directives = directives
12
14
  end
13
15
 
14
16
  def to_h
@@ -19,8 +21,8 @@ module Ralyxa
19
21
  end
20
22
  end
21
23
 
22
- def self.as_hash(output_speech: Ralyxa::OutputSpeech.as_hash, session_attributes: {}, end_session: false, start_over: false, card: false)
23
- new(output_speech, session_attributes, end_session, start_over, card).to_h
24
+ def self.as_hash(output_speech: false, session_attributes: {}, end_session: false, start_over: false, card: false, directives: false)
25
+ new(output_speech, session_attributes, end_session, start_over, card, directives).to_h
24
26
  end
25
27
 
26
28
  private
@@ -37,10 +39,12 @@ module Ralyxa
37
39
  end
38
40
 
39
41
  def add_response(response)
40
- response[:response] = {}
41
- response[:response][:outputSpeech] = @output_speech
42
- response[:response][:card] = @card if @card
43
- response[:response][:shouldEndSession] = @end_session
42
+ response[:response] = {}.tap do |response_object|
43
+ response_object[:outputSpeech] = @output_speech if @output_speech
44
+ response_object[:card] = @card if @card
45
+ response_object[:directives] = @directives if @directives
46
+ response_object[:shouldEndSession] = @end_session
47
+ end
44
48
  end
45
49
  end
46
50
  end
@@ -1,3 +1,3 @@
1
1
  module Ralyxa
2
- VERSION = '1.6.2'.freeze
2
+ VERSION = '1.7.0'.freeze
3
3
  end
data/ralyxa.gemspec CHANGED
@@ -28,4 +28,5 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency 'timecop', '~> 0.9'
29
29
  spec.add_development_dependency 'vcr', '~> 3.0'
30
30
  spec.add_development_dependency 'webmock', '~> 3.0'
31
+ spec.add_development_dependency 'simplecov', '~> 0.15'
31
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ralyxa
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.2
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Morgan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-01-10 00:00:00.000000000 Z
11
+ date: 2018-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: alexa_verifier
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '3.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.15'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.15'
111
125
  description: A Ruby framework for interacting with Amazon Alexa. Designed to work
112
126
  with Sinatra, although can be used with a few other web frameworks.
113
127
  email:
@@ -122,6 +136,7 @@ files:
122
136
  - ".ruby-version"
123
137
  - ".travis.yml"
124
138
  - CODE_OF_CONDUCT.md
139
+ - CONTRIBUTING.md
125
140
  - Gemfile
126
141
  - LICENSE.txt
127
142
  - README.md
@@ -137,6 +152,14 @@ files:
137
152
  - lib/ralyxa/request_entities/user.rb
138
153
  - lib/ralyxa/response_builder.rb
139
154
  - lib/ralyxa/response_entities/card.rb
155
+ - lib/ralyxa/response_entities/directives.rb
156
+ - lib/ralyxa/response_entities/directives/audio.rb
157
+ - lib/ralyxa/response_entities/directives/audio/audio_item.rb
158
+ - lib/ralyxa/response_entities/directives/audio/stream.rb
159
+ - lib/ralyxa/response_entities/directives/audio_player.rb
160
+ - lib/ralyxa/response_entities/directives/audio_player/clear_queue.rb
161
+ - lib/ralyxa/response_entities/directives/audio_player/play.rb
162
+ - lib/ralyxa/response_entities/directives/audio_player/stop.rb
140
163
  - lib/ralyxa/response_entities/output_speech.rb
141
164
  - lib/ralyxa/response_entities/response.rb
142
165
  - lib/ralyxa/skill.rb
@@ -163,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
163
186
  version: '0'
164
187
  requirements: []
165
188
  rubyforge_project:
166
- rubygems_version: 2.6.14
189
+ rubygems_version: 2.6.10
167
190
  signing_key:
168
191
  specification_version: 4
169
192
  summary: A Ruby framework for interacting with Amazon Alexa.