Class: GoogleDrive::File

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Util
Defined in:
lib/google_drive/file.rb

Overview

A file in Google Drive, including a Google Docs document/spreadsheet/presentation and a folder.

Use GoogleDrive::Session#files or GoogleDrive::Session#file_by_title to get this object.

In addition to the methods below, properties defined here are also available as attributes: developers.google.com/drive/v3/reference/files#resource

e.g.,

file.mime_type  # ==> "text/plain"

Direct Known Subclasses

Collection, Spreadsheet

Constant Summary

Constants included from Util

Util::EXT_TO_CONTENT_TYPE, Util::IMPORTABLE_CONTENT_TYPE_MAP

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Util

concat_url, construct_and_query, construct_query, convert_params, delegate_api_methods, encode_query, get_singleton_class, h

Constructor Details

#initialize(session, api_file) ⇒ File

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of File.



29
30
31
32
33
34
# File 'lib/google_drive/file.rb', line 29

def initialize(session, api_file)
  @session = session
  @api_file = api_file
  @acl = nil
  delegate_api_methods(self, @api_file, [:title])
end

Instance Attribute Details

#api_fileObject (readonly)

Wrapped Google::APIClient::Schema::Drive::V3::File object.



37
38
39
# File 'lib/google_drive/file.rb', line 37

def api_file
  @api_file
end

Instance Method Details

#acl(params = {}) ⇒ Object

Returns GoogleDrive::Acl object for the file.

With the object, you can see and modify people who can access the file. Modifications take effect immediately.

e.g.

# Dumps people who have access:
for entry in file.acl
  p [entry.type, entry.email_address, entry.role]
  # => e.g. ["user", "[email protected]", "owner"]
end

# Shares the file with new people:
# NOTE: This sends email to the new people.
file.acl.push(
    {type: "user", email_address: "[email protected]", role: "reader"})
file.acl.push(
    {type: "user", email_address: "[email protected]", role: "writer"})

# Changes the role of a person:
file.acl[1].role = "writer"

# Deletes an ACL entry:
file.acl.delete(file.acl[1])


249
250
251
252
# File 'lib/google_drive/file.rb', line 249

def acl(params = {})
  @acl = Acl.new(@session, self) if !@acl || params[:reload]
  @acl
end

#acl_feed_urlObject

Deprecated ACL feed URL of the file.



59
60
61
# File 'lib/google_drive/file.rb', line 59

def acl_feed_url
  document_feed_url + '/acl'
end

#available_content_typesObject

Content types you can specify in methods download_to_file, download_to_string, download_to_io.

This returns zero or one file type. You may be able to download the file in other formats using export_as_file, export_as_string, or export_to_io.



88
89
90
# File 'lib/google_drive/file.rb', line 88

def available_content_types
  api_file.web_content_link ? [api_file.mime_type] : []
end

#copy(title, file_properties = {}) ⇒ Object Also known as: duplicate

Creates copy of this file with the given title.



216
217
218
219
220
221
# File 'lib/google_drive/file.rb', line 216

def copy(title, file_properties = {})
  api_file = @session.drive_service.copy_file(
    id, { name: title }.merge(file_properties), fields: '*', supports_all_drives: true
  )
  @session.wrap_api_file(api_file)
end

#delete(permanent = false) ⇒ Object

If permanent is false, moves the file to the trash. If permanent is true, deletes the file permanently.



194
195
196
197
198
199
200
201
202
203
# File 'lib/google_drive/file.rb', line 194

def delete(permanent = false)
  if permanent
    @session.drive_service.delete_file(id, supports_all_drives: true)
  else
    @session.drive_service.update_file(
      id, { trashed: true }, supports_all_drives: true
    )
  end
  nil
end

#document_feed_urlObject

URL of feed used in the deprecated document list feed API.



53
54
55
56
# File 'lib/google_drive/file.rb', line 53

def document_feed_url
  'https://docs.google.com/feeds/default/private/full/' +
    CGI.escape(resource_id)
end

#download_to_file(path, params = {}) ⇒ Object

Downloads the file to a local file. e.g.

file.download_to_file("/path/to/hoge.txt")

To export the file in other formats, use export_as_file.



96
97
98
99
100
101
# File 'lib/google_drive/file.rb', line 96

def download_to_file(path, params = {})
  @session.drive_service.get_file(
    id,
    { download_dest: path, supports_all_drives: true }.merge(params)
  )
end

#download_to_io(io, params = {}) ⇒ Object

Downloads the file and writes it to io.

To export the file in other formats, use export_to_io.



115
116
117
118
119
120
# File 'lib/google_drive/file.rb', line 115

