BoxMetadata represents metadata about a box, including the name it should have, a description of it, the versions it has, and more.
The long-form human-readable description of a box.
@return [String]
The name that the box should be if it is added.
@return [String]
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 22 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
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 51 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
Returns all the versions supported by this metadata. These versions are sorted so the last element of the list is the latest version.
@
# File lib/vagrant/box_metadata.rb, line 74
def versions
@version_map.keys.sort.map(&:to_s)
end