stealth 1.1.6 → 2.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +15 -54
  3. data/CHANGELOG.md +72 -0
  4. data/Gemfile +1 -1
  5. data/Gemfile.lock +49 -44
  6. data/LICENSE +4 -17
  7. data/README.md +9 -17
  8. data/VERSION +1 -1
  9. data/lib/stealth/base.rb +62 -15
  10. data/lib/stealth/cli.rb +1 -2
  11. data/lib/stealth/commands/console.rb +1 -1
  12. data/lib/stealth/configuration.rb +0 -3
  13. data/lib/stealth/controller/callbacks.rb +1 -1
  14. data/lib/stealth/controller/catch_all.rb +27 -4
  15. data/lib/stealth/controller/controller.rb +168 -49
  16. data/lib/stealth/controller/dev_jumps.rb +41 -0
  17. data/lib/stealth/controller/dynamic_delay.rb +4 -6
  18. data/lib/stealth/controller/interrupt_detect.rb +100 -0
  19. data/lib/stealth/controller/messages.rb +283 -0
  20. data/lib/stealth/controller/nlp.rb +50 -0
  21. data/lib/stealth/controller/replies.rb +178 -40
  22. data/lib/stealth/controller/unrecognized_message.rb +62 -0
  23. data/lib/stealth/core_ext.rb +5 -0
  24. data/lib/stealth/{flow/core_ext.rb → core_ext/numeric.rb} +0 -1
  25. data/lib/stealth/core_ext/string.rb +18 -0
  26. data/lib/stealth/dispatcher.rb +21 -0
  27. data/lib/stealth/errors.rb +12 -0
  28. data/lib/stealth/flow/base.rb +1 -2
  29. data/lib/stealth/flow/specification.rb +3 -2
  30. data/lib/stealth/flow/state.rb +3 -3
  31. data/lib/stealth/generators/builder/Gemfile +4 -3
  32. data/lib/stealth/generators/builder/bot/controllers/bot_controller.rb +42 -0
  33. data/lib/stealth/generators/builder/bot/controllers/catch_alls_controller.rb +2 -0
  34. data/lib/stealth/generators/builder/bot/controllers/goodbyes_controller.rb +2 -0
  35. data/lib/stealth/generators/builder/bot/controllers/hellos_controller.rb +2 -0
  36. data/lib/stealth/generators/builder/bot/controllers/interrupts_controller.rb +9 -0
  37. data/lib/stealth/generators/builder/bot/controllers/unrecognized_messages_controller.rb +9 -0
  38. data/lib/stealth/generators/builder/config/flow_map.rb +8 -0
  39. data/lib/stealth/generators/builder/config/initializers/autoload.rb +8 -0
  40. data/lib/stealth/generators/builder/config/initializers/inflections.rb +16 -0
  41. data/lib/stealth/generators/builder/config/puma.rb +15 -0
  42. data/lib/stealth/helpers/redis.rb +40 -0
  43. data/lib/stealth/lock.rb +83 -0
  44. data/lib/stealth/logger.rb +27 -18
  45. data/lib/stealth/nlp/client.rb +22 -0
  46. data/lib/stealth/nlp/result.rb +57 -0
  47. data/lib/stealth/reloader.rb +90 -0
  48. data/lib/stealth/reply.rb +17 -0
  49. data/lib/stealth/scheduled_reply.rb +3 -3
  50. data/lib/stealth/server.rb +3 -3
  51. data/lib/stealth/service_message.rb +3 -2
  52. data/lib/stealth/service_reply.rb +5 -1
  53. data/lib/stealth/services/base_reply_handler.rb +2 -2
  54. data/lib/stealth/session.rb +106 -53
  55. data/spec/configuration_spec.rb +9 -2
  56. data/spec/controller/callbacks_spec.rb +23 -28
  57. data/spec/controller/catch_all_spec.rb +81 -29
  58. data/spec/controller/controller_spec.rb +444 -43
  59. data/spec/controller/dynamic_delay_spec.rb +16 -18
  60. data/spec/controller/helpers_spec.rb +1 -2
  61. data/spec/controller/interrupt_detect_spec.rb +171 -0
  62. data/spec/controller/messages_spec.rb +744 -0
  63. data/spec/controller/nlp_spec.rb +93 -0
  64. data/spec/controller/replies_spec.rb +446 -11
  65. data/spec/controller/unrecognized_message_spec.rb +168 -0
  66. data/spec/dispatcher_spec.rb +79 -0
  67. data/spec/flow/flow_spec.rb +1 -2
  68. data/spec/flow/state_spec.rb +14 -3
  69. data/spec/helpers/redis_spec.rb +77 -0
  70. data/spec/lock_spec.rb +100 -0
  71. data/spec/nlp/client_spec.rb +23 -0
  72. data/spec/nlp/result_spec.rb +57 -0
  73. data/spec/replies/messages/say_msgs_without_breaks.yml +4 -0
  74. data/spec/replies/messages/say_randomize_speech.yml +10 -0
  75. data/spec/replies/messages/say_randomize_text.yml +10 -0
  76. data/spec/replies/messages/sub1/sub2/say_nested.yml +10 -0
  77. data/spec/reply_spec.rb +61 -0
  78. data/spec/scheduled_reply_spec.rb +23 -0
  79. data/spec/service_reply_spec.rb +1 -2
  80. data/spec/session_spec.rb +251 -12
  81. data/spec/spec_helper.rb +21 -0
  82. data/spec/support/controllers/vaders_controller.rb +24 -0
  83. data/spec/support/nlp_clients/dialogflow.rb +9 -0
  84. data/spec/support/nlp_clients/luis.rb +9 -0
  85. data/spec/support/nlp_results/luis_result.rb +163 -0
  86. data/spec/version_spec.rb +1 -2
  87. data/stealth.gemspec +6 -6
  88. metadata +83 -38
  89. data/docs/00-introduction.md +0 -37
  90. data/docs/01-getting-started.md +0 -21
  91. data/docs/02-local-development.md +0 -40
  92. data/docs/03-basics.md +0 -171
  93. data/docs/04-sessions.md +0 -29
  94. data/docs/05-controllers.md +0 -179
  95. data/docs/06-models.md +0 -39
  96. data/docs/07-replies.md +0 -114
  97. data/docs/08-catchalls.md +0 -49
  98. data/docs/09-messaging-integrations.md +0 -80
  99. data/docs/10-nlp-integrations.md +0 -13
  100. data/docs/11-analytics.md +0 -13
  101. data/docs/12-commands.md +0 -62
  102. data/docs/13-deployment.md +0 -50
  103. data/lib/stealth/generators/builder/config/initializers/.keep +0 -0
