Skip to content

Commit d7c8a4e

Browse files
committed
Update GoogleDrive provider to use GD v3 API
[SVCS-426 ] GoogleDrive migration guide https://developers.google.com/drive/v3/web/migration Of particular note: GD v3 API has no method of downloading GoogleDoc revisions. This PR leaves behind GD v2 calls, in order to maintain this functionality as long as possible. GD v3 returns minimal representations of resources. Fields must be specified, to be returned. Many field names changed. Most commonly in the provider: title -> name modifiedDate -> modifiedTime fileSize -> size etags are no longer available from GoogleDrive exportLinks are no longer available in the 'file' representation of GoogleDoc files. GD v3 returns lists of resources as either 'files' or 'revisions' as opposed to GD v2 which returned 'items' for all resource lists.
1 parent 481c9d9 commit d7c8a4e

9 files changed

Lines changed: 863 additions & 1151 deletions

File tree

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,25 @@
11
{
22
"revision_metadata": {
3-
"modifiedDate": "2015-01-01T16:54:58.929Z",
4-
"md5Checksum": "43c5a01efeaea6bfd0433fa516a0d71f",
5-
"fileSize": "918668",
6-
"lastModifyingUser": {"kind": "drive#user", "permissionId": "07992110234966807597", "emailAddress": "jm.carp@gmail.com", "isAuthenticatedUser": true, "displayName": "Joshua Carp", "picture": {"url": "https://lh3.googleusercontent.com/-ndG-yHyqonM/AAAAAAAAAAI/AAAAAAAAADs/wUR8YhDe3vY/s64/photo.jpg"}},
7-
"selfLink": "https://www.googleapis.com/drive/v2/files/1GwpK7IozbO01RiyC5aPd66v7ShEViqggvT6ur5_pZMFo-ZzQHOgkyoU3ztjf0ytKt0HSdvUg6O2nmoYR/revisions/1DVR6FVQGOSpUrtHjxCKb4-2R0chGVJFG6wVPQwq1o-gay_tqwA",
8-
"lastModifyingUserName": "Joshua Carp",
9-
"downloadUrl": "https://doc-0g-5k-docs.googleusercontent.com/docs/securesc/6l6ti67c1gnej8b4rr55nfimce1282lr/4kr23qf2mtt0g577quhmb7sn41q8t9kl/1424894400000/07992110234966807597/07992110234966807597/1GwpK7IozbO01RiyC5aPd66v7ShEViqggvT6ur5_pZMFo-ZzQHOgkyoU3ztjf0ytKt0HSdvUg6O2nmoYR?rid=1DVR6FVQGOSpUrtHjxCKb4-2R0chGVJFG6wVPQwq1o-gay_tqwA&e=download&gd=true",
3+
"id": "0BxdmnuT5XpqcOGNTWDl3K044Yi83ZU14aDBzSThoRFJEb25jPQ",
104
"mimeType": "application/pdf",
11-
"id": "1DVR6FVQGOSpUrtHjxCKb4-2R0chGVJFG6wVPQwq1o-gay_tqwA",
12-
"kind": "drive#revision",
13-
"etag": "\"zWM2D6PBtLRQKuDNbaQNSNEy5BE/58C3fd_BFF2TTwuUg7RCveoALHM\"",
14-
"published": false,
15-
"pinned": false
5+
"modifiedTime": "2017-10-12T13:31:17.922Z",
6+
"originalFilename": "xps-13-9343-laptop_Service Manual_en-us.pdf",
7+
"md5Checksum": "53141aa6a986e636bcdcef2ff08beece",
8+
"size": "8604865"
169
},
1710
"revisions_list": {
18-
"kind": "drive#revisionList",
19-
"etag": "\"zWM2D6PBtLRQKuDNbaQNSNEy5BE/PeANBe5F3yk-YAzsoQO4pYPA5W8\"",
20-
"selfLink": "https://www.googleapis.com/drive/v2/files/1GwpK7IozbO01RiyC5aPd66v7ShEViqggvT6ur5_pZMFo-ZzQHOgkyoU3ztjf0ytKt0HSdvUg6O2nmoYR/revisions",
21-
"items": [
22-
{"selfLink": "https://www.googleapis.com/drive/v2/files/1GwpK7IozbO01RiyC5aPd66v7ShEViqggvT6ur5_pZMFo-ZzQHOgkyoU3ztjf0ytKt0HSdvUg6O2nmoYR/revisions/1DVR6FVQGOSpUrtHjxCKb4-2R0chGVJFG6wVPQwq1o-gay_tqwA", "md5Checksum": "43c5a01efeaea6bfd0433fa516a0d71f", "pinned": false, "etag": "\"zWM2D6PBtLRQKuDNbaQNSNEy5BE/sdQBhqMbZWHR5JnnXwR2jMjJYa4\"", "id": "1DVR6FVQGOSpUrtHjxCKb4-2R0chGVJFG6wVPQwq1o-gay_tqwA", "kind": "drive#revision", "lastModifyingUserName": "Joshua Carp", "mimeType": "application/pdf", "fileSize": "918668", "lastModifyingUser": {"kind": "drive#user", "emailAddress": "jm.carp@gmail.com", "permissionId": "07992110234966807597", "picture": {"url": "https://lh3.googleusercontent.com/-ndG-yHyqonM/AAAAAAAAAAI/AAAAAAAAADs/wUR8YhDe3vY/s64/photo.jpg"}, "displayName": "Joshua Carp", "isAuthenticatedUser": true}, "downloadUrl": "https://doc-0g-5k-docs.googleusercontent.com/docs/securesc/6l6ti67c1gnej8b4rr55nfimce1282lr/nccdohm8rrrqmabek0d1ot5alel2768g/1424959200000/07992110234966807597/07992110234966807597/1GwpK7IozbO01RiyC5aPd66v7ShEViqggvT6ur5_pZMFo-ZzQHOgkyoU3ztjf0ytKt0HSdvUg6O2nmoYR?rid=1DVR6FVQGOSpUrtHjxCKb4-2R0chGVJFG6wVPQwq1o-gay_tqwA&e=download&gd=true", "modifiedDate": "2015-01-01T16:54:58.929Z", "published": false}
11+
"revisions": [
12+
{
13+
"id": "0BxdmnuT5XpqcdFdzM2dtTnB4bnNuUXpmYlZkOUZDV1AvcWFRPQ",
14+
"mimeType": "image/jpeg",
15+
"modifiedTime": "2017-10-16T13:27:10.965Z",
16+
"originalFilename": "sunshine.jpg",
17+
"md5Checksum": "2f7be16736648476f22f08e2e3978d08",
18+
"size": "3782"
19+
}
2320
]
2421
},
2522
"revisions_list_empty":{
26-
"kind": "drive#revisionList",
27-
"etag": "\"zWM2D6PBtLRQKuDNbaQNSNEy5BE/PeANBe5F3yk-YAzsoQO4pYPA5W8\"",
28-
"selfLink": "https://www.googleapis.com/drive/v2/files/1GwpK7IozbO01RiyC5aPd66v7ShEViqggvT6ur5_pZMFo-ZzQHOgkyoU3ztjf0ytKt0HSdvUg6O2nmoYR/revisions",
29-
"items": []
23+
"revisions": []
3024
}
3125
}

tests/providers/googledrive/fixtures/root_provider.json

Lines changed: 117 additions & 269 deletions
Large diffs are not rendered by default.

tests/providers/googledrive/fixtures/sharing.json

Lines changed: 180 additions & 419 deletions
Large diffs are not rendered by default.

tests/providers/googledrive/test_metadata.py

Lines changed: 50 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -24,92 +24,92 @@ def basepath():
2424
class TestMetadata:
2525

2626
def test_file_metadata_drive(self, basepath, root_provider_fixtures):
27-
item = root_provider_fixtures['list_file']['items'][0]
28-
path = basepath.child(item['title'])
29-
parsed = GoogleDriveFileMetadata(item, path)
27+
file = root_provider_fixtures['list_file']['files'][0]
28+
path = basepath.child(file['name'])
29+
parsed = GoogleDriveFileMetadata(file, path)
3030

3131
assert parsed.provider == 'googledrive'
32-
assert parsed.id == item['id']
33-
assert path.name == item['title']
34-
assert parsed.name == item['title']
35-
assert parsed.size == item['fileSize']
36-
assert parsed.modified == item['modifiedDate']
37-
assert parsed.content_type == item['mimeType']
32+
assert parsed.id == file['id']
33+
assert path.name == file['name']
34+
assert parsed.name == file['name']
35+
assert parsed.size == file['size']
36+
assert parsed.modified == file['modifiedTime']
37+
assert parsed.content_type == file['mimeType']
3838
assert parsed.extra == {
39-
'revisionId': item['version'],
40-
'webView': item['alternateLink'],
41-
'hashes': {'md5': item['md5Checksum']},
39+
'revisionId': file['version'],
40+
'webView': file['webViewLink'],
41+
'hashes': {'md5': file['md5Checksum']},
4242
}
4343
assert parsed.path == '/' + os.path.join(*[x.raw for x in path.parts])
4444
assert parsed.materialized_path == str(path)
4545
assert parsed.is_google_doc is False
46-
assert parsed.export_name == item['title']
46+
assert parsed.export_name == file['name']
4747

4848
def test_file_metadata_drive_slashes(self, basepath, root_provider_fixtures):
49-
item = root_provider_fixtures['file_forward_slash']
50-
path = basepath.child(item['title'])
51-
parsed = GoogleDriveFileMetadata(item, path)
49+
file = root_provider_fixtures['file_forward_slash']
50+
path = basepath.child(file['name'])
51+
parsed = GoogleDriveFileMetadata(file, path)
5252

5353
assert parsed.provider == 'googledrive'
54-
assert parsed.id == item['id']
55-
assert parsed.name == item['title']
54+
assert parsed.id == file['id']
55+
assert parsed.name == file['name']
5656
assert parsed.name == path.name
57-
assert parsed.size == item['fileSize']
58-
assert parsed.modified == item['modifiedDate']
59-
assert parsed.content_type == item['mimeType']
57+
assert parsed.size == file['size']
58+
assert parsed.modified == file['modifiedTime']
59+
assert parsed.content_type == file['mimeType']
6060
assert parsed.extra == {
61-
'revisionId': item['version'],
62-
'webView': item['alternateLink'],
63-
'hashes': {'md5': item['md5Checksum']},
61+
'revisionId': file['version'],
62+
'webView': file['webViewLink'],
63+
'hashes': {'md5': file['md5Checksum']},
6464
}
6565
assert parsed.path == '/' + os.path.join(*[x.raw for x in path.parts])
6666
assert parsed.materialized_path == str(path)
6767
assert parsed.is_google_doc is False
68-
assert parsed.export_name == item['title']
68+
assert parsed.export_name == file['name']
6969

7070
def test_file_metadata_docs(self, basepath, root_provider_fixtures):
71-
item = root_provider_fixtures['docs_file_metadata']
72-
path = basepath.child(item['title'])
73-
parsed = GoogleDriveFileMetadata(item, path)
71+
file = root_provider_fixtures['docs_file_metadata']
72+
path = basepath.child(file['name'])
73+
parsed = GoogleDriveFileMetadata(file, path)
7474

75-
assert parsed.name == item['title'] + '.gdoc'
75+
assert parsed.name == file['name'] + '.gdoc'
7676
assert parsed.extra == {
77-
'revisionId': item['version'],
77+
'revisionId': file['version'],
7878
'downloadExt': '.docx',
79-
'webView': item['alternateLink'],
79+
'webView': file['webViewLink'],
8080
}
8181
assert parsed.is_google_doc is True
82-
assert parsed.export_name == item['title'] + '.docx'
82+
assert parsed.export_name == file['name'] + '.docx'
8383

8484
def test_folder_metadata(self, root_provider_fixtures):
85-
item = root_provider_fixtures['folder_metadata']
86-
path = GoogleDrivePath('/we/love/you/conrad').child(item['title'], folder=True)
87-
parsed = GoogleDriveFolderMetadata(item, path)
85+
file = root_provider_fixtures['folder_metadata']
86+
path = GoogleDrivePath('/we/love/you/conrad').child(file['name'], folder=True)
87+
parsed = GoogleDriveFolderMetadata(file, path)
8888

8989
assert parsed.provider == 'googledrive'
90-
assert parsed.id == item['id']
91-
assert parsed.name == item['title']
92-
assert parsed.extra == {'revisionId': item['version']}
90+
assert parsed.id == file['id']
91+
assert parsed.name == file['name']
92+
assert parsed.extra == {'revisionId': file['version']}
9393
assert parsed.path == '/' + os.path.join(*[x.raw for x in path.parts]) + '/'
9494
assert parsed.materialized_path == str(path)
95-
assert parsed.export_name == item['title']
95+
assert parsed.export_name == file['name']
9696

9797
def test_folder_metadata_slash(self, root_provider_fixtures):
98-
item = root_provider_fixtures['folder_metadata_forward_slash']
99-
path = GoogleDrivePath('/we/love/you/conrad').child(item['title'], folder=True)
100-
parsed = GoogleDriveFolderMetadata(item, path)
98+
file = root_provider_fixtures['folder_metadata_forward_slash']
99+
path = GoogleDrivePath('/we/love/you/conrad').child(file['name'], folder=True)
100+
parsed = GoogleDriveFolderMetadata(file, path)
101101

102102
assert parsed.provider == 'googledrive'
103-
assert parsed.id == item['id']
104-
assert parsed.name == item['title']
105-
assert parsed.extra == {'revisionId': item['version']}
103+
assert parsed.id == file['id']
104+
assert parsed.name == file['name']
105+
assert parsed.extra == {'revisionId': file['version']}
106106
assert parsed.path == '/' + os.path.join(*[x.raw for x in path.parts]) + '/'
107107
assert parsed.materialized_path == str(path)
108-
assert parsed.export_name == item['title']
108+
assert parsed.export_name == file['name']
109109

110110
def test_revision_metadata(self, revision_fixtures):
111-
item = revision_fixtures['revision_metadata']
112-
parsed = GoogleDriveRevision(item)
111+
revision = revision_fixtures['revision_metadata']
112+
parsed = GoogleDriveRevision(revision)
113113
assert parsed.version_identifier == 'revision'
114-
assert parsed.version == item['id']
115-
assert parsed.modified == item['modifiedDate']
114+
assert parsed.version == revision['id']
115+
assert parsed.modified == revision['modifiedTime']

0 commit comments

Comments
 (0)