lita 3.3.1 → 4.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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