Class: CMDx::Mergers

Inherits:
Object
  • Object
show all
Defined in:
lib/cmdx/mergers.rb,
lib/cmdx/mergers/no_merge.rb,
lib/cmdx/mergers/deep_merge.rb,
lib/cmdx/mergers/last_write_wins.rb

Overview

Registry of named merge strategies used to fold successful parallel task results back into the workflow context. Ships with built-ins for ‘:last_write_wins` (default), `:deep_merge`, and `:no_merge`. A merger is any callable accepting `call(workflow_context, result)`.

Defined Under Namespace

Modules: DeepMerge, LastWriteWins, NoMerge

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeMergers

Returns a new instance of Mergers.



12
13
14
15
16
17
18
# File 'lib/cmdx/mergers.rb', line 12

def initialize
  @registry = {
    last_write_wins: Mergers::LastWriteWins,
    deep_merge: Mergers::DeepMerge,
    no_merge: Mergers::NoMerge
  }
end

Instance Attribute Details

#registryObject (readonly)

Returns the value of attribute registry.



10
11
12
# File 'lib/cmdx/mergers.rb', line 10

def registry
  @registry
end

Instance Method Details

#deregister(name) ⇒ Mergers

Returns self for chaining.

Parameters:

  • name (Symbol)

Returns:



53
54
55
56
# File 'lib/cmdx/mergers.rb', line 53

def deregister(name)
  registry.delete(name)
  self
end

#empty?Boolean

Returns:

  • (Boolean)


100
101
102
# File 'lib/cmdx/mergers.rb', line 100

def empty?
  registry.empty?
end

#initialize_copy(source) ⇒ void

This method returns an undefined value.

Parameters:

  • source (Mergers)

    registry to duplicate



22
23
24
# File 'lib/cmdx/mergers.rb', line 22

def initialize_copy(source)
  @registry = source.registry.dup
end

#key?(name) ⇒ Boolean

Returns whether a merger is registered under ‘name`.

Parameters:

  • name (Symbol)

Returns:

  • (Boolean)

    whether a merger is registered under ‘name`



60
61
62
# File 'lib/cmdx/mergers.rb', line 60

def key?(name)
  registry.key?(name)
end

#lookup(name) ⇒ #call

Returns the registered merger.

Parameters:

  • name (Symbol)

Returns:

  • (#call)

    the registered merger

Raises:



67
68
69
70
71
72
73
74
# File 'lib/cmdx/mergers.rb', line 67

def lookup(name)
  registry[name] || begin
    raise UnknownEntryError, <<~MSG.chomp
      unknown merger #{name.inspect}; registered: #{registry.keys.inspect}.
      See https://drexed.github.io/cmdx/workflows/#merge-strategies
    MSG
  end
end

#register(name, callable = nil, &block) { ... } ⇒ Mergers

Registers a named merger, overwriting any existing entry.

Parameters:

  • name (Symbol)
  • callable (#call, nil) (defaults to: nil)

    pass either this or a block

  • block (#call, nil)

    merger callable when ‘callable` is omitted

Yields:

  • merger body — ‘call(workflow_context, result)`

Returns:

Raises:

  • (ArgumentError)

    when both ‘callable` and a block are given, or when the resolved merger isn’t callable



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/cmdx/mergers.rb', line 35

def register(name, callable = nil, &block)
  merger = callable || block

  if callable && block
    raise ArgumentError, "merger: provide either a callable or a block, not both"
  elsif !merger.respond_to?(:call)
    raise ArgumentError, <<~MSG.chomp
      merger must respond to #call (got #{merger.class}).
      See https://drexed.github.io/cmdx/workflows/#merge-strategies
    MSG
  end

  registry[name.to_sym] = merger
  self
end

#resolve(spec) ⇒ #call

Resolves a declaration’s ‘:merger` option to a concrete callable. Accepts `nil` (default `:last_write_wins`), a Symbol (registry lookup), or any object responding to `#call`.

Parameters:

  • spec (Symbol, #call, nil)

Returns:

  • (#call)

Raises:



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/cmdx/mergers.rb', line 83

def resolve(spec)
  case spec
  when NilClass
    lookup(:last_write_wins)
  when Symbol
    lookup(spec)
  else
    return spec if spec.respond_to?(:call)

    raise UnknownEntryError, <<~MSG.chomp
      unknown merger #{spec.inspect}; expected a Symbol from #{registry.keys.inspect} or a callable.
      See https://drexed.github.io/cmdx/workflows/#merge-strategies
    MSG
  end
end

#sizeInteger

Returns:

  • (Integer)


105
106
107
# File 'lib/cmdx/mergers.rb', line 105

def size
  registry.size
end