Class: Gemvault::Manifest
- Inherits:
-
Object
- Object
- Gemvault::Manifest
- 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
-
#created_at ⇒ Object
readonly
Returns the value of attribute created_at.
-
#format_version ⇒ Object
readonly
Returns the value of attribute format_version.
-
#records ⇒ Object
readonly
Returns the value of attribute records.
Class Method Summary collapse
Instance Method Summary collapse
- #find(name, version, platform) ⇒ Object
- #gem_entries ⇒ Object
-
#initialize(created_at:, records:, format_version: FORMAT_VERSION) ⇒ Manifest
constructor
A new instance of Manifest.
- #to_json(*_args) ⇒ Object
- #with(record) ⇒ Object
- #without(dropped) ⇒ Object
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_at ⇒ Object (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_version ⇒ Object (readonly)
Returns the value of attribute format_version.
43 44 45 |
# File 'lib/gemvault/manifest.rb', line 43 def format_version @format_version end |
#records ⇒ Object (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_entries ⇒ Object
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 |