@@ -6,6 +6,7 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
6
6
  require 'rspec'
7
7
 
8
8
  require 'stealth'
9
+ require 'sidekiq/testing'
9
10
  require 'mock_redis'
10
11
 
11
12
  # Requires supporting files with custom matchers and macros, etc,
@@ -13,7 +14,27 @@ require 'mock_redis'
13
14
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
14
15
 
15
16
  $redis = MockRedis.new
17
+ $services_yml = File.read(File.join(File.dirname(__FILE__), 'support', 'services.yml'))
16
18
 
17
19
  RSpec.configure do |config|
18
20
  ENV['STEALTH_ENV'] = 'test'
21
+
22
+ config.before(:each) do |example|
23
+ Sidekiq::Testing.fake!
24
+
25
+ Stealth.load_services_config!($services_yml)
26
+ end
27
+
28
+ config.expect_with :rspec do |expectations|
29
+ # This option will default to `true` in RSpec 4. It makes the `description`
30
+ # and `failure_message` of custom matchers include text for helper methods
31
+ # defined using `chain`, e.g.:
32
+ # be_bigger_than(2).and_smaller_than(4).description
33
+ # # => "be bigger than 2 and smaller than 4"
34
+ # ...rather than:
35
+ # # => "be bigger than 2"
36
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
37
+
38
+ expectations.on_potential_false_positives = :nothing
39
+ end
19
40
  end
