core-operation 0.1.1 → 0.2.0
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/CHANGELOG.md +16 -6
 - data/lib/core/operation/action.rb +63 -0
 - data/lib/core/operation/actions/block.rb +29 -0
 - data/lib/core/operation/callable.rb +87 -0
 - data/lib/core/operation/compiler.rb +60 -12
 - data/lib/core/operation/errors/undefined_action_error.rb +8 -0
 - data/lib/core/operation/failed.rb +17 -0
 - data/lib/core/operation/result.rb +47 -15
 - data/lib/core/operation/version.rb +1 -1
 - data/lib/core/operation.rb +92 -0
 - metadata +30 -12
 - data/lib/is/operation.rb +0 -44
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 31a0abdb122d6ca1ad5fcad68fedfa7f2286d11840d080db2daf54f45b6b153b
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 2c472a84ff410b278d9f13344dcd386cb71c92d31987f6a2639bc9ad16379a16
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 272370d98179fc6e361e8ffb1ff226ae457922b7a74e32f68026e5db30000b8d95cafd3168c78df0a51424401d019f850c471894d0cdf8870dd74be0af91cf20
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: '0188b166e710ade916bf0ac9b7b74fafb686c665943d45ec17730be0fcccccadfcd141335c02d82dd5ddfe493e1688963ecb23f7add7f5f48b33e0b554c14828'
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,19 +1,29 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            ## [v0. 
     | 
