action_alexa 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rspec +3 -0
- data/.rubocop.yml +45 -0
- data/.simplecov +8 -0
- data/Gemfile +1 -0
- data/Rakefile +14 -2
- data/action_alexa.gemspec +11 -0
- data/lib/action_alexa.rb +24 -3
- data/lib/action_alexa/alexa_request.rb +19 -0
- data/lib/action_alexa/configuration.rb +51 -0
- data/lib/action_alexa/exceptions.rb +4 -0
- data/lib/action_alexa/intent/authorization.rb +57 -0
- data/lib/action_alexa/intent/base.rb +28 -0
- data/lib/action_alexa/intent/registry.rb +35 -0
- data/lib/action_alexa/railtie.rb +4 -0
- data/lib/action_alexa/request_payload/request.rb +63 -0
- data/lib/action_alexa/request_payload/session.rb +39 -0
- data/lib/action_alexa/response.rb +48 -0
- data/lib/action_alexa/skill.rb +62 -0
- data/lib/action_alexa/version.rb +1 -1
- metadata +121 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9394081d9ef3f322eadd652a0ba47086bdb9b53f31585cf4aebfc76b4fde4f42
|
4
|
+
data.tar.gz: 14e6da85a7e81e7fb57b141f8d085cad258a95f764894e91cf3ebc3606d46608
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 301f74f40020662e3f161379f7063ca639ac845946f19831e12715340980b7b03d0b9e492116137d544841ec8b03f5266344002726aa0748764f69c8e0d8f535
|
7
|
+
data.tar.gz: 50cb237e7c8d5de3a45b35b361947ad36f58a4aab8ebaa3e6a966a44c9e32cde932025d59b27d0736e7e01df2debc4fd8e23b5230f09b3b319426c3bf85e440b
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.6
|
3
|
+
|
4
|
+
Layout/EmptyLinesAroundAttributeAccessor:
|
5
|
+
Enabled: true
|
6
|
+
Layout/SpaceAroundMethodCallOperator:
|
7
|
+
Enabled: true
|
8
|
+
Lint/DeprecatedOpenSSLConstant:
|
9
|
+
Enabled: true
|
10
|
+
Lint/MixedRegexpCaptureTypes:
|
11
|
+
Enabled: true
|
12
|
+
Lint/RaiseException:
|
13
|
+
Enabled: true
|
14
|
+
Lint/StructNewOverride:
|
15
|
+
Enabled: true
|
16
|
+
Style/AccessorGrouping:
|
17
|
+
Enabled: true
|
18
|
+
Style/BisectedAttrAccessor:
|
19
|
+
Enabled: true
|
20
|
+
Style/ExponentialNotation:
|
21
|
+
Enabled: true
|
22
|
+
Style/HashEachMethods:
|
23
|
+
Enabled: true
|
24
|
+
Style/HashTransformKeys:
|
25
|
+
Enabled: true
|
26
|
+
Style/HashTransformValues:
|
27
|
+
Enabled: true
|
28
|
+
Style/RedundantAssignment:
|
29
|
+
Enabled: true
|
30
|
+
Style/RedundantFetchBlock:
|
31
|
+
Enabled: true
|
32
|
+
Style/RedundantRegexpCharacterClass:
|
33
|
+
Enabled: true
|
34
|
+
Style/RedundantRegexpEscape:
|
35
|
+
Enabled: true
|
36
|
+
Style/SlicingWithRange:
|
37
|
+
Enabled: true
|
38
|
+
|
39
|
+
Style/FrozenStringLiteralComment:
|
40
|
+
Enabled: false
|
41
|
+
|
42
|
+
Metrics/BlockLength:
|
43
|
+
Exclude:
|
44
|
+
# spec files will have large nested blocks due to RSpec structure
|
45
|
+
- 'spec/**/*.rb'
|
data/.simplecov
ADDED
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -1,2 +1,14 @@
|
|
1
|
-
require
|
2
|
-
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rubocop/rake_task'
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
|
5
|
+
desc 'Run RSpec against the spec directory'
|
6
|
+
RSpec::Core::RakeTask.new(:spec)
|
7
|
+
|
8
|
+
desc 'Run RuboCop on the lib directory'
|
9
|
+
RuboCop::RakeTask.new(:rubocop) do |task|
|
10
|
+
task.patterns = ['lib/**/*.rb', 'spec/**/*.rb']
|
11
|
+
task.fail_on_error = true
|
12
|
+
end
|
13
|
+
|
14
|
+
task :default => [:spec, :rubocop]
|
data/action_alexa.gemspec
CHANGED
@@ -25,4 +25,15 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.bindir = "exe"
|
26
26
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
27
27
|
spec.require_paths = ["lib"]
|
28
|
+
|
29
|
+
# Runtime Depend
|
30
|
+
spec.add_dependency 'railties', '~> 6.0', '>= 6.0.3.2'
|
31
|
+
|
32
|
+
# Development/Test Dependencies
|
33
|
+
spec.add_development_dependency 'rspec', '~> 3.9'
|
34
|
+
spec.add_development_dependency 'rubocop', '~> 0.87.0'
|
35
|
+
spec.add_development_dependency 'faker', '~> 2.13'
|
36
|
+
spec.add_development_dependency 'simplecov', '~> 0.18.5'
|
37
|
+
spec.add_development_dependency 'simplecov-console', '~> 0.7.2'
|
38
|
+
spec.add_development_dependency 'pry', '~> 0.13.1'
|
28
39
|
end
|
data/lib/action_alexa.rb
CHANGED
@@ -1,6 +1,27 @@
|
|
1
|
-
require
|
1
|
+
require 'active_support/inflector'
|
2
2
|
|
3
|
+
require 'action_alexa/version'
|
4
|
+
require 'action_alexa/intent/base'
|
5
|
+
require 'action_alexa/intent/registry'
|
6
|
+
require 'action_alexa/request_payload/request'
|
7
|
+
require 'action_alexa/request_payload/session'
|
8
|
+
require 'action_alexa/alexa_request'
|
9
|
+
require 'action_alexa/response'
|
10
|
+
require 'action_alexa/configuration'
|
11
|
+
require 'action_alexa/exceptions'
|
12
|
+
require 'action_alexa/skill'
|
13
|
+
|
14
|
+
require 'action_alexa/railtie' if defined?(Rails)
|
15
|
+
|
16
|
+
# Base
|
3
17
|
module ActionAlexa
|
4
|
-
class
|
5
|
-
|
18
|
+
class << self
|
19
|
+
attr_accessor :config
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.configure
|
23
|
+
self.config ||= ActionAlexa::Configuration.new
|
24
|
+
|
25
|
+
yield config if block_given?
|
26
|
+
end
|
6
27
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'action_alexa/request_payload/session'
|
2
|
+
require 'action_alexa/request_payload/request'
|
3
|
+
|
4
|
+
module ActionAlexa
|
5
|
+
# ActionAlexa::AlexaRequest is a wrapper around the actual request hash sent
|
6
|
+
# by the Alexa service. It provides utility accessor methods to extrapolate
|
7
|
+
# the request structure from Alexa from the application code that consumes
|
8
|
+
# this gem
|
9
|
+
class AlexaRequest
|
10
|
+
include ActionAlexa::RequestPayload::Session
|
11
|
+
include ActionAlexa::RequestPayload::Request
|
12
|
+
|
13
|
+
attr_reader :alexa_payload
|
14
|
+
|
15
|
+
def initialize(alexa_payload)
|
16
|
+
@alexa_payload = alexa_payload
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module ActionAlexa
|
2
|
+
# Configuration class to support application code hooks within the ActionAlexa
|
3
|
+
# gem. Configurations below that do not have hooks should be set within the
|
4
|
+
# Rails initializers (app/config/initializers/*.rb). This class should be used
|
5
|
+
# as a singleton instance through the ActionAlexa module
|
6
|
+
class Configuration
|
7
|
+
attr_writer :root, :current_user_hook, :logger,
|
8
|
+
:default_intent_response_class
|
9
|
+
|
10
|
+
MISSING_CURRENT_USER_HOOK_ERROR =
|
11
|
+
'No block set for #current_user_hook to execute'.freeze
|
12
|
+
MISSING_DEFAULT_INTENT_ERROR =
|
13
|
+
'Default/Fallback Intent class not defined'.freeze
|
14
|
+
|
15
|
+
# Consumers can either pass a block into #current_user_hook or explicitly
|
16
|
+
# create a lambda/proc and assign it via the writer #current_user_hook=
|
17
|
+
def current_user_hook(&block)
|
18
|
+
return @current_user_hook if current_user_hook?
|
19
|
+
|
20
|
+
if block_given?
|
21
|
+
@current_user_hook = block
|
22
|
+
return
|
23
|
+
end
|
24
|
+
|
25
|
+
raise ActionAlexa::MissingConfiguration, MISSING_CURRENT_USER_HOOK_ERROR
|
26
|
+
end
|
27
|
+
|
28
|
+
def current_user_hook?
|
29
|
+
!@current_user_hook.nil?
|
30
|
+
end
|
31
|
+
|
32
|
+
def root
|
33
|
+
@root ||= Rails.root
|
34
|
+
end
|
35
|
+
|
36
|
+
def logger
|
37
|
+
@logger ||= Rails.logger
|
38
|
+
end
|
39
|
+
|
40
|
+
# rubocop:disable Style/IfUnlessModifier - rubocop is having issues with
|
41
|
+
# the code below but its fairly succicient, so disabling the check here
|
42
|
+
def default_intent_response_class
|
43
|
+
if @default_intent_response_class.nil?
|
44
|
+
raise ActionAlexa::MissingConfiguration, MISSING_DEFAULT_INTENT_ERROR
|
45
|
+
end
|
46
|
+
|
47
|
+
@default_intent_response_class
|
48
|
+
end
|
49
|
+
# rubocop:enable Style/IfUnlessModifier
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
|
3
|
+
module ActionAlexa
|
4
|
+
module Intent
|
5
|
+
# Module to allow adding basic authorization flow to Intents
|
6
|
+
# This module interfaces between accessing the user profile from
|
7
|
+
# Amazon and provide a callback to pull the application user
|
8
|
+
# who matches the profile UUID provided by the Alexa service
|
9
|
+
module Authorization
|
10
|
+
AMAZON_API_URL = 'https://api.amazon.com/user/profile'.freeze
|
11
|
+
|
12
|
+
# Utility method that allows upstream Intent classes to map the Amazon
|
13
|
+
# user Alexa is calling as with the user account for your service.
|
14
|
+
# Common mapping is to match the UUID from the Alexa payload against a
|
15
|
+
# User object in your Users table
|
16
|
+
# This method will call fetch_user with the amazon user id from the
|
17
|
+
# request while fetch_user will execute any lambda passed into the
|
18
|
+
# Configuration current_user_hook to perform the look up
|
19
|
+
def current_user
|
20
|
+
@current_user ||= fetch_user_from_request
|
21
|
+
end
|
22
|
+
|
23
|
+
def fetch_user_from_request
|
24
|
+
fetch_user(profile['user_id'])
|
25
|
+
end
|
26
|
+
|
27
|
+
# Fetch the user object in your application that matches the user_id from
|
28
|
+
# the amazon request. The implementation for the look up is configurable
|
29
|
+
# by passing in a block to the Configuration.current_user_hook utilty
|
30
|
+
# The Configuration.current_user_hook method will be invoked with the
|
31
|
+
# user_id from the Alexa payload
|
32
|
+
def fetch_user(user_id)
|
33
|
+
ActionAlexa.config.current_user_hook.call(user_id)
|
34
|
+
end
|
35
|
+
|
36
|
+
def fetch_amazon_user_profile(access_token)
|
37
|
+
uri = URI.parse(AMAZON_API_URL)
|
38
|
+
request = Net::HTTP::Get.new(uri.request_uri)
|
39
|
+
request['Authorization'] = 'bearer ' + access_token
|
40
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
41
|
+
http.use_ssl = true
|
42
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
43
|
+
|
44
|
+
response = http.request(request)
|
45
|
+
JSON.parse(response.body)
|
46
|
+
end
|
47
|
+
|
48
|
+
def profile
|
49
|
+
@profile ||= fetch_amazon_user_profile(access_token)
|
50
|
+
end
|
51
|
+
|
52
|
+
def access_token
|
53
|
+
@access_token ||= alexa_payload.access_token
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'action_alexa/intent/authorization'
|
4
|
+
|
5
|
+
module ActionAlexa
|
6
|
+
module Intent
|
7
|
+
# Base Intent class which provides some basic sanity methods
|
8
|
+
# for the Skill intents defined by the application
|
9
|
+
class Base
|
10
|
+
class << self; attr_accessor :name end
|
11
|
+
|
12
|
+
include ActionAlexa::Intent::Authorization
|
13
|
+
|
14
|
+
attr_reader :alexa_payload, :alexa_response
|
15
|
+
|
16
|
+
AMAZON_API_URL = 'https://api.amazon.com/user/profile'
|
17
|
+
|
18
|
+
def initialize(alexa_payload)
|
19
|
+
@alexa_payload = alexa_payload
|
20
|
+
@alexa_response = ActionAlexa::Response.new
|
21
|
+
end
|
22
|
+
|
23
|
+
def execute
|
24
|
+
raise 'Implement this method in your intent subclass'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module ActionAlexa
|
2
|
+
module Intent
|
3
|
+
# The registry will auto-discover and auto-load and intent files found
|
4
|
+
# within the intents folder (configurable). Default path to search is
|
5
|
+
# Rails.root/app/intents/*_intents.rb
|
6
|
+
# The classes loaded should inherit from ActionAlexa::Intent::Base
|
7
|
+
class Registry
|
8
|
+
def self.intents
|
9
|
+
@intents ||= {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.register_intent(intent)
|
13
|
+
intents[intent] = intent.constantize
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.find_intent(intent)
|
17
|
+
load_registry! if intents.empty?
|
18
|
+
|
19
|
+
intent_name = "#{intent}Intent"
|
20
|
+
intents[intent_name]
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.load_registry!
|
24
|
+
intents_path = File.join(
|
25
|
+
ActionAlexa.config.root, 'app', 'intents', '*_intent.rb'
|
26
|
+
)
|
27
|
+
Dir.glob(intents_path).sort.each do |intent_file|
|
28
|
+
require intent_file
|
29
|
+
class_name = intent_file.split('/').last.gsub(/\.rb/, '')
|
30
|
+
register_intent(class_name.split('_').collect(&:capitalize).join)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActionAlexa
|
4
|
+
module RequestPayload
|
5
|
+
# Request component of the JSON blob from the Alexa request TO the
|
6
|
+
# application. This module contains utility methods to access the attributes
|
7
|
+
module Request
|
8
|
+
def type
|
9
|
+
request_payload['type']
|
10
|
+
end
|
11
|
+
|
12
|
+
def intent_name
|
13
|
+
return type unless type == 'IntentRequest'
|
14
|
+
|
15
|
+
full_intent_name = request_payload['intent']['name']
|
16
|
+
full_intent_name.split(/\./).last.gsub(/Intent$/, '')
|
17
|
+
end
|
18
|
+
|
19
|
+
# For logging purposes when reaching out to Amazon
|
20
|
+
def request_id
|
21
|
+
request_payload['requestId']
|
22
|
+
end
|
23
|
+
|
24
|
+
def timestamp
|
25
|
+
request_payload['timestamp']
|
26
|
+
end
|
27
|
+
|
28
|
+
def locale
|
29
|
+
request_payload['locale']
|
30
|
+
end
|
31
|
+
|
32
|
+
def link_result_should_be_returned?
|
33
|
+
key = 'shouldLinkResultBeReturned'
|
34
|
+
|
35
|
+
request_payload.key?(key) && request_payload[key]
|
36
|
+
end
|
37
|
+
|
38
|
+
def slots?
|
39
|
+
!slots.nil?
|
40
|
+
end
|
41
|
+
|
42
|
+
def slot?(slot_type)
|
43
|
+
slots? && !slot(slot_type).nil?
|
44
|
+
end
|
45
|
+
|
46
|
+
def slot(slot_type)
|
47
|
+
return nil unless slots?
|
48
|
+
|
49
|
+
slots[slot_type]
|
50
|
+
end
|
51
|
+
|
52
|
+
def slots
|
53
|
+
request_payload['intent']['slots']
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def request_payload
|
59
|
+
alexa_payload['request']
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActionAlexa
|
4
|
+
module RequestPayload
|
5
|
+
# Session compontent of the JSON blob from the Alexa request TO the
|
6
|
+
# application. This module contains utility methods to access the attributes
|
7
|
+
module Session
|
8
|
+
def new?
|
9
|
+
session_payload.key?('new') && session_payload['new']
|
10
|
+
end
|
11
|
+
|
12
|
+
def session_id
|
13
|
+
session_payload['sessionId']
|
14
|
+
end
|
15
|
+
|
16
|
+
def application_id
|
17
|
+
session_payload['application']['applicationId']
|
18
|
+
end
|
19
|
+
|
20
|
+
def user_id
|
21
|
+
session_payload['user']['userId']
|
22
|
+
end
|
23
|
+
|
24
|
+
def user_access_token_present?
|
25
|
+
session_payload['user'].key?('accessToken')
|
26
|
+
end
|
27
|
+
|
28
|
+
def access_token
|
29
|
+
session_payload['user']['accessToken']
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def session_payload
|
35
|
+
alexa_payload['session']
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module ActionAlexa
|
2
|
+
# The return values from this class will go to the Alexa service and let the
|
3
|
+
# Alexa device announce the statements provided. There are hooks to onboard
|
4
|
+
# and send user cards to the end user accounts
|
5
|
+
class Response
|
6
|
+
VERSION = '1.0'.freeze
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@payload = default_payload
|
10
|
+
end
|
11
|
+
|
12
|
+
def say(message, overrides = {})
|
13
|
+
@payload[:response].merge!(
|
14
|
+
outputSpeech: {
|
15
|
+
type: 'PlainText',
|
16
|
+
text: message
|
17
|
+
},
|
18
|
+
shouldEndSession: overrides.fetch(:should_end_session, true)
|
19
|
+
)
|
20
|
+
|
21
|
+
with_link_account_card if link_account_card?(overrides)
|
22
|
+
|
23
|
+
@payload
|
24
|
+
end
|
25
|
+
|
26
|
+
def with_link_account_card
|
27
|
+
@payload[:response].merge!(
|
28
|
+
card: { type: 'LinkAccount' }
|
29
|
+
)
|
30
|
+
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def link_account_card?(overrides)
|
37
|
+
overrides.key?(:link_account_card) && overrides[:link_account_card]
|
38
|
+
end
|
39
|
+
|
40
|
+
def default_payload
|
41
|
+
{
|
42
|
+
version: VERSION,
|
43
|
+
response: {},
|
44
|
+
sessionAttributes: {}
|
45
|
+
}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'action_alexa/alexa_request'
|
2
|
+
require 'action_alexa/intent/registry'
|
3
|
+
|
4
|
+
module ActionAlexa
|
5
|
+
# Top level class that will:
|
6
|
+
# 1. Take in the Alexa request payload
|
7
|
+
# 2. Fetch the intent Alexa is attempting to run
|
8
|
+
# 3. Run the intent
|
9
|
+
# 4. Return the response to Alexa for the end user
|
10
|
+
# This class should be run within a Rails Controller to interface between
|
11
|
+
# Alexa calls to the web service and intent executions
|
12
|
+
class Skill
|
13
|
+
attr_reader :alexa_payload, :logger
|
14
|
+
|
15
|
+
MISSING_DEFAULT_INTENT_MESSAGE =
|
16
|
+
'There was an error talking to the service'.freeze
|
17
|
+
|
18
|
+
def initialize(alexa_payload)
|
19
|
+
@alexa_payload = ActionAlexa::AlexaRequest.new(alexa_payload)
|
20
|
+
@logger = ActionAlexa.config.logger
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.execute(alexa_payload)
|
24
|
+
new(alexa_payload).execute_skill
|
25
|
+
end
|
26
|
+
|
27
|
+
def execute_skill
|
28
|
+
# Find the intent based on the registery intents
|
29
|
+
intent_class = ActionAlexa::Intent::Registry.find_intent(
|
30
|
+
alexa_payload.intent_name
|
31
|
+
)
|
32
|
+
|
33
|
+
return fallback_intent_response if intent_class.nil?
|
34
|
+
|
35
|
+
intent = intent_class.new(alexa_payload)
|
36
|
+
|
37
|
+
# Execute the intent and return the result back to Alexa
|
38
|
+
intent.execute
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def fallback_intent_response
|
44
|
+
logger.error(
|
45
|
+
"Could not find the intent for #{alexa_payload.intent_name}"
|
46
|
+
)
|
47
|
+
|
48
|
+
begin
|
49
|
+
intent_class = ActionAlexa.config.default_intent_response_class
|
50
|
+
intent_class.new(alexa_payload).execute
|
51
|
+
rescue ActionAlexa::MissingConfiguration => e
|
52
|
+
logger.error(e.message)
|
53
|
+
default_intent_response
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def default_intent_response
|
58
|
+
response = ActionAlexa::Response.new
|
59
|
+
response.say(MISSING_DEFAULT_INTENT_MESSAGE)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/lib/action_alexa/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,119 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: action_alexa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zshawn Syed
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
12
|
-
dependencies:
|
11
|
+
date: 2020-10-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: railties
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '6.0'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 6.0.3.2
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '6.0'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 6.0.3.2
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rspec
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '3.9'
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '3.9'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rubocop
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.87.0
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 0.87.0
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: faker
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '2.13'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '2.13'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: simplecov
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 0.18.5
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 0.18.5
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: simplecov-console
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 0.7.2
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 0.7.2
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: pry
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.13.1
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: 0.13.1
|
13
117
|
description: Gem that helps process Amazon Alexa Intents with Rails
|
14
118
|
email:
|
15
119
|
- zsyed91@gmail.com
|
@@ -18,6 +122,9 @@ extensions: []
|
|
18
122
|
extra_rdoc_files: []
|
19
123
|
files:
|
20
124
|
- ".gitignore"
|
125
|
+
- ".rspec"
|
126
|
+
- ".rubocop.yml"
|
127
|
+
- ".simplecov"
|
21
128
|
- Gemfile
|
22
129
|
- README.md
|
23
130
|
- Rakefile
|
@@ -25,6 +132,17 @@ files:
|
|
25
132
|
- bin/console
|
26
133
|
- bin/setup
|
27
134
|
- lib/action_alexa.rb
|
135
|
+
- lib/action_alexa/alexa_request.rb
|
136
|
+
- lib/action_alexa/configuration.rb
|
137
|
+
- lib/action_alexa/exceptions.rb
|
138
|
+
- lib/action_alexa/intent/authorization.rb
|
139
|
+
- lib/action_alexa/intent/base.rb
|
140
|
+
- lib/action_alexa/intent/registry.rb
|
141
|
+
- lib/action_alexa/railtie.rb
|
142
|
+
- lib/action_alexa/request_payload/request.rb
|
143
|
+
- lib/action_alexa/request_payload/session.rb
|
144
|
+
- lib/action_alexa/response.rb
|
145
|
+
- lib/action_alexa/skill.rb
|
28
146
|
- lib/action_alexa/version.rb
|
29
147
|
homepage: https://github.com/zsyed91/action_alexa
|
30
148
|
licenses: []
|