lib/interactor.rb in interactor-3.0.0 vs lib/interactor.rb in interactor-3.0.1

- old
+ new

@@ -1,50 +1,166 @@ require "interactor/context" require "interactor/error" require "interactor/hooks" require "interactor/organizer" +# Public: Interactor methods. Because Interactor is a module, custom Interactor +# classes should include Interactor rather than inherit from it. +# +# Examples +# +# class MyInteractor +# include Interactor +# +# def call +# puts context.foo +# end +# end module Interactor + # Internal: Install Interactor's behavior in the given class. def self.included(base) base.class_eval do extend ClassMethods include Hooks + # Public: Gets the Interactor::Context of the Interactor instance. attr_reader :context end end + # Internal: Interactor class methods. module ClassMethods + # Public: Invoke an Interactor. This is the primary public API method to an + # interactor. + # + # context - A Hash whose key/value pairs are used in initializing a new + # Interactor::Context object. An existing Interactor::Context may + # also be given. (default: {}) + # + # Examples + # + # MyInteractor.call(foo: "bar") + # # => #<Interactor::Context foo="bar"> + # + # MyInteractor.call + # # => #<Interactor::Context> + # + # Returns the resulting Interactor::Context after manipulation by the + # interactor. def call(context = {}) new(context).tap(&:run).context end + # Public: Invoke an Interactor. The "call!" method behaves identically to + # the "call" method with one notable exception. If the context is failed + # during invocation of the interactor, the Interactor::Failure is raised. + # + # context - A Hash whose key/value pairs are used in initializing a new + # Interactor::Context object. An existing Interactor::Context may + # also be given. (default: {}) + # + # Examples + # + # MyInteractor.call!(foo: "bar") + # # => #<Interactor::Context foo="bar"> + # + # MyInteractor.call! + # # => #<Interactor::Context> + # + # MyInteractor.call!(foo: "baz") + # # => Interactor::Failure: #<Interactor::Context foo="baz"> + # + # Returns the resulting Interactor::Context after manipulation by the + # interactor. + # Raises Interactor::Failure if the context is failed. def call!(context = {}) new(context).tap(&:run!).context end end + # Internal: Initialize an Interactor. + # + # context - A Hash whose key/value pairs are used in initializing the + # interactor's context. An existing Interactor::Context may also be + # given. (default: {}) + # + # Examples + # + # MyInteractor.new(foo: "bar") + # # => #<MyInteractor @context=#<Interactor::Context foo="bar">> + # + # MyInteractor.new + # # => #<MyInteractor @context=#<Interactor::Context>> def initialize(context = {}) @context = Context.build(context) end + # Internal: Invoke an interactor instance along with all defined hooks. The + # "run" method is used internally by the "call" class method. The following + # are equivalent: + # + # MyInteractor.call(foo: "bar") + # # => #<Interactor::Context foo="bar"> + # + # interactor = MyInteractor.new(foo: "bar") + # interactor.run + # interactor.context + # # => #<Interactor::Context foo="bar"> + # + # After successful invocation of the interactor, the instance is tracked + # within the context. If the context is failed or any error is raised, the + # context is rolled back. + # + # Returns nothing. def run run! rescue Failure end + # Internal: Invoke an Interactor instance along with all defined hooks. The + # "run!" method is used internally by the "call!" class method. The following + # are equivalent: + # + # MyInteractor.call!(foo: "bar") + # # => #<Interactor::Context foo="bar"> + # + # interactor = MyInteractor.new(foo: "bar") + # interactor.run! + # interactor.context + # # => #<Interactor::Context foo="bar"> + # + # After successful invocation of the interactor, the instance is tracked + # within the context. If the context is failed or any error is raised, the + # context is rolled back. + # + # The "run!" method behaves identically to the "run" method with one notable + # exception. If the context is failed during invocation of the interactor, + # the Interactor::Failure is raised. + # + # Returns nothing. + # Raises Interactor::Failure if the context is failed. def run! with_hooks do call context.called!(self) end rescue context.rollback! raise end + # Public: Invoke an Interactor instance without any hooks, tracking, or + # rollback. It is expected that the "call" instance method is overwritten for + # each interactor class. + # + # Returns nothing. def call end + # Public: Reverse prior invocation of an Interactor instance. Any interactor + # class that requires undoing upon downstream failure is expected to overwrite + # the "rollback" instance method. + # + # Returns nothing. def rollback end end