Module: Jade::Extensions

Extended by:
Extensions
Included in:
Extensions
Defined in:
lib/jade/extensions.rb

Overview

Where an extension gem hooks into compilation. Only gems named in ALLOWED may register, so jade knows who extends it and nothing about what they do.

Defined Under Namespace

Classes: CallContext, NotAllowed, UnknownPhase

Constant Summary collapse

ALLOWED =
%w[jade-sql].freeze
PHASES =
%i[call].freeze

Instance Method Summary collapse

Instance Method Details

#call_checksObject



44
# File 'lib/jade/extensions.rb', line 44

def call_checks = @call_checks ||= {}

#check_call(name, arg_types, node, registry, entry_name, span) ⇒ Object



50
51
52
53
54
55
56
57
# File 'lib/jade/extensions.rb', line 50

def check_call(name, arg_types, node, registry, entry_name, span)
  call_checks[name].then do |watching|
    next [] if watching.nil?

    CallContext[name, arg_types, node, registry, entry_name, span]
      .then { |ctx| watching.flat_map { it.check(ctx) } }
  end
end

#deriversObject



42
# File 'lib/jade/extensions.rb', line 42

def derivers = @derivers ||= []

#register_check(gem_name, phase, check) ⇒ Object

A :call check answers watches -> [qualified name] and check(context) -> [error]. Watching by name keeps every other call in the program off the check's path entirely.



33
34
35
36
37
38
39
40
# File 'lib/jade/extensions.rb', line 33

def register_check(gem_name, phase, check)
  allow!(gem_name)
  fail UnknownPhase.new(phase) unless PHASES.include?(phase)

  @call_checks = check
    .watches
    .reduce(call_checks) { |acc, name| acc.merge(name => acc.fetch(name, []) | [check]) }
end

#register_deriver(gem_name, deriver) ⇒ Object



25
26
27
28
# File 'lib/jade/extensions.rb', line 25

def register_deriver(gem_name, deriver)
  allow!(gem_name)
  @derivers = derivers | [deriver]
end

#reset!Object



59
60
61
62
# File 'lib/jade/extensions.rb', line 59

def reset!
  @derivers = []
  @call_checks = {}
end