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 28 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"]), Version.new(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 57 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] # NOTE: The :auto value is not expanded here since no architecture # value comparisons are being done within this method architecture = opts.fetch(:architecture, :auto) @version_map.keys.sort.reverse.each do |v| next if !requirements.all? { |r| r.satisfied_by?(v) } version = @version_map[v] valid_providers = version.providers # If filtering by provider(s), apply filter valid_providers &= providers if providers # Skip if no valid providers are found next if valid_providers.empty? # Skip if no valid provider includes support # the desired architecture next if architecture && valid_providers.none? { |p| version.provider(p, architecture) } 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 97 def versions(**opts) architecture = opts[:architecture] provider = opts[:provider].to_sym if opts[:provider] # Return full version list if no filters provided if provider.nil? && architecture.nil? return @version_map.keys.sort.map(&:to_s) end # If a specific provider is not provided, filter # only on architecture if provider.nil? return @version_map.select { |_, version| !version.providers(architecture).empty? }.keys.sort.map(&:to_s) end @version_map.select { |_, version| version.provider(provider, architecture) }.keys.sort.map(&:to_s) end