Module: VisualBriefGuard

Defined in:
lib/visual_brief_guard.rb,
lib/visual_brief_guard/version.rb

Defined Under Namespace

Classes: InvalidBrief

Constant Summary collapse

REQUIRED_KEYS =
%w[
  scene
  aspect_ratio
  color_palette
  reference_tags
].freeze
ALLOWED_KEYS =
(REQUIRED_KEYS + %w[schema_version constraints notes]).freeze
VERSION =
"1.0.0"

Class Method Summary collapse

Class Method Details

.canonical(brief) ⇒ Object



39
40
41
42
# File 'lib/visual_brief_guard.rb', line 39

def canonical(brief)
  validate!(brief)
  canonicalize(brief.transform_keys(&:to_s))
end

.canonical_json(brief) ⇒ Object



44
45
46
# File 'lib/visual_brief_guard.rb', line 44

def canonical_json(brief)
  JSON.generate(canonical(brief))
end

.export(brief, path) ⇒ Object



52
53
54
55
# File 'lib/visual_brief_guard.rb', line 52

def export(brief, path)
  File.write(path, "#{canonical_json(brief)}\n")
  path
end

.fingerprint(brief) ⇒ Object



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

def fingerprint(brief)
  Digest::SHA256.hexdigest(canonical_json(brief))
end

.validate!(brief) ⇒ Object

Raises:



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/visual_brief_guard.rb', line 20

def validate!(brief)
  raise InvalidBrief, "brief must be a Hash" unless brief.is_a?(Hash)

  string_keys = brief.transform_keys(&:to_s)
  missing = REQUIRED_KEYS.reject do |key|
    string_keys.key?(key) && !blank?(string_keys[key])
  end
  raise InvalidBrief, "missing required fields: #{missing.join(', ')}" unless missing.empty?

  unknown = string_keys.keys - ALLOWED_KEYS
  raise InvalidBrief, "unknown fields: #{unknown.sort.join(', ')}" unless unknown.empty?

  unless string_keys["reference_tags"].is_a?(Array)
    raise InvalidBrief, "reference_tags must be an Array"
  end

  true
end