@@ -0,0 +1,24 @@
1
+ class VadersController < Stealth::Controller
2
+ def my_action
3
+ raise "oops"
4
+ end
5
+
6
+ def my_action2
7
+
8
+ end
9
+
10
+ def my_action3
11
+ do_nothing
12
+ end
13
+
14
+ def action_with_unrecognized_msg
15
+ handle_message(
16
+ 'hello' => proc { puts "Hello world!" },
17
+ 'bye' => proc { puts "Goodbye world!" }
18
+ )
19
+ end
20
+
21
+ def action_with_unrecognized_match
22
+ match = get_match(['hello', 'bye'])
23
+ end
24
+ end
@@ -0,0 +1,9 @@
1
+ module Stealth
2
+ module Nlp
3
+ module Dialogflow
4
+ class Client < Stealth::Nlp::Client
5
+
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Stealth
2
+ module Nlp
3
+ module Luis
4
+ class Client < Stealth::Nlp::Client
5
+
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,163 @@
1
+ module TestNlpResult
2
+ class Luis < Stealth::Nlp::Result
3
+
4
+ ENTITY_MAP = {
5
+ 'money' => :currency, 'number' => :number, 'email' => :email,
6
+ 'percentage' => :percentage, 'Calendar.Duration' => :duration,
7
+ 'geographyV2' => :geo, 'age' => :age, 'phonenumber' => :phone,
8
+ 'ordinalV2' => :ordinal, 'url' => :url, 'dimension' => :dimension,
9
+ 'temperature' => :temp, 'keyPhrase' => :key_phrase, 'name' => :name,
10
+ 'datetimeV2' => :datetime
11
+ }
12
+
13
+ attr_reader :result, :intent
14
+
15
+ def initialize(intent:, entity: :single_number_entity)
16
+ @result = test_responses[entity]
17
+ @intent = intent
18
+ end
19
+
20
+ def parsed_result
21
+ @result
22
+ end
23
+
24
+ def intent_score
25
+ rand
26
+ end
27
+
28
+ def raw_entities
29
+ @result.dig('prediction', 'entities')
30
+ end
31
+
32
+ def entities
33
+ return {} if raw_entities.blank?
34
+ _entities = {}
35
+
36
+ raw_entities.each do |type, values|
37
+ if ENTITY_MAP[type]
38
+ _entities[ENTITY_MAP[type]] = values
39
+ else
40
+ # A custom entity
41
+ _entities[type.to_sym] = values
42
+ end
43
+ end
44
+
45
+ _entities
46
+ end
47
+
48
+ def sentiment
49
+ %i(positive neutral negative).sample
50
+ end
51
+
52
+ def sentiment_score
53
+ rand
54
+ end
55
+
56
+ def present?
57
+ parsed_result.present?
58
+ end
59
+
60
+ private
61
+
62
+ def test_responses
63
+ {
64
+ single_number_entity: {
65
+ "query" => "My score was 78",
66
+ "prediction" => {
67
+ "topIntent" => "None",
68
+ "intents" => {
69
+ "None" => {
70
+ "score" => 0.170594558
71
+ }
72
+ },
73
+ "entities" => {
74
+ "keyPhrase" => [
75
+ "score"
76
+ ],
77
+ "number" => [
78
+ 78
79
+ ]
80
+ },
81
+ "sentiment" => {
82
+ "label" => "neutral",
83
+ "score" => 0.5
84
+ }
85
+ }
86
+ },
87
+
88
+ double_number_entity: {
89
+ "query" => "Their scores were 89 and 97, respectively",
90
+ "prediction" => {
91
+ "topIntent" => "None",
92
+ "intents" => {
93
+ "None" => {
94
+ "score" => 0.5280223
95
+ }
96
+ },
97
+ "entities" => {
98
+ "keyPhrase" => [
99
+ "scores"
100
+ ],
101
+ "number" => [
102
+ 89,
103
+ 97
104
+ ]
105
+ },
106
+ "sentiment" => {
107
+ "label" => "negative",
108
+ "score" => 0.309174955
109
+ }
110
+ }
111
+ },
112
+
113
+ triple_number_entity: {
114
+ "query" => "Their scores were 89, 65, and 97, respectively",
115
+ "prediction" => {
116
+ "topIntent" => "None",
117
+ "intents" => {
118
+ "None" => {
119
+ "score" => 0.6703843
120
+ }
121
+ },
122
+ "entities" => {
123
+ "keyPhrase" => [
124
+ "scores"
125
+ ],
126
+ "number" => [
127
+ 89,
128
+ 65,
129
+ 97
130
+ ]
131
+ },
132
+ "sentiment" => {
133
+ "label" => "negative",
134
+ "score" => 0.309174955
135
+ }
136
+ }
137
+ },
138
+
139
+ custom_entity: {
140
+ "query" => "call me right away",
141
+ "prediction" => {
142
+ "topIntent" => "now",
143
+ "intents" => {
144
+ "now" => {
145
+ "score" => 0.781227
146
+ }
147
+ },
148
+ "entities" => {
149
+ "asap" => [
150
+ ["right away"]
151
+ ]
152
+ },
153
+ "sentiment" => {
154
+ "label" => "neutral",
155
+ "score" => 0.5
156
+ }
157
+ }
158
+ }
159
+ }
160
+ end
161
+
162
+ end
163
+ end
@@ -1,7 +1,6 @@
1
- # coding: utf-8
2
1
  # frozen_string_literal: true
