waylon-core 0.1.1 → 0.1.4

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: '0381c0f70f922e5958355430bef0ec1c8fd5d966b77b032f866fa9ecdcd3dd18'
4
- data.tar.gz: 13b63cef7b5e7575b5d564d43cb599bd326e0b9ed499be5df1b08a1c191fc073
3
+ metadata.gz: bb29b523a0f093d01b8a9abdf5cd23d54b2815ae0430b81f8e670680959d02f6
4
+ data.tar.gz: 4c79ff418934e61e9063db9568d2397409117afd2a7519d9b4c9348233991667
5
5
  SHA512:
6
- metadata.gz: bf835c89b14aa09e591fd8ca11b7c27065d0ad8262c2248ca261d897f320c0c5128d15154454407c32d35021dead332bcfb0597507e337dd7ee9de186bea2f1f
7
- data.tar.gz: 2eb7a29a02dcc44c85ed8dd0c74999299dae4ed1bb2736d6d076e9c1885ea80b96ffdc71288f730fe68de5c2487e23183d6adf0239f23112bec2cf9cf2e006ed
6
+ metadata.gz: 505ad2082ae04e37478e03637b13952d81d8c26c9e8107eeded3b4247ae25f776f7d1d7d4a4fd0739edd670ba74256e33adbd22c6f46957f528c820ef371bfce
7
+ data.tar.gz: a9c1b1de874c75d7d909a83904e46360236334f652dae8ad059d5adf8b405315030245420dba3a8e159b21d99d221a502d30cfe439f2b2b77411ff06261af695
data/.roxanne.yml CHANGED
@@ -1,4 +1,8 @@
1
1
  version: 1.0
2
2
  stages:
3
3
  test:
4
- image: ruby:3.0
4
+ image: ruby:3.1
5
+ release:
6
+ image: ruby:3.1
7
+ only:
8
+ - main
data/.rubocop.yml CHANGED
@@ -21,7 +21,10 @@ Gemspec/RequireMFA:
21
21
  Enabled: false
22
22
 
23
23
  Metrics/AbcSize:
24
- Max: 19
24
+ Max: 19.5
25
+
26
+ Metrics/ClassLength:
27
+ Max: 200
25
28
 
26
29
  Metrics/CyclomaticComplexity:
27
30
  Max: 9
@@ -32,7 +35,11 @@ Metrics/PerceivedComplexity:
32
35
  Metrics/MethodLength:
33
36
  Max: 20
34
37
 
38
+ Metrics/ParameterLists:
39
+ Max: 6
40
+
35
41
  Metrics/BlockLength:
36
42
  Exclude:
37
43
  - "**/*_spec.rb"
38
44
  - "*.gemspec"
45
+ - "lib/waylon/rspec/matchers/**/*.rb"
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.0.3
1
+ 3.1.2
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- waylon-core (0.1.1)
4
+ waylon-core (0.1.4)
5
5
  addressable (~> 2.8)
6
6
  faraday (~> 1.8)
7
7
  i18n (~> 1.8)
@@ -16,10 +16,10 @@ GEM
16
16
  addressable (2.8.0)
17
17
  public_suffix (>= 2.0.2, < 5.0)
18
18
  ast (2.4.2)
19
- concurrent-ruby (1.1.9)
20
- diff-lcs (1.4.4)
19
+ concurrent-ruby (1.1.10)
20
+ diff-lcs (1.5.0)
21
21
  docile (1.4.0)
22
- faraday (1.9.3)
22
+ faraday (1.10.0)
23
23
  faraday-em_http (~> 1.0)
24
24
  faraday-em_synchrony (~> 1.0)
25
25
  faraday-excon (~> 1.1)
@@ -35,72 +35,71 @@ GEM
35
35
  faraday-em_synchrony (1.0.0)
36
36
  faraday-excon (1.1.0)
37
37
  faraday-httpclient (1.0.1)