def download_to_io(io, params = {})
  @session.drive_service.get_file(
    id,
    **{ download_dest: io, supports_all_drives: true }.merge(params)
  )
end

#download_to_string(params = {}) ⇒ Object

Downloads the file and returns as a String.

To export the file in other formats, use export_as_string.



106
107
108
109
110
# File 'lib/google_drive/file.rb', line 106

def download_to_string(params = {})
  sio = StringIO.new
  download_to_io(sio, params)
  sio.string
end

#export_as_file(path, format = nil) ⇒ Object

Export the file to path in content type format. If format is nil, it is guessed from the file name.

e.g.,

spreadsheet.export_as_file("/path/to/hoge.csv")
spreadsheet.export_as_file("/path/to/hoge", "text/csv")

If you want to download the file in the original format, use download_to_file instead.



131
132
133
134
135
136
137
138
139
140
141
# File 'lib/google_drive/file.rb', line 131

def export_as_file(path, format = nil)
  unless format
    format = EXT_TO_CONTENT_TYPE[::File.extname(path).downcase]
    unless format
      raise(ArgumentError,
            format("Cannot guess format from the file name: %s\n" \
             'Specify format argument explicitly.', path))
    end
  end
  export_to_dest(path, format)
end

#export_as_string(format) ⇒ Object

Export the file as String in content type format.

e.g.,

spreadsheet.export_as_string("text/csv")

If you want to download the file in the original format, use download_to_string instead.



150
151
152
153
154
# File 'lib/google_drive/file.rb', line 150

def export_as_string(format)
  sio = StringIO.new
  export_to_dest(sio, format)
  sio.string
end

#export_to_io(io, format) ⇒ Object

Export the file to io in content type format.

If you want to download the file in the original format, use download_to_io instead.



160
161
162
# File 'lib/google_drive/file.rb', line 160

def export_to_io(io, format)
  export_to_dest(io, format)
end

#human_urlObject

URL to view/edit the file in a Web browser.

e.g. “docs.google.com/file/d/xxxx/edit



79
80
81
# File 'lib/google_drive/file.rb', line 79

def human_url
  api_file.web_view_link
end

#inspectObject



254
255
256
# File 'lib/google_drive/file.rb', line 254

def inspect
  format("\#<%p id=%p title=%p>", self.class, id, title)
end

#reload_metadataObject

Reloads file metadata such as title and acl.



40
41
42
43
44
45
# File 'lib/google_drive/file.rb', line 40

def 
  @api_file = @session.drive_service.get_file(
    id, fields: '*', supports_all_drives: true
  )
  @acl = Acl.new(@session, self) if @acl
end

#rename(title) ⇒ Object Also known as: title=

Renames title of the file.



206
207
208
209
210
211
# File 'lib/google_drive/file.rb', line 206

def rename(title)
  @session.drive_service.update_file(
    id, { name: title }, supports_all_drives: true
  )
  nil
end

#resource_idObject

Returns resource_type + “:” + id.



48
49
50
# File 'lib/google_drive/file.rb', line 48

def resource_id
  format('%s:%s', resource_type, id)
end

#resource_typeObject

The type of resourse. e.g. “document”, “spreadsheet”, “folder”



64
65
66
# File 'lib/google_drive/file.rb', line 64

def resource_type
  mime_type.slice(/^application\/vnd.google-apps.(.+)$/, 1) || 'file'
end

#title(params = {}) ⇒ Object Also known as: name

Title of the file.



69
70
71
72
# File 'lib/google_drive/file.rb', line 69

def title(params = {})
   if params[:reload]
  api_file.name
end

#update_from_file(path, params = {}) ⇒ Object

Updates the file with the content of the local file.

e.g.

file.update_from_file("/path/to/hoge.txt")


176
177
178
179
180
181
182
183
# File 'lib/google_drive/file.rb', line 176

def update_from_file(path, params = {})
  # Somehow it doesn't work if I specify the file name directly as
  # upload_source.
  open(path, 'rb') do |f|
    update_from_io(f, params)
  end
  nil
end

#update_from_io(io, params = {}) ⇒ Object

Reads content from io and updates the file with the content.



186
187
188
189
190
# File 'lib/google_drive/file.rb', line 186

def update_from_io(io, params = {})
  params = { upload_source: io, supports_all_drives: true }.merge(params)
  @session.drive_service.update_file(id, nil, **params)
  nil
end

#update_from_string(content, params = {}) ⇒ Object

Updates the file with content.

e.g.

file.update_from_string("Good bye, world.")


168
169
170
# File 'lib/google_drive/file.rb', line 168

def update_from_string(content, params = {})
  update_from_io(StringIO.new(content), params)
end