3
2
 
4
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
3
+ require 'spec_helper'
5
4
 
6
5
  describe "Stealth::Version" do
7
6
 
@@ -13,16 +13,16 @@ Gem::Specification.new do |s|
13
13
  s.email = 'mauricio@edge14.com'
14
14
 
15
15
  s.add_dependency 'sinatra', '~> 2.0'
16
- s.add_dependency 'puma', '~> 3.10'
17
- s.add_dependency 'thor', '~> 0.20'
16
+ s.add_dependency 'puma', '>= 4.2', '< 5.0'
17
+ s.add_dependency 'thor', '~> 1.0'
18
18
  s.add_dependency 'multi_json', '~> 1.12'
19
- s.add_dependency 'sidekiq', '~> 5.0'
20
- s.add_dependency 'activesupport', '~> 5.2'
19
+ s.add_dependency 'sidekiq', '~> 6.0'
20
+ s.add_dependency 'activesupport', '~> 6.0'
21
21
 
22
- s.add_development_dependency 'rspec', '~> 3.6'
22
+ s.add_development_dependency 'rspec', '~> 3.9'
23
23
  s.add_development_dependency 'rspec_junit_formatter', '~> 0.3'
24
24
  s.add_development_dependency 'rack-test', '~> 1.1'
25
- s.add_development_dependency 'mock_redis', '~> 0.17'
25
+ s.add_development_dependency 'mock_redis', '~> 0.22'
26
26
 
27
27
  s.files = `git ls-files`.split("\n")
28
28
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stealth
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.6
4
+ version: 2.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mauricio Gomes
8
8
  - Matthew Black
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-03-01 00:00:00.000000000 Z
12
+ date: 2020-09-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sinatra
@@ -29,30 +29,36 @@ dependencies:
29
29
  name: puma
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - "~>"
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '4.2'
35
+ - - "<"
33
36
  - !ruby/object:Gem::Version
34
- version: '3.10'
37
+ version: '5.0'
35
38
  type: :runtime
36
39
  prerelease: false
37
40
  version_requirements: !ruby/object:Gem::Requirement
38
41
  requirements:
39
- - - "~>"
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: '4.2'
45
+ - - "<"
40
46
  - !ruby/object:Gem::Version
41
- version: '3.10'
47
+ version: '5.0'
42
48
  - !ruby/object:Gem::Dependency
43
49
  name: thor
44
50
  requirement: !ruby/object:Gem::Requirement
45
51
  requirements:
46
52
  - - "~>"
47
53
  - !ruby/object:Gem::Version
48
- version: '0.20'
54
+ version: '1.0'
49
55
  type: :runtime
50
56
  prerelease: false
51
57
  version_requirements: !ruby/object:Gem::Requirement
52
58
  requirements:
53
59
  - - "~>"
54
60
  - !ruby/object:Gem::Version
55
- version: '0.20'
61
+ version: '1.0'
56
62
  - !ruby/object:Gem::Dependency
57
63
  name: multi_json
58
64
  requirement: !ruby/object:Gem::Requirement
@@ -73,42 +79,42 @@ dependencies:
73
79
  requirements:
74
80
  - - "~>"
75
81
  - !ruby/object:Gem::Version
76
- version: '5.0'
82
+ version: '6.0'
77
83
  type: :runtime
78
84
  prerelease: false
79
85
  version_requirements: !ruby/object:Gem::Requirement
80
86
  requirements:
81
87
  - - "~>"
82
88
  - !ruby/object:Gem::Version
83
- version: '5.0'
89
+ version: '6.0'
84
90
  - !ruby/object:Gem::Dependency