38
- faraday-multipart (1.0.2)
38
+ faraday-multipart (1.0.3)
39
39
  multipart-post (>= 1.2, < 3)
40
40
  faraday-net_http (1.0.1)
41
41
  faraday-net_http_persistent (1.2.0)
42
42
  faraday-patron (1.0.0)
43
43
  faraday-rack (1.0.0)
44
44
  faraday-retry (1.0.3)
45
- i18n (1.8.11)
45
+ i18n (1.10.0)
46
46
  concurrent-ruby (~> 1.0)
47
- json (2.6.1)
48
- moneta (1.4.2)
47
+ json (2.6.2)
48
+ moneta (1.5.1)
49
49
  mono_logger (1.1.1)
50
50
  multi_json (1.15.0)
51
51
  multipart-post (2.1.1)
52
52
  mustermann (1.1.1)
53
53
  ruby2_keywords (~> 0.0.1)
54
54
  nio4r (2.5.8)
55
- parallel (1.21.0)
56
- parser (3.0.3.2)
55
+ parallel (1.22.1)
56
+ parser (3.1.2.0)
57
57
  ast (~> 2.4.1)
58
- public_suffix (4.0.6)
59
- puma (5.5.2)
58
+ public_suffix (4.0.7)
59
+ puma (5.6.4)
60
60
  nio4r (~> 2.0)
61
61
  rack (2.2.3)
62
- rack-protection (2.1.0)
62
+ rack-protection (2.2.0)
63
63
  rack
64
- rainbow (3.0.0)
64
+ rainbow (3.1.1)
65
65
  rake (13.0.6)
66
- redis (4.5.1)
67
- redis-namespace (1.8.1)
66
+ redis (4.6.0)
67
+ redis-namespace (1.8.2)
68
68
  redis (>= 3.0.4)
69
- regexp_parser (2.2.0)
70
- resque (2.2.0)
69
+ regexp_parser (2.4.0)
70
+ resque (2.2.1)
71
71
  mono_logger (~> 1.0)
72
72
  multi_json (~> 1.0)
73
73
  redis-namespace (~> 1.6)
74
74
  sinatra (>= 0.9.2)
75
- vegas (~> 0.1.2)
76
75
  rexml (3.2.5)
77
- rspec (3.10.0)
78
- rspec-core (~> 3.10.0)
79
- rspec-expectations (~> 3.10.0)
80
- rspec-mocks (~> 3.10.0)
81
- rspec-core (3.10.1)
82
- rspec-support (~> 3.10.0)
83
- rspec-expectations (3.10.1)
76
+ rspec (3.11.0)
77
+ rspec-core (~> 3.11.0)
78
+ rspec-expectations (~> 3.11.0)
79
+ rspec-mocks (~> 3.11.0)
80
+ rspec-core (3.11.0)
81
+ rspec-support (~> 3.11.0)
82
+ rspec-expectations (3.11.0)
84
83
  diff-lcs (>= 1.2.0, < 2.0)
85
- rspec-support (~> 3.10.0)
86
- rspec-mocks (3.10.2)
84
+ rspec-support (~> 3.11.0)
85
+ rspec-mocks (3.11.1)
87
86
  diff-lcs (>= 1.2.0, < 2.0)
88
- rspec-support (~> 3.10.0)
89
- rspec-support (3.10.3)
90
- rubocop (1.23.0)
87
+ rspec-support (~> 3.11.0)
88
+ rspec-support (3.11.0)
89
+ rubocop (1.29.1)
91
90
  parallel (~> 1.10)
92
- parser (>= 3.0.0.0)
91
+ parser (>= 3.1.0.0)
93
92
  rainbow (>= 2.2.2, < 4.0)
94
93
  regexp_parser (>= 1.8, < 3.0)
95
- rexml
96
- rubocop-ast (>= 1.12.0, < 2.0)
94
+ rexml (>= 3.2.5, < 4.0)
95
+ rubocop-ast (>= 1.17.0, < 2.0)
97
96
  ruby-progressbar (~> 1.7)
