Class: Muninn::Cache::KeyBuilder
- Inherits:
-
Object
- Object
- Muninn::Cache::KeyBuilder
- Defined in:
- lib/muninn/cache/key_builder.rb
Class Method Summary collapse
- .build(namespace:, scope:, deps: {}, fingerprint: nil, version: nil, mode: nil, entity_id: nil) ⇒ Object
- .build_deps(deps, scope_name: "entity") ⇒ Object
- .fingerprint_from_params(params:, allowed_keys: [], context: {}) ⇒ Object
- .normalize_payload(params, allowed_keys: []) ⇒ Object
- .normalize_value(value) ⇒ Object
Class Method Details
.build(namespace:, scope:, deps: {}, fingerprint: nil, version: nil, mode: nil, entity_id: nil) ⇒ Object
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# File 'lib/muninn/cache/key_builder.rb', line 9 def self.build(namespace:, scope:, deps: {}, fingerprint: nil, version: nil, mode: nil, entity_id: nil) scope_name = scope.fetch(:scope_name) scope_id = scope.fetch(:scope_id) version ||= VersionCounter.get(namespace: namespace, scope_name: scope_name, scope_id: scope_id) deps_versioned = build_deps(deps) parts = [] parts << "scope:#{scope_name}:#{scope_id}" parts << "namespace:#{namespace}" parts << "entity:#{entity_id}" if entity_id parts << "mode:#{mode}" if mode parts << "deps:#{deps_versioned}" if deps_versioned parts << "fingerprint:#{fingerprint}" if fingerprint parts << "version:#{version}" canonical = parts.join(":") "cache:#{Digest::SHA256.hexdigest(canonical)}" end |
.build_deps(deps, scope_name: "entity") ⇒ Object
53 54 55 56 57 58 59 60 |
# File 'lib/muninn/cache/key_builder.rb', line 53 def self.build_deps(deps, scope_name: "entity") return nil if deps.nil? || deps.empty? deps.map do |namespace, id| version = VersionCounter.get(namespace: namespace, scope_name: scope_name, scope_id: id) "#{namespace}:#{id}:v#{version}" end.sort.join("|") end |
.fingerprint_from_params(params:, allowed_keys: [], context: {}) ⇒ Object
26 27 28 29 |
# File 'lib/muninn/cache/key_builder.rb', line 26 def self.fingerprint_from_params(params:, allowed_keys: [], context: {}) payload = normalize_payload(params, allowed_keys: allowed_keys).merge(context) Digest::SHA256.hexdigest(JSON.generate(payload)) end |
.normalize_payload(params, allowed_keys: []) ⇒ Object
31 32 33 34 35 36 37 38 |
# File 'lib/muninn/cache/key_builder.rb', line 31 def self.normalize_payload(params, allowed_keys: []) data = params || {} data = data.to_h if data.respond_to?(:to_h) data = data.deep_symbolize_keys if data.respond_to?(:deep_symbolize_keys) allowed = allowed_keys.map(&:to_sym) data = data.slice(*allowed) if allowed.any? normalize_value(data) end |
.normalize_value(value) ⇒ Object
40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/muninn/cache/key_builder.rb', line 40 def self.normalize_value(value) case value when Hash value.keys.sort.each_with_object({}) do |key, acc| acc[key] = normalize_value(value[key]) end when Array value.map { |item| normalize_value(item) }.sort_by { |item| item.to_s } else value end end |