85
91
  name: activesupport
86
92
  requirement: !ruby/object:Gem::Requirement
87
93
  requirements:
88
94
  - - "~>"
89
95
  - !ruby/object:Gem::Version
90
- version: '5.2'
96
+ version: '6.0'
91
97
  type: :runtime
92
98
  prerelease: false
93
99
  version_requirements: !ruby/object:Gem::Requirement
94
100
  requirements:
95
101
  - - "~>"
96
102
  - !ruby/object:Gem::Version
97
- version: '5.2'
103
+ version: '6.0'
98
104
  - !ruby/object:Gem::Dependency
99
105
  name: rspec
100
106
  requirement: !ruby/object:Gem::Requirement
101
107
  requirements:
102
108
  - - "~>"
103
109
  - !ruby/object:Gem::Version
104
- version: '3.6'
110
+ version: '3.9'
105
111
  type: :development
106
112
  prerelease: false
107
113
  version_requirements: !ruby/object:Gem::Requirement
108
114
  requirements:
109
115
  - - "~>"
110
116
  - !ruby/object:Gem::Version
111
- version: '3.6'
117
+ version: '3.9'
112
118
  - !ruby/object:Gem::Dependency
113
119
  name: rspec_junit_formatter
114
120
  requirement: !ruby/object:Gem::Requirement
@@ -143,14 +149,14 @@ dependencies:
143
149
  requirements:
144
150
  - - "~>"
145
151
  - !ruby/object:Gem::Version
146
- version: '0.17'
152
+ version: '0.22'
147
153
  type: :development
148
154
  prerelease: false
149
155
  version_requirements: !ruby/object:Gem::Requirement
150
156
  requirements:
151
157
  - - "~>"
152
158
  - !ruby/object:Gem::Version
153
- version: '0.17'
159
+ version: '0.22'
154
160
  description: Ruby framework for building conversational bots.
155
161
  email: mauricio@edge14.com
156
162
  executables:
@@ -167,20 +173,6 @@ files:
167
173
  - README.md
168
174
  - VERSION
169
175
  - bin/stealth
170
- - docs/00-introduction.md
171
- - docs/01-getting-started.md
172
- - docs/02-local-development.md
173
- - docs/03-basics.md
174
- - docs/04-sessions.md
175
- - docs/05-controllers.md
176
- - docs/06-models.md
177
- - docs/07-replies.md
178
- - docs/08-catchalls.md
179
- - docs/09-messaging-integrations.md
180
- - docs/10-nlp-integrations.md
181
- - docs/11-analytics.md
182
- - docs/12-commands.md
183
- - docs/13-deployment.md
184
176
  - lib/stealth.rb
185
177
  - lib/stealth/base.rb
186
178
  - lib/stealth/cli.rb
@@ -192,13 +184,20 @@ files:
192
184
  - lib/stealth/controller/callbacks.rb
193
185
  - lib/stealth/controller/catch_all.rb
194
186
  - lib/stealth/controller/controller.rb
187
+ - lib/stealth/controller/dev_jumps.rb
195
188
  - lib/stealth/controller/dynamic_delay.rb
196
189
  - lib/stealth/controller/helpers.rb
190
+ - lib/stealth/controller/interrupt_detect.rb
191
+ - lib/stealth/controller/messages.rb
192
+ - lib/stealth/controller/nlp.rb
197
193
  - lib/stealth/controller/replies.rb
194
+ - lib/stealth/controller/unrecognized_message.rb
195
+ - lib/stealth/core_ext.rb
196
+ - lib/stealth/core_ext/numeric.rb
197
+ - lib/stealth/core_ext/string.rb
198
198
  - lib/stealth/dispatcher.rb
199
199
  - lib/stealth/errors.rb
200
200
  - lib/stealth/flow/base.rb
201
- - lib/stealth/flow/core_ext.rb
202
201
  - lib/stealth/flow/specification.rb
203
202
  - lib/stealth/flow/state.rb
204
203
  - lib/stealth/generators/builder.rb
@@ -212,6 +211,8 @@ files:
212
211
  - lib/stealth/generators/builder/bot/controllers/concerns/.keep
213
212
  - lib/stealth/generators/builder/bot/controllers/goodbyes_controller.rb
214
213
  - lib/stealth/generators/builder/bot/controllers/hellos_controller.rb
