class VagrantCloud::Box::Provider
Constants
- DirectUpload
Result for upload requests to upload directly to the storage backend.
@param [String] upload_url URL for uploading file asset @param [String] callback_url URL callback to PUT after successful upload @param [Proc] callback Callable proc to perform callback via configured client
Attributes
Public Class Methods
# File lib/vagrant_cloud/box/provider.rb, line 21 def initialize(version:, **opts) if !version.is_a?(Version) raise TypeError, "Expecting type `#{Version.name}` but received `#{version.class.name}`" end @version = version super(**opts) end
Public Instance Methods
Delete this provider
@return [nil]
# File lib/vagrant_cloud/box/provider.rb, line 32 def delete if exist? version.box.organization.account.client.box_version_provider_delete( username: version.box.username, name: version.box.name, version: version.version, provider: name ) pv = version.providers.dup pv.delete(self) version.clean(data: {providers: pv}) end nil end
Check if this instance is dirty
@param [Boolean] deep Check nested instances @return [Boolean] instance is dirty
# File lib/vagrant_cloud/box/provider.rb, line 135 def dirty?(key=nil, **args) if key super(key) else super || !exist? end end
@return [Boolean] provider exists remotely
# File lib/vagrant_cloud/box/provider.rb, line 127 def exist? !!created_at end
Save the provider if any changes have been made
@return [self]
# File lib/vagrant_cloud/box/provider.rb, line 146 def save save_provider if dirty? self end
Upload box file to be hosted on VagrantCloud
. This method provides different behaviors based on the parameters passed. When the `direct` option is enabled the upload target will be directly to the backend storage. However, when the `direct` option is used the upload process becomes a two steps where a callback must be called after the upload is complete.
If the path is provided, the file will be uploaded and the callback will be requested if the `direct` option is enabled.
If a block is provided, the upload URL will be yielded to the block. If the `direct` option is set, the callback will be automatically requested after the block execution has completed.
If no path or block is provided, the upload URL will be returned. If the `direct` option is set, the `DirectUpload` instance will be yielded and it is the caller's responsibility to issue the callback
@param [String] path Path to asset @param [Boolean] direct Upload directly to backend storage @yieldparam [String] url URL to upload asset @return [self, Object, String, DirectUpload] self when path provided, result of yield when block provided, URL otherwise @note The callback request uses PUT request method
# File lib/vagrant_cloud/box/provider.rb, line 74 def upload(path: nil, direct: false) if !exist? raise Error::BoxError::ProviderNotFoundError, "Provider #{name} not found for box #{version.box.tag} version #{version.version}" end if path && block_given? raise ArgumentError, "Only path or block may be provided, not both" end if path && !File.exist?(path) raise Errno::ENOENT, path end req_args = { username: version.box.username, name: version.box.name, version: version.version, provider: name } if direct r = version.box.organization.account.client.box_version_provider_upload_direct(**req_args) else r = version.box.organization.account.client.box_version_provider_upload(**req_args) end result = DirectUpload.new( upload_url: r[:upload_path], callback_url: r[:callback], callback: proc { if r[:callback] version.box.organization.account.client. request(method: :put, path: URI.parse(r[:callback]).path) end } ) if block_given? block_r = yield result.upload_url result[:callback].call block_r elsif path File.open(path, "rb") do |file| chunks = lambda { file.read(Excon.defaults[:chunk_size]).to_s } Excon.put(result.upload_url, request_block: chunks) end result[:callback].call self else # When returning upload information for requester to complete, # return upload URL when `direct` option is false, otherwise # return the `DirectUpload` instance direct ? result : result.upload_url end end
Protected Instance Methods
Save the provider
@return [self]
# File lib/vagrant_cloud/box/provider.rb, line 156 def save_provider req_args = { username: version.box.username, name: version.box.name, version: version.version, provider: name, checksum: checksum, checksum_type: checksum_type, url: url } if exist? result = version.box.organization.account.client.box_version_provider_update(**req_args) else result = version.box.organization.account.client.box_version_provider_create(**req_args) end clean(data: result) self end