Module: AnalyticsOps::Canonical

Defined in:
lib/analytics_ops/canonical.rb

Overview

Deterministic serialization shared by snapshots and saved plans.

Class Method Summary collapse

Class Method Details

.copy(value) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/analytics_ops/canonical.rb', line 52

def copy(value)
  case value
  when Hash
    value.to_h { |key, child| [copy(key), copy(child)] }
  when Array
    value.map { |child| copy(child) }
  when String
    value.dup
  else
    value
  end
end

.deep_freeze(value) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/analytics_ops/canonical.rb', line 34

def deep_freeze(value)
  case value
  when Hash
    value.each do |key, child|
      deep_freeze(key)
      deep_freeze(child)
    end
  when Array
    value.each { |child| deep_freeze(child) }
  end

  value.freeze
end

.fingerprint(value) ⇒ Object



30
31
32
# File 'lib/analytics_ops/canonical.rb', line 30

def fingerprint(value)
  "sha256:#{Digest::SHA256.hexdigest(json(value))}"
end

.immutable(value) ⇒ Object



48
49
50
# File 'lib/analytics_ops/canonical.rb', line 48

def immutable(value)
  deep_freeze(copy(value))
end

.json(value) ⇒ Object



26
27
28
# File 'lib/analytics_ops/canonical.rb', line 26

def json(value)
  JSON.generate(normalize(value))
end

.normalize(value) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/analytics_ops/canonical.rb', line 13

def normalize(value)
  case value
  when Hash
    value.each_with_object({}) do |(key, child), result|
      result[key.to_s] = normalize(child)
    end.sort.to_h
  when Array
    value.map { |child| normalize(child) }
  else
    value
  end
end