214
+ - lib/stealth/generators/builder/bot/controllers/interrupts_controller.rb
215
+ - lib/stealth/generators/builder/bot/controllers/unrecognized_messages_controller.rb
215
216
  - lib/stealth/generators/builder/bot/helpers/bot_helper.rb
216
217
  - lib/stealth/generators/builder/bot/models/bot_record.rb
217
218
  - lib/stealth/generators/builder/bot/models/concerns/.keep
@@ -223,7 +224,8 @@ files:
223
224
  - lib/stealth/generators/builder/config/database.yml
224
225
  - lib/stealth/generators/builder/config/environment.rb
225
226
  - lib/stealth/generators/builder/config/flow_map.rb
226
- - lib/stealth/generators/builder/config/initializers/.keep
227
+ - lib/stealth/generators/builder/config/initializers/autoload.rb
228
+ - lib/stealth/generators/builder/config/initializers/inflections.rb
227
229
  - lib/stealth/generators/builder/config/puma.rb
228
230
  - lib/stealth/generators/builder/config/services.yml
229
231
  - lib/stealth/generators/builder/config/sidekiq.yml
@@ -232,12 +234,17 @@ files:
232
234
  - lib/stealth/generators/generate/flow/controllers/controller.tt
233
235
  - lib/stealth/generators/generate/flow/helpers/helper.tt
234
236
  - lib/stealth/generators/generate/flow/replies/ask_example.tt
237
+ - lib/stealth/helpers/redis.rb
235
238
  - lib/stealth/jobs.rb
239
+ - lib/stealth/lock.rb
236
240
  - lib/stealth/logger.rb
237
241
  - lib/stealth/migrations/configurator.rb
238
242
  - lib/stealth/migrations/generators.rb
239
243
  - lib/stealth/migrations/railtie_config.rb
240
244
  - lib/stealth/migrations/tasks.rb
245
+ - lib/stealth/nlp/client.rb
246
+ - lib/stealth/nlp/result.rb
247
+ - lib/stealth/reloader.rb
241
248
  - lib/stealth/reply.rb
242
249
  - lib/stealth/scheduled_reply.rb
243
250
  - lib/stealth/server.rb
@@ -256,27 +263,46 @@ files:
256
263
  - spec/controller/controller_spec.rb
257
264
  - spec/controller/dynamic_delay_spec.rb
258
265
  - spec/controller/helpers_spec.rb
266
+ - spec/controller/interrupt_detect_spec.rb
267
+ - spec/controller/messages_spec.rb
268
+ - spec/controller/nlp_spec.rb
259
269
  - spec/controller/replies_spec.rb
270
+ - spec/controller/unrecognized_message_spec.rb
271
+ - spec/dispatcher_spec.rb
260
272
  - spec/flow/flow_spec.rb
261
273
  - spec/flow/state_spec.rb
274
+ - spec/helpers/redis_spec.rb
275
+ - spec/lock_spec.rb
276
+ - spec/nlp/client_spec.rb
277
+ - spec/nlp/result_spec.rb
262
278
  - spec/replies/hello.yml.erb
263
279
  - spec/replies/messages/say_hola.yml+facebook.erb
264
280
  - spec/replies/messages/say_hola.yml+twilio.erb
265
281
  - spec/replies/messages/say_hola.yml.erb
266
282
  - spec/replies/messages/say_howdy_with_dynamic.yml
283
+ - spec/replies/messages/say_msgs_without_breaks.yml
267
284
  - spec/replies/messages/say_offer.yml
268
285
  - spec/replies/messages/say_offer_with_dynamic.yml
269
286
  - spec/replies/messages/say_oi.yml.erb
287
+ - spec/replies/messages/say_randomize_speech.yml
288
+ - spec/replies/messages/say_randomize_text.yml
270
289
  - spec/replies/messages/say_yo.yml
271
290
  - spec/replies/messages/say_yo.yml+twitter
291
+ - spec/replies/messages/sub1/sub2/say_nested.yml
292
+ - spec/reply_spec.rb
293
+ - spec/scheduled_reply_spec.rb
272
294
  - spec/service_reply_spec.rb
273
295
  - spec/session_spec.rb
274
296
  - spec/spec_helper.rb
275
297
  - spec/support/alternate_helpers/foo_helper.rb
