Class: Vagrant::BoxMetadata
- Inherits:
-
Object
- Object
- Vagrant::BoxMetadata
- 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
-
#description ⇒ String
The long-form human-readable description of a box.
-
#name ⇒ String
The name that the box should be if it is added.
Instance Method Summary collapse
-
#initialize(io, **_) ⇒ BoxMetadata
constructor
Loads the metadata associated with the box from the given IO.
-
#version(version, **opts) ⇒ Version
Returns data about a single version that is included in this metadata.
-
#versions(**opts) ⇒ Object
Returns all the versions supported by this metadata.
Constructor Details
#initialize(io, **_) ⇒ BoxMetadata
Loads the metadata associated with the box from the given IO.
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
#description ⇒ String
The long-form human-readable description of a box.
22 23 24 |
# File 'lib/vagrant/box_metadata.rb', line 22 def description @description end |
#name ⇒ String
The name that the box should be if it is added.
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.
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 |