lita 3.3.1 → 4.0.0.rc1

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.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/.travis.yml +3 -0
  4. data/lib/lita.rb +45 -97
  5. data/lib/lita/adapter.rb +38 -17
  6. data/lib/lita/adapters/shell.rb +5 -3
  7. data/lib/lita/authorization.rb +109 -60
  8. data/lib/lita/builder.rb +38 -0
  9. data/lib/lita/callback.rb +37 -0
  10. data/lib/lita/cli.rb +2 -0
  11. data/lib/lita/config.rb +1 -18
  12. data/lib/lita/configurable.rb +29 -0
  13. data/lib/lita/configuration.rb +179 -0
  14. data/lib/lita/configuration_validator.rb +66 -0
  15. data/lib/lita/daemon.rb +4 -11
  16. data/lib/lita/default_configuration.rb +146 -0
  17. data/lib/lita/errors.rb +9 -0
  18. data/lib/lita/handler.rb +5 -264
  19. data/lib/lita/handler/chat_router.rb +130 -0
  20. data/lib/lita/handler/common.rb +114 -0
  21. data/lib/lita/handler/event_router.rb +77 -0
  22. data/lib/lita/handler/http_router.rb +26 -0
  23. data/lib/lita/handlers/authorization.rb +13 -18
  24. data/lib/lita/handlers/deprecation_check.rb +24 -0
  25. data/lib/lita/handlers/help.rb +5 -3
  26. data/lib/lita/handlers/info.rb +2 -2
  27. data/lib/lita/http_callback.rb +29 -0
  28. data/lib/lita/http_route.rb +41 -26
  29. data/lib/lita/namespace.rb +23 -0
  30. data/lib/lita/rack_app.rb +29 -2
  31. data/lib/lita/registry.rb +133 -0
  32. data/lib/lita/robot.rb +58 -20
  33. data/lib/lita/route_validator.rb +12 -4
  34. data/lib/lita/rspec.rb +23 -14
  35. data/lib/lita/rspec/handler.rb +93 -23
  36. data/lib/lita/rspec/matchers/chat_route_matcher.rb +48 -0
  37. data/lib/lita/rspec/matchers/deprecated.rb +36 -0
  38. data/lib/lita/rspec/matchers/event_route_matcher.rb +27 -0
  39. data/lib/lita/rspec/matchers/http_route_matcher.rb +18 -60
  40. data/lib/lita/user.rb +0 -6
  41. data/lib/lita/util.rb +1 -8
  42. data/lib/lita/version.rb +1 -1
  43. data/lita.gemspec +1 -0
  44. data/spec/lita/adapter_spec.rb +25 -7
  45. data/spec/lita/adapters/shell_spec.rb +24 -4
  46. data/spec/lita/authorization_spec.rb +57 -38
  47. data/spec/lita/builder_spec.rb +39 -0
  48. data/spec/lita/config_spec.rb +0 -24
  49. data/spec/lita/configuration_spec.rb +222 -0
  50. data/spec/lita/configuration_validator_spec.rb +112 -0
  51. data/spec/lita/daemon_spec.rb +2 -2
  52. data/spec/lita/default_configuration_spec.rb +254 -0
  53. data/spec/lita/handler/chat_router_spec.rb +192 -0
  54. data/spec/lita/handler/common_spec.rb +272 -0
  55. data/spec/lita/handler/event_router_spec.rb +54 -0
  56. data/spec/lita/handler/http_router_spec.rb +106 -0
  57. data/spec/lita/handler_spec.rb +20 -291
  58. data/spec/lita/handlers/authorization_spec.rb +9 -11
  59. data/spec/lita/handlers/deprecation_check_spec.rb +21 -0
  60. data/spec/lita/handlers/help_spec.rb +31 -9
  61. data/spec/lita/handlers/info_spec.rb +2 -2
  62. data/spec/lita/handlers/room_spec.rb +5 -3
  63. data/spec/lita/robot_spec.rb +30 -11
  64. data/spec/lita/rspec_spec.rb +71 -31
  65. data/spec/lita/user_spec.rb +2 -2
  66. data/spec/lita_spec.rb +62 -4
  67. data/spec/spec_helper.rb +7 -0
  68. data/templates/locales/en.yml +56 -4
  69. data/templates/plugin/gemspec.tt +1 -0
  70. data/templates/plugin/spec/spec_helper.tt +4 -0
  71. metadata +54 -8
  72. data/lib/lita/rspec/matchers/event_subscription_matcher.rb +0 -67
  73. data/lib/lita/rspec/matchers/route_matcher.rb +0 -69
  74. data/spec/lita/rack_app_spec.rb +0 -92
