Class: Gemvault::Manifest

Inherits:
Object
  • Object
show all
Defined in:
lib/gemvault/manifest.rb

Overview

The manifest.json stored as the first entry of a Tarvault. Records each gem's identity, timestamp, and SHA256 digest so listing and integrity checks never require reading every gem blob.

Defined Under Namespace

Classes: StoredGem

Constant Summary collapse

FILENAME =
"manifest.json".freeze
FORMAT_VERSION =
2

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(created_at:, records:, format_version: FORMAT_VERSION) ⇒ Manifest

Returns a new instance of Manifest.



45
46
47
# File 'lib/gemvault/manifest.rb', line 45

def initialize(created_at:, records:, format_version: FORMAT_VERSION)
  super
end

Class Method Details

.digest(bytes) ⇒ Object



34
# File 'lib/gemvault/manifest.rb', line 34

def self.digest(bytes) = Digest::SHA256.hexdigest(bytes)

.empty(created_at:) ⇒ Object



36
# File 'lib/gemvault/manifest.rb', line 36

def self.empty(created_at:) = new(created_at:, records: [])

.parse(json) ⇒ Object



38
39
40
41
42
43
# File 'lib/gemvault/manifest.rb', line 38

def self.parse(json)
  data = JSON.parse(json, symbolize_names: true)
  records = data.fetch(:gems, []).map { |gem| StoredGem.from_h(gem) }
  format_version = (data[:vault_version] || FORMAT_VERSION).to_i
  new(created_at: data[:created_at], records:, format_version:)
end

Instance Method Details

#find(entry) ⇒ Object



53
54
55
# File 'lib/gemvault/manifest.rb', line 53

def find(entry)
  records.find { |record| record.gem.same_identity_as?(entry) }
end

#gem_entriesObject



63
64
65
# File 'lib/gemvault/manifest.rb', line 63

def gem_entries
  records.map(&:gem).sort_by { |gem| [gem.name, gem.version] }
end

#matching(reference) ⇒ Object



57
58
59
# File 'lib/gemvault/manifest.rb', line 57

def matching(reference)
  records.select { |record| reference.matches?(record.gem) }
end

#sizeObject



61
# File 'lib/gemvault/manifest.rb', line 61

def size = records.size

#to_hObject



67
68
69
70
71
72
73
74
# File 'lib/gemvault/manifest.rb', line 67

def to_h
  {
    vault_version: FORMAT_VERSION,
    format: "tarvault",
    created_at:,
    gems: records.map(&:to_h),
  }
end

#to_json(*_args) ⇒ Object



76
# File 'lib/gemvault/manifest.rb', line 76

def to_json(*_args) = JSON.pretty_generate(to_h)

#with_record(record) ⇒ Object



49
# File 'lib/gemvault/manifest.rb', line 49

def with_record(record) = with(records: records + [record])

#without(dropped) ⇒ Object



51
# File 'lib/gemvault/manifest.rb', line 51

def without(dropped) = with(records: records - dropped)