Module: AnalyticsOps::Canonical
- Defined in:
- lib/analytics_ops/canonical.rb
Overview
Deterministic serialization shared by snapshots and saved plans.
Class Method Summary collapse
- .copy(value) ⇒ Object
- .deep_freeze(value) ⇒ Object
- .fingerprint(value) ⇒ Object
- .immutable(value) ⇒ Object
- .json(value) ⇒ Object
- .normalize(value) ⇒ Object
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 |