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: Record

Constant Summary collapse

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

Instance Attribute Summary collapse

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
48
49
# File 'lib/gemvault/manifest.rb', line 45

def initialize(created_at:, records:, format_version: FORMAT_VERSION)
  @created_at = created_at
  @records = records
  @format_version = format_version
end

Instance Attribute Details

#created_atObject (readonly)

Returns the value of attribute created_at.



43
44
45
# File 'lib/gemvault/manifest.rb', line 43

def created_at
  @created_at
end

#format_versionObject (readonly)

Returns the value of attribute format_version.



43
44
45
# File 'lib/gemvault/manifest.rb', line 43

def format_version
  @format_version
end

#recordsObject (readonly)

Returns the value of attribute records.



43
44
45
# File 'lib/gemvault/manifest.rb', line 43

def records
  @records
end

Class Method Details

.digest(bytes) ⇒ Object



25
26
27
# File 'lib/gemvault/manifest.rb', line 25

def self.digest(bytes)
  OpenSSL::Digest.new(DIGEST).hexdigest(bytes)
end

.empty(created_at:) ⇒ Object



29
30
31
# File 'lib/gemvault/manifest.rb', line 29

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

.parse(json) ⇒ Object



33
34
35
36
37
38
39
40
41
# File 'lib/gemvault/manifest.rb', line 33

def self.parse(json)
  data = JSON.parse(json)
  records = data.fetch("gems", []).map { |g| Record.new(**g.transform_keys(&:to_sym)) }
  new(
    created_at: data["created_at"],
    records: records,
    format_version: (data["vault_version"] || FORMAT_VERSION).to_i,
  )
end

Instance Method Details

#find(name, version, platform) ⇒ Object



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

def find(name, version, platform)
  records.find { |r| r.name == name && r.version == version && r.platform == platform }
end

#gem_entriesObject



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

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

#to_json(*_args) ⇒ Object



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

def to_json(*_args)
  JSON.pretty_generate(
    "vault_version" => FORMAT_VERSION,
    "format" => "tarvault",
    "created_at" => created_at,
    "gems" => records.map(&:to_h),
  )
end

#with(record) ⇒ Object



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

def with(record)
  self.class.new(created_at: created_at, records: records + [record], format_version: format_version)
end

#without(dropped) ⇒ Object



55
56
57
# File 'lib/gemvault/manifest.rb', line 55

def without(dropped)
  self.class.new(created_at: created_at, records: records - dropped, format_version: format_version)
end