action_alexa 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|