Module: Igniter::Extensions::Contracts::InvariantsPack

Defined in:
lib/igniter/extensions/contracts/invariants_pack.rb

Class Method Summary collapse

Class Method Details

.build(&block) ⇒ Object



28
29
30
# File 'lib/igniter/extensions/contracts/invariants_pack.rb', line 28

def build(&block)
  Invariants::Builder.build(&block)
end

.check(target, invariants:) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/igniter/extensions/contracts/invariants_pack.rb', line 32

def check(target, invariants:)
  execution_result = unwrap_execution_result(target)
  outputs = execution_result.outputs.to_h
  violations = invariants.invariants.filter_map { |invariant| invariant.check(outputs) }

  Invariants::Report.new(
    suite: invariants,
    outputs: outputs,
    violations: violations,
    execution_result: execution_result
  )
end

.install_into(kernel) ⇒ Object



24
25
26
# File 'lib/igniter/extensions/contracts/invariants_pack.rb', line 24

def install_into(kernel)
  kernel
end

.manifestObject



17
18
19
20
21
22
# File 'lib/igniter/extensions/contracts/invariants_pack.rb', line 17

def manifest
  Igniter::Contracts::PackManifest.new(
    name: :extensions_invariants,
    metadata: { category: :validation }
  )
end

.run(environment, inputs:, invariants:, compiled_graph: nil, &block) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
# File 'lib/igniter/extensions/contracts/invariants_pack.rb', line 52

def run(environment, inputs:, invariants:, compiled_graph: nil, &block)
  graph =
    if block
      environment.compile(&block)
    else
      compiled_graph || raise(ArgumentError, "invariant run requires a block or compiled_graph")
    end

  result = environment.execute(graph, inputs: inputs)
  check(result, invariants: invariants)
end

.unwrap_execution_result(target) ⇒ Object



80
81
82
83
84
# File 'lib/igniter/extensions/contracts/invariants_pack.rb', line 80

def unwrap_execution_result(target)
  return target.execution_result if target.respond_to?(:execution_result)

  target
end

.validate!(target, invariants:) ⇒ Object



45
46
47
48
49
50
# File 'lib/igniter/extensions/contracts/invariants_pack.rb', line 45

def validate!(target, invariants:)
  report = check(target, invariants: invariants)
  raise Invariants::InvariantError.new(nil, violations: report.violations) if report.invalid?

  report
end

.verify_cases(environment, cases:, invariants:, compiled_graph: nil, &block) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/igniter/extensions/contracts/invariants_pack.rb', line 64

def verify_cases(environment, cases:, invariants:, compiled_graph: nil, &block)
  graph =
    if block
      environment.compile(&block)
    else
      compiled_graph || raise(ArgumentError, "verify_cases requires a block or compiled_graph")
    end

  reports = Array(cases).map do |inputs|
    result = environment.execute(graph, inputs: inputs)
    check(result, invariants: invariants)
  end

  Invariants::CasesReport.new(reports: reports)
end