Class: VagrantCloud::Box::Version

Inherits:
Data::Mutable show all
Defined in:
lib/vagrant_cloud/box/version.rb

Constant Summary

Constants inherited from Data

Data::Nil

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Data::Mutable

#[], attr_mutable, #clean, #clean!, #freeze, load

Methods inherited from Data::Immutable

attr_optional, attr_required, inherited, #inspect, sync

Methods inherited from Data

#[], #inspect

Constructor Details

#initialize(box:, **opts) ⇒ Version

Returns a new instance of Version.



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/vagrant_cloud/box/version.rb', line 11

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

Instance Attribute Details

#boxObject (readonly)

Returns the value of attribute box.



4
5
6
# File 'lib/vagrant_cloud/box/version.rb', line 4

def box
  @box
end

Instance Method Details

#add_provider(pname, architecture = nil) ⇒ Provider

Add a new provider for this version

Parameters:

  • pname (String)

    Name of provider

Returns:



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/vagrant_cloud/box/version.rb', line 93

def add_provider(pname, architecture=nil)
  if providers.any? { |p|
       p.name == pname &&
         (architecture.nil? || p.architecture == architecture)
     }
    raise Error::BoxError::VersionProviderExistsError,
      "Provider #{pname} already exists for box #{box.tag} version #{version} (#{architecture})"
  end
  pv = Provider.new(
    version: self,
    name: pname,
  )
  pv.architecture = architecture if architecture
  clean(data: {providers: providers + [pv]})
  pv
end

#deletenil

Note:

This will delete the version, and all providers

Delete this version

Returns:

  • (nil)


31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/vagrant_cloud/box/version.rb', line 31

def delete
  if exist?
    box.organization..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

#dirty?(key = nil, deep: false) ⇒ Boolean

Check if this instance is dirty

Parameters:

  • deep (Boolean) (defaults to: false)

    Check nested instances

Returns:

  • (Boolean)

    instance is dirty



114
115
116
117
118
119
120
121
122
123
124
# File 'lib/vagrant_cloud/box/version.rb', line 114

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

#exist?Boolean

Returns version exists remotely.

Returns:

  • (Boolean)

    version exists remotely



127
128
129
# File 'lib/vagrant_cloud/box/version.rb', line 127

def exist?
  !!created_at
end

#releaseself

Release this version

Returns:

  • (self)


49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/vagrant_cloud/box/version.rb', line 49

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..client.box_version_release(
    username: box.username,
    name: box.name,
    version: version
  )
  clean(data: result, only: :status)
  self
end

#released?Boolean

Returns:

  • (Boolean)


85
86
87
# File 'lib/vagrant_cloud/box/version.rb', line 85

def released?
  status == "active"
end

#revokeself

Revoke this version

Returns:

  • (self)


70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/vagrant_cloud/box/version.rb', line 70

def revoke
  if !released?
    raise Error::BoxError::VersionStatusChangeError,
      "Version #{version} is not yet released for box #{box.tag}"
  end
  result = box.organization..client.box_version_revoke(
    username: box.username,
    name: box.name,
    version: version
  )
  clean(data: result, only: :status)
  self
end

#saveself

Save the version if any changes have been made

Returns:

  • (self)


134
135
136
137
138
# File 'lib/vagrant_cloud/box/version.rb', line 134

def save
  save_version if dirty?
  save_providers if dirty?(deep: true)
  self
end