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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c514b08431f184e8d48699e2b3c57feefd3a49bad60d5c83090e5c7cbaa57550
4
- data.tar.gz: 3bd3273da9ea19973fbbef18ed5b709edb24022ae3b56f4f515f63817f9c430a
3
+ metadata.gz: 9394081d9ef3f322eadd652a0ba47086bdb9b53f31585cf4aebfc76b4fde4f42
4
+ data.tar.gz: 14e6da85a7e81e7fb57b141f8d085cad258a95f764894e91cf3ebc3606d46608
5
5
  SHA512:
6
- metadata.gz: 771bc33d6c48de88a7e34c28698f538ac860f67b27e8390f7c722d92f431cfbbe8a2e5cd364c913f81cbd540cccc5f270423f44b1c5073464fe17dc3bd2459ee
7
- data.tar.gz: aa0d5eed54594c373972e07d9b937d22a49c314287812141e108755bd9e1b3aa7dd8b2777492e54cf6f339217ad70101b2ee26117048027c85f72601717a3afb
6
+ metadata.gz: 301f74f40020662e3f161379f7063ca639ac845946f19831e12715340980b7b03d0b9e492116137d544841ec8b03f5266344002726aa0748764f69c8e0d8f535
7
+ data.tar.gz: 50cb237e7c8d5de3a45b35b361947ad36f58a4aab8ebaa3e6a966a44c9e32cde932025d59b27d0736e7e01df2debc4fd8e23b5230f09b3b319426c3bf85e440b
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --require spec_helper
2
+ --format documentation
3
+ -I lib
@@ -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'
@@ -0,0 +1,8 @@
1
+ require 'simplecov-console'
2
+
3
+ SimpleCov.start do
4
+ formatter SimpleCov::Formatter::MultiFormatter.new([
5
+ SimpleCov::Formatter::Console,
6
+ SimpleCov::Formatter::HTMLFormatter
7
+ ])
8
+ end
data/Gemfile CHANGED
@@ -4,3 +4,4 @@ source "https://rubygems.org"
4
4
  gemspec
5
5
 
6
6
  gem "rake", "~> 12.0"
7
+
data/Rakefile CHANGED
@@ -1,2 +1,14 @@
1
- require "bundler/gem_tasks"
2
- task :default => :spec
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]
@@ -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
@@ -1,6 +1,27 @@
1
- require "action_alexa/version"
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 Error < StandardError; end
5
- # Your code goes here...
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,4 @@
1
+ module ActionAlexa
2
+ class Error < StandardError; end
3
+ class MissingConfiguration < StandardError; end
4
+ 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,4 @@
1
+ module ActionAlexa
2
+ class Railtie < Rails::Railtie
3
+ end
4
+ 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
@@ -1,3 +1,3 @@
1
1
  module ActionAlexa
2
- VERSION = "0.1.0"
2
+ VERSION = '0.1.1'.freeze
3
3
  end
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.0
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-08-11 00:00:00.000000000 Z
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: []