require 'cgi'
require 'faraday'

module Smartsheet
  module API
    # Specification for a file attachment by path, target filename, and MIME content type
    class PathFileSpec
      attr_reader :upload_io, :filename, :content_type, :file_length

      def initialize(path, filename, content_type)
        @file_length = File.size(path)
        @filename = (filename.nil? || filename.empty?) ? File.basename(path) : filename
        @upload_io = Faraday::UploadIO.new(path, content_type, CGI::escape(@filename))
        @content_type = content_type
      end
    end

    # Specification for a file attachment by {::File}, target filename, file length, and MIME
    # content type
    class ObjectFileSpec
      attr_reader :upload_io, :filename, :content_type, :file_length

      def initialize(file, filename, file_length, content_type)
        @file_length = file_length
        @filename = filename
        @upload_io = Faraday::UploadIO.new(file, content_type, CGI::escape(filename))
        @content_type = content_type
      end
    end
  end
end

require 'cgi'
require 'faraday'

module Smartsheet
  module API
    # Specification for a file attachment by path, target filename, and MIME content type
    class PathFileSpec
      attr_reader :upload_io, :filename, :content_type, :file_length

      def initialize(path, filename, content_type)
        @file_length = File.size(path)
        @filename = (filename.nil? || filename.empty?) ? File.basename(path) : filename
        @upload_io = Faraday::UploadIO.new(path, content_type, CGI::escape(@filename))
        @content_type = content_type
      end
    end

    # Specification for a file attachment by {::File}, target filename, file length, and MIME
    # content type
    class ObjectFileSpec
      attr_reader :upload_io, :filename, :content_type, :file_length

      def initialize(file, filename, file_length, content_type)
        @file_length = file_length
        @filename = filename
        @upload_io = Faraday::UploadIO.new(file, content_type, CGI::escape(filename))
        @content_type = content_type
      end
    end

    # Specification for file sheet import by path and MIME content type
    class ImportPathFileSpec
      attr_reader :upload_io, :filename, :content_type, :file_length

      def initialize(path, content_type)
        @file_length = File.size(path)
        @filename = nil
        @upload_io = Faraday::UploadIO.new(path, content_type)
        @content_type = content_type
      end
    end

    # Specification for file sheet import by {::File}, file length, and MIME content type
    class ImportObjectFileSpec
      attr_reader :upload_io, :filename, :content_type, :file_length

      def initialize(file, file_length, content_type)
        @file_length = file_length
        @filename = nil
        @upload_io = Faraday::UploadIO.new(file, content_type)
        @content_type = content_type
      end
    end
  end
end

Add new file specifications for sheet importing.
Add new file specifications for sheet importing.
