Class: Vagrant::BoxMetadata

Inherits:
Object
  • Object
show all
Defined in:
lib/vagrant/box_metadata.rb,
lib/vagrant/box_metadata/remote.rb

Overview

BoxMetadata represents metadata about a box, including the name it should have, a description of it, the versions it has, and more.

Defined Under Namespace

Modules: Remote Classes: Provider, Version

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(io, **_) ⇒ BoxMetadata

Loads the metadata associated with the box from the given IO.

Parameters:

  • io (IO)

    An IO object to read the metadata from.



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 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

Instance Attribute Details

#descriptionString

The long-form human-readable description of a box.

Returns:

  • (String)


22
23
24
# File 'lib/vagrant/box_metadata.rb', line 22

def description
  @description
end

#nameString

The name that the box should be if it is added.

Returns:

  • (String)


17
18
19
# File 'lib/vagrant/box_metadata.rb', line 17

def name
  @name
end

Instance Method Details

#version(version, **opts) ⇒ Version

Returns data about a single version that is included in this metadata.

Parameters:

  • version (String)

    The version to return, this can also be a constraint.

Returns:

  • (Version)

    The matching version or nil if a matching version was not found.



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# 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) ⇒ Object

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.

@return[Array]



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# 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