stealth 2.0.0.beta4 → 2.0.0.beta5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +58 -3
- data/CHANGELOG.md +3 -0
- data/Gemfile.lock +3 -3
- data/VERSION +1 -1
- data/lib/stealth/base.rb +1 -1
- data/lib/stealth/controller/controller.rb +9 -0
- data/lib/stealth/controller/replies.rb +5 -1
- data/lib/stealth/errors.rb +3 -0
- data/lib/stealth/helpers/redis.rb +3 -3
- data/lib/stealth/logger.rb +1 -1
- data/lib/stealth/server.rb +1 -1
- data/lib/stealth/service_message.rb +1 -1
- data/spec/configuration_spec.rb +1 -1
- data/spec/controller/controller_spec.rb +34 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 24ba7ba55d264e21395db7b9166ecf96064c2c0d8c8bc51d09dd274ecaf5fd34
|
4
|
+
data.tar.gz: c42254f819550577f249fddb13266cfa6bc8e2f27760994e3efdf7798447ecdd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f1af77ae1b811b4f53f85df2365fae399efe6caf9db77a801898250dfcdb732e366b06efa1641b255eda53e2a22fff38ca7a8ebd6577d6dcf860509d002c261
|
7
|
+
data.tar.gz: 7146a30ad60302ccc322e6691c6676b6b281dee1625bc1acf674e133b87d371b5cc470c5d3d4eb6d50526d33992a81f424364fbf4b10e23d93910aed815b5864
|
data/.circleci/config.yml
CHANGED
@@ -3,7 +3,7 @@ version: 2
|
|
3
3
|
jobs:
|
4
4
|
ruby_2_6:
|
5
5
|
docker:
|
6
|
-
- image:
|
6
|
+
- image: cimg/ruby:2.6
|
7
7
|
environment:
|
8
8
|
STEALTH_ENV: test
|
9
9
|
|
@@ -56,7 +56,7 @@ jobs:
|
|
56
56
|
destination: test-results
|
57
57
|
ruby_2_7:
|
58
58
|
docker:
|
59
|
-
- image:
|
59
|
+
- image: cimg/ruby:2.7
|
60
60
|
environment:
|
61
61
|
STEALTH_ENV: test
|
62
62
|
|
@@ -110,7 +110,61 @@ jobs:
|
|
110
110
|
|
111
111
|
ruby_3_0:
|
112
112
|
docker:
|
113
|
-
- image:
|
113
|
+
- image: cimg/ruby:3.0
|
114
|
+
environment:
|
115
|
+
STEALTH_ENV: test
|
116
|
+
|
117
|
+
working_directory: ~/repo
|
118
|
+
|
119
|
+
steps:
|
120
|
+
- checkout
|
121
|
+
|
122
|
+
# Download and cache dependencies
|
123
|
+
- restore_cache:
|
124
|
+
keys:
|
125
|
+
- v1-dependencies-{{ checksum "Gemfile.lock" }}
|
126
|
+
# fallback to using the latest cache if no exact match is found
|
127
|
+
- v1-dependencies-
|
128
|
+
- run:
|
129
|
+
name: Configure Bundler
|
130
|
+
command: |
|
131
|
+
echo 'export BUNDLER_VERSION=$(cat Gemfile.lock | tail -1 | tr -d " ")' >> $BASH_ENV
|
132
|
+
source $BASH_ENV
|
133
|
+
gem install bundler
|
134
|
+
- run:
|
135
|
+
name: install dependencies
|
136
|
+
command: |
|
137
|
+
bundle install --jobs=4 --retry=3 --path vendor/bundle
|
138
|
+
|
139
|
+
- save_cache:
|
140
|
+
paths:
|
141
|
+
- ./vendor/bundle
|
142
|
+
key: v1-dependencies-{{ checksum "Gemfile.lock" }}
|
143
|
+
|
144
|
+
# run tests!
|
145
|
+
- run:
|
146
|
+
name: run tests
|
147
|
+
command: |
|
148
|
+
mkdir /tmp/test-results
|
149
|
+
TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)"
|
150
|
+
|
151
|
+
bundle exec rspec --format progress \
|
152
|
+
--format RspecJunitFormatter \
|
153
|
+
--out /tmp/test-results/rspec.xml \
|
154
|
+
--format progress \
|
155
|
+
-- \
|
156
|
+
$TEST_FILES
|
157
|
+
|
158
|
+
# collect reports
|
159
|
+
- store_test_results:
|
160
|
+
path: /tmp/test-results
|
161
|
+
- store_artifacts:
|
162
|
+
path: /tmp/test-results
|
163
|
+
destination: test-results
|
164
|
+
|
165
|
+
ruby_3_1:
|
166
|
+
docker:
|
167
|
+
- image: cimg/ruby:3.1
|
114
168
|
environment:
|
115
169
|
STEALTH_ENV: test
|
116
170
|
|
@@ -169,3 +223,4 @@ workflows:
|
|
169
223
|
- ruby_2_6
|
170
224
|
- ruby_2_7
|
171
225
|
- ruby_3_0
|
226
|
+
- ruby_3_1
|
data/CHANGELOG.md
CHANGED
@@ -53,6 +53,9 @@
|
|
53
53
|
* [Controllers] `handle_message` now supports `Regexp` keys.
|
54
54
|
* [Configuration] `database.yml` is now parsed with ERB in order to support environment variables. Thanks @malkovro.
|
55
55
|
* [Replies] Speech and SSML replies now use `speech` and `ssml` as keys, respectively, instead of `text`
|
56
|
+
* [Replies] Voice services (determined by having "voice" in the name) now automatically skip auto-delays.
|
57
|
+
* [Controllers] `current_message` now has a `confidence` attribute containing a float with the confidence value of the transcription (from 0 to 1).
|
58
|
+
* [Controllers] Added a `halt!` method that can be used with the controller error handlers to stop code execution.
|
56
59
|
|
57
60
|
## Bug Fixes
|
58
61
|
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
stealth (2.0.0.
|
4
|
+
stealth (2.0.0.beta5)
|
5
5
|
activesupport (~> 6.0)
|
6
6
|
multi_json (~> 1.12)
|
7
7
|
puma (>= 4.2, < 6.0)
|
@@ -12,13 +12,13 @@ PATH
|
|
12
12
|
GEM
|
13
13
|
remote: https://rubygems.org/
|
14
14
|
specs:
|
15
|
-
activesupport (6.1.
|
15
|
+
activesupport (6.1.5)
|
16
16
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
17
17
|
i18n (>= 1.6, < 2)
|
18
18
|
minitest (>= 5.1)
|
19
19
|
tzinfo (~> 2.0)
|
20
20
|
zeitwerk (~> 2.3)
|
21
|
-
concurrent-ruby (1.1.
|
21
|
+
concurrent-ruby (1.1.10)
|
22
22
|
connection_pool (2.2.5)
|
23
23
|
diff-lcs (1.3)
|
24
24
|
i18n (1.10.0)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0.0.
|
1
|
+
2.0.0.beta5
|
data/lib/stealth/base.rb
CHANGED
@@ -88,7 +88,7 @@ module Stealth
|
|
88
88
|
|
89
89
|
Thread.current[:configuration] ||= begin
|
90
90
|
@semaphore.synchronize do
|
91
|
-
services_config = YAML.
|
91
|
+
services_config = YAML.safe_load(ERB.new(services_yaml).result, aliases: true)
|
92
92
|
|
93
93
|
unless services_config.has_key?(env)
|
94
94
|
raise Stealth::Errors::ConfigurationError, "Could not find services.yml configuration for #{env} environment"
|
@@ -91,6 +91,11 @@ module Stealth
|
|
91
91
|
unless flow_controller.progressed?
|
92
92
|
run_catch_all(reason: 'Did not send replies, update session, or step')
|
93
93
|
end
|
94
|
+
rescue Stealth::Errors::Halted
|
95
|
+
Stealth::Logger.l(
|
96
|
+
topic: "session",
|
97
|
+
message: "User #{current_session_id}: session halted."
|
98
|
+
)
|
94
99
|
rescue StandardError => e
|
95
100
|
if e.class == Stealth::Errors::UnrecognizedMessage
|
96
101
|
run_unrecognized_message(err: e)
|
@@ -215,6 +220,10 @@ module Stealth
|
|
215
220
|
@progressed = :do_nothing
|
216
221
|
end
|
217
222
|
|
223
|
+
def halt!
|
224
|
+
raise Stealth::Errors::Halted
|
225
|
+
end
|
226
|
+
|
218
227
|
private
|
219
228
|
|
220
229
|
def update_session(flow:, state:)
|
@@ -72,8 +72,12 @@ module Stealth
|
|
72
72
|
|
73
73
|
private
|
74
74
|
|
75
|
+
def voice_service?
|
76
|
+
current_service.match?(/voice/)
|
77
|
+
end
|
78
|
+
|
75
79
|
def send_reply(reply:)
|
76
|
-
if !reply.delay? && Stealth.config.auto_insert_delays
|
80
|
+
if !reply.delay? && Stealth.config.auto_insert_delays && !voice_service?
|
77
81
|
# if it's the first reply in the service_reply or the previous reply
|
78
82
|
# wasn't a custom delay, then insert a delay
|
79
83
|
if @previous_reply.blank? || !@previous_reply.delay?
|
data/lib/stealth/errors.rb
CHANGED
@@ -21,9 +21,9 @@ module Stealth
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def getex(key, expiration=Stealth.config.session_ttl)
|
24
|
-
$redis.multi do
|
25
|
-
|
26
|
-
|
24
|
+
$redis.multi do |pipeline|
|
25
|
+
pipeline.expire(key, expiration)
|
26
|
+
pipeline.get(key)
|
27
27
|
end.last
|
28
28
|
end
|
29
29
|
|
data/lib/stealth/logger.rb
CHANGED
data/lib/stealth/server.rb
CHANGED
@@ -21,7 +21,7 @@ module Stealth
|
|
21
21
|
<body>
|
22
22
|
<center>
|
23
23
|
<a href='https://hellostealth.org'>
|
24
|
-
<img src='
|
24
|
+
<img src='https://raw.githubusercontent.com/hellostealth/stealth/master/logo.svg' height='120' alt='Stealth Logo' aria-label='hellostealth.org' />
|
25
25
|
</a>
|
26
26
|
</center>
|
27
27
|
</body>
|
data/spec/configuration_spec.rb
CHANGED
@@ -6,7 +6,7 @@ describe "Stealth::Configuration" do
|
|
6
6
|
|
7
7
|
describe "accessing via method calling" do
|
8
8
|
let(:services_yml) { File.read(File.join(File.dirname(__FILE__), 'support', 'services.yml')) }
|
9
|
-
let(:parsed_config) { YAML.
|
9
|
+
let(:parsed_config) { YAML.safe_load(ERB.new(services_yml).result, aliases: true)[Stealth.env] }
|
10
10
|
let(:config) { Stealth.load_services_config!(services_yml) }
|
11
11
|
|
12
12
|
it "should return the root node" do
|
@@ -42,6 +42,11 @@ describe "Stealth::Controller" do
|
|
42
42
|
def parts_unknown
|
43
43
|
step_to flow: :parts, state: :unknown
|
44
44
|
end
|
45
|
+
|
46
|
+
def halted
|
47
|
+
halt!
|
48
|
+
step_to state: :other_action2
|
49
|
+
end
|
45
50
|
end
|
46
51
|
|
47
52
|
class FlowMap
|
@@ -60,6 +65,7 @@ describe "Stealth::Controller" do
|
|
60
65
|
state :other_action4
|
61
66
|
state :broken_action
|
62
67
|
state :part_unknown
|
68
|
+
state :halted
|
63
69
|
state :deprecated_action, redirects_to: :other_action
|
64
70
|
state :deprecated_action2, redirects_to: 'mr_robot->my_action'
|
65
71
|
end
|
@@ -884,6 +890,34 @@ describe "Stealth::Controller" do
|
|
884
890
|
controller.action(action: :parts_unknown)
|
885
891
|
end
|
886
892
|
end
|
893
|
+
|
894
|
+
describe "halt!" do
|
895
|
+
it "should catch the error and log the sessio halt" do
|
896
|
+
### It's lame we have to include these two
|
897
|
+
expect(Stealth::Logger).to receive(:l).with(
|
898
|
+
topic: "primary_session",
|
899
|
+
message: "User #{facebook_message.sender_id}: setting session to mr_tron->halted"
|
900
|
+
)
|
901
|
+
expect(Stealth::Logger).to receive(:l).with(
|
902
|
+
topic: "previous_session",
|
903
|
+
message: "User #{facebook_message.sender_id}: setting to parts->unknown"
|
904
|
+
)
|
905
|
+
###
|
906
|
+
|
907
|
+
expect(Stealth::Logger).to receive(:l).with(
|
908
|
+
topic: "session",
|
909
|
+
message: "User #{facebook_message.sender_id}: session halted."
|
910
|
+
)
|
911
|
+
|
912
|
+
controller.step_to(flow: :mr_tron, state: :halted)
|
913
|
+
end
|
914
|
+
|
915
|
+
it "should NOT continue with the rest of the controller code" do
|
916
|
+
expect_any_instance_of(MrTronsController).to_not receive(:other_action2)
|
917
|
+
expect_any_instance_of(MrTronsController).to_not receive(:step_to).with(state: :other_action2)
|
918
|
+
controller.step_to(flow: :mr_tron, state: :halted)
|
919
|
+
end
|
920
|
+
end
|
887
921
|
end
|
888
922
|
|
889
923
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stealth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.
|
4
|
+
version: 2.0.0.beta5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mauricio Gomes
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2022-03-
|
12
|
+
date: 2022-03-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
@@ -327,7 +327,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
327
327
|
- !ruby/object:Gem::Version
|
328
328
|
version: 1.3.1
|
329
329
|
requirements: []
|
330
|
-
rubygems_version: 3.
|
330
|
+
rubygems_version: 3.3.7
|
331
331
|
signing_key:
|
332
332
|
specification_version: 4
|
333
333
|
summary: Ruby framework for conversational bots
|