298
+ - spec/support/controllers/vaders_controller.rb
276
299
  - spec/support/helpers/fun/games_helper.rb
277
300
  - spec/support/helpers/fun/pdf_helper.rb
278
301
  - spec/support/helpers/standalone_helper.rb
279
302
  - spec/support/helpers_typo/users_helper.rb
303
+ - spec/support/nlp_clients/dialogflow.rb
304
+ - spec/support/nlp_clients/luis.rb
305
+ - spec/support/nlp_results/luis_result.rb
280
306
  - spec/support/sample_messages.rb
281
307
  - spec/support/services.yml
282
308
  - spec/support/services_with_erb.yml
@@ -286,7 +312,7 @@ homepage: https://github.com/hellostealth/stealth
286
312
  licenses:
287
313
  - MIT
288
314
  metadata: {}
289
- post_install_message:
315
+ post_install_message:
290
316
  rdoc_options: []
291
317
  require_paths:
292
318
  - lib
@@ -297,12 +323,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
297
323
  version: '0'
298
324
  required_rubygems_version: !ruby/object:Gem::Requirement
299
325
  requirements:
300
- - - ">="
326
+ - - ">"
301
327
  - !ruby/object:Gem::Version
302
- version: '0'
328
+ version: 1.3.1
303
329
  requirements: []
304
- rubygems_version: 3.0.2
305
- signing_key:
330
+ rubygems_version: 3.1.2
331
+ signing_key:
306
332
  specification_version: 4
307
333
  summary: Ruby framework for conversational bots
308
334
  test_files:
@@ -312,27 +338,46 @@ test_files:
312
338
  - spec/controller/controller_spec.rb
313
339
  - spec/controller/dynamic_delay_spec.rb
314
340
  - spec/controller/helpers_spec.rb
341
+ - spec/controller/interrupt_detect_spec.rb
342
+ - spec/controller/messages_spec.rb
343
+ - spec/controller/nlp_spec.rb
315
344
  - spec/controller/replies_spec.rb
345
+ - spec/controller/unrecognized_message_spec.rb
346
+ - spec/dispatcher_spec.rb
316
347
  - spec/flow/flow_spec.rb
317
348
  - spec/flow/state_spec.rb
349
+ - spec/helpers/redis_spec.rb
350
+ - spec/lock_spec.rb
351
+ - spec/nlp/client_spec.rb
352
+ - spec/nlp/result_spec.rb
318
353
  - spec/replies/hello.yml.erb
319
354
  - spec/replies/messages/say_hola.yml+facebook.erb
320
355
  - spec/replies/messages/say_hola.yml+twilio.erb
321
356
  - spec/replies/messages/say_hola.yml.erb
322
357
  - spec/replies/messages/say_howdy_with_dynamic.yml
358
+ - spec/replies/messages/say_msgs_without_breaks.yml
323
359
  - spec/replies/messages/say_offer.yml
324
360
  - spec/replies/messages/say_offer_with_dynamic.yml
325
361
  - spec/replies/messages/say_oi.yml.erb
362
+ - spec/replies/messages/say_randomize_speech.yml
363
+ - spec/replies/messages/say_randomize_text.yml
326
364
  - spec/replies/messages/say_yo.yml
327
365
  - spec/replies/messages/say_yo.yml+twitter
366
+ - spec/replies/messages/sub1/sub2/say_nested.yml
367
+ - spec/reply_spec.rb
368
+ - spec/scheduled_reply_spec.rb
328
369
  - spec/service_reply_spec.rb
329
370
  - spec/session_spec.rb
330
371
  - spec/spec_helper.rb
331
372
  - spec/support/alternate_helpers/foo_helper.rb
373
+ - spec/support/controllers/vaders_controller.rb
332
374
  - spec/support/helpers/fun/games_helper.rb
333
375
  - spec/support/helpers/fun/pdf_helper.rb
334
376
  - spec/support/helpers/standalone_helper.rb
335
377
  - spec/support/helpers_typo/users_helper.rb
378
+ - spec/support/nlp_clients/dialogflow.rb
379
+ - spec/support/nlp_clients/luis.rb
380
+ - spec/support/nlp_results/luis_result.rb
336
381
  - spec/support/sample_messages.rb
337
382
  - spec/support/services.yml
338
383
  - spec/support/services_with_erb.yml