ralyxa-lambda 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +16 -0
  5. data/.ruby-version +1 -0
  6. data/.tool-versions +1 -0
  7. data/.travis.yml +12 -0
  8. data/CODE_OF_CONDUCT.md +74 -0
  9. data/CONTRIBUTING.md +19 -0
  10. data/Gemfile +3 -0
  11. data/LICENSE.txt +21 -0
  12. data/README.md +294 -0
  13. data/Rakefile +6 -0
  14. data/bin/console +14 -0
  15. data/bin/setup +8 -0
  16. data/lib/ralyxa.rb +36 -0
  17. data/lib/ralyxa/configuration.rb +18 -0
  18. data/lib/ralyxa/errors.rb +4 -0
  19. data/lib/ralyxa/handler.rb +47 -0
  20. data/lib/ralyxa/register_intents.rb +45 -0
  21. data/lib/ralyxa/request_entities/request.rb +63 -0
  22. data/lib/ralyxa/request_entities/user.rb +25 -0
  23. data/lib/ralyxa/response_builder.rb +65 -0
  24. data/lib/ralyxa/response_entities/card.rb +89 -0
  25. data/lib/ralyxa/response_entities/directives.rb +9 -0
  26. data/lib/ralyxa/response_entities/directives/audio.rb +11 -0
  27. data/lib/ralyxa/response_entities/directives/audio/audio_item.rb +23 -0
  28. data/lib/ralyxa/response_entities/directives/audio/stream.rb +37 -0
  29. data/lib/ralyxa/response_entities/directives/audio_player.rb +46 -0
  30. data/lib/ralyxa/response_entities/directives/audio_player/clear_queue.rb +27 -0
  31. data/lib/ralyxa/response_entities/directives/audio_player/play.rb +32 -0
  32. data/lib/ralyxa/response_entities/directives/audio_player/stop.rb +19 -0
  33. data/lib/ralyxa/response_entities/output_speech.rb +35 -0
  34. data/lib/ralyxa/response_entities/reprompt.rb +20 -0
  35. data/lib/ralyxa/response_entities/response.rb +54 -0
  36. data/lib/ralyxa/skill.rb +53 -0
  37. data/lib/ralyxa/version.rb +3 -0
  38. data/pkg/ralyxa-1.0.0.gem +0 -0
  39. data/ralyxa.gemspec +32 -0
  40. metadata +195 -0