98
97
  unicode-display_width (>= 1.4.0, < 3.0)
99
- rubocop-ast (1.15.0)
100
- parser (>= 3.0.1.1)
98
+ rubocop-ast (1.18.0)
99
+ parser (>= 3.1.1.0)
101
100
  rubocop-rake (0.6.0)
102
101
  rubocop (~> 1.0)
103
- rubocop-rspec (2.6.0)
102
+ rubocop-rspec (2.11.1)
104
103
  rubocop (~> 1.19)
105
104
  ruby-progressbar (1.11.0)
106
105
  ruby2_keywords (0.0.5)
@@ -109,25 +108,24 @@ GEM
109
108
  simplecov-html (~> 0.11)
110
109
  simplecov_json_formatter (~> 0.1)
111
110
  simplecov-html (0.12.3)
112
- simplecov_json_formatter (0.1.3)
113
- sinatra (2.1.0)
111
+ simplecov_json_formatter (0.1.4)
112
+ sinatra (2.2.0)
114
113
  mustermann (~> 1.0)
115
114
  rack (~> 2.2)
116
- rack-protection (= 2.1.0)
115
+ rack-protection (= 2.2.0)
117
116
  tilt (~> 2.0)
118
117
  tilt (2.0.10)
119
118
  unicode-display_width (2.1.0)
120
- vegas (0.1.11)
121
- rack (>= 1.0.0)
122
119
  webrick (1.7.0)
123
120
  yard (0.9.27)
124
121
  webrick (~> 1.7.0)
125
122
 
126
123
  PLATFORMS
127
124
  arm64-darwin-21
125
+ x86_64-linux
128
126
 
129
127
  DEPENDENCIES
130
- bundler (~> 2.2)
128
+ bundler (~> 2.3)
131
129
  rake (~> 13.0)
132
130
  rspec (~> 3.10)
133
131
  rubocop (~> 1.23)
@@ -138,4 +136,4 @@ DEPENDENCIES
138
136
  yard (~> 0.9, >= 0.9.27)
139
137
 
140
138
  BUNDLED WITH
141
- 2.2.32
139
+ 2.3.10
data/README.md CHANGED
@@ -44,7 +44,7 @@ Alone, this library isn't super useful for running a bot, but it does include a
44
44
 
45
45
  ## Development
46
46
 
47
- Waylon's development pipeline makes heavy use of [RSpec](https://rspec.info/) for testing (and [SimpleCov](https://github.com/simplecov-ruby/simplecov) for reporting on coverage), [Rubocop](https://rubocop.org/) for linting/format checking, [YARD](https://yardoc.org/) for documentation, and [Travis CI](https://www.travis-ci.com/) for CI. Most of this is built-in and will work out-of-the-box for GitHub PRs.
47
+ Waylon's development pipeline makes heavy use of [RSpec](https://rspec.info/) for testing (and [SimpleCov](https://github.com/simplecov-ruby/simplecov) for reporting on coverage), [Rubocop](https://rubocop.org/) for linting/format checking, [YARD](https://yardoc.org/) for documentation, and [RoxanneCI](https://github.com/apps/roxanneci) for CI. Most of this is built-in and will work out-of-the-box for GitHub PRs.
48
48
 
