lib/asana/resource_includes/attachment_uploading.rb in asana-0.10.2 vs lib/asana/resource_includes/attachment_uploading.rb in asana-0.10.3
- old
+ new
@@ -3,28 +3,35 @@
# Internal: Mixin to add the ability to upload an attachment to a specific
# Asana resource (a Task, really).
module AttachmentUploading
# Uploads a new attachment to the resource.
#
- # filename - [String] the absolute path of the file to upload.
+ # 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
def attach(filename: required('filename'),
mime: required('mime'),
- options: {}, **data)
- path = File.expand_path(filename)
- unless File.exist?(path)
- raise ArgumentError, "file #{filename} doesn't exist"
- end
- upload = Faraday::UploadIO.new(path, 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
# rubocop:enable Metrics/MethodLength
# rubocop:enable Metrics/AbcSize
end