simple_google_drive 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +1 -0
- data/.travis.yml +8 -0
- data/Gemfile +14 -0
- data/LICENSE.txt +22 -0
- data/README.md +153 -0
- data/Rakefile +1 -0
- data/lib/simple_google_drive/client.rb +131 -0
- data/lib/simple_google_drive/session_base.rb +114 -0
- data/lib/simple_google_drive/version.rb +3 -0
- data/lib/simple_google_drive.rb +21 -0
- data/simple_google_drive.gemspec +23 -0
- data/spec/lib/simple_google_drive/client_spec.rb +230 -0
- data/spec/lib/simple_google_drive_spec.rb +11 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/support/example.txt +15 -0
- metadata +92 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 84776c7a234eb7a66c4090869f9b64ea4a870d84
|
4
|
+
data.tar.gz: fba3c290c5028fbbb3950221e893ca0cc9754070
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 98a189859a7c10888692d774c3c1d11273c8ae45aa808a9824162d0bc06462c1946293b8fd04e336a780a9cf906c9c1e7c4bbc2fb6a339887450cfc91913ed56
|
7
|
+
data.tar.gz: 614edf0063a245424d0eb347483ce389d95571bf4ca53032887986094163c8c9467fb6fdf7ac0d171b72d61638b1519fd6469a35f313e23494e63407c92fe169
|
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Guilherme Vinicius Moreira
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,153 @@
|
|
1
|
+
|
2
|
+
# SimpleGoogleDrive
|
3
|
+
|
4
|
+
[](https://travis-ci.org/guivinicius/simple_google_drive)
|
5
|
+
[](https://codeclimate.com/repos/52d5408f6956800ac6002687/feed)
|
6
|
+
[](https://bitdeli.com/free "Bitdeli Badge")
|
7
|
+
|
8
|
+
A simple interface for Google Drive API
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
Add this line to your application's Gemfile:
|
13
|
+
|
14
|
+
gem 'simple_google_drive'
|
15
|
+
|
16
|
+
And then execute:
|
17
|
+
|
18
|
+
$ bundle
|
19
|
+
|
20
|
+
Or install it yourself as:
|
21
|
+
|
22
|
+
$ gem install simple_google_drive
|
23
|
+
|
24
|
+
## Getting Started
|
25
|
+
|
26
|
+
You need to create a new object and then call its methods. Simple like that.
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
oauth2_access_token = "YOUR ACCESS TOKEN"
|
30
|
+
client = SimpleGoogleDrive.new(oauth2_access_token)
|
31
|
+
client.about
|
32
|
+
```
|
33
|
+
|
34
|
+
## Methods
|
35
|
+
|
36
|
+
Each method name was made to be compliant with Google Drive API reference.
|
37
|
+
|
38
|
+
https://developers.google.com/drive/v2/reference/
|
39
|
+
|
40
|
+
### About
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
client.about
|
44
|
+
# => {"kind": "drive#about", ... }
|
45
|
+
```
|
46
|
+
|
47
|
+
### Files methods
|
48
|
+
|
49
|
+
* **FILES_GET** (https://developers.google.com/drive/v2/reference/files/get)
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
optional_params = {:updateViewedDate => true}
|
53
|
+
client.files_get(file_id, optional_params)
|
54
|
+
```
|
55
|
+
|
56
|
+
* **FILES_INSERT** (https://developers.google.com/drive/v2/reference/files/insert)
|
57
|
+
|
58
|
+
This method is only for metadata-only requests not to upload files.
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
body = {:title => "A thesis about how awesome I am", :description => "No need!", }
|
62
|
+
optional_params = { :convert => true, :ocr => true }
|
63
|
+
client.files_insert(body, optional_params)
|
64
|
+
```
|
65
|
+
|
66
|
+
* **FILES_UPLOAD** (https://developers.google.com/drive/manage-uploads)
|
67
|
+
|
68
|
+
Supporting only: **simple** and **multipart** uploads for now.
|
69
|
+
|
70
|
+
**Simple Upload Example**
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
file_object = File.open("/tmp/awesome.pdf")
|
74
|
+
args = {:uploadType => 'media'}
|
75
|
+
client.files_upload(file_object, args)
|
76
|
+
```
|
77
|
+
|
78
|
+
**Multipart Upload Example**
|
79
|
+
|
80
|
+
```ruby
|
81
|
+
file_object = File.open("/tmp/awesome.pdf")
|
82
|
+
args = {:uploadType => 'multipart', :body_object => {:title => "A thesis about how awesome I am", :description => "Ok! It needs!" }}
|
83
|
+
client.files_upload(file_object, args)
|
84
|
+
```
|
85
|
+
|
86
|
+
* **FILES_PATCH** (https://developers.google.com/drive/v2/reference/files/patch)
|
87
|
+
|
88
|
+
```ruby
|
89
|
+
body = {:title => "A thesis about how awesome I am", :description => "Ok! It needs!" }
|
90
|
+
optional_params = { :convert => true, :ocr => true }
|
91
|
+
client.files_patch(file_id, body, optional_params)
|
92
|
+
```
|
93
|
+
|
94
|
+
* **FILES_COPY** (https://developers.google.com/drive/v2/reference/files/copy)
|
95
|
+
|
96
|
+
```ruby
|
97
|
+
body = {:title => "A thesis about how awesome I am (copy)", :description => "Ok! It needs!" }
|
98
|
+
optional_params = { :convert => true, :ocr => true }
|
99
|
+
client.files_copy(file_id, body, optional_params)
|
100
|
+
```
|
101
|
+
|
102
|
+
* **FILES_DELETE** (https://developers.google.com/drive/v2/reference/files/delete)
|
103
|
+
|
104
|
+
```ruby
|
105
|
+
client.files_delete(file_id)
|
106
|
+
```
|
107
|
+
|
108
|
+
* **FILES_LIST** (https://developers.google.com/drive/v2/reference/files/list)
|
109
|
+
|
110
|
+
The most important part of this method is the search parameters and you can find more at https://developers.google.com/drive/search-parameters
|
111
|
+
|
112
|
+
```ruby
|
113
|
+
optional_params = {:maxResults => 10, :q => "title = 'awesome'"}
|
114
|
+
client.files_list(optional_params)
|
115
|
+
```
|
116
|
+
|
117
|
+
* **FILES_TOUCH** (https://developers.google.com/drive/v2/reference/files/touch)
|
118
|
+
|
119
|
+
```ruby
|
120
|
+
client.files_touch(file_id)
|
121
|
+
```
|
122
|
+
|
123
|
+
* **FILES_TRASH** (https://developers.google.com/drive/v2/reference/files/trash)
|
124
|
+
|
125
|
+
```ruby
|
126
|
+
client.files_trash(file_id)
|
127
|
+
```
|
128
|
+
|
129
|
+
* **FILES_UNTRASH** (https://developers.google.com/drive/v2/reference/files/untrash)
|
130
|
+
|
131
|
+
```ruby
|
132
|
+
client.files_untrash(file_id)
|
133
|
+
```
|
134
|
+
|
135
|
+
* **FILES_WATCH** (https://developers.google.com/drive/v2/reference/files/watch)
|
136
|
+
|
137
|
+
```ruby
|
138
|
+
client.files_watch(file_id)
|
139
|
+
```
|
140
|
+
|
141
|
+
## Todo's
|
142
|
+
|
143
|
+
* Implement authenticantion flow
|
144
|
+
* Implementing more methods
|
145
|
+
* Improve test suite
|
146
|
+
|
147
|
+
## Contributing
|
148
|
+
|
149
|
+
1. Fork it ( http://github.com/guivinicius/simple_google_drive/fork )
|
150
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
151
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
152
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
153
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,131 @@
|
|
1
|
+
module SimpleGoogleDrive
|
2
|
+
|
3
|
+
class Client < SessionBase
|
4
|
+
|
5
|
+
attr_accessor :access_token
|
6
|
+
|
7
|
+
def initialize(oauth2_access_token)
|
8
|
+
|
9
|
+
if oauth2_access_token.is_a?(String)
|
10
|
+
@access_token = oauth2_access_token
|
11
|
+
else
|
12
|
+
raise ArgumentError, "oauth2_access_token doesn't have a valid type"
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
public
|
18
|
+
|
19
|
+
def about
|
20
|
+
url = build_url("/about")
|
21
|
+
request = build_request(url)
|
22
|
+
response = send_request(url, request)
|
23
|
+
|
24
|
+
parse_response(response)
|
25
|
+
end
|
26
|
+
|
27
|
+
def files_get(file_id, params = nil)
|
28
|
+
url = build_url("/files/#{file_id}", params)
|
29
|
+
request = build_request(url)
|
30
|
+
response = send_request(url, request)
|
31
|
+
|
32
|
+
parse_response(response)
|
33
|
+
end
|
34
|
+
|
35
|
+
def files_insert(body = {}, params = nil)
|
36
|
+
url = build_url("/files", params)
|
37
|
+
request = build_request(url, 'post', body.to_json)
|
38
|
+
response = send_request(url, request)
|
39
|
+
|
40
|
+
parse_response(response)
|
41
|
+
end
|
42
|
+
|
43
|
+
def files_upload(file_object, args = {})
|
44
|
+
raise ArgumentError, "Invalid upload type. Choose between media, multipart or resumable." if args[:uploadType].nil?
|
45
|
+
|
46
|
+
case args[:uploadType].to_s
|
47
|
+
when 'media'
|
48
|
+
body = file_object
|
49
|
+
content_type = MIME::Types.type_for(file_object.path).first.to_s
|
50
|
+
when 'multipart'
|
51
|
+
body = build_multipart_body(file_object, args[:body_object])
|
52
|
+
content_type = "multipart/related;boundary=simple_google_drive_boundary"
|
53
|
+
when 'resumable'
|
54
|
+
body = build_resumable_body(file_object, args[:body_object])
|
55
|
+
content_type = ""
|
56
|
+
end
|
57
|
+
|
58
|
+
url = build_url("/files", args[:parameters], true)
|
59
|
+
request = build_request(url, 'post', body, content_type)
|
60
|
+
response = send_request(url, request)
|
61
|
+
|
62
|
+
parse_response(response)
|
63
|
+
end
|
64
|
+
|
65
|
+
def files_patch(file_id, body = nil, params = nil)
|
66
|
+
url = build_url("/files/#{file_id}", params)
|
67
|
+
request = build_request(url, 'patch', body)
|
68
|
+
response = send_request(url, request)
|
69
|
+
|
70
|
+
parse_response(response)
|
71
|
+
end
|
72
|
+
|
73
|
+
def files_copy(file_id, body = nil, params = nil)
|
74
|
+
url = build_url("/files/#{file_id}/copy", params)
|
75
|
+
request = build_request(url, 'post', body)
|
76
|
+
response = send_request(url, request)
|
77
|
+
|
78
|
+
parse_response(response)
|
79
|
+
end
|
80
|
+
|
81
|
+
def files_delete(file_id)
|
82
|
+
url = build_url("/files/#{file_id}")
|
83
|
+
request = build_request(url, 'delete')
|
84
|
+
response = send_request(url, request)
|
85
|
+
|
86
|
+
parse_response(response)
|
87
|
+
end
|
88
|
+
|
89
|
+
def files_list(params = nil)
|
90
|
+
url = build_url("/files", params)
|
91
|
+
request = build_request(url)
|
92
|
+
response = send_request(url, request)
|
93
|
+
|
94
|
+
parse_response(response)
|
95
|
+
end
|
96
|
+
|
97
|
+
def files_touch(file_id)
|
98
|
+
url = build_url("/files/#{file_id}/touch")
|
99
|
+
request = build_request(url, 'post')
|
100
|
+
response = send_request(url, request)
|
101
|
+
|
102
|
+
parse_response(response)
|
103
|
+
end
|
104
|
+
|
105
|
+
def files_trash(file_id)
|
106
|
+
url = build_url("/files/#{file_id}/trash")
|
107
|
+
request = build_request(url, 'post')
|
108
|
+
response = send_request(url, request)
|
109
|
+
|
110
|
+
parse_response(response)
|
111
|
+
end
|
112
|
+
|
113
|
+
def files_untrash(file_id)
|
114
|
+
url = build_url("/files/#{file_id}/untrash")
|
115
|
+
request = build_request(url, 'post')
|
116
|
+
response = send_request(url, request)
|
117
|
+
|
118
|
+
parse_response(response)
|
119
|
+
end
|
120
|
+
|
121
|
+
def files_watch(file_id, body = nil)
|
122
|
+
url = build_url("/files/#{file_id}/watch")
|
123
|
+
request = build_request(url, 'post', body.to_json)
|
124
|
+
response = send_request(url, request)
|
125
|
+
|
126
|
+
parse_response(response)
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
module SimpleGoogleDrive
|
2
|
+
|
3
|
+
class SessionBase
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def build_url(path, params = nil, upload = false)
|
8
|
+
url = URI.parse("#{ upload ? API_UPLOAD_URL : API_BASE_URL }#{path}")
|
9
|
+
url.query = URI.encode_www_form(params) if !params.nil?
|
10
|
+
|
11
|
+
return url
|
12
|
+
end
|
13
|
+
|
14
|
+
def build_request(url, method = 'get', body = nil, content_type = nil)
|
15
|
+
|
16
|
+
default_headers = {'User-Agent' => "Ruby/SimpleGoogleDrive/#{SimpleGoogleDrive::VERSION}", 'Authorization' => "Bearer #{@access_token}"}
|
17
|
+
|
18
|
+
case method
|
19
|
+
when 'get'
|
20
|
+
req = Net::HTTP::Get.new(url, default_headers)
|
21
|
+
when 'patch'
|
22
|
+
req = Net::HTTP::Patch.new(url, default_headers)
|
23
|
+
when 'post'
|
24
|
+
req = Net::HTTP::Post.new(url, default_headers)
|
25
|
+
when 'delete'
|
26
|
+
req = Net::HTTP::Delete.new(url, default_headers)
|
27
|
+
end
|
28
|
+
|
29
|
+
if !body.nil?
|
30
|
+
if body.is_a?(Hash)
|
31
|
+
req.set_form_data(body)
|
32
|
+
elsif body.respond_to?(:read)
|
33
|
+
if body.respond_to?(:length)
|
34
|
+
req["Content-Length"] = body.length.to_s
|
35
|
+
elsif body.respond_to?(:stat) && body.stat.respond_to?(:size)
|
36
|
+
req["Content-Length"] = body.stat.size.to_s
|
37
|
+
else
|
38
|
+
raise ArgumentError, "Don't know how to handle 'body' (responds to 'read' but not to 'length' or 'stat.size')."
|
39
|
+
end
|
40
|
+
req.body_stream = body
|
41
|
+
req["Content-Type"]= content_type
|
42
|
+
else
|
43
|
+
s = body.to_s
|
44
|
+
req["Content-Length"] = s.length
|
45
|
+
req["Content-Type"] = content_type
|
46
|
+
req.body = s
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
return req
|
52
|
+
end
|
53
|
+
|
54
|
+
def send_request(url, request)
|
55
|
+
|
56
|
+
http = Net::HTTP.new(url.host, url.port)
|
57
|
+
http.use_ssl = true
|
58
|
+
|
59
|
+
begin
|
60
|
+
response = http.request(request)
|
61
|
+
rescue Exception => e
|
62
|
+
raise "Something wrong with the http response: #{e}"
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
def parse_response(response)
|
68
|
+
return "" if response.body.nil?
|
69
|
+
|
70
|
+
if response.kind_of?(Net::HTTPServerError)
|
71
|
+
raise "Google Drive Server Error: #{response} - #{response.body}"
|
72
|
+
elsif response.kind_of?(Net::HTTPUnauthorized)
|
73
|
+
raise "User is not authenticated."
|
74
|
+
elsif not response.kind_of?(Net::HTTPSuccess)
|
75
|
+
begin
|
76
|
+
d = JSON.parse(response.body)
|
77
|
+
rescue
|
78
|
+
raise "Server Error: response=#{response}"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
begin
|
83
|
+
JSON.parse(response.body)
|
84
|
+
rescue JSON::ParserError
|
85
|
+
raise "Unable to parse JSON response: #{response.body}"
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
def build_multipart_body(file_object, body_object)
|
91
|
+
content_type = MIME::Types.type_for(file_object.path).first.to_s
|
92
|
+
|
93
|
+
body = <<-eos
|
94
|
+
--simple_google_drive_boundary
|
95
|
+
Content-Type: application/json; charset=UTF-8
|
96
|
+
|
97
|
+
#{body_object.to_json}
|
98
|
+
|
99
|
+
--simple_google_drive_boundary
|
100
|
+
Content-Type: #{content_type}
|
101
|
+
|
102
|
+
#{file_object.read}
|
103
|
+
|
104
|
+
--simple_google_drive_boundary--
|
105
|
+
eos
|
106
|
+
end
|
107
|
+
|
108
|
+
def build_resumable_body(file_object, body_object)
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'net/http'
|
3
|
+
require 'json'
|
4
|
+
require 'mime/types'
|
5
|
+
|
6
|
+
require 'simple_google_drive/version'
|
7
|
+
require 'simple_google_drive/session_base'
|
8
|
+
require 'simple_google_drive/client'
|
9
|
+
|
10
|
+
module SimpleGoogleDrive
|
11
|
+
|
12
|
+
API_HOST = "www.googleapis.com"
|
13
|
+
API_VERSION = "2"
|
14
|
+
API_UPLOAD_URL = "https://#{API_HOST}/upload/drive/v#{API_VERSION}"
|
15
|
+
API_BASE_URL = "https://#{API_HOST}/drive/v#{API_VERSION}"
|
16
|
+
|
17
|
+
def self.new(oauth2_access_token)
|
18
|
+
Client.new(oauth2_access_token)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'simple_google_drive/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "simple_google_drive"
|
8
|
+
spec.version = SimpleGoogleDrive::VERSION
|
9
|
+
spec.authors = ["Guilherme Vinicius Moreira"]
|
10
|
+
spec.email = ["gui.vinicius@gmail.com"]
|
11
|
+
spec.summary = "A simple interface for Google Drive API"
|
12
|
+
spec.description = "A simple interface for Google Drive API"
|
13
|
+
spec.homepage = "https://github.com/guivinicius/simple_google_drive"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.5"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
end
|
@@ -0,0 +1,230 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SimpleGoogleDrive::Client do
|
4
|
+
|
5
|
+
let(:oauth2_access_token) { "1/fFBGRNJru1FQd44AzqT3Zg" }
|
6
|
+
let(:client) { SimpleGoogleDrive.new(oauth2_access_token) }
|
7
|
+
let(:headers) {
|
8
|
+
{
|
9
|
+
"Accept" => "*/*",
|
10
|
+
"Accept-Encoding" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3",
|
11
|
+
"Authorization"=>"Bearer #{oauth2_access_token}",
|
12
|
+
"Host" => "www.googleapis.com",
|
13
|
+
"User-Agent" => "Ruby/SimpleGoogleDrive/#{SimpleGoogleDrive::VERSION}"
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
describe "#about" do
|
18
|
+
|
19
|
+
it "returns the user information" do
|
20
|
+
stub_request(:get, "#{SimpleGoogleDrive::API_BASE_URL}/about")
|
21
|
+
.with(:headers => headers)
|
22
|
+
.to_return(:status => 200, :body => '{"kind": "drive#about"}')
|
23
|
+
|
24
|
+
expect(client.about).to eq(JSON.parse('{"kind": "drive#about"}'))
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#files" do
|
30
|
+
|
31
|
+
let(:file_id) { 159 }
|
32
|
+
|
33
|
+
describe "#get" do
|
34
|
+
it "returns a file's metadata by ID" do
|
35
|
+
stub_request(:get, "#{SimpleGoogleDrive::API_BASE_URL}/files/#{file_id}")
|
36
|
+
.with(:headers => headers)
|
37
|
+
.to_return(:status => 200, :body => '{"kind": "drive#files"}')
|
38
|
+
|
39
|
+
expect(client.files_get(file_id)).to eq(JSON.parse('{"kind": "drive#files"}'))
|
40
|
+
end
|
41
|
+
|
42
|
+
it "returns a file's metadata by ID with updateViewedDate param" do
|
43
|
+
stub_request(:get, "#{SimpleGoogleDrive::API_BASE_URL}/files/#{file_id}")
|
44
|
+
.with(:query => {:updateViewedDate => "true"}, :headers => headers)
|
45
|
+
.to_return(:status => 200, :body => '{"kind": "drive#files"}')
|
46
|
+
|
47
|
+
expect(client.files_get(file_id, :updateViewedDate => true)).to eq(JSON.parse('{"kind": "drive#files"}'))
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "#insert" do
|
53
|
+
|
54
|
+
it "Insert a new file and return it's metadata." do
|
55
|
+
|
56
|
+
request_body = '{"title":"New file from insert","description":"Blank file!"}'
|
57
|
+
response_body = '{"kind": "drive#files", "title": "New file from insert", "description": "Blank file!"}'
|
58
|
+
|
59
|
+
body = {:title => "New file from insert", :description => "Blank file!"}
|
60
|
+
params = { :convert => "true" }
|
61
|
+
|
62
|
+
stub_request(:post, "#{SimpleGoogleDrive::API_BASE_URL}/files")
|
63
|
+
.with(:query => params, :body => request_body, :headers => headers)
|
64
|
+
.to_return(:status => 200, :body => response_body)
|
65
|
+
|
66
|
+
expect(client.files_insert(body, params)).to eq(JSON.parse(response_body))
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "#upload" do
|
73
|
+
|
74
|
+
let (:file_path) { File.expand_path("spec/support/example.txt") }
|
75
|
+
let (:file_obj) { File.open(file_path) }
|
76
|
+
|
77
|
+
it "returns it's metadata using 'simple' method" do
|
78
|
+
|
79
|
+
response_body = '{"kind": "drive#files", "title": "example.txt"}'
|
80
|
+
params = { :uploadType => "media", :parameters => { :convert => true} }
|
81
|
+
|
82
|
+
stub_request(:post, "#{SimpleGoogleDrive::API_UPLOAD_URL}/files")
|
83
|
+
.with(:query => {:convert => 'true'}, :body => /.+/, :headers => headers.merge({'Content-Type' => 'text/plain'}))
|
84
|
+
.to_return(:status => 200, :body => response_body)
|
85
|
+
|
86
|
+
expect(client.files_upload(file_obj, params)).to eq(JSON.parse(response_body))
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
it "returns it's metadata using 'multipart' method" do
|
91
|
+
params = { :uploadType => "multipart", :parameters => { :convert => true }, :body_object => { :title => "example2.txt", :description => "something" } }
|
92
|
+
|
93
|
+
request_body = <<-eos
|
94
|
+
--simple_google_drive_boundary
|
95
|
+
Content-Type: application/json; charset=UTF-8
|
96
|
+
|
97
|
+
#{params[:body_object].to_json}
|
98
|
+
|
99
|
+
--simple_google_drive_boundary
|
100
|
+
Content-Type: text/plain
|
101
|
+
|
102
|
+
#{file_obj.read}
|
103
|
+
|
104
|
+
--simple_google_drive_boundary--
|
105
|
+
eos
|
106
|
+
|
107
|
+
response_body = '{"kind": "drive#files", "title": "example2.txt", "description": "something"}'
|
108
|
+
|
109
|
+
stub_request(:post, "#{SimpleGoogleDrive::API_UPLOAD_URL}/files")
|
110
|
+
.with(:query => {:convert => 'true'}, :body => request_body, :headers => headers.merge({'Content-Type' => 'multipart/related;boundary=simple_google_drive_boundary'}))
|
111
|
+
.to_return(:status => 200, :body => response_body)
|
112
|
+
|
113
|
+
expect(client.files_upload(File.open(file_path), params)).to eq(JSON.parse(response_body))
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
describe "#patch" do
|
120
|
+
|
121
|
+
it "Updates file metadata and return it" do
|
122
|
+
response_body = '{"kind": "drive#files", "title": "new title"}'
|
123
|
+
|
124
|
+
stub_request(:patch, "#{SimpleGoogleDrive::API_BASE_URL}/files/#{file_id}").with(:body => {:title => 'new title'}, :headers => headers)
|
125
|
+
.to_return(:status => 200, :body => response_body)
|
126
|
+
|
127
|
+
expect(client.files_patch(file_id, {:title => 'new title'})).to eq(JSON.parse(response_body))
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
131
|
+
|
132
|
+
describe "#update" do
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
describe "#copy" do
|
137
|
+
it "Copies the origin file and return the copy metadata" do
|
138
|
+
|
139
|
+
response_body = '{"kind": "drive#files"}'
|
140
|
+
|
141
|
+
stub_request(:post, "#{SimpleGoogleDrive::API_BASE_URL}/files/#{file_id}/copy").with(:headers => headers)
|
142
|
+
.to_return(:status => 200, :body => response_body)
|
143
|
+
|
144
|
+
expect(client.files_copy(file_id)).to eq(JSON.parse(response_body))
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe "#delete" do
|
149
|
+
it "Permanently deletes a file by ID." do
|
150
|
+
|
151
|
+
stub_request(:delete, "#{SimpleGoogleDrive::API_BASE_URL}/files/#{file_id}").with(:headers => headers)
|
152
|
+
.to_return(:status => 204)
|
153
|
+
|
154
|
+
expect(client.files_delete(file_id)).to eq("")
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
describe "#list" do
|
159
|
+
|
160
|
+
it "Lists the user's files" do
|
161
|
+
|
162
|
+
response_body = '{"kind": "drive#fileList", "items":"[]"}'
|
163
|
+
|
164
|
+
stub_request(:get, "#{SimpleGoogleDrive::API_BASE_URL}/files").with(:headers => headers)
|
165
|
+
.to_return(:status => 200, :body => response_body)
|
166
|
+
|
167
|
+
expect(client.files_list).to eq(JSON.parse(response_body))
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
171
|
+
|
172
|
+
describe "#touch" do
|
173
|
+
|
174
|
+
it "Set the file's updated time to the current server time." do
|
175
|
+
|
176
|
+
response_body = '{"kind": "drive#files"}'
|
177
|
+
|
178
|
+
stub_request(:post, "#{SimpleGoogleDrive::API_BASE_URL}/files/#{file_id}/touch").with(:headers => headers)
|
179
|
+
.to_return(:status => 200, :body => response_body)
|
180
|
+
|
181
|
+
expect(client.files_touch(file_id)).to eq(JSON.parse(response_body))
|
182
|
+
end
|
183
|
+
|
184
|
+
end
|
185
|
+
|
186
|
+
describe "#trash" do
|
187
|
+
|
188
|
+
it "Moves a file to the trash and return files metadata." do
|
189
|
+
|
190
|
+
response_body = '{"kind": "drive#files"}'
|
191
|
+
|
192
|
+
stub_request(:post, "#{SimpleGoogleDrive::API_BASE_URL}/files/#{file_id}/trash").with(:headers => headers)
|
193
|
+
.to_return(:status => 200, :body => response_body)
|
194
|
+
|
195
|
+
expect(client.files_trash(file_id)).to eq(JSON.parse(response_body))
|
196
|
+
end
|
197
|
+
|
198
|
+
end
|
199
|
+
|
200
|
+
describe "#untrash" do
|
201
|
+
it "Restores a file from the trash and return file metadata." do
|
202
|
+
|
203
|
+
response_body = '{"kind": "drive#files"}'
|
204
|
+
|
205
|
+
stub_request(:post, "#{SimpleGoogleDrive::API_BASE_URL}/files/#{file_id}/untrash").with(:headers => headers)
|
206
|
+
.to_return(:status => 200, :body => response_body)
|
207
|
+
|
208
|
+
expect(client.files_untrash(file_id)).to eq(JSON.parse(response_body))
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
describe "#watch" do
|
213
|
+
|
214
|
+
it "Start watching for changes to a file and return a api#channel metadata." do
|
215
|
+
|
216
|
+
response_body = '{"kind": "api#channel"}'
|
217
|
+
request_body = '{"id":"1","token":"123123","type":"web_hook","address":"192.168.0.1","params":{"ttl":"60000"}}'
|
218
|
+
params = { :id => "1", :token => "123123", :type => "web_hook", :address => "192.168.0.1", :params => {:ttl => "60000"} }
|
219
|
+
|
220
|
+
stub_request(:post, "#{SimpleGoogleDrive::API_BASE_URL}/files/#{file_id}/watch").with(:body => request_body, :headers => headers)
|
221
|
+
.to_return(:status => 200, :body => response_body)
|
222
|
+
|
223
|
+
expect(client.files_watch(file_id, params)).to eq(JSON.parse(response_body))
|
224
|
+
end
|
225
|
+
|
226
|
+
end
|
227
|
+
|
228
|
+
end
|
229
|
+
|
230
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SimpleGoogleDrive do
|
4
|
+
|
5
|
+
let(:oauth2_access_token) { "1/fFBGRNJru1FQd44AzqT3Zg" }
|
6
|
+
|
7
|
+
it "returns a new client instance" do
|
8
|
+
expect(SimpleGoogleDrive.new(oauth2_access_token)).to be_instance_of(SimpleGoogleDrive::Client)
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require "codeclimate-test-reporter"
|
2
|
+
CodeClimate::TestReporter.start
|
3
|
+
|
4
|
+
require 'simple_google_drive'
|
5
|
+
require 'webmock/rspec'
|
6
|
+
|
7
|
+
# Allowing codeclimate connections
|
8
|
+
WebMock.disable_net_connect!(:allow => "codeclimate.com")
|
9
|
+
|
10
|
+
RSpec.configure do |config|
|
11
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
12
|
+
config.run_all_when_everything_filtered = true
|
13
|
+
config.filter_run :focus
|
14
|
+
|
15
|
+
config.order = 'random'
|
16
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
2
|
+
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
3
|
+
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
4
|
+
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
5
|
+
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
6
|
+
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
7
|
+
|
8
|
+
Do you preffer Dropbox ?
|
9
|
+
|
10
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
11
|
+
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
12
|
+
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
13
|
+
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
14
|
+
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
15
|
+
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
metadata
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: simple_google_drive
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Guilherme Vinicius Moreira
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-01-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.5'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: A simple interface for Google Drive API
|
42
|
+
email:
|
43
|
+
- gui.vinicius@gmail.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- ".gitignore"
|
49
|
+
- ".rspec"
|
50
|
+
- ".travis.yml"
|
51
|
+
- Gemfile
|
52
|
+
- LICENSE.txt
|
53
|
+
- README.md
|
54
|
+
- Rakefile
|
55
|
+
- lib/simple_google_drive.rb
|
56
|
+
- lib/simple_google_drive/client.rb
|
57
|
+
- lib/simple_google_drive/session_base.rb
|
58
|
+
- lib/simple_google_drive/version.rb
|
59
|
+
- simple_google_drive.gemspec
|
60
|
+
- spec/lib/simple_google_drive/client_spec.rb
|
61
|
+
- spec/lib/simple_google_drive_spec.rb
|
62
|
+
- spec/spec_helper.rb
|
63
|
+
- spec/support/example.txt
|
64
|
+
homepage: https://github.com/guivinicius/simple_google_drive
|
65
|
+
licenses:
|
66
|
+
- MIT
|
67
|
+
metadata: {}
|
68
|
+
post_install_message:
|
69
|
+
rdoc_options: []
|
70
|
+
require_paths:
|
71
|
+
- lib
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
requirements: []
|
83
|
+
rubyforge_project:
|
84
|
+
rubygems_version: 2.2.0
|
85
|
+
signing_key:
|
86
|
+
specification_version: 4
|
87
|
+
summary: A simple interface for Google Drive API
|
88
|
+
test_files:
|
89
|
+
- spec/lib/simple_google_drive/client_spec.rb
|
90
|
+
- spec/lib/simple_google_drive_spec.rb
|
91
|
+
- spec/spec_helper.rb
|
92
|
+
- spec/support/example.txt
|