49
49
  To get started locally, after checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rake` to run the tests and linting. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
50
50
 
@@ -10,19 +10,37 @@ module Waylon
10
10
  # @param action [Symbol] The method to call if the condition matches
11
11
  # @param allowed_groups [Array<Symbol>] The group names allowed to use this action
12
12
  # @param help [String] Optional help text to describe usage for this action
13
- def initialize(mechanism, action, allowed_groups, help = nil)
13
+ # @param mention_only [Boolean] Only applies to messages that directly mention (or IM) this bot
14
+ # rubocop:disable Style/OptionalBooleanParameter
15
+ def initialize(mechanism, action, allowed_groups, help = nil, mention_only = true)
14
16
  @mechanism = mechanism
15
17
  @action = action
16
18
  @allowed_groups = allowed_groups
17
19
  @help = help
20
+ @mention_only = mention_only
18
21
  end
22
+ # rubocop:enable Style/OptionalBooleanParameter
19
23
 
20
24
  # Placeholder for determining if this condition applies to the given input
21
25
  # @param _input [Waylon::Message] The input message
26
+ # @return [Boolean]
22
27
  def matches?(_input)
23
28
  false
24
29
  end
25
30
 
31
+ # Is this condition only valid for Messages that directly mention the bot?
32
+ # @return [Boolean]
33
+ def mention_only?
34
+ @mention_only
35
+ end
36
+
37
+ # Placeholder for optionally providing _named_ tokens
38
+ # @param _input [String] The message content
39
+ # @return [Hash<String,Object>]
40
+ def named_tokens(_input)
41
+ {}
42
+ end
43
+
26
44
  # Checks if a user is allowed based on this condition
27
45
  # @param user [Waylon::User] abstract user
28
46
  def permits?(user)
@@ -44,6 +62,16 @@ module Waylon
44
62
  permitted
45
63
  end
46
64
 
65
+ # Determines of a message complies with the {#mention_only?} setting for this condition
66
+ # @param message [Waylon::Message] The received message
67
+ # @return [Boolean]
68
+ def properly_mentions?(message)
69
+ return true unless mention_only?
70
+
71
+ message.to_bot?
72
+ # (mention_only? && message.to_bot?) || (!mention_only? && !message.to_bot?)
73
+ end
74
+
47
75
  # Tokens is used to provide details about the message input to the action
48
76
  # @param _input [String] The message content as text
49
77
  # @return [Array<String>] The tokens extracted from the input message
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Waylon
4
+ module Conditions
5
+ # A pre-made catch-all condition for ignoring messages
6
+ class BlackHole < Condition
7
+ # Overrides normal Condition initialization to force a specific action
8
+ def initialize(*_args) # rubocop:disable Lint/MissingSuper
9
+ @mechanism = nil
10
+ @action = :ignore
11
+ @allowed_groups = [:everyone]
12
+ @help = ""
13
+ end
14
+
15
+ # Matches any input (since the Default route, when used, should always function)
16
+ # @return [Boolean]
17
+ def matches?(_input)
18
+ true
19
+ end
20
+
21
+ # Permits any user (since the Default route, when used, should always function)
22
+ # @return [Boolean]
23
+ def permits?(_user)
24
+ true
25
+ end
26
+
27
+ # Just provides back all input as a single token
28
+ # @return [Array<String>]
29
+ def tokens(input)
30
+ [input]
31
+ end
32
+ end
33
+ end
34
+ end
@@ -17,6 +17,14 @@ module Waylon
17
17
  def tokens(input)
18
18
  @mechanism.match(input).to_a[1..]
19
19
  end
20
+
21
+ # Provides the _named_ regular expression match groups as a hash
22
+ # @param input [String] The message text
23
+ # @return [Hash<Symbol,String>] The named regular expression match groups
24
+ def named_tokens(input)
25
+ match_data = @mechanism.match(input)
26
+ match_data.names.to_h { |n| [n.to_sym, match_data[n]] }
27
+ end
20
28
  end
21
29
  end
22
30
  end
data/lib/waylon/config.rb CHANGED
@@ -23,7 +23,7 @@ module Waylon
23
23
  true
24
24
  end
25
25
 
26
- # A list of emails specified via the CONF_GLOBAL_ADMINS environment variable
26
+ # A list of emails specified via the GLOBAL_ADMINS environment variable
27
27
  # @return [Array<String>] a list of emails
28
28
  def admins
29
29
  admin_emails = self["global.admins"]
@@ -32,15 +32,16 @@ module Waylon
32
32
 
33
33
  # Load in the config from env variables
34
34
  # @return [Boolean] Was the configuration loaded?
35
- def load_env
35
+ def load_env # rubocop:disable Metrics/AbcSize
36
36
  @schema ||= {}
37
37
  self["global.log.level"] = ENV.fetch("LOG_LEVEL", "info")
38
38
  self["global.redis.host"] = ENV.fetch("REDIS_HOST", "redis")
39
39
  self["global.redis.port"] = ENV.fetch("REDIS_PORT", "6379")
40
+ self["global.admins"] = ENV.fetch("GLOBAL_ADMINS", "")
40
41
  ENV.keys.grep(/CONF_/).each do |env_key|
41
42
  conf_key = env_key.downcase.split("_")[1..].join(".")
42
43
  ::Waylon::Logger.log("Attempting to set #{conf_key} from #{env_key}", :debug)
43
- self[conf_key] = ENV[env_key]
44
+ self[conf_key] = ENV.fetch(env_key, nil)
44
45
  end
45
46
  true
46
47
  end
data/lib/waylon/core.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  # Standard Library dependencies
4
4
  require "base64"
5
+ require "benchmark"
5
6
  require "digest"
6
7
  require "English"
7
8
  require "fileutils"
@@ -21,6 +22,7 @@ require "i18n"
21
22
  require "json"
22
23
  require "moneta"
23
24
  require "resque"
25
+ require "sinatra"
24
26
 
25
27
  # Internal requirements
26
28
  require "waylon/version"
@@ -39,8 +41,12 @@ require "waylon/sense"
39
41
  require "waylon/skill_registry"
40
42
  require "waylon/skill"
41
43
  require "waylon/user"
44
+ require "waylon/conditions/black_hole"
42
45
  require "waylon/conditions/default"
43
46
  require "waylon/conditions/permission_denied"
44
47
  require "waylon/conditions/regex"
48
+ require "waylon/routes/black_hole"
45
49
  require "waylon/routes/default"
46
50
  require "waylon/routes/permission_denied"
51
+ require "waylon/webhook"
52
+ require "waylon/webhook_registry"
data/lib/waylon/group.rb CHANGED
@@ -30,7 +30,7 @@ module Waylon
30
30
  return false unless include?(user)
31
31
 
32
32
  users = members
33
- users.delete(user)
33
+ users.delete(user.email.downcase)
34
34
  storage.store(key, users)
35
35
  true
36
36
  end
data/lib/waylon/logger.rb CHANGED
@@ -6,7 +6,7 @@ module Waylon
6
6
  # The log level as defined in the global Config singleton
7
7
  # @return [String] The current log level
8
8
  def self.level
9
- Config.instance["global.log.level"]
9
+ Config.instance["global.log.level"] || "info"
10
10
  end
11
11
 
12
12
  # Abstraction for sending logs to the logger at some level
@@ -19,12 +19,18 @@ module Waylon
19
19
  # Provides an easy way to access the underlying logger
20
20
  # @return [Logger] The Logger instance
21
21
  def self.logger
22
- return @logger if @logger
22
+ @logger ||= json_logger
23
+ end
24
+
25
+ def self.logger=(logger)
26
+ @logger = logger
27
+ end
23
28
 
24
- @logger = ::Logger.new($stderr)
25
- @logger.level = level
26
- @logger.progname = "Waylon"
27
- @logger.formatter = proc do |severity, datetime, progname, msg|
29
+ def self.json_logger
30
+ a_logger = ::Logger.new($stderr)
31
+ a_logger.level = level
32
+ a_logger.progname = "Waylon"
33
+ a_logger.formatter = proc do |severity, datetime, progname, msg|
28
34
  json_data = JSON.dump(
29
35
  ts: datetime,
30
36
  severity: severity.ljust(5).to_s,
@@ -35,7 +41,8 @@ module Waylon
35
41
  )
36
42
  "#{json_data}\n"
37
43
  end
38
- @logger
44
+
45
+ a_logger
39
46
  end
40
47
  end
41
48
  end
@@ -9,9 +9,29 @@ module Waylon
9
9
  nil
10
10
  end
11
11
 
12
+ # Message body
13
+ def body
14
+ nil
15
+ end
16
+
12
17
  # Message channel (meant to be overwritten by mixing classes)
13
18
  def channel
14
19
  nil
15
20
  end
21
+
22
+ # Does the Message mention the bot (meant to be overwritten by mixing classes)
23
+ def mentions_bot?
24
+ nil
25
+ end
26
+
27
+ # Is the Message a private/direct Message?
28
+ def private?
29
+ false
30
+ end
31
+
32
+ def to_bot?
33
+ # private? || mentions_bot?
34
+ true
35
+ end
16
36
  end
17
37
  end
data/lib/waylon/route.rb CHANGED
@@ -23,7 +23,7 @@ module Waylon
23
23
  @priority = priority
24
24
  end
25
25
 
26
- delegate %i[action help matches? permits? tokens] => :@condition
26
+ delegate %i[action help matches? mention_only? named_tokens permits? properly_mentions? tokens] => :@condition
27
27
 
28
28
  private
29
29
 
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Waylon
4
+ module Routes
5
+ # The route for unroutable events
6
+ class BlackHole < Route
7
+ def initialize(
8
+ name: "black_hole",
9
+ destination: Skills::Default,
10
+ condition: Conditions::BlackHole.new,
11
+ priority: 0
12
+ )
13
+ super
14
+ end
15
+ end
16
+ end
17
+ end
@@ -36,6 +36,13 @@ module Waylon
36
36
  chain :to do |method_name|
37
37
  @method_name = method_name
38
38
  end
39
+
40
+ description do
41
+ result = "route \"#{expected}\""
42
+ result += " to action \"#{@method_name}\"" if @method_name
43
+ result += " while a member of \"#{@group}\"" if @group
44
+ result
45
+ end
39
46
  end
40
47
  end
41
48
  end
@@ -63,7 +63,7 @@ module Waylon
63
63
  msg_details[:channel_id] = channel ? channel.id : chatroom.id
64
64
  end
65
65
 
66
- TestSense.process(msg_details)
66
+ TestSense.perform(msg_details)
67
67
  TestWorker.handle(TestSense.fake_queue)
68
68
  end
69
69
  end
@@ -51,6 +51,8 @@ module Waylon
51
51
  details[:text]
52
52
  end
53
53
 
54
+ alias body text
55
+
54
56
  # Lazily provides the details for TestMessages
55
57
  # @api private
56
58
  # @return [Hash] The details for this TestMessage instance
@@ -22,14 +22,14 @@ module Waylon
22
22
  end
23
23
 
24
24
  # Overrides the Sense.enqueue class method to avoid Resque
25
- def self.enqueue(route, request_id, body)
25
+ def self.enqueue(route, request)
26
26
  details = {
27
27
  "sense" => self,
28
- "message" => request_id,
29
- "tokens" => route.tokens(body.strip)
28
+ "request" => request,
29
+ "route" => route.name
30
30
  }
31
31
 
32
- fake_queue.push [route.destination, route.action, details]
32
+ fake_queue.push [route.destination, details]
33
33
  end
34
34
 
35
35
  # Allows access to the fake version of Resque
@@ -50,15 +50,10 @@ module Waylon
50
50
  @message_list ||= []
51
51
  end
52
52
 
53
- # Receives incoming message details and places work on a queue to be performed by a Skill
54
- # @param message_details [Hash] The details necessary for creating a TestMessage
55
- # @return [void]
56
- def self.process(message_details)
57
- message_list << message_details
58
- message_id = message_list.size - 1
59
- msg = message_class.new(message_id)
60
- route = SkillRegistry.instance.route(msg) || SkillRegistry.instance.default_route
61
- enqueue(route, msg.id, msg.text)
53
+ # Provides a way to use an initial request to reconstitute a Sense-specific Message
54
+ # @return [Waylon::Message]
55
+ def self.message_from_request(request)
56
+ message_class.new(message_list.size - 1, request)
62
57
  end
63
58
 
64
59
  # Emulates reactions by sending a message with the reaction type
@@ -66,7 +61,7 @@ module Waylon
66
61
  # @param type [Symbol,String] The type of reaction to send
67
62
  # @return [void]
68
63
  def self.react(request, type)
69
- msg = message_class.new(request)
64
+ msg = message_from_request(request)
70
65
  msg.channel.post_message(":#{type}:")
71
66
  end
72
67
 
@@ -81,10 +76,21 @@ module Waylon
81
76
  # @param text [String] The message content to send in response to the request
82
77
  # @return [void]
83
78
  def self.reply(request, text)
84
- msg = message_class.new(request)
79
+ msg = message_from_request(request)
85
80
  msg.channel.post_message(text)
86
81
  end
87
82
 
83
+ # Receives incoming message details and places work on a queue to be performed by a Skill
84
+ # @param message_details [Hash] The details necessary for creating a TestMessage
85
+ # @return [void]
86
+ def self.run(message_details)
87
+ message_list << message_details
88
+ message_id = message_list.size - 1
89
+ msg = message_class.new(message_id)
90
+ route = SkillRegistry.route(msg) || SkillRegistry.instance.default_route(msg)
91
+ enqueue(route, message_details)
92
+ end
93
+
88
94
  # Provides all message text sent _by_ Waylon
89
95
  # @return [Array<String>]
90
96
  def self.sent_messages
@@ -41,7 +41,10 @@ end
41
41
  Waylon::RSpec::TestChannel.find_or_create("random")
42
42
 
43
43
  # Load demo skills here
44
+ require "waylon/skills/diagnostics"
44
45
  require "waylon/skills/fun"
46
+ require "waylon/skills/groups"
47
+ require "waylon/skills/help"
45
48
 
46
49
  # Handle demo chat REPL
47
50
  def adminuser
@@ -101,7 +104,7 @@ def handle_input(body, from: this_user, privately: true)
101
104
  else
102
105
  message_count = Waylon::RSpec::TestSense.sent_messages.size
103
106
 
104
- Waylon::RSpec::TestSense.process(msg_details(body, from, privately))
107
+ Waylon::RSpec::TestSense.perform(msg_details(body, from, privately))
105
108
  Waylon::RSpec::TestWorker.handle(Waylon::RSpec::TestSense.fake_queue)
106
109
  result = Waylon::RSpec::TestSense.sent_messages[message_count..].join("\n")
107
110
  puts("(@#{Waylon::RSpec::TestUser.whoami.handle}) >> #{result}")
@@ -147,8 +147,8 @@ module Waylon
147
147
  # @api private
148
148
  # @return [String] A generated email address
149
149
  def self.email_from_name(name)
150
- if ENV["USER_EMAIL"] && name == "homer.simpson"
151
- ENV["USER_EMAIL"]
150
+ if ENV.fetch("USER_EMAIL", nil) && name == "homer.simpson"
151
+ ENV.fetch("USER_EMAIL", nil)
152
152
  else
153
153
  "#{name.downcase.gsub(/[\s_-]/, ".")}@example.com"
154
154
  end
@@ -7,8 +7,8 @@ module Waylon
7
7
  # Instructs the worker to grab an item off the Queue and run it
8
8
  # @param queue [Queue] The queue that contains work to be done
9
9
  def self.handle(queue)
10
- skill, action, details = queue.pop
11
- skill.perform(action, details)
10
+ skill, details = queue.pop
11
+ skill.perform(details)
12
12
  end
13
13
  end
14
14
  end