@@ -0,0 +1,77 @@
1
+ module Lita
2
+ class Handler
3
+ # A handler mixin that provides the methods necessary for handling events.
4
+ # @since 4.0.0
5
+ module EventRouter
6
+ # Includes common handler methods in any class that includes {EventRouter}.
7
+ def self.extended(klass)
8
+ klass.send(:include, Common)
9
+ end
10
+
11
+ # @overload on(event_name, method_name)
12
+ # Registers an event subscription. When an event is triggered with
13
+ # {#trigger}, a new instance of the handler will be created and the
14
+ # instance method name supplied to {#on} will be invoked with a payload
15
+ # (a hash of arbitrary keys and values).
16
+ # @param event_name [String, Symbol] The name of the event to subscribe to.
17
+ # @param method_name [String, Symbol] The name of the instance method on
18
+ # the handler that should be invoked when the event is triggered.
19
+ # @return [void]
20
+ # @overload on(event_name, callable)
21
+ # Registers an event subscription. When an event is triggered with
22
+ # {#trigger}, a new instance of the handler will be created and the
23
+ # callable object supplied to {#on} will be evaluated within the context of the new
24
+ # handler instance, and passed a payload (a hash of arbitrary keys and values).
25
+ # @param event_name [String, Symbol] The name of the event to subscribe to.
26
+ # @param callable [#call] A callable object to serve as the event callback.
27
+ # @return [void]
28
+ # @since 4.0.0
29
+ # @overload on(event_name)
30
+ # Registers an event subscription. When an event is triggered with
31
+ # {#trigger}, a new instance of the handler will be created and the
32
+ # block supplied to {#on} will be evaluated within the context of the new
33
+ # handler instance, and passed a payload (a hash of arbitrary keys and values).
34
+ # @param event_name [String, Symbol] The name of the event to subscribe to.
35
+ # @yield The body of the event callback.
36
+ # @return [void]
37
+ # @since 4.0.0
38
+ def on(event_name, method_name_or_callable = nil)
39
+ event_subscriptions[normalize_event(event_name)] << Callback.new(
40
+ method_name_or_callable || (proc if block_given?)
41
+ )
42
+ end
43
+
44
+ # Returns an array of all callbacks registered for the named event.
45
+ # @param event_name [String, Symbol] The name of the event to return callbacks for.
46
+ # @return [Array] The array of callbacks.
47
+ # @since 4.0.0
48
+ def event_subscriptions_for(event_name)
49
+ event_subscriptions[normalize_event(event_name)]
50
+ end
51
+
52
+ # Triggers an event, invoking methods previously registered with {#on} and
53
+ # passing them a payload hash with any arbitrary data.
54
+ # @param robot [Lita::Robot] The currently running robot instance.
55
+ # @param event_name [String, Symbol], The name of the event to trigger.
56
+ # @param payload [Hash] An optional hash of arbitrary data.
57
+ # @return [Boolean] Whether or not the event triggered any callbacks.
58
+ def trigger(robot, event_name, payload = {})
59
+ event_subscriptions_for(event_name).any? do |callback|
60
+ callback.call(new(robot), payload)
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ # A hash of arrays used to store event subscriptions registered with {#on}.
67
+ def event_subscriptions
68
+ @event_subscriptions ||= Hash.new { |h, k| h[k] = [] }
69
+ end
70
+
71
+ # Normalize the event name, ignoring casing and spaces.
72
+ def normalize_event(event_name)
73
+ event_name.to_s.downcase.strip.to_sym
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,26 @@
1
+ module Lita
2
+ class Handler
3
+ # A handler mixin that provides the methods necessary for handling incoming HTTP requests.
4
+ # @since 4.0.0
5
+ module HTTPRouter
6
+ # Includes common handler methods in any class that includes {HTTPRouter}.
7
+ def self.extended(klass)
8
+ klass.send(:include, Common)
9
+ end
10
+
11
+ # Creates a new {Lita::HTTPRoute} which is used to define an HTTP route
12
+ # for the built-in web server.
13
+ # @see Lita::HTTPRoute
14
+ # @return [Lita::HTTPRoute] The new {Lita::HTTPRoute}.
15
+ def http
16
+ HTTPRoute.new(self)
17
+ end
18
+
19
+ # An array of all HTTP routes defined for the handler.
20
+ # @return [Array<Lita::HTTPRoute>] The array of routes.
21
+ def http_routes
22
+ @http_routes ||= []
23
+ end
24
+ end
25
+ end
26
+ end
@@ -25,29 +25,14 @@ module Lita
25
25
  # @param response [Lita::Response] The response object.
