class Vagrant::BoxMetadata
BoxMetadata
represents metadata about a box, including the name it should have, a description of it, the versions it has, and more.
Attributes
description[RW]
The long-form human-readable description of a box.
@return [String]
name[RW]
The name that the box should be if it is added.
@return [String]
Public Class Methods
new(io, **_)
click to toggle source
Loads the metadata associated with the box from the given IO.
@param [IO] io An IO object to read the metadata from.
# File lib/vagrant/box_metadata.rb, line 25 def initialize(io, **_) begin @raw = JSON.load(io) rescue JSON::ParserError => e raise Errors::BoxMetadataMalformed, error: e.to_s end @raw ||= {} @name = @raw["name"] @description = @raw["description"] @version_map = (@raw["versions"] || []).map do |v| begin [Gem::Version.new(v["version"]), v] rescue ArgumentError raise Errors::BoxMetadataMalformedVersion, version: v["version"].to_s end end @version_map = Hash[@version_map] end
Public Instance Methods
version(version, **opts)
click to toggle source
Returns data about a single version that is included in this metadata.
@param [String] version The version to return, this can also
be a constraint.
@return [Version] The matching version or nil if a matching
version was not found.
# File lib/vagrant/box_metadata.rb, line 54 def version(version, **opts) requirements = version.split(",").map do |v| Gem::Requirement.new(v.strip) end providers = nil providers = Array(opts[:provider]).map(&:to_sym) if opts[:provider] @version_map.keys.sort.reverse.each do |v| next if !requirements.all? { |r| r.satisfied_by?(v) } version = Version.new(@version_map[v]) next if (providers & version.providers).empty? if providers return version end nil end
versions(**opts)
click to toggle source
Returns all the versions supported by this metadata. These versions are sorted so the last element of the list is the latest version. Optionally filter versions by a matching provider.
# File lib/vagrant/box_metadata.rb, line 78 def versions(**opts) provider = nil provider = opts[:provider].to_sym if opts[:provider] if provider @version_map.select do |version, raw| if raw["providers"] raw["providers"].detect do |p| p["name"].to_sym == provider end end end.keys.sort.map(&:to_s) else @version_map.keys.sort.map(&:to_s) end end