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 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: []