26
26
  # @return [void]
27
27
  def add(response)
28
- return unless valid_message?(response)
29
-
30
- if Lita::Authorization.add_user_to_group(response.user, @user, @group)
31
- response.reply t("user_added", user: @user.name, group: @group)
32
- else
33
- response.reply t("user_already_in", user: @user.name, group: @group)
34
- end
28
+ toggle_membership(response, :add_user_to_group, "user_added", "user_already_in")
35
29
  end
36
30
 
37
31
  # Removes a user from an authorization group.
38
32
  # @param response [Lita::Response] The response object.
39
33
  # @return [void]
40
34
  def remove(response)
41
- return unless valid_message?(response)
42
-
43
- if Lita::Authorization.remove_user_from_group(response.user, @user, @group)
44
- response.reply t("user_removed",
45
- user: @user.name,
46
- group: @group
47
- )
48
- else
49
- response.reply t("user_not_in", user: @user.name, group: @group)
50
- end
35
+ toggle_membership(response, :remove_user_from_group, "user_removed", "user_not_in")
51
36
  end
52
37
 
53
38
  # Lists all authorization groups (or only the specified group) and the
@@ -75,7 +60,7 @@ module Lita
75
60
  end
76
61
 
77
62
  def get_groups_list(requested_group)
78
- groups_with_users = Lita::Authorization.groups_with_users
63
+ groups_with_users = robot.auth.groups_with_users
79
64
  if requested_group
80
65
  requested_group = requested_group.downcase.strip.to_sym
81
66
  groups_with_users.select! { |group, _| group == requested_group }
@@ -86,6 +71,16 @@ module Lita
86
71
  end
87
72
  end
88
73
 
74
+ def toggle_membership(response, method_name, success_key, failure_key)
75
+ return unless valid_message?(response)
76
+
77
+ if robot.auth.public_send(method_name, response.user, @user, @group)
78
+ response.reply t(success_key, user: @user.name, group: @group)
79
+ else
80
+ response.reply t(failure_key, user: @user.name, group: @group)
81
+ end
82
+ end
83
+
89
84
  def valid_group?(response, identifier)
90
85
  unless identifier && @group
91
86
  response.reply "#{t("format")}: #{robot.name} auth add USER GROUP"
@@ -0,0 +1,24 @@
1
+ module Lita
2
+ module Handlers
3
+ # Warns about any handlers using deprecated features.
4
+ # @since 4.0.0
5
+ class DeprecationCheck
6
+ extend Lita::Handler::EventRouter
7
+
8
+ on :loaded, :check_handlers_for_default_config
9
+
10
+ # Warns about handlers using the old +default_config+ method.
11
+ def check_handlers_for_default_config(_payload)
12
+ robot.registry.handlers.each do |handler|
13
+ if handler.respond_to?(:default_config)
14
+ Lita.logger.warn(
15
+ I18n.t("lita.config.handler_default_config_deprecated", name: handler.namespace)
16
+ )
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ Lita.register_handler(DeprecationCheck)
23
+ end
24
+ end
@@ -22,13 +22,15 @@ module Lita
22
22
  # Checks if the user is authorized to at least one of the given groups.
23
23
  def authorized?(user, required_groups)
24
24
  required_groups.nil? || required_groups.any? do |group|
25
- Lita::Authorization.user_in_group?(user, group)
25
+ robot.auth.user_in_group?(user, group)
26
26
  end
27
27
  end
28
28
 
29
29
  # Creates an array of help info for all registered routes.
30
30
  def build_help(response)
31
- Lita.handlers.map do |handler|
31
+ robot.handlers.map do |handler|
32
+ next unless handler.respond_to?(:routes)
33
+
32
34
  handler.routes.map do |route|
33
35
  route.help.map do |command, description|
34
36
  if authorized?(response.user, route.required_groups)
@@ -58,7 +60,7 @@ module Lita
58
60
 
59
61
  # The way the bot should be addressed in order to trigger a command.
