stealth 2.0.0.beta4 → 2.0.0.beta5
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 +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
|