@@ -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,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,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,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,35 @@
1
+ module Ralyxa
2
+ module ResponseEntities
3
+ class OutputSpeech
4
+ DEFAULT_RESPONSE_TEXT = 'Hello World'.freeze
5
+ DEFAULT_RESPONSE_SSML = '<speak>Hello World</speak>'.freeze
6
+
7
+ def initialize(speech, ssml)
8
+ @speech = speech
9
+ @ssml = ssml
10
+ end
11
+
12
+ def to_h
13
+ {}.tap do |output_speech|
14
+ @ssml ? add_ssml(output_speech) : add_plaintext(output_speech)
15
+ end
16
+ end
17
+
18
+ def self.as_hash(speech: nil, ssml: false)
19
+ new(speech, ssml).to_h
20
+ end
21
+
22
+ private
23
+
24
+ def add_ssml(output_speech)
25
+ output_speech[:type] = 'SSML'
26
+ output_speech[:ssml] = (@speech || DEFAULT_RESPONSE_SSML)
27
+ end
28
+
29
+ def add_plaintext(output_speech)
30
+ output_speech[:type] = 'PlainText'
31
+ output_speech[:text] = (@speech || DEFAULT_RESPONSE_TEXT)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,20 @@
1
+ module Ralyxa
2
+ module ResponseEntities
3
+ class Reprompt
4
+ def initialize(reprompt_speech, reprompt_ssml)
5
+ @reprompt_speech = reprompt_speech
6
+ @reprompt_ssml = reprompt_ssml
7
+ end
8
+
9
+ def to_h
10
+ {}.tap do |reprompt|
11
+ reprompt[:outputSpeech] = Ralyxa::ResponseEntities::OutputSpeech.as_hash(speech: @reprompt_speech, ssml: @reprompt_ssml)
12
+ end
13
+ end
14
+
15
+ def self.as_hash(reprompt_speech: nil, reprompt_ssml: false)
16
+ new(reprompt_speech, reprompt_ssml).to_h
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,54 @@
1
+ require_relative './output_speech'
2
+ require_relative './reprompt'
3
+ require_relative './directives'
4
+
5
+ module Ralyxa
6
+ module ResponseEntities
7
+ class Response
8
+ def initialize(output_speech, reprompt, session_attributes, end_session, start_over, card, directives)
9
+ @output_speech = output_speech
10
+ @reprompt = reprompt
11
+ @session_attributes = session_attributes
12
+ @end_session = end_session
13
+ @start_over = start_over
14
+ @card = card
15
+ @directives = directives
16
+ end
17
+
18
+ def to_h
19
+ {}.tap do |response|
20
+ add_version(response)
21
+ add_session_attributes(response)
22
+ add_response(response)
23
+ end
24
+ end
25
+
26
+ def self.as_hash(output_speech: false, reprompt: false, session_attributes: {}, end_session: false, start_over: false, card: false, directives: false)
27
+ new(output_speech, reprompt, session_attributes, end_session, start_over, card, directives).to_h
28
+ end
29
+
30
+ private
31
+
32
+ attr_reader :response
33
+
34
+ def add_version(response)
35
+ response[:version] = '1.0'
36
+ end
37
+
38
+ def add_session_attributes(response)
39
+ return response[:sessionAttributes] = {} if @start_over
40
+ response[:sessionAttributes] = @session_attributes unless @session_attributes.empty?
41
+ end
42
+
43
+ def add_response(response)
44
+ response[:response] = {}.tap do |response_object|
45
+ response_object[:outputSpeech] = @output_speech if @output_speech
46
+ response_object[:reprompt] = @reprompt if @reprompt
47
+ response_object[:card] = @card if @card
48
+ response_object[:directives] = @directives if @directives
49
+ response_object[:shouldEndSession] = @end_session
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,53 @@
1
+ require_relative './request_entities/request'
2
+ require_relative './handler'
3
+
4
+ # Routes an incoming request to the correct Handler.
5
+ module Ralyxa
6
+ class Skill
7
+ @handlers = {}
8
+
9
+ def initialize(request)
10
+ @request = request
11
+ end
12
+
13
+ def handle
14
+ handler = self.class.handlers[@request.intent_name]
15
+ handler ? handler.new(@request).handle : warn(handler_not_found)
16
+ end
17
+
18
+ class << self
19
+ def intent(intent_name, handler_base_class = Ralyxa::Handler, &intent_block)
20
+ intent_handler = Class.new(handler_base_class)
21
+ intent_handler.send(:define_method, :handle, &intent_block)
22
+ @handlers[intent_name] = intent_handler
23
+ end
24
+
25
+ def handle(request, alexa_request_wrapper = Ralyxa::RequestEntities::Request)
26
+ new(alexa_request_wrapper.new(request)).handle
27
+ end
28
+
29
+ def handlers
30
+ @handlers.dup
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def handler_not_found
37
+ <<~HEREDOC
38
+ \e[33m
39
+ WARNING: An intent declaration for intent "#{@request.intent_name}" was not found.
40
+
41
+ To define it, add an intent declaration inside a directory called 'intents',
42
+ on the same directory level as the runfile for your server application.
43
+
44
+ You probably want something like:
45
+
46
+ intent "#{@request.intent_name}" do
47
+ respond("Hello World!")
48
+ end
49
+ \e[0m
50
+ HEREDOC
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,3 @@
1
+ module Ralyxa
2
+ VERSION = '1.8.0'.freeze
3
+ end
Binary file
data/ralyxa.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'ralyxa/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'ralyxa-lambda'
7
+ spec.version = Ralyxa::VERSION
8
+ spec.authors = ['Sam Morgan']
9
+ spec.email = ['samm@makersacademy.com']
10
+
11
+ spec.summary = 'A Ruby framework for interacting with Amazon Alexa and lambda support'
12
+ spec.description = 'A Ruby framework for interacting with Amazon Alexa. Designed to work with Sinatra, although can be used with a few other web frameworks.'
13
+ spec.homepage = 'https://github.com/sjmog/ralyxa'
14
+ spec.license = 'MIT'
15
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
16
+ f.match(%r{^(test|spec|features)/})
17
+ end
18
+ spec.bindir = 'exe'
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ['lib']
21
+ spec.required_ruby_version = '>= 2.3.1'
22
+
23
+ spec.add_dependency 'alexa_verifier', '~> 1.0'
24
+
25
+ spec.add_development_dependency 'bundler', '~> 1.14'
26
+ spec.add_development_dependency 'rake', '~> 10.0'
27
+ spec.add_development_dependency 'rspec', '~> 3.0'
28
+ spec.add_development_dependency 'timecop', '~> 0.9'
29
+ spec.add_development_dependency 'vcr', '~> 3.0'
30
+ spec.add_development_dependency 'webmock', '~> 3.0'
31
+ spec.add_development_dependency 'simplecov', '~> 0.15'
32
+ end
metadata ADDED
@@ -0,0 +1,195 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ralyxa-lambda
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.8.0
5
+ platform: ruby
6
+ authors:
7
+ - Sam Morgan
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-01-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: alexa_verifier
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.14'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.14'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: timecop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.9'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.9'
83
+ - !ruby/object:Gem::Dependency
84
+ name: vcr
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: webmock
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
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'
125
+ description: A Ruby framework for interacting with Amazon Alexa. Designed to work
126
+ with Sinatra, although can be used with a few other web frameworks.
127
+ email:
128
+ - samm@makersacademy.com
129
+ executables: []
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - ".gitignore"
134
+ - ".rspec"
135
+ - ".rubocop.yml"
136
+ - ".ruby-version"
137
+ - ".tool-versions"
138
+ - ".travis.yml"
139
+ - CODE_OF_CONDUCT.md
140
+ - CONTRIBUTING.md
141
+ - Gemfile
142
+ - LICENSE.txt
143
+ - README.md
144
+ - Rakefile
145
+ - bin/console
146
+ - bin/setup
147
+ - lib/ralyxa.rb
148
+ - lib/ralyxa/configuration.rb
149
+ - lib/ralyxa/errors.rb
150
+ - lib/ralyxa/handler.rb
151
+ - lib/ralyxa/register_intents.rb
152
+ - lib/ralyxa/request_entities/request.rb
153
+ - lib/ralyxa/request_entities/user.rb
154
+ - lib/ralyxa/response_builder.rb
155
+ - lib/ralyxa/response_entities/card.rb
156
+ - lib/ralyxa/response_entities/directives.rb
157
+ - lib/ralyxa/response_entities/directives/audio.rb
158
+ - lib/ralyxa/response_entities/directives/audio/audio_item.rb
159
+ - lib/ralyxa/response_entities/directives/audio/stream.rb
160
+ - lib/ralyxa/response_entities/directives/audio_player.rb
161
+ - lib/ralyxa/response_entities/directives/audio_player/clear_queue.rb
162
+ - lib/ralyxa/response_entities/directives/audio_player/play.rb
163
+ - lib/ralyxa/response_entities/directives/audio_player/stop.rb
164
+ - lib/ralyxa/response_entities/output_speech.rb
165
+ - lib/ralyxa/response_entities/reprompt.rb
166
+ - lib/ralyxa/response_entities/response.rb
167
+ - lib/ralyxa/skill.rb
168
+ - lib/ralyxa/version.rb
169
+ - pkg/ralyxa-1.0.0.gem
170
+ - ralyxa.gemspec
171
+ homepage: https://github.com/sjmog/ralyxa
172
+ licenses:
173
+ - MIT
174
+ metadata: {}
175
+ post_install_message:
176
+ rdoc_options: []
177
+ require_paths:
178
+ - lib
179
+ required_ruby_version: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - ">="
182
+ - !ruby/object:Gem::Version
183
+ version: 2.3.1
184
+ required_rubygems_version: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ requirements: []
190
+ rubyforge_project:
191
+ rubygems_version: 2.7.3
192
+ signing_key:
193
+ specification_version: 4
194
+ summary: A Ruby framework for interacting with Amazon Alexa and lambda support
195
+ test_files: []