60
62
  def name
61
- Lita.config.robot.mention_name || Lita.config.robot.name
63
+ robot.config.robot.mention_name || robot.config.robot.name
62
64
  end
63
65
  end
64
66
 
@@ -22,13 +22,13 @@ module Lita
22
22
  end
23
23
 
24
24
  # Returns JSON with basic information about the robot.
25
- # @param request [Rack::Request] The HTTP request.
25
+ # @param _request [Rack::Request] The HTTP request.
26
26
  # @param response [Rack::Response] The HTTP response.
27
27
  # @return [void]
28
28
  def web(_request, response)
29
29
  response.headers["Content-Type"] = "application/json"
30
30
  json = MultiJson.dump(
31
- adapter: Lita.config.robot.adapter,
31
+ adapter: robot.config.robot.adapter,
32
32
  lita_version: Lita::VERSION,
33
33
  redis_memory_usage: redis_memory_usage,
34
34
  redis_version: redis_version,
@@ -0,0 +1,29 @@
1
+ module Lita
2
+ # A wrapper around a handler's HTTP route callbacks that sets up the request and response.
3
+ # @api private
4
+ # @since 4.0.0
5
+ class HTTPCallback
6
+ # @param handler_class [Lita::Handler] The handler defining the callback.
7
+ # @param callback [Proc] The callback.
8
+ def initialize(handler_class, callback)
9
+ @handler_class = handler_class
10
+ @callback = callback
11
+ end
12
+
13
+ # Call the Rack endpoint with a standard environment hash.
14
+ def call(env)
15
+ request = Rack::Request.new(env)
16
+ response = Rack::Response.new
17
+
18
+ if request.head?
19
+ response.status = 204
20
+ else
21
+ handler = @handler_class.new(env["lita.robot"])
22
+
23
+ @callback.call(handler, request, response)
24
+ end
25
+
26
+ response.finish
27
+ end
28
+ end
29
+ end
@@ -1,3 +1,17 @@
1
+ # Primary class from the +http_router+ gem.
2
+ # @todo Remove this monkey patch as soon as a gem is released with this pull request merged:
3
+ # https://github.com/joshbuddy/http_router/pull/40
4
+ class HttpRouter
5
+ # An individual HTTP route.
6
+ class Route
7
+ # Sets a name for the route. Monkey patched due to a bug.
8
+ def name=(name)
9
+ @name = name
10
+ router.named_routes[name] << self if router
11
+ end
12
+ end
13
+ end
14
+
1
15
  module Lita
2
16
  # Handlers use this class to define HTTP routes for the built-in web
3
17
  # server.
@@ -22,16 +36,23 @@ module Lita
22
36
  private
23
37
 
24
38
  # @!macro define_http_method
25
- # @method $1(path, method_name)
26
- # Defines a new route with the "$1" HTTP method.
27
- # @param path [String] The URL path component that will trigger the
28
- # route.
29
- # @param method_name [Symbol, String] The name of the instance method in
30
- # the handler to call for the route.
31
- # @return [void]
39
+ # @overload $1(path, method_name, options = {})
40
+ # Defines a new route with the "$1" HTTP method.
41
+ # @param path [String] The URL path component that will trigger the route.
42
+ # @param method_name [Symbol, String] The name of the instance method in
43
+ # the handler to call for the route.
44
+ # @param options [Hash] Various options for controlling the behavior of the route.
45
+ # @return [void]
46
+ # @overload $1(path, options = {})
47
+ # Defines a new route with the "$1" HTTP method.
48
+ # @param path [String] The URL path component that will trigger the route.
49
+ # @param options [Hash] Various options for controlling the behavior of the route.
50
+ # @yield The body of the route's callback.
51
+ # @return [void]
52
+ # @since 4.0.0
32
53
  def define_http_method(http_method)
33
- define_method(http_method) do |path, method_name, options = {}|
34
- create_route(http_method.to_s.upcase, path, method_name, options)
54
+ define_method(http_method) do |path, method_name = nil, options = {}, &block|
55
+ register_route(http_method.to_s.upcase, path, Callback.new(method_name || block), options)
35
56
  end
36
57
  end
37
58
  end
@@ -48,28 +69,22 @@ module Lita
48
69
 
49
70
  private
50
71
 
51
- # Creates a new HTTP route.
52
- def create_route(http_method, path, method_name, options)
72
+ # Adds a new HTTP route for the handler.
73
+ def register_route(http_method, path, callback, options)
74
+ route = new_route(http_method, path, callback, options)
75
+ route.to(HTTPCallback.new(handler_class, callback))
76
+ handler_class.http_routes << route
77
+ end
78
+
79
+ # Creates and configures a new HTTP route.
80
+ def new_route(http_method, path, callback, options)
53
81
  route = ExtendedRoute.new
54
82
  route.path = path
83
+ route.name = callback.method_name
55
84
  route.add_match_with(options)
56
85
  route.add_request_method(http_method)
57
86
  route.add_request_method("HEAD") if http_method == "GET"
58
-
59
- route.to do |env|
60
- request = Rack::Request.new(env)
61
- response = Rack::Response.new
62
-
63
- if request.head?
64
- response.status = 204
65
- else
66
- handler_class.new(env["lita.robot"]).public_send(method_name, request, response)
67
- end
68
-
69
- response.finish
70
- end
71
-
72
- handler_class.http_routes << route
87
+ route
73
88
  end
74
89
  end
75
90
  end
@@ -0,0 +1,23 @@
1
+ module Lita
2
+ # A mixin for setting and getting a plugin's namespace.
3
+ # @since 4.0.0
4
+ module Namespace
5
+ # Gets (and optionally sets) the namespace for a plugin. The namespace is generated from the
6
+ # class's name by default.
7
+ # @param value [String] If provided, sets the namespace of the plugin to the value.
8
+ # @return [String] The namespace.
9
+ # @raise [RuntimeError] If the plugin is an anonymous class, does not define +self.name+, and
10
+ # has not set a namespace manually.
11
+ def namespace(value = nil)
12
+ @namespace = value.to_s if value
13
+
14
+ string_name = defined?(@namespace) ? @namespace : name
15
+
16
+ if string_name
17
+ Util.underscore(string_name.split("::").last)
18
+ else
19
+ raise I18n.t("lita.plugin.name_required")
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,5 +1,5 @@
1
1
  module Lita
2
- # A +Rack+ application to serve routes registered by handlers.
2
+ # A +Rack+ application to serve HTTP routes registered by handlers.
3
3
  class RackApp
4
4
  # The currently running robot.
5
5
  # @return [Lita::Robot] The robot.
@@ -9,6 +9,16 @@ module Lita
9
9
  # @return [HttpRouter] The router.
10
10
  attr_reader :router
11
11
 
12
+ # Constructs a {RackApp} inside a +Rack::Builder+, including any configured middleware.
13
+ # @param robot [Lita::Robot] The currently running robot.
14
+ # @return [Lita::RackApp, Class] The Rack application.
15
+ def self.build(robot)
16
+ builder = Rack::Builder.new
17
+ builder.run(new(robot))
18
+ robot.config.http.middleware.each { |middleware| builder.use(middleware) }
19
+ builder.to_app
20
+ end
21
+
12
22
  # @param robot [Lita::Robot] The currently running robot.
13
23
  def initialize(robot)
14
24
  @robot = robot
@@ -24,13 +34,30 @@ module Lita
24
34
  router.call(env)
25
35
  end
26
36
 
37
+ # Finds the first route that matches the request environment, if any. Does not trigger the
38
+ # route.
39
+ # @param env [Hash] A Rack environment.
40
+ # @return [Array] An array of the name of the first matching route.
41
+ # @since 4.0.0
42
+ def recognize(env)
43
+ env["lita.robot"] = robot
44
+ recognized_routes_for(env).map { |match| match.route.name }
45
+ end
46
+
27
47
  private
28
48
 
29
49
  # Registers routes in the router for each handler's defined routes.
30
50
  def compile
31
- Lita.handlers.each do |handler|
51
+ robot.handlers.each do |handler|
52
+ next unless handler.respond_to?(:http_routes)
53
+
32
54
  handler.http_routes.each { |route| router.add_route(route) }
33
55
  end
34
56
  end
57
+
58
+ # Returns an array containing the first recongnized route, if any.
59
+ def recognized_routes_for(env)
60
+ Array(router.recognize(env).first)
61
+ end
35
62
  end
36
63
  end
@@ -0,0 +1,133 @@
1
+ module Lita
2
+ # An object to hold various types of data including configuration and plugins.
3
+ # @since 4.0.0
4
+ class Registry
5
+ # Allows a registry to be added to another object.
6
+ module Mixins
7
+ # The primary configuration object. Provides user settings for the robot.
8
+ # @return [Object] The configuration object.
9
+ def config
10
+ @config ||= DefaultConfiguration.new(self).finalize
11
+ end
12
+
13
+ # Yields the configuration object. Called by the user in a +lita_config.rb+ file.
14
+ # @yieldparam [Object] config The configuration object.
15
+ # @return [void]
16
+ def configure
17
+ yield config
18
+ end
19
+
20
+ # A registry of adapters.
21
+ # @return [Hash] A map of adapter keys to adapter classes.
22
+ def adapters
23
+ @adapters ||= {}
24
+ end
25
+
26
+ # A registry of handlers.
27
+ # @return [Set] The set of handlers.
28
+ def handlers
29
+ @handlers ||= Set.new
30
+ end
31
+
32
+ # A registry of hook handler objects.
33
+ # @return [Hash] A hash mapping hook names to sets of objects that handle them.
34
+ # @since 3.2.0
35
+ def hooks
36
+ @hooks ||= Hash.new { |h, k| h[k] = Set.new }
37
+ end
38
+
39
+ # @overload register_adapter(key, adapter)
40
+ # Adds an adapter to the registry under the provided key.
41
+ # @param key [String, Symbol] The key that identifies the adapter.
42
+ # @param adapter [Class] The adapter class.
43
+ # @return [void]
44
+ # @overload register_adapter(key)
45
+ # Adds an adapter to the registry under the provided key.
46
+ # @param key [String, Symbol] The key that identifies the adapter.
47
+ # @yield The body of the adapter class.
48
+ # @return [void]
49
+ # @since 4.0.0
50
+ def register_adapter(key, adapter = nil)
51
+ adapter = Builder.new(key, &proc).build_adapter if block_given?
52
+
53
+ unless adapter.is_a?(Class)
54
+ raise ArgumentError, I18n.t("lita.core.register_adapter.block_or_class_required")
55
+ end
56
+
57
+ adapters[key.to_sym] = adapter
58
+ end
59
+
60
+ # @overload register_handler(handler)
61
+ # Adds a handler to the registry.
62
+ # @param handler [Lita::Handler] The handler class.
63
+ # @return [void]
64
+ # @overload register_handler(key)
65
+ # Adds a handler to the registry.
66
+ # @param key [String] The namespace of the handler.
67
+ # @yield The body of the handler class.
68
+ # @return [void]
69
+ # @since 4.0.0
70
+ def register_handler(handler_or_key)
71
+ if block_given?
72
+ handler = Builder.new(handler_or_key, &proc).build_handler
73
+ else
74
+ handler = handler_or_key
75
+
76
+ unless handler.is_a?(Class)
77
+ raise ArgumentError, I18n.t("lita.core.register_handler.block_or_class_required")
78
+ end
79
+ end
80
+
81
+ handlers << handler
82
+ end
83
+
84
+ # Adds a hook handler object to the registry for the given hook.
85
+ # @return [void]
86
+ # @since 3.2.0
87
+ def register_hook(name, hook)
88
+ hooks[name.to_s.downcase.strip.to_sym] << hook
89
+ end
90
+
91
+ # Clears the configuration object and the adapter, handler, and hook registries.
92
+ # @return [void]
93
+ # @since 3.2.0
94
+ def reset
95
+ reset_adapters
96
+ reset_config
97
+ reset_handlers
98
+ reset_hooks
99
+ end
100
+
101
+ # Resets the adapter registry, removing all registered adapters.
102
+ # @return [void]
103
+ # @since 3.2.0
104
+ def reset_adapters
105
+ @adapters = nil
106
+ end
107
+
108
+ # Resets the configuration object. The next call to {#config}
109
+ # will create a fresh config object.
110
+ # @return [void]
111
+ def reset_config
112
+ @config = nil
113
+ end
114
+ alias_method :clear_config, :reset_config
115
+
116
+ # Resets the handler registry, removing all registered handlers.
117
+ # @return [void]
118
+ # @since 3.2.0
119
+ def reset_handlers
120
+ @handlers = nil
121
+ end
122
+
123
+ # Resets the hooks registry, removing all registered hook handlers.
124
+ # @return [void]
125
+ # @since 3.2.0
126
+ def reset_hooks
127
+ @hooks = nil
128
+ end
129
+ end
130
+
131
+ include Mixins
132
+ end
133
+ end