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 Google Docs document/spreadsheet/presentation.

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

:nodoc:



26
27
28
29
30
31
# File 'lib/google_drive/file.rb', line 26

def initialize(session, api_file) #:nodoc:
  @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.



34
35
36
# File 'lib/google_drive/file.rb', line 34

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])


226
227
228
229
# File 'lib/google_drive/file.rb', line 226

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

#acl_feed_urlObject

Deprecated ACL feed URL of the file.



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

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.



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

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

#copy(title) ⇒ Object Also known as: duplicate

Creates copy of this file with the given title.



195
196
197
198
# File 'lib/google_drive/file.rb', line 195

def copy(title)
  api_file = @session.drive.copy_file(id, { name: title }, {})
  @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.



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

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

#document_feed_urlObject

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



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

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.



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

def download_to_file(path, params = {})
  @session.drive.get_file(id, {download_dest: path}.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.



104
105
106
# File 'lib/google_drive/file.rb', line 104

def download_to_io(io, params = {})
  @session.drive.get_file(id, {download_dest: io}.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.



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

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.



116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/google_drive/file.rb', line 116

def export_as_file(path, format = nil)
  unless format
    format = EXT_TO_CONTENT_TYPE[::File.extname(path).downcase]
    unless format
      fail(ArgumentError,
           ("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.



135
136
137
138
139
# File 'lib/google_drive/file.rb', line 135

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.



144
145
146
# File 'lib/google_drive/file.rb', line 144

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



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

def human_url
  api_file.web_view_link
end

#inspectObject



231
232
233
# File 'lib/google_drive/file.rb', line 231

def inspect
  "\#<%p id=%p title=%p>" % [self.class, id, title]
end

#reload_metadataObject

Reloads file metadata such as title and acl.



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

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

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

Renames title of the file.



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

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

#resource_idObject

Returns resource_type + “:” + id.



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

def resource_id
  '%s:%s' % [resource_type, id]
end

#resource_typeObject

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



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

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

#title(params = {}) ⇒ Object

Title of the file.



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

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")


160
161
162
163
164
165
166
# File 'lib/google_drive/file.rb', line 160

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.



169
170
171
172
173
# File 'lib/google_drive/file.rb', line 169

def update_from_io(io, params = {})
  params = { upload_source: io }.merge(params)
  @session.drive.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.")


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

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