| 
      
 1 
     | 
    
         
            +
            ## [v0.2.0](https://github.com/bryanp/corerb/releases/tag/2023-12-24)
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            *released on 2023-12-24*
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              * `fix` [#149](https://github.com/bryanp/corerb/pull/149) Fix operations that don't define a default action ([bryanp](https://github.com/bryanp))
         
     | 
| 
      
 6 
     | 
    
         
            +
              * `fix` [#148](https://github.com/bryanp/corerb/pull/148) Fix an issue with subclassed operations ([bryanp](https://github.com/bryanp))
         
     | 
| 
      
 7 
     | 
    
         
            +
              * `dep` [#143](https://github.com/bryanp/corerb/pull/143) Deprecate `Is::*` and `Refine::*` namespaces ([bryanp](https://github.com/bryanp))
         
     | 
| 
      
 8 
     | 
    
         
            +
              * `chg` [#140](https://github.com/bryanp/corerb/pull/140) Refactor operations to be single-action returning a result object ([bryanp](https://github.com/bryanp))
         
     | 
| 
      
 9 
     | 
    
         
            +
              * `dep` [#135](https://github.com/bryanp/corerb/pull/135) Remove Ruby 2 support ([bryanp](https://github.com/bryanp))
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            ## [v0.1.1](https://github.com/bryanp/corerb/releases/tag/2022-01-13)
         
     | 
| 
       2 
12 
     | 
    
         | 
| 
       3 
13 
     | 
    
         
             
            *released on 2022-01-13*
         
     | 
| 
       4 
14 
     | 
    
         | 
| 
       5 
     | 
    
         
            -
              * `fix` [#120](https://github.com/ 
     | 
| 
      
 15 
     | 
    
         
            +
              * `fix` [#120](https://github.com/bryanp/corerb/pull/120) Explicitly require a dependency ([bryanp](https://github.com/bryanp))
         
     | 
| 
       6 
16 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
            ## [v0.1.0](https://github.com/ 
     | 
| 
      
 17 
     | 
    
         
            +
            ## [v0.1.0](https://github.com/bryanp/corerb/releases/tag/2021-11-03)
         
     | 
| 
       8 
18 
     | 
    
         | 
| 
       9 
19 
     | 
    
         
             
            *released on 2021-11-03*
         
     | 
| 
       10 
20 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
              * `add` [#104](https://github.com/ 
     | 
| 
      
 21 
     | 
    
         
            +
              * `add` [#104](https://github.com/bryanp/corerb/pull/104) Let operation result be turned into a hash ([bryanp](https://github.com/bryanp))
         
     | 
| 
       12 
22 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
            ## [v0.0.0](https://github.com/ 
     | 
| 
      
 23 
     | 
    
         
            +
            ## [v0.0.0](https://github.com/bryanp/corerb/releases/tag/2021-11-02)
         
     | 
| 
       14 
24 
     | 
    
         | 
| 
       15 
25 
     | 
    
         
             
            *released on 2021-11-02*
         
     | 
| 
       16 
26 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
              * `add` [#90](https://github.com/ 
     | 
| 
      
 27 
     | 
    
         
            +
              * `add` [#90](https://github.com/bryanp/corerb/pull/90) Initial implementation of the core-operation gem ([bryanp](https://github.com/bryanp))
         
     | 
| 
       18 
28 
     | 
    
         | 
| 
       19 
29 
     | 
    
         | 
| 
         @@ -0,0 +1,63 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "core/inspect"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "core/state"
         
     | 
| 
      
 5 
     | 
    
         
            +
            require "securerandom"
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            module Core
         
     | 
| 
      
 8 
     | 
    
         
            +
              module Operation
         
     | 
| 
      
 9 
     | 
    
         
            +
                # [public] An operation action.
         
     | 
| 
      
 10 
     | 
    
         
            +
                #
         
     | 
| 
      
 11 
     | 
    
         
            +
                class Action
         
     | 
| 
      
 12 
     | 
    
         
            +
                  include Core::State
         
     | 
| 
      
 13 
     | 
    
         
            +
                  state :__used_random_suffixes__, default: []
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                  class << self
         
     | 
| 
      
 16 
     | 
    
         
            +
                    # [public] Builds an action for a given target.
         
     | 
| 
      
 17 
     | 
    
         
            +
                    #
         
     | 
| 
      
 18 
     | 
    
         
            +
                    def build(target = nil, *args, &block)
         
     | 
| 
      
 19 
     | 
    
         
            +
                      raise ArgumentError, "actions must be defined with a block" unless block
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                      Actions::Block.new(target, &block)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                    def build_reference
         
     | 
| 
      
 25 
     | 
    
         
            +
                      suffix = generate_random_suffix
         
     | 
| 
      
 26 
     | 
    
         
            +
                      if __used_random_suffixes__.include?(suffix)
         
     | 
| 
      
 27 
     | 
    
         
            +
                        build_reference
         
     | 
| 
      
 28 
     | 
    
         
            +
                      else
         
     | 
| 
      
 29 
     | 
    
         
            +
                        __used_random_suffixes__ << suffix
         
     | 
| 
      
 30 
     | 
    
         
            +
                        "action_#{suffix}"
         
     | 
| 
      
 31 
     | 
    
         
            +
                      end
         
     | 
| 
      
 32 
     | 
    
         
            +
                    end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                    def generate_random_suffix
         
     | 
| 
      
 35 
     | 
    
         
            +
                      SecureRandom.hex(8)
         
     | 
| 
      
 36 
     | 
    
         
            +
                    end
         
     | 
| 
      
 37 
     | 
    
         
            +
                  end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                  include Core::Inspect
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                  def initialize(name)
         
     | 
| 
      
 42 
     | 
    
         
            +
                    @name = (name || :call).to_sym
         
     | 
| 
      
 43 
     | 
    
         
            +
                    @reference = self.class.build_reference.to_sym
         
     | 
| 
      
 44 
     | 
    
         
            +
                  end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                  # [public] The action name.
         
     | 
| 
      
 47 
     | 
    
         
            +
                  #
         
     | 
| 
      
 48 
     | 
    
         
            +
                  attr_reader :name
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                  # [public] The action reference.
         
     | 
| 
      
 51 
     | 
    
         
            +
                  #
         
     | 
| 
      
 52 
     | 
    
         
            +
                  attr_reader :reference
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                  # [public] Finalizes the action for the given context.
         
     | 
| 
      
 55 
     | 
    
         
            +
                  #
         
     | 
| 
      
 56 
     | 
    
         
            +
                  def finalize(context)
         
     | 
| 
      
 57 
     | 
    
         
            +
                    raise "not implemented"
         
     | 
| 
      
 58 
     | 
    
         
            +
                  end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                  require_relative "actions/block"
         
     | 
| 
      
 61 
     | 
    
         
            +
                end
         
     | 
| 
      
 62 
     | 
    
         
            +
              end
         
     | 
| 
      
 63 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,29 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "core/inspect"
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module Core
         
     | 
| 
      
 6 
     | 
    
         
            +
              module Operation
         
     | 
| 
      
 7 
     | 
    
         
            +
                module Actions
         
     | 
| 
      
 8 
     | 
    
         
            +
                  # [public] An operation action defined as a block.
         
     | 
| 
      
 9 
     | 
    
         
            +
                  #
         
     | 
| 
      
 10 
     | 
    
         
            +
                  class Block < Action
         
     | 
| 
      
 11 
     | 
    
         
            +
                    include Core::Inspect
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                    def initialize(name = nil, &block)
         
     | 
| 
      
 14 
     | 
    
         
            +
                      @block = block
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                      super(name)
         
     | 
| 
      
 17 
     | 
    
         
            +
                    end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                    # [public]
         
     | 
| 
      
 20 
     | 
    
         
            +
                    #
         
     | 
| 
      
 21 
     | 
    
         
            +
                    def finalize(context)
         
     | 
| 
      
 22 
     | 
    
         
            +
                      context.define_method(@reference, &@block)
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                      @reference
         
     | 
| 
      
 25 
     | 
    
         
            +
                    end
         
     | 
| 
      
 26 
     | 
    
         
            +
                  end
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,87 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require_relative "action"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require_relative "compiler"
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module Core
         
     | 
| 
      
 7 
     | 
    
         
            +
              module Operation
         
     | 
| 
      
 8 
     | 
    
         
            +
                class Callable
         
     | 
| 
      
 9 
     | 
    
         
            +
                  def initialize(object)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    @object = object
         
     | 
| 
      
 11 
     | 
    
         
            +
                    @actions = []
         
     | 
| 
      
 12 
     | 
    
         
            +
                    @compiled = false
         
     | 
| 
      
 13 
     | 
    
         
            +
                    @compiler = Compiler
         
     | 
| 
      
 14 
     | 
    
         
            +
                  end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                  def initialize_copy(...)
         
     | 
| 
      
 17 
     | 
    
         
            +
                    @actions = @actions.clone
         
     | 
| 
      
 18 
     | 
    
         
            +
                    super
         
     | 
| 
      
 19 
     | 
    
         
            +
                  end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                  attr_reader :actions
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                  # [public] Relocates to another object context.
         
     | 
| 
      
 24 
     | 
    
         
            +
                  #
         
     | 
| 
      
 25 
     | 
    
         
            +
                  def relocate(object)
         
     | 
| 
      
 26 
     | 
    
         
            +
                    @object = object
         
     | 
| 
      
 27 
     | 
    
         
            +
                  end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                  # [public] Defines an action.
         
     | 
| 
      
 30 
     | 
    
         
            +
                  #
         
     | 
| 
      
 31 
     | 
    
         
            +
                  def action(...)
         
     | 
| 
      
 32 
     | 
    
         
            +
                    @actions << Action.build(...)
         
     | 
| 
      
 33 
     | 
    
         
            +
                    recompile if compiled?
         
     | 
| 
      
 34 
     | 
    
         
            +
                  end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                  # [public]
         
     | 
| 
      
 37 
     | 
    
         
            +
                  #
         
     | 
| 
      
 38 
     | 
    
         
            +
                  def action?(name)
         
     | 
| 
      
 39 
     | 
    
         
            +
                    @actions.any? { |action| action.name == name.to_sym }
         
     | 
| 
      
 40 
     | 
    
         
            +
                  end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                  # [public] Calls the default operation action with the given arguments.
         
     | 
| 
      
 43 
     | 
    
         
            +
                  #
         
     | 
| 
      
 44 
     | 
    
         
            +
                  def call(object, ...)
         
     | 
| 
      
 45 
     | 
    
         
            +
                    finalize.call(object, ...)
         
     | 
| 
      
 46 
     | 
    
         
            +
                  end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                  # [public]
         
     | 
| 
      
 49 
     | 
    
         
            +
                  #
         
     | 
| 
      
 50 
     | 
    
         
            +
                  def invoke(object, name, ...)
         
     | 
| 
      
 51 
     | 
    
         
            +
                    finalize.invoke(object, name, ...)
         
     | 
| 
      
 52 
     | 
    
         
            +
                  end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                  # [public] Finalizes the operation.
         
     | 
| 
      
 55 
     | 
    
         
            +
                  #
         
     | 
| 
      
 56 
     | 
    
         
            +
                  def finalize
         
     | 
| 
      
 57 
     | 
    
         
            +
                    compile
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                    self
         
     | 
| 
      
 60 
     | 
    
         
            +
                  end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                  private def compile
         
     | 
| 
      
 63 
     | 
    
         
            +
                    return if compiled?
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                    instance_eval(@compiler.compile(self, @object), __FILE__, __LINE__ - 1)
         
     | 
| 
      
 66 
     | 
    
         
            +
                    @compiled = true
         
     | 
| 
      
 67 
     | 
    
         
            +
                  end
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                  private def recompile
         
     | 
| 
      
 70 
     | 
    
         
            +
                    remove_compiled_methods
         
     | 
| 
      
 71 
     | 
    
         
            +
                    compile
         
     | 
| 
      
 72 
     | 
    
         
            +
                  end
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                  private def compiled?
         
     | 
| 
      
 75 
     | 
    
         
            +
                    @compiled == true
         
     | 
| 
      
 76 
     | 
    
         
            +
                  end
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                  private def remove_compiled_methods
         
     | 
| 
      
 79 
     | 
    
         
            +
                    return unless compiled?
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
                    singleton_class.remove_method(:call)
         
     | 
| 
      
 82 
     | 
    
         
            +
                    singleton_class.remove_method(:invoke)
         
     | 
| 
      
 83 
     | 
    
         
            +
                    @compiled = false
         
     | 
| 
      
 84 
     | 
    
         
            +
                  end
         
     | 
| 
      
 85 
     | 
    
         
            +
                end
         
     | 
| 
      
 86 
     | 
    
         
            +
              end
         
     | 
| 
      
 87 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -1,24 +1,72 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # frozen_string_literal: true
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            require_relative "result"
         
     | 
| 
      
 3 
     | 
    
         
            +
            require_relative "errors/undefined_action_error"
         
     | 
| 
       6 
4 
     | 
    
         | 
| 
       7 
5 
     | 
    
         
             
            module Core
         
     | 
| 
       8 
6 
     | 
    
         
             
              module Operation
         
     | 
| 
       9 
     | 
    
         
            -
                 
     | 
| 
      
 7 
     | 
    
         
            +
                # [public] Compiles an operation into evalable code.
         
     | 
| 
      
 8 
     | 
    
         
            +
                #
         
     | 
| 
      
 9 
     | 
    
         
            +
                class Compiler
         
     | 
| 
       10 
10 
     | 
    
         
             
                  class << self
         
     | 
| 
       11 
     | 
    
         
            -
                     
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                       
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
                    # [public] Compiles a callable operation in context of an object.
         
     | 
| 
      
 12 
     | 
    
         
            +
                    #
         
     | 
| 
      
 13 
     | 
    
         
            +
                    def compile(callable, object)
         
     | 
| 
      
 14 
     | 
    
         
            +
                      compiled = <<~CODE
         
     | 
| 
      
 15 
     | 
    
         
            +
                        #{compile_actions(callable, object)}
         
     | 
| 
      
 16 
     | 
    
         
            +
                        def invoke(object, name, ...)
         
     | 
| 
      
 17 
     | 
    
         
            +
                          __send__(name, object, ...)
         
     | 
| 
      
 18 
     | 
    
         
            +
                        end
         
     | 
| 
      
 19 
     | 
    
         
            +
                      CODE
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                      unless callable.actions.any? { |action| action.name == :call }
         
     | 
| 
      
 22 
     | 
    
         
            +
                        compiled << <<~CODE
         
     | 
| 
      
 23 
     | 
    
         
            +
                          def call(...)
         
     | 
| 
      
 24 
     | 
    
         
            +
                            raise UndefinedActionError, "undefined action `call`"
         
     | 
| 
      
 25 
     | 
    
         
            +
                          end
         
     | 
| 
      
 26 
     | 
    
         
            +
                        CODE
         
     | 
| 
      
 27 
     | 
    
         
            +
                      end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                      compiled
         
     | 
| 
      
 30 
     | 
    
         
            +
                    end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                    # [public]
         
     | 
| 
      
 33 
     | 
    
         
            +
                    #
         
     | 
| 
      
 34 
     | 
    
         
            +
                    private def compile_actions(callable, object)
         
     | 
| 
      
 35 
     | 
    
         
            +
                      compiled = +""
         
     | 
| 
      
 36 
     | 
    
         
            +
                      finalized_actions(callable, object).each_value do |action|
         
     | 
| 
      
 37 
     | 
    
         
            +
                        compiled << compile_action(action, object)
         
     | 
| 
      
 38 
     | 
    
         
            +
                      end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                      compiled
         
     | 
| 
       18 
41 
     | 
    
         
             
                    end
         
     | 
| 
       19 
42 
     | 
    
         | 
| 
      
 43 
     | 
    
         
            +
                    # [public]
         
     | 
| 
      
 44 
     | 
    
         
            +
                    #
         
     | 
| 
       20 
45 
     | 
    
         
             
                    private def compile_action(action, object)
         
     | 
| 
       21 
     | 
    
         
            -
                       
     | 
| 
      
 46 
     | 
    
         
            +
                      action_body = case action[:finalized]
         
     | 
| 
      
 47 
     | 
    
         
            +
                      when Symbol
         
     | 
| 
      
 48 
     | 
    
         
            +
                        "object.#{action[:finalized]}(...)"
         
     | 
| 
      
 49 
     | 
    
         
            +
                      end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                      <<~CODE
         
     | 
| 
      
 52 
     | 
    
         
            +
                        def #{action[:object].name}(object, ...)
         
     | 
| 
      
 53 
     | 
    
         
            +
                          #{action_body}
         
     | 
| 
      
 54 
     | 
    
         
            +
                        end
         
     | 
| 
      
 55 
     | 
    
         
            +
                      CODE
         
     | 
| 
      
 56 
     | 
    
         
            +
                    end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                    private def finalized_actions(callable, object)
         
     | 
| 
      
 59 
     | 
    
         
            +
                      finalized_actions = build_finalized_actions(callable, object)
         
     | 
| 
      
 60 
     | 
    
         
            +
                      callable.instance_variable_set(:@__finalized_actions__, finalized_actions)
         
     | 
| 
      
 61 
     | 
    
         
            +
                    end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                    private def build_finalized_actions(callable, object)
         
     | 
| 
      
 64 
     | 
    
         
            +
                      callable.actions.map { |action|
         
     | 
| 
      
 65 
     | 
    
         
            +
                        finalized = action.finalize(object)
         
     | 
| 
      
 66 
     | 
    
         
            +
                        {object: action, finalized: finalized, object_id: finalized.object_id}
         
     | 
| 
      
 67 
     | 
    
         
            +
                      }.each_with_object({}) { |action, lookup|
         
     | 
| 
      
 68 
     | 
    
         
            +
                        lookup[action[:object_id]] = action
         
     | 
| 
      
 69 
     | 
    
         
            +
                      }
         
     | 
| 
       22 
70 
     | 
    
         
             
                    end
         
     | 
| 
       23 
71 
     | 
    
         
             
                  end
         
     | 
| 
       24 
72 
     | 
    
         
             
                end
         
     | 
| 
         @@ -1,34 +1,66 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # frozen_string_literal: true
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            require_relative "failed"
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
       3 
5 
     | 
    
         
             
            module Core
         
     | 
| 
       4 
6 
     | 
    
         
             
              module Operation
         
     | 
| 
      
 7 
     | 
    
         
            +
                # [public]
         
     | 
| 
      
 8 
     | 
    
         
            +
                #
         
     | 
| 
       5 
9 
     | 
    
         
             
                class Result
         
     | 
| 
      
 10 
     | 
    
         
            +
                  include Core::Inspect
         
     | 
| 
      
 11 
     | 
    
         
            +
                  inspects :value, :failure
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
       6 
13 
     | 
    
         
             
                  def initialize
         
     | 
| 
       7 
     | 
    
         
            -
                    @ 
     | 
| 
       8 
     | 
    
         
            -
                    @ 
     | 
| 
      
 14 
     | 
    
         
            +
                    @value = nil
         
     | 
| 
      
 15 
     | 
    
         
            +
                    @failure = nil
         
     | 
| 
      
 16 
     | 
    
         
            +
                    @succeeded = false
         
     | 
| 
      
 17 
     | 
    
         
            +
                    @failed = false
         
     | 
| 
       9 
18 
     | 
    
         
             
                  end
         
     | 
| 
       10 
19 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
                   
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                    self
         
     | 
| 
       15 
     | 
    
         
            -
                  end
         
     | 
| 
      
 20 
     | 
    
         
            +
                  # [public]
         
     | 
| 
      
 21 
     | 
    
         
            +
                  #
         
     | 
| 
      
 22 
     | 
    
         
            +
                  attr_reader :failure
         
     | 
| 
       16 
23 
     | 
    
         | 
| 
      
 24 
     | 
    
         
            +
                  # [public]
         
     | 
| 
      
 25 
     | 
    
         
            +
                  #
         
     | 
| 
       17 
26 
     | 
    
         
             
                  def value
         
     | 
| 
       18 
     | 
    
         
            -
                    @ 
     | 
| 
      
 27 
     | 
    
         
            +
                    raise Failed.new(@failure) if failure?
         
     | 
| 
      
 28 
     | 
    
         
            +
                    @value
         
     | 
| 
       19 
29 
     | 
    
         
             
                  end
         
     | 
| 
       20 
30 
     | 
    
         | 
| 
       21 
     | 
    
         
            -
                   
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
      
 31 
     | 
    
         
            +
                  # [public]
         
     | 
| 
      
 32 
     | 
    
         
            +
                  #
         
     | 
| 
      
 33 
     | 
    
         
            +
                  def succeeded(value)
         
     | 
| 
      
 34 
     | 
    
         
            +
                    @value = value
         
     | 
| 
      
 35 
     | 
    
         
            +
                    @succeeded = true
         
     | 
| 
      
 36 
     | 
    
         
            +
                    finalize
         
     | 
| 
       24 
37 
     | 
    
         
             
                  end
         
     | 
| 
       25 
38 
     | 
    
         | 
| 
       26 
     | 
    
         
            -
                   
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
      
 39 
     | 
    
         
            +
                  # [public]
         
     | 
| 
      
 40 
     | 
    
         
            +
                  #
         
     | 
| 
      
 41 
     | 
    
         
            +
                  def failed(value)
         
     | 
| 
      
 42 
     | 
    
         
            +
                    @failure = value
         
     | 
| 
      
 43 
     | 
    
         
            +
                    @failed = true
         
     | 
| 
      
 44 
     | 
    
         
            +
                    finalize
         
     | 
| 
       28 
45 
     | 
    
         
             
                  end
         
     | 
| 
       29 
46 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
                   
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
      
 47 
     | 
    
         
            +
                  # [public]
         
     | 
| 
      
 48 
     | 
    
         
            +
                  #
         
     | 
| 
      
 49 
     | 
    
         
            +
                  def success?
         
     | 
| 
      
 50 
     | 
    
         
            +
                    @succeeded == true
         
     | 
| 
      
 51 
     | 
    
         
            +
                  end
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                  # [public]
         
     | 
| 
      
 54 
     | 
    
         
            +
                  #
         
     | 
| 
      
 55 
     | 
    
         
            +
                  def failure?
         
     | 
| 
      
 56 
     | 
    
         
            +
                    @failed == true
         
     | 
| 
      
 57 
     | 
    
         
            +
                  end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                  # [public]
         
     | 
| 
      
 60 
     | 
    
         
            +
                  #
         
     | 
| 
      
 61 
     | 
    
         
            +
                  def finalize
         
     | 
| 
      
 62 
     | 
    
         
            +
                    freeze
         
     | 
| 
      
 63 
     | 
    
         
            +
                    self
         
     | 
| 
       32 
64 
     | 
    
         
             
                  end
         
     | 
| 
       33 
65 
     | 
    
         
             
                end
         
     | 
| 
       34 
66 
     | 
    
         
             
              end
         
     | 
    
        data/lib/core/operation.rb
    CHANGED
    
    | 
         @@ -1,7 +1,99 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # frozen_string_literal: true
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            require "core/extension"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "core/local"
         
     | 
| 
      
 5 
     | 
    
         
            +
            require "core/state"
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
       3 
7 
     | 
    
         
             
            module Core
         
     | 
| 
      
 8 
     | 
    
         
            +
              # [public]
         
     | 
| 
      
 9 
     | 
    
         
            +
              #
         
     | 
| 
       4 
10 
     | 
    
         
             
              module Operation
         
     | 
| 
      
 11 
     | 
    
         
            +
                require_relative "operation/callable"
         
     | 
| 
      
 12 
     | 
    
         
            +
                require_relative "operation/result"
         
     | 
| 
       5 
13 
     | 
    
         
             
                require_relative "operation/version"
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                extend Core::Extension
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                applies do |extended:|
         
     | 
| 
      
 18 
     | 
    
         
            +
                  # [public] The callable operation.
         
     | 
| 
      
 19 
     | 
    
         
            +
                  #
         
     | 
| 
      
 20 
     | 
    
         
            +
                  state :operation, default: Core::Operation::Callable.new(extended ? singleton_class : self)
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                extends dependencies: [
         
     | 
| 
      
 24 
     | 
    
         
            +
                  Core::Local,
         
     | 
| 
      
 25 
     | 
    
         
            +
                  Core::State
         
     | 
| 
      
 26 
     | 
    
         
            +
                ]
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                extends :definition do
         
     | 
| 
      
 29 
     | 
    
         
            +
                  # [public] Defines an action.
         
     | 
| 
      
 30 
     | 
    
         
            +
                  #
         
     | 
| 
      
 31 
     | 
    
         
            +
                  def action(...)
         
     | 
| 
      
 32 
     | 
    
         
            +
                    operation.action(...)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                  def inherited(subclass)
         
     | 
| 
      
 36 
     | 
    
         
            +
                    super
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                    subclass.operation.relocate(subclass)
         
     | 
| 
      
 39 
     | 
    
         
            +
                  end
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                extends :implementation do
         
     | 
| 
      
 43 
     | 
    
         
            +
                  # [public] Calls the default action with arguments.
         
     | 
| 
      
 44 
     | 
    
         
            +
                  #
         
     | 
| 
      
 45 
     | 
    
         
            +
                  def call(...)
         
     | 
| 
      
 46 
     | 
    
         
            +
                    call_operation do
         
     | 
| 
      
 47 
     | 
    
         
            +
                      @operation.call(self, ...)
         
     | 
| 
      
 48 
     | 
    
         
            +
                    end
         
     | 
| 
      
 49 
     | 
    
         
            +
                  end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                  # [public] Defines an action, isolated to the instance.
         
     | 
| 
      
 52 
     | 
    
         
            +
                  #
         
     | 
| 
      
 53 
     | 
    
         
            +
                  def action(...)
         
     | 
| 
      
 54 
     | 
    
         
            +
                    operation.relocate(singleton_class)
         
     | 
| 
      
 55 
     | 
    
         
            +
                    operation.action(...)
         
     | 
| 
      
 56 
     | 
    
         
            +
                  end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                  # [public]
         
     | 
| 
      
 59 
     | 
    
         
            +
                  #
         
     | 
| 
      
 60 
     | 
    
         
            +
                  def failed(...)
         
     | 
| 
      
 61 
     | 
    
         
            +
                    localized(:__core_operation_result__).failed(...)
         
     | 
| 
      
 62 
     | 
    
         
            +
                  end
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                  def method_missing(name, ...)
         
     | 
| 
      
 65 
     | 
    
         
            +
                    if @operation.action?(name)
         
     | 
| 
      
 66 
     | 
    
         
            +
                      call_operation do
         
     | 
| 
      
 67 
     | 
    
         
            +
                        @operation.invoke(self, name, ...)
         
     | 
| 
      
 68 
     | 
    
         
            +
                      end
         
     | 
| 
      
 69 
     | 
    
         
            +
                    else
         
     | 
| 
      
 70 
     | 
    
         
            +
                      super
         
     | 
| 
      
 71 
     | 
    
         
            +
                    end
         
     | 
| 
      
 72 
     | 
    
         
            +
                  end
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                  def respond_to_missing?(name, ...)
         
     | 
| 
      
 75 
     | 
    
         
            +
                    @operation.action?(name) || super
         
     | 
| 
      
 76 
     | 
    
         
            +
                  end
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                  private def call_operation
         
     | 
| 
      
 79 
     | 
    
         
            +
                    localize(:__core_operation_result__, Core::Operation::Result.new) { |result|
         
     | 
| 
      
 80 
     | 
    
         
            +
                      value = yield
         
     | 
| 
      
 81 
     | 
    
         
            +
                      unless result.failure?
         
     | 
| 
      
 82 
     | 
    
         
            +
                        result.succeeded(value)
         
     | 
| 
      
 83 
     | 
    
         
            +
                      end
         
     | 
| 
      
 84 
     | 
    
         
            +
                      result
         
     | 
| 
      
 85 
     | 
    
         
            +
                    }
         
     | 
| 
      
 86 
     | 
    
         
            +
                  end
         
     | 
| 
      
 87 
     | 
    
         
            +
                end
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
                extends :implementation, prepend: true do
         
     | 
| 
      
 90 
     | 
    
         
            +
                  # [public]
         
     | 
| 
      
 91 
     | 
    
         
            +
                  #
         
     | 
| 
      
 92 
     | 
    
         
            +
                  def finalize(...)
         
     | 
| 
      
 93 
     | 
    
         
            +
                    super if defined?(super)
         
     | 
| 
      
 94 
     | 
    
         
            +
                    operation.finalize
         
     | 
| 
      
 95 
     | 
    
         
            +
                    self
         
     | 
| 
      
 96 
     | 
    
         
            +
                  end
         
     | 
| 
      
 97 
     | 
    
         
            +
                end
         
     | 
| 
       6 
98 
     | 
    
         
             
              end
         
     | 
| 
       7 
99 
     | 
    
         
             
            end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: core-operation
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.2.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Bryan Powell
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire:
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date:  
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2023-12-24 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: core-extension
         
     | 
| 
         @@ -16,30 +16,44 @@ dependencies: 
     | 
|
| 
       16 
16 
     | 
    
         
             
                requirements:
         
     | 
| 
       17 
17 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       18 
18 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       19 
     | 
    
         
            -
                    version: '0. 
     | 
| 
      
 19 
     | 
    
         
            +
                    version: '0.5'
         
     | 
| 
       20 
20 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       21 
21 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       22 
22 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       23 
23 
     | 
    
         
             
                requirements:
         
     | 
| 
       24 
24 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       25 
25 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       26 
     | 
    
         
            -
                    version: '0. 
     | 
| 
      
 26 
     | 
    
         
            +
                    version: '0.5'
         
     | 
| 
      
 27 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 28 
     | 
    
         
            +
              name: core-inspect
         
     | 
| 
      
 29 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 30 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 31 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 32 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 33 
     | 
    
         
            +
                    version: '0.2'
         
     | 
| 
      
 34 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 35 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 36 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 37 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 38 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 39 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 40 
     | 
    
         
            +
                    version: '0.2'
         
     | 
| 
       27 
41 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       28 
42 
     | 
    
         
             
              name: core-local
         
     | 
| 
       29 
43 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       30 
44 
     | 
    
         
             
                requirements:
         
     | 
| 
       31 
45 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       32 
46 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       33 
     | 
    
         
            -
                    version: '0. 
     | 
| 
      
 47 
     | 
    
         
            +
                    version: '0.2'
         
     | 
| 
       34 
48 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       35 
49 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       36 
50 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       37 
51 
     | 
    
         
             
                requirements:
         
     | 
| 
       38 
52 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       39 
53 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       40 
     | 
    
         
            -
                    version: '0. 
     | 
| 
      
 54 
     | 
    
         
            +
                    version: '0.2'
         
     | 
| 
       41 
55 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       42 
     | 
    
         
            -
              name: core- 
     | 
| 
      
 56 
     | 
    
         
            +
              name: core-state
         
     | 
| 
       43 
57 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       44 
58 
     | 
    
         
             
                requirements:
         
     | 
| 
       45 
59 
     | 
    
         
             
                - - "~>"
         
     | 
| 
         @@ -53,7 +67,7 @@ dependencies: 
     | 
|
| 
       53 
67 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       54 
68 
     | 
    
         
             
                    version: '0.2'
         
     | 
| 
       55 
69 
     | 
    
         
             
            description: Turns Ruby objects into operations.
         
     | 
| 
       56 
     | 
    
         
            -
            email: bryan@ 
     | 
| 
      
 70 
     | 
    
         
            +
            email: bryan@bryanp.org
         
     | 
| 
       57 
71 
     | 
    
         
             
            executables: []
         
     | 
| 
       58 
72 
     | 
    
         
             
            extensions: []
         
     | 
| 
       59 
73 
     | 
    
         
             
            extra_rdoc_files: []
         
     | 
| 
         @@ -61,11 +75,15 @@ files: 
     | 
|
| 
       61 
75 
     | 
    
         
             
            - CHANGELOG.md
         
     | 
| 
       62 
76 
     | 
    
         
             
            - LICENSE
         
     | 
| 
       63 
77 
     | 
    
         
             
            - lib/core/operation.rb
         
     | 
| 
      
 78 
     | 
    
         
            +
            - lib/core/operation/action.rb
         
     | 
| 
      
 79 
     | 
    
         
            +
            - lib/core/operation/actions/block.rb
         
     | 
| 
      
 80 
     | 
    
         
            +
            - lib/core/operation/callable.rb
         
     | 
| 
       64 
81 
     | 
    
         
             
            - lib/core/operation/compiler.rb
         
     | 
| 
      
 82 
     | 
    
         
            +
            - lib/core/operation/errors/undefined_action_error.rb
         
     | 
| 
      
 83 
     | 
    
         
            +
            - lib/core/operation/failed.rb
         
     | 
| 
       65 
84 
     | 
    
         
             
            - lib/core/operation/result.rb
         
     | 
| 
       66 
85 
     | 
    
         
             
            - lib/core/operation/version.rb
         
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
       68 
     | 
    
         
            -
            homepage: https://github.com/metabahn/corerb/
         
     | 
| 
      
 86 
     | 
    
         
            +
            homepage: https://github.com/bryanp/corerb/
         
     | 
| 
       69 
87 
     | 
    
         
             
            licenses:
         
     | 
| 
       70 
88 
     | 
    
         
             
            - MPL-2.0
         
     | 
| 
       71 
89 
     | 
    
         
             
            metadata: {}
         
     | 
| 
         @@ -77,14 +95,14 @@ required_ruby_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       77 
95 
     | 
    
         
             
              requirements:
         
     | 
| 
       78 
96 
     | 
    
         
             
              - - ">="
         
     | 
| 
       79 
97 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       80 
     | 
    
         
            -
                  version: ' 
     | 
| 
      
 98 
     | 
    
         
            +
                  version: '3.0'
         
     | 
| 
       81 
99 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
       82 
100 
     | 
    
         
             
              requirements:
         
     | 
| 
       83 
101 
     | 
    
         
             
              - - ">="
         
     | 
| 
       84 
102 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       85 
103 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       86 
104 
     | 
    
         
             
            requirements: []
         
     | 
| 
       87 
     | 
    
         
            -
            rubygems_version: 3. 
     | 
| 
      
 105 
     | 
    
         
            +
            rubygems_version: 3.5.1
         
     | 
| 
       88 
106 
     | 
    
         
             
            signing_key:
         
     | 
| 
       89 
107 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       90 
108 
     | 
    
         
             
            summary: Turns Ruby objects into operations.
         
     | 
    
        data/lib/is/operation.rb
    DELETED
    
    | 
         @@ -1,44 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require "is/extension"
         
     | 
| 
       4 
     | 
    
         
            -
            require "is/localized"
         
     | 
| 
       5 
     | 
    
         
            -
            require "is/pipeline"
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
            require_relative "../core/operation/compiler"
         
     | 
| 
       8 
     | 
    
         
            -
            require_relative "../core/operation/result"
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
            module Is
         
     | 
| 
       11 
     | 
    
         
            -
              # [public]
         
     | 
| 
       12 
     | 
    
         
            -
              #
         
     | 
| 
       13 
     | 
    
         
            -
              module Operation
         
     | 
| 
       14 
     | 
    
         
            -
                extend Is::Extension
         
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
                applies do
         
     | 
| 
       17 
     | 
    
         
            -
                  pipeline.compiler = Core::Operation::Compiler
         
     | 
| 
       18 
     | 
    
         
            -
                end
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
                extends dependencies: [Is::Localized, Is::Pipeline]
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                extends :definition, :implementation do
         
     | 
| 
       23 
     | 
    
         
            -
                  # [public]
         
     | 
| 
       24 
     | 
    
         
            -
                  #
         
     | 
| 
       25 
     | 
    
         
            -
                  def action(*args, curry: true, **kwargs, &block)
         
     | 
| 
       26 
     | 
    
         
            -
                    super(*args, curry: curry, **kwargs)
         
     | 
| 
       27 
     | 
    
         
            -
                  end
         
     | 
| 
       28 
     | 
    
         
            -
                end
         
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
                extends :implementation do
         
     | 
| 
       31 
     | 
    
         
            -
                  # [public]
         
     | 
| 
       32 
     | 
    
         
            -
                  #
         
     | 
| 
       33 
     | 
    
         
            -
                  def get(name)
         
     | 
| 
       34 
     | 
    
         
            -
                    localized(:result).get(name)
         
     | 
| 
       35 
     | 
    
         
            -
                  end
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
                  # [public]
         
     | 
| 
       38 
     | 
    
         
            -
                  #
         
     | 
| 
       39 
     | 
    
         
            -
                  def set(name, value)
         
     | 
| 
       40 
     | 
    
         
            -
                    localized(:result).set(name, value)
         
     | 
| 
       41 
     | 
    
         
            -
                  end
         
     | 
| 
       42 
     | 
    
         
            -
                end
         
     | 
| 
       43 
     | 
    
         
            -
              end
         
     | 
| 
       44 
     | 
    
         
            -
            end
         
     |