Module: Athar::Context

Defined in:
lib/athar/context.rb

Constant Summary collapse

PG_META_KEY =
"athar.meta"
PG_DISABLED_KEY =
"athar.disabled"

Class Method Summary collapse

Class Method Details

.with_actor(actor, &block) ⇒ Object

Raises:

  • (ArgumentError)


9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/athar/context.rb', line 9

def with_actor(actor, &block)
  raise ArgumentError, "block required" unless block

  return block.call if actor.nil?

  unless actor.is_a?(ActiveRecord::Base)
    raise ArgumentError,
          "Athar.with_actor only accepts ActiveRecord instances. " \
          "Use Athar.with_metadata(actor: #{actor.inspect}) for symbolic actors."
  end

  meta = {
    "actor_type" => actor.class.base_class.name,
    "actor_id" => actor.public_send(actor.class.primary_key)
  }

  (meta, &block)
end

.with_context(actor: nil, **metadata, &block) ⇒ Object

Raises:

  • (ArgumentError)


47
48
49
50
51
52
53
54
# File 'lib/athar/context.rb', line 47

def with_context(actor: nil, **, &block)
  raise ArgumentError, "block required" unless block

  return with_actor(actor, &block) if .empty?
  return (, &block) if actor.nil?

  with_actor(actor) { (, &block) }
end

.with_metadata(meta = nil, **kwargs, &block) ⇒ Object

rubocop:disable Metrics/MethodLength

Raises:

  • (ArgumentError)


28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/athar/context.rb', line 28

def (meta = nil, **kwargs, &block) # rubocop:disable Metrics/MethodLength
  raise ArgumentError, "block required" unless block

  normalized = normalize_meta(meta, kwargs)
  return block.call if normalized.empty?

  run_in_transaction do
    previous_merged = MetadataStack.current
    MetadataStack.push(normalized)
    begin
      apply_meta(MetadataStack.current)
      block.call
    ensure
      MetadataStack.pop
      apply_meta(previous_merged)
    end
  end
end

.without_capture(&block) ⇒ Object

Raises:

  • (ArgumentError)


56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/athar/context.rb', line 56

def without_capture(&block)
  raise ArgumentError, "block required" unless block

  run_in_transaction do
    previous = read_disabled_setting
    set_local(PG_DISABLED_KEY, "on")
    begin
      block.call
    ensure
      restore_disabled_setting(previous)
    end
  end
end