module Asana::Resources::AttachmentUploading

Internal: Mixin to add the ability to upload an attachment to a specific Asana resource (a Task, really).

Public Instance Methods

attach(filename: required('filename'), mime: required('mime'), io: nil, options: {}, **data) click to toggle source

Uploads a new attachment to the resource.

filename - [String] the absolute path of the file to upload OR the desired filename when using io mime - [String] the MIME type of the file io - [IO] an object which returns the file's content on #read, e.g. a ::StringIO options - [Hash] the request I/O options data - [Hash] extra attributes to post

rubocop:disable Metrics/AbcSize rubocop:disable Metrics/MethodLength

# File lib/asana/resource_includes/attachment_uploading.rb, line 16
def attach(filename: required('filename'),
           mime: required('mime'),
           io: nil, options: {}, **data)

  upload = if io.nil?
             path = File.expand_path(filename)
             raise ArgumentError, "file #{filename} doesn't exist" unless File.exist?(path)

             Faraday::FilePart.new(path, mime)
           else
             Faraday::FilePart.new(io, mime, filename)
           end

  response = client.post("/#{self.class.plural_name}/#{gid}/attachments",
                         body: data,
                         upload: upload,
                         options: options)

  Attachment.new(parse(response).first, client: client)
end