1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
module VagrantCloud
class Box
class Version < Data::Mutable
attr_reader :box
attr_required :version
attr_optional :status, :description_html, :description_markdown,
:created_at, :updated_at, :number, :providers, :description
attr_mutable :description
def initialize(box:, **opts)
if !box.is_a?(Box)
raise TypeError, "Expecting type `#{Box.name}` but received `#{box.class.name}`"
end
@box = box
opts[:providers] = Array(opts[:providers]).map do |provider|
if provider.is_a?(Provider)
provider
else
Provider.load(version: self, **provider)
end
end
super(**opts)
clean!
end
# Delete this version
#
# @return [nil]
# @note This will delete the version, and all providers
def delete
if exist?
box.organization.account.client.box_version_delete(
username: box.username,
name: box.name,
version: version
)
# Remove self from box
v = box.versions.dup
v.delete(self)
box.clean(data: {versions: v})
end
nil
end
# Release this version
#
# @return [self]
def release
if released?
raise Error::BoxError::VersionStatusChangeError,
"Version #{version} is already released for box #{box.tag}"
end
if !exist?
raise Error::BoxError::VersionStatusChangeError,
"Version #{version} for box #{box.tag} must be saved before release"
end
result = box.organization.account.client.box_version_release(
username: box.username,
name: box.name,
version: version
)
clean(data: result, only: :status)
self
end
# Revoke this version
#
# @return [self]
def revoke
if !released?
raise Error::BoxError::VersionStatusChangeError,
"Version #{version} is not yet released for box #{box.tag}"
end
result = box.organization.account.client.box_version_revoke(
username: box.username,
name: box.name,
version: version
)
clean(data: result, only: :status)
self
end
# @return [Boolean]
def released?
status == "active"
end
# Add a new provider for this version
#
# @param [String] pname Name of provider
# @return [Provider]
def add_provider(pname)
if providers.any? { |p| p.name == pname }
raise Error::BoxError::VersionProviderExistsError,
"Provider #{pname} already exists for box #{box.tag} version #{version}"
end
pv = Provider.new(version: self, name: pname)
clean(data: {providers: providers + [pv]})
pv
end
# Check if this instance is dirty
#
# @param [Boolean] deep Check nested instances
# @return [Boolean] instance is dirty
def dirty?(key=nil, deep: false)
if key
super(key)
else
d = super() || !exist?
if deep && !d
d = providers.any? { |p| p.dirty?(deep: true) }
end
d
end
end
# @return [Boolean] version exists remotely
def exist?
!!created_at
end
# Save the version if any changes have been made
#
# @return [self]
def save
save_version if dirty?
save_providers if dirty?(deep: true)
self
end
protected
# Save the version
#
# @return [self]
def save_version
params = {
username: box.username,
name: box.name,
version: version,
description: description
}
if exist?
result = box.organization.account.client.box_version_update(**params)
else
result = box.organization.account.client.box_version_create(**params)
end
clean(data: result, ignores: :providers)
self
end
# Save the providers if any require saving
#
# @return [self]
def save_providers
Array(providers).map(&:save)
self
end
end
end
end
|