drive_v3 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Read the content of a data file
5
+
6
+ require 'drive_v3'
7
+ require 'json'
8
+ require 'stringio'
9
+
10
+ drive_service = DriveV3.drive_service
11
+
12
+ file_id = ARGV[0] || ENV.fetch('FILE_ID', nil)
13
+ raise 'Missing file_id' unless file_id
14
+
15
+ # download_dest can be an IO object that responds to `write` that will receive
16
+ # the content of the file, or a string naming an existing file to be written
17
+ # to.
18
+ download_dest = StringIO.new
19
+
20
+ # Read content from file
21
+ #
22
+ begin
23
+ drive_service.get_file(file_id, download_dest:)
24
+ puts JSON.pretty_generate(download_dest.string)
25
+ rescue StandardError => e
26
+ puts "An error occurred: #{e.message}"
27
+ end
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Export a spreadsheet to a .tsv file
5
+ #
6
+ # To export a specific sheet, use the sheet_id parameter. To export multiple
7
+ # sheets, use the sheet_ids parameter. Omitting the sheet_id parameter exports
8
+ # the first sheet.
9
+ #
10
+ # To export to a different file type, change the mimeType parameter.
11
+
12
+ require 'drive_v3'
13
+ require 'json'
14
+
15
+ drive_service = DriveV3.drive_service
16
+
17
+ # First create a spreadsheet, populating with some data.
18
+ # Then get the file id of the spreadsheet.
19
+
20
+ name = 'My Test Spreadsheet'
21
+ parents = [] # Create in the user's My Drive root folder
22
+ mime_type = 'application/vnd.google-apps.spreadsheet'
23
+ file_metadata = { name:, parents:, mime_type: }
24
+ fields = 'id, name'
25
+ upload_source = StringIO.new("1,2,3\n4,5,6\n7,8,9")
26
+ content_type = 'text/csv'
27
+ begin
28
+ file = drive_service.create_file(file_metadata, fields:, upload_source:, content_type:)
29
+ puts JSON.pretty_generate(file.to_h)
30
+ rescue StandardError => e
31
+ puts "An error occurred: #{e.message}"
32
+ exit 1
33
+ end
34
+
35
+ # Export the spreadsheet to a PDF file nameed 'My Test Spreadsheet.pdf'
36
+
37
+ file_id = file.id
38
+ mime_type = 'application/pdf'
39
+ download_dest = "#{file.name}.pdf"
40
+
41
+ begin
42
+ drive_service.export_file(file_id, mime_type, download_dest:)
43
+ rescue StandardError => e
44
+ puts "An error occurred: #{e.message}"
45
+ exit 1
46
+ end
47
+
48
+ puts "Exported #{file.name} to #{download_dest}"
data/examples/file_get ADDED
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # `get_file` shows how to get a
5
+ # [File](https://github.com/googleapis/google-api-ruby-client/blob/main/generated/google-apis-drive_v3/lib/google/apis/drive_v3/classes.rb)
6
+ # from the drive controlling which fields are returned.
7
+
8
+ require 'drive_v3'
9
+
10
+ drive_service = DriveV3.drive_service
11
+
12
+ file_id = ARGV[0] || '1MNb_59W87lj75-9HqrEQoFBdrQiNl96rDlRy87sDIjs'
13
+
14
+ # If `fields` is not specified, the following fields are returned for each file:
15
+ # id, name, mimeType, and kind.
16
+ #
17
+ # Could return all possible fields by specifying `fields: '*'`. See
18
+ # [Return specific fields for a file](https://developers.google.com/drive/api/guides/fields-parameter)
19
+ # for more information about how to retrieve other fields.
20
+ #
21
+ # fields = 'id, name, parents, web_view_link'
22
+ fields = '*'
23
+
24
+ # If `supports_all_drives` is false or not specified, the request will fail if
25
+ # the file is in a shared drive.
26
+ #
27
+ # See [Search for files & folders](https://developers.google.com/drive/api/v3/search-files)
28
+ # for more information about how to search for files in shared drives.
29
+ #
30
+ supports_all_drives = true
31
+
32
+ begin
33
+ file = drive_service.get_file(file_id, fields:, supports_all_drives:)
34
+ puts JSON.pretty_generate(file.to_h)
35
+ rescue StandardError => e
36
+ puts "An error occurred: #{e.message}"
37
+ end
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # `recover_trashed_file` shows how to recover a file from the trash.
5
+ #
6
+ # Moving a file to the trash is done by updating the file's trashed attribute to
7
+ # true. To recover a trashed file is done by updating the file's trashed attribute
8
+ # to false.
9
+
10
+ require 'drive_v3'
11
+
12
+ drive_service = DriveV3.drive_service
13
+
14
+ file_id = ARGV[0] || ENV.fetch('FILE_ID', nil)
15
+ raise 'Missing file_id' unless file_id
16
+
17
+ begin
18
+ print 'Recovering trashed file...'
19
+ file_object = { trashed: false }
20
+ file = drive_service.update_file(file_id, file_object)
21
+ puts "update_file result:\n#{file.to_h.pretty_inspect}"
22
+ rescue StandardError => e
23
+ puts "An error occurred: #{e.message}"
24
+ end
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Search for files owned by the current user
5
+ #
6
+ # Returns a [FileList](https://github.com/googleapis/google-api-ruby-client/blob/main/generated/google-apis-drive_v3/lib/google/apis/drive_v3/classes.rb)
7
+ # object. The FileList object has a `files` property that is an array of files returned.
8
+ #
9
+ # This example illustrates how to:
10
+ # 1. specify a search query (to omit files in the trash)
11
+ # 2. specify which fields to return for each file
12
+ # 3. retrieve pagenated results
13
+ #
14
+ # Use the `jq` command to format the output of this script. For example:
15
+ # * List names: `bundle exec examples/list_files | jq '.[].name'`
16
+ # * List names and id's: `bundle exec examples/list_files | jq '[.[] | {name: .name, id: .id}]'`
17
+ # * List names and parents: `bundle exec examples/list_files | jq '[.[] | {name: .name, parents: .parents}]'`
18
+
19
+ require 'drive_v3'
20
+
21
+ @drive_service = DriveV3.drive_service
22
+
23
+ @parents = {}
24
+
25
+ def parent(id)
26
+ @parents[id] ||= @drive_service.get_file(id, fields: 'name, web_view_link')
27
+ end
28
+
29
+ files = []
30
+
31
+ # Number of files to return with each request
32
+ #
33
+ # Limiting to 5 for this example, normally this would be a lot higher
34
+ # (default is 100)
35
+ #
36
+ page_size = 100
37
+
38
+ # Signal to get first page of results
39
+ #
40
+ # nextPageToken property returns the page_token of the next page
41
+ # of results. If nextPageToken is empty, there are no more pages.
42
+ #
43
+ page_token = nil
44
+
45
+ # By default `list_files` returns all files even files in the trash. To omit trashed
46
+ # files add `trashed=false` to the q (query) parameter.
47
+ #
48
+ # See [Search for files & folders](https://developers.google.com/drive/api/v3/search-files)
49
+ # for more information about how to use the `q` parameter.
50
+ #
51
+ # q = "trashed=false and '1V6RS_7_YgJmLDH-BDw3dpD8Np60Oi9ET' in parents"
52
+ q = 'trashed=false'
53
+
54
+ # If `fields` is not specified, the following fields are returned for each file:
55
+ # id, name, mimeType, and kind.
56
+ #
57
+ # Could return all possible fields by specifying `fields: '*'`. In this example,
58
+ # we only need `nextPageToken` for the request and `id`, `name`, and `parents`,
59
+ # and `web_view_link` for each file.
60
+ #
61
+ # If you give fields, you must explicitly include `nextPageToken` if you want it.
62
+ #
63
+ # See [Return specific fields for a file](https://developers.google.com/drive/api/guides/fields-parameter)
64
+ # for more information about how to retrieve other fields.
65
+ #
66
+ # fields = 'nextPageToken, files(id, name, parents, web_view_link)'
67
+ fields = '*'
68
+
69
+ # If `include_items_from_all_drives` is false or omitted, only files from the user's
70
+ # default drive are returned.
71
+ #
72
+ include_items_from_all_drives = true
73
+
74
+ loop do
75
+ file_list = @drive_service.list_files(
76
+ q:, fields:, include_items_from_all_drives:,
77
+ page_token:, page_size:
78
+ )
79
+ files += file_list.files.map(&:to_h)
80
+ # Stop looping if there are no more pages
81
+ break unless (page_token = file_list.next_page_token)
82
+ end
83
+
84
+ # Print as JSON with links to each file and its parents
85
+
86
+ puts JSON.pretty_generate(files)
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # `trash_file` shows how to move a file to the trash.
5
+ #
6
+ # Moving a file to the trash is done by updating the file's trashed attribute to
7
+ # true. The process involves using the update method on the file you wish to move
8
+ # to the trash.
9
+
10
+ require 'drive_v3'
11
+
12
+ drive_service = DriveV3.drive_service
13
+
14
+ file_id = ARGV[0] || ENV.fetch('FILE_ID', nil)
15
+ raise 'Missing file_id' unless file_id
16
+
17
+ begin
18
+ print 'Trash file...'
19
+ file_object = { trashed: true }
20
+ file = drive_service.update_file(file_id, file_object)
21
+ puts "update_file result:\n#{file.to_h.pretty_inspect}"
22
+ rescue StandardError => e
23
+ puts "An error occurred: #{e.message}"
24
+ end
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Replace a file's content
5
+
6
+ require 'drive_v3'
7
+
8
+ drive_service = DriveV3.drive_service
9
+
10
+ file_id = ARGV[0] || ENV.fetch('FILE_ID', nil)
11
+ raise 'Missing file_id' unless file_id
12
+
13
+ # upload_source can be an IO object that responds to `read` and `size` (e.g.
14
+ # StringIO) or a string that names an existing file to upload.
15
+ #
16
+ upload_source = StringIO.new('This is the content that replaced the original content')
17
+
18
+ # Replace the content of an existing file
19
+ #
20
+ begin
21
+ file = drive_service.update_file(file_id, upload_source:)
22
+ puts JSON.pretty_generate(file.to_h)
23
+ rescue StandardError => e
24
+ puts "An error occurred: #{e.message}"
25
+ end
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Creates a new permission for a file
5
+ #
6
+ # To add a permission:
7
+ #
8
+ # 1. Create a permission object with the `type` and `role`. If type=user or
9
+ # type=group, provide an `email_address`. If type=domain, provide a `domain`.
10
+ # 2. Call the `create_permission` method with the id for the associated file
11
+ # or folder.
12
+ # 3. The response returns an instance of a Permission resource, including the
13
+ # assigned id.
14
+
15
+ require 'drive_v3'
16
+ require 'optparse'
17
+
18
+ # Parse the command line
19
+ #
20
+ # @example For a user or group
21
+ # permission-create FILE_ID \
22
+ # --type {user|group} \
23
+ # --email EMAIL \
24
+ # --role ROLE \
25
+ # [--expiration TIME] \
26
+ # [{--allow-file-discovery | --no-allow-file-discovery}]
27
+ #
28
+ # @example For a domain
29
+ # permission-create FILE_ID \
30
+ # --type domain \
31
+ # --domain NAME \
32
+ # --role ROLE \
33
+ # [--expiration TIME] \
34
+ # [{--allow-file-discovery | --no-allow-file-discovery}]
35
+ #
36
+ # @example For a anyone
37
+ # permission-create FILE_ID \
38
+ # --type anyone \
39
+ # --role ROLE \
40
+ # [--expiration TIME] \
41
+ # [{--allow-file-discovery | --no-allow-file-discovery}]
42
+ #
43
+ class PermissionCreateCli
44
+ def initialize(argv)
45
+ @argv = argv.dup
46
+ default_options
47
+ parser.parse!(@argv)
48
+ @file_id = @argv.shift || ENV.fetch('FILE_ID', nil)
49
+ validate(@argv)
50
+ end
51
+
52
+ attr_reader :file_id, :permission_id, :permission
53
+
54
+ def to_s
55
+ "'#{file_id}', #{permission}"
56
+ end
57
+
58
+ private
59
+
60
+ def banner = <<~BANNER
61
+ Usage:
62
+ #{$PROGRAM_NAME} FILE_ID [options]
63
+
64
+ Creates permission for a file.
65
+
66
+ Options:
67
+ BANNER
68
+
69
+ def parser
70
+ @parser ||= OptionParser.new(banner) do |opts|
71
+ option_definitions.each { |option_definition| opts.on(*option_definition) }
72
+ end
73
+ end
74
+
75
+ def help
76
+ puts parser
77
+ exit
78
+ end
79
+
80
+ def option_definitions
81
+ [
82
+ help_definition,
83
+ type_definition, email_definition, domain_definition, role_definition,
84
+ allow_file_discovery_definition, expiration_definition
85
+ ].freeze
86
+ end
87
+
88
+ def help_definition = ['-h', '--help', '', ->(_value) { help }]
89
+ def type_definition = ['--type=TYPE', ->(value) { @permission[:type] = value }]
90
+ def email_definition = ['--email=EMAIL', ->(value) { @permission[:email_address] = value }]
91
+ def domain_definition = ['--domain=DOMAIN', ->(value) { @permission[:domain] = value }]
92
+ def role_definition = ['--role=ROLE', ->(value) { @permission[:role] = value }]
93
+
94
+ def allow_file_discovery_definition
95
+ [
96
+ '--[no-]allow-file-discovery',
97
+ ->(value) { @permission[:allow_file_discovery] = value }
98
+ ]
99
+ end
100
+
101
+ def expiration_definition
102
+ [
103
+ '--expiration=TIME',
104
+ ->(value) { @permission[:expiration_time] = DateTime.parse(value) }
105
+ ]
106
+ end
107
+
108
+ def default_options
109
+ @file_id = nil
110
+ @permission = {
111
+ type: nil, email_address: nil, domain: nil, role: nil,
112
+ allow_file_discovery: nil, expiration_time: nil
113
+ }
114
+ end
115
+
116
+ def validate(argv)
117
+ raise "Extra command line arguments: #{argv}" unless argv.empty?
118
+
119
+ raise 'Missing file_id' unless file_id
120
+ end
121
+ end
122
+
123
+ # The new permission to create
124
+ #
125
+ # `type` can be user, group, domain, or anyone.
126
+ #
127
+ # When type=user or type=group, you must also provide an `email_address`.
128
+ #
129
+ # When type=domain, you must also provide a `domain``.
130
+ #
131
+ # See [Share files, folders & drives](https://developers.google.com/drive/api/guides/manage-sharing)
132
+ #
133
+ # See [Roles & permissions](https://developers.google.com/drive/api/guides/ref-roles)
134
+ # for more information about the different roles.
135
+ #
136
+ # allow_file_discovery is not valid for individual users.
137
+ #
138
+ # @example: when type is 'anyone'
139
+ # permission = {
140
+ # allow_file_discovery: true,
141
+ # type: 'anyone',
142
+ # role: 'writer'
143
+ # }
144
+ #
145
+ # @example: when type is 'user'
146
+ # permission = {
147
+ # type: 'user',
148
+ # role: 'writer',
149
+ # email_address: 'jcouball@gmail.com'
150
+ # }
151
+ #
152
+
153
+ drive_service = DriveV3.drive_service
154
+
155
+ options = PermissionCreateCli.new(ARGV)
156
+ fields = '*'
157
+
158
+ begin
159
+ result = drive_service.create_permission(options.file_id, options.permission, fields:)
160
+ # The result.id is 'anyoneWithLink' if type=anyone
161
+ # The result.id is of the existing permission if it already exists
162
+ puts JSON.pretty_generate(result.to_h)
163
+ rescue StandardError => e
164
+ puts "An error occurred: #{e.message}"
165
+ end
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # List permissions for a file or folder
5
+
6
+ require 'drive_v3'
7
+
8
+ file_id = ARGV.shift || ENV.fetch('FILE_ID', nil)
9
+ raise 'Missing file_id' unless file_id
10
+
11
+ permission_id = ARGV.shift || ENV.fetch('PERMISSION_ID', nil)
12
+ raise 'Missing permission_id' unless permission_id
13
+
14
+ raise "Extra arguments: #{ARGV}" unless ARGV.empty?
15
+
16
+ drive_service = DriveV3.drive_service
17
+
18
+ begin
19
+ drive_service.delete_permission(file_id, permission_id)
20
+ rescue StandardError => e
21
+ puts "An error occurred: #{e.message}"
22
+ end
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # List permissions for a file or folder
5
+
6
+ require 'drive_v3'
7
+
8
+ file_id = ARGV[0] || ENV.fetch('FILE_ID', nil)
9
+ raise 'Missing file_id' unless file_id
10
+
11
+ drive_service = DriveV3.drive_service
12
+
13
+ permissions = []
14
+
15
+ # Number of files to return with each request
16
+ #
17
+ # Limiting to 2 for this example, normally this would be a lot higher
18
+ # (default is 100)
19
+ #
20
+ page_size = 2
21
+
22
+ # Signal to get first page of results
23
+ #
24
+ # nextPageToken property returns the page_token of the next page
25
+ # of results. If nextPageToken is empty, there are no more pages.
26
+ #
27
+ page_token = nil
28
+
29
+ # If `fields` is not specified, the following fields are returned for each permission:
30
+ # ???
31
+ #
32
+ # Could return all possible fields by specifying `fields: '*'`.
33
+ #
34
+ # If you give fields, you must explicitly include `nextPageToken` if you want it.
35
+ #
36
+ # See [Return specific fields for a file](https://developers.google.com/drive/api/guides/fields-parameter)
37
+ # for more information about how to retrieve other fields.
38
+ #
39
+ # fields = 'nextPageToken, files(id, name, parents, web_view_link)'
40
+ fields = '*'
41
+
42
+ loop do
43
+ permission_list = drive_service.list_permissions(file_id, fields:, page_token:, page_size:)
44
+ permissions += permission_list.permissions.map(&:to_h)
45
+ # Stop looping if there are no more pages
46
+ break unless (page_token = permission_list.next_page_token)
47
+ end
48
+
49
+ puts JSON.pretty_generate(permissions)
@@ -0,0 +1,134 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Updates an existing permission for a file
5
+ #
6
+ # Use permission_list to list the existing permissions for a file.
7
+
8
+ require 'drive_v3'
9
+ require 'optparse'
10
+ require 'time'
11
+
12
+ # Parse command line arguments
13
+ #
14
+ # Usage: permission-update FILE_ID PERMISSION_ID \
15
+ # --remove-expiration \
16
+ # --type TYPE \
17
+ # --email EMAIL \
18
+ # --domain DOMAIN \
19
+ # --role ROLE \
20
+ # --[no-]allow-file-discovery \
21
+ # --expiration TIME
22
+ #
23
+ # Examples:
24
+ # permission-update 12345678 12345678 --expiration 2023-12-31T00:00:00-07:00
25
+ # permission-update 12345678 12345678 --remove-expiration
26
+ # permission-update 12345678 12345678 --role reader
27
+ # permission-update 12345678 12345678 --email jcouball@yahoo.com
28
+ # permission-update 12345678 12345678 --email jcouball@yahoo.com --role reader
29
+ # permission-update 12345678 12345678 --allow-file-discovery
30
+ # permission-update 12345678 12345678 --no-allow-file-discovery
31
+ #
32
+ class PermissionUpdateCli
33
+ def initialize(argv)
34
+ @argv = argv.dup
35
+ default_options
36
+ parser.parse!(@argv)
37
+ @file_id = @argv.shift || ENV.fetch('FILE_ID', nil)
38
+ @permission_id = @argv.shift || ENV.fetch('PERMISSION_ID', nil)
39
+ validate(@argv)
40
+ end
41
+
42
+ attr_reader :file_id, :permission_id, :permission, :remove_expiration
43
+
44
+ def to_s
45
+ "'#{file_id}', '#{permission_id}', #{permission}, remove_expiration: #{remove_expiration}"
46
+ end
47
+
48
+ private
49
+
50
+ def banner = <<~BANNER
51
+ Usage:
52
+ #{$PROGRAM_NAME} FILE_ID PERMISSION_ID [options]
53
+
54
+ Updates a permission for a file.
55
+ Use permission-create to create a new permission for a file.
56
+ User permission-list to list permissions for a file.
57
+
58
+ Options:
59
+ BANNER
60
+
61
+ def parser
62
+ @parser ||= OptionParser.new(banner) do |opts|
63
+ option_definitions.each { |option_definition| opts.on(*option_definition) }
64
+ end
65
+ end
66
+
67
+ def help
68
+ puts parser
69
+ exit
70
+ end
71
+
72
+ def option_definitions
73
+ [
74
+ help_definition, remove_expiration_definition, type_definition,
75
+ email_definition, domain_definition, role_definition,
76
+ allow_file_discovery_definition, expiration_definition
77
+ ].freeze
78
+ end
79
+
80
+ def help_definition = ['-h', '--help', '', ->(_value) { help }]
81
+ def type_definition = ['--type=TYPE', ->(value) { @permission[:type] = value }]
82
+ def email_definition = ['--email=EMAIL', ->(value) { @permission[:email_address] = value }]
83
+ def domain_definition = ['--domain=DOMAIN', ->(value) { @permission[:domain] = value }]
84
+ def role_definition = ['--role=ROLE', ->(value) { @permission[:role] = value }]
85
+ def remove_expiration_definition = ['--remove-expiration', ->(_value) { @remove_expiration = true }]
86
+
87
+ def allow_file_discovery_definition
88
+ [
89
+ '--[no-]allow-file-discovery',
90
+ ->(value) { @permission[:allow_file_discovery] = value }
91
+ ]
92
+ end
93
+
94
+ def expiration_definition
95
+ [
96
+ '--expiration=TIME',
97
+ ->(value) { @permission[:expiration_time] = DateTime.parse(value) }
98
+ ]
99
+ end
100
+
101
+ def default_options
102
+ @file_id = nil
103
+ @permission_id = nil
104
+ @permission = {
105
+ type: nil, email_address: nil, domain: nil, role: nil,
106
+ allow_file_discovery: nil, expiration_time: nil
107
+ }
108
+ @remove_expiration = nil
109
+ end
110
+
111
+ def validate(argv)
112
+ raise "Extra command line arguments: #{argv}" unless argv.empty?
113
+
114
+ raise 'Missing file_id' unless file_id
115
+
116
+ raise 'Missing permission_id' unless permission_id
117
+ end
118
+ end
119
+
120
+ drive_service = DriveV3.drive_service
121
+
122
+ options = PermissionUpdateCli.new(ARGV)
123
+ file_id = options.file_id
124
+ permission_id = options.permission_id
125
+ permission = options.permission
126
+ remove_expiration = options.remove_expiration
127
+ fields = '*'
128
+
129
+ begin
130
+ result = drive_service.update_permission(file_id, permission_id, permission, remove_expiration:, fields:)
131
+ puts "Permission updated: #{result.to_h.pretty_inspect}"
132
+ rescue StandardError => e
133
+ puts "An error occurred: #{e.message}"
134
+ end