browse-everything 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YjFkMzhlOTI5ZmE2NWViNTM1ZGE1ZGZmM2E4NGI4ZDMzMWVhMDE3Mw==
4
+ OGZmMTA5NTFiMmVjY2M2YWUzMTU0Mzc0NzI3ZWJmZDFjY2ZjYTkzNg==
5
5
  data.tar.gz: !binary |-
6
- ZTY1NzA0OGZkMjMyZWQ3YTY2ZDYwMjg3MWQ1ZDgwNmU1NDU2N2JkMg==
6
+ MDUwODBiZWQ1NDRiMDRmZThlNWJmN2I3NDU5MjM5YzMzMmMyMGE4OA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- OTQ2OGI4MDAwMTczNTdjMTZmZDhkNzAwOGY0MjlhNjVmZTlkMDFiY2ZmNGZk
10
- ZGYyYzA0Yzk3ZmVkN2ExYmMwY2FmYTIwYjY5MjFmY2E2N2QwOTI0MmM5N2Fm
11
- YzE1YzdhOTg0ZWVjOTZjMGNmMThkYzVjODkxNmMxNjQ3MmQyYTI=
9
+ ZWE3YjBiNTM5OWNlOWI2ZDU3ZTJhYTYzMTE2MWQ3M2I1ZjBiZWRjMTRkYmY5
10
+ MzZjMjI0ZThmNWJiOTM2ZThjMTA2Njc5ZDFiZTc4ZTJhNTFmZTk3ODRkOGFh
11
+ ODE2YzQxMTFkOWQzMmUwNDFlMDMxMWU2MzRjMWZkYzBlOGE4NjE=
12
12
  data.tar.gz: !binary |-
13
- NGJmMDBlODBmMDA4MDY1YTI5MjY2OTdkYmViYzIyNTc5ODlkMDJlZDY3ZmEw
14
- YjcxYjM1ZmU1YzFjNDhjMDc0NmZjNWU2ZDRkNTAzNDA4NjJlMDYzYzJlNGEz
15
- NmU0MzE0Yzk4ZDRjODg5OGZmZTA5MmJmMzU2NWYyZmQ0YzE1YTM=
13
+ ZGI3OGRhYmYwODgwMGYyOTA3Nzk0MzgwZmEzNmYwMjFiYjc0NTY2OTkxMjY5
14
+ NWUyNDA2NDYwNDExNDJkNWU5MzBhM2JmMTYyMDEyOGY3MDMxYzU2MjhkNWFh
15
+ YTM4MDFhOTI0NGE3NDY3ODMyZDg5MzhiNzc4NzIxNDU2ZWMyMmQ=
data/HISTORY.md CHANGED
@@ -1,3 +1,7 @@
1
+ ### 0.4.0 (2014-04-01)
2
+ - Added configuration generator
3
+ - Improved documentation
4
+
1
5
  ### 0.3.0 (2014-03-24)
2
6
  - Additional response parameters
3
7
  - Refresh token fixes for Box, SkyDrive, and Google Drive
data/README.md CHANGED
@@ -25,75 +25,36 @@ And then execute:
25
25
  Or install it yourself as:
26
26
 
27
27
  $ gem install browse-everything
28
+
29
+ ### Configuring the gem
30
+
31
+ After installing the gem, run the generator
28
32
 
29
- ## Usage
30
-
31
- ### Configuration
32
-
33
- To use the gem you will need to configure the providers by providing applcation keys that are required by each provider
34
-
35
- An example config/browse_everything_providers.yml:
36
-
37
- ```yaml
38
- ---
39
- file_system:
40
- :home: /<location for server file drop>
41
- sky_drive:
42
- :client_id: <your client id>
43
- :client_secret: <your client secret>
44
- box:
45
- :client_id: <your client id>
46
- :client_secret: <your client secret>
47
- drop_box:
48
- :app_key: <your client id>
49
- :app_secret: <your app secret>
50
- google_drive:
51
- :client_id: <your client id>
52
- :client_secret: <your client secret>
53
- ```
33
+ $ rails g browse_anything:config
34
+
35
+ This generator will set up the _config/browse_everything_providers.yml_ file and add the browse-everything engine to your application's routes.
54
36
 
55
- You must register your application with each cloud provider separately:
37
+ If you prefer not to use the generator, or need info on how to set up providers in the browse_everything_providers.yml, use the info on [Configuring browse-everything](https://github.com/projecthydra/browse-everything/wiki/Configuring-browse-everything).
56
38
 
57
- * Skydrive: [https://account.live.com/developers/applications/create](https://account.live.com/developers/applications/create)
58
- * Dropbox: [https://www.dropbox.com/developers/apps/create](https://www.dropbox.com/developers/apps/create)
59
- * Box: [https://app.box.com/developers/services/edit/](https://app.box.com/developers/services/edit/)
60
- * GoogleDrive: [https://code.google.com/apis/console](https://code.google.com/apis/console)
61
-
62
- ### CSS and JavaScript Modifications
39
+ ### Include the CSS and JavaScript
63
40
 
64
41
  Add `@import "browse_everything";` to your application.css.scss
65
42
 
66
43
  Add `//= require browse_everything` to your application.js
67
44
 
68
- ### Routes
45
+ ## Usage
69
46
 
70
- Mount the engine in your routes.rb
71
-
72
- ```
73
- mount BrowseEverything::Engine => '/browse'
74
- ```
47
+ ### Adding Providers
48
+ In order to connect to a provider like [DropBox](http://www.dropbox.com),
49
+ [Skydrive](https://skydrive.live.com/), [Google Drive](http://drive.google.com), or
50
+ [Box](http://www.box.com), you must provide API keys in _config/browse_everything_providers.yml_. For info on how to edit this file, see [Configuring browse-everything](https://github.com/projecthydra/browse-everything/wiki/Configuring-browse-everything)
75
51
 
76
52
  ### Views
77
53
 
78
- browse-everything can be triggered in one of two ways:
79
-
80
- #### Via data attributes
81
-
82
- ```html
83
- <button type="button" data-toggle="browse-everything" data-route="<%=browse_everything_engine.root_path%>"
84
- data-target="#myForm" class="btn btn-large btn-success" id="browse">Browse!</button>
85
- ```
86
-
87
- #### Via JavaScript
88
-
89
- ```javascript
90
- $('#browse').browseEverything(options)
91
- ```
54
+ browse-everything can be triggered in two ways -- either via data attributes in an HTML tag or via JavaScript. Either way, it accepts the same options:
92
55
 
93
56
  #### Options
94
57
 
95
- Options can be passed via data attributes or JavaScript. For data attributes, append the option name to `data-`,
96
- as in `data-target="#myForm"`.
97
58
 
98
59
  | Name | type | default | description |
99
60
  |-----------------|-----------------|-----------------|----------------------------------------------------------------|
@@ -101,45 +62,40 @@ as in `data-target="#myForm"`.
101
62
  | target | xpath or jQuery | null | A form object to add the results to as hidden fields. |
102
63
 
103
64
  If a `target` is provided, browse-everything will automatically convert the JSON response to a series of hidden form fields
104
- that can be posted back to Rails to re-create the array on the server side.
65
+ that can be posted back to Rails to re-create the array on the server side.
105
66
 
106
- #### Methods
107
67
 
108
- ##### .browseEverything(options)
68
+ #### Via data attributes
109
69
 
110
- Attaches the browsing behavior to the click event of the receiver.
70
+ To trigger browse-everything using data attributes, set the _data-toggle_ attribute to "browse-everything" on the HTML tag. This tells the javascript where to attach the browse-everything behaviors. Pass in the options using the _data-route_ and _data-target_ attributes, as in `data-target="#myForm"`.
71
+
72
+ For example:
73
+
74
+ ```html
75
+ <button type="button" data-toggle="browse-everything" data-route="<%=browse_everything_engine.root_path%>"
76
+ data-target="#myForm" class="btn btn-large btn-success" id="browse">Browse!</button>
77
+ ```
78
+
79
+ #### Via JavaScript
80
+
81
+ To trigger browse-everything via javascript, use the .browseEverything() method to attach the behaviors to DOM elements.
111
82
 
83
+ ```javascript
84
+ $('#browse').browseEverything(options)
85
+ ```
86
+
87
+ The options argument should be a JSON object with the route and (optionally) target values set. For example:
112
88
  ```javascript
113
89
  $('#browse').browseEverything({
114
90
  route: "/browse",
115
91
  target: "#myForm"
116
- }).done(function(data) {
117
- // User has submitted files; data contains an array of URLs and their options
118
- }).cancel(function() {
119
- // User cancelled the browse operation
120
- }).fail(function(status, error, text) {
121
- // URL retrieval experienced a techical failure
122
- });
92
+ })
123
93
  ```
124
94
 
125
- ##### .browseEverything()
126
-
127
- Returns the existing callback object for the receiver, allowing for a mix of data attribute and JavaScript modes.
128
-
129
- ```html
130
- <button type="button" data-toggle="browse-everything" data-route="/browse"
131
- data-target="#myForm" class="btn btn-large btn-success" id="browse">Browse!</button>
95
+ See [JavaScript Methods](https://github.com/projecthydra/browse-everything/wiki/JavaScript-Methods) for more info on using javascript to trigger browse-everything.
132
96
 
133
- <script>
134
- $(document).ready(function() {
135
- $('#browse').browseEverything().done(function(data) {
136
- // Set the "done" callback for the already-defined #browse button
137
- })
138
- });
139
- </script>
140
- ```
141
97
 
142
- #### Data Structure
98
+ ### The Results (Data Structure)
143
99
 
144
100
  browse-everything returns a JSON data structure consisting of an array of URL specifications. Each URL specification
145
101
  is a plain object with the following properties:
@@ -151,6 +107,40 @@ is a plain object with the following properties:
151
107
  | expires | The expiration date/time of the specified URL. |
152
108
  | file_name | The base name (filename.ext) of the selected file. |
153
109
 
110
+ For example, after picking two files from dropbox,
111
+
112
+ If you initialized browse-everything via JavaScript, the results data passed to the `.done()` callback will look like this:
113
+ ```json
114
+ [
115
+ {
116
+ "url": "https://dl.dropbox.com/fake/filepicker-demo.txt.txt",
117
+ "expires": "2014-03-31T20:37:36.214Z",
118
+ "file_name": "filepicker-demo.txt.txt"
119
+ }, {
120
+ "url": "https://dl.dropbox.com/fake/Getting%20Started.pdf",
121
+ "expires": "2014-03-31T20:37:36.731Z",
122
+ "file_name": "Getting+Started.pdf"
123
+ }
124
+ ]
125
+ ```
126
+ See [JavaScript Methods](https://github.com/projecthydra/browse-everything/wiki/JavaScript-Methods) for more info on using javascript to trigger browse-everything.
127
+
128
+ If you initialized browse-everything via data-attributes and set the _target_ option (via the _data-target_ attribute or via the _target_ option on the javascript method), the results data be written as hidden fields in the `<form>` you've specified as the target. When the user submits that form, the results will look like this:
129
+ ```ruby
130
+ "selected_files" => {
131
+ "0"=>{
132
+ "url"=>"https://dl.dropbox.com/fake/filepicker-demo.txt.txt",
133
+ "expires"=>"2014-03-31T20:37:36.214Z",
134
+ "file_name"=>"filepicker-demo.txt.txt"
135
+ },
136
+ "1"=>{
137
+ "url"=>"https://dl.dropbox.com/fake/Getting%20Started.pdf",
138
+ "expires"=>"2014-03-31T20:37:36.731Z",
139
+ "file_name"=>"Getting+Started.pdf"
140
+ }
141
+ }
142
+ ```
143
+
154
144
  ### Examples
155
145
 
156
146
  See `spec/support/app/views/file_handler/index.html` for an example use case. You can also run `rake app:generate` to
@@ -32,6 +32,8 @@
32
32
  position: fixed !important;
33
33
  margin: 0 0 0 -37.5%;
34
34
  left: 50%;
35
+ top: 10%;
36
+ background-color: initial;
35
37
  width: 75%;
36
38
 
37
39
  .modal-body {
@@ -90,4 +92,4 @@
90
92
  }
91
93
  }
92
94
 
93
- }
95
+ }
@@ -36,5 +36,6 @@ Gem::Specification.new do |spec|
36
36
  spec.add_development_dependency "webmock"
37
37
  spec.add_development_dependency "vcr"
38
38
  spec.add_development_dependency "sqlite3"
39
+ spec.add_development_dependency "factory_girl_rails"
39
40
 
40
41
  end
@@ -13,7 +13,7 @@ module BrowseEverything
13
13
  end
14
14
 
15
15
  def contents(path='')
16
- relative_path = path.sub(%r{^[/.]+},'')
16
+ relative_path = path.sub(%r{^[\/.]+},'')
17
17
  real_path = File.join(config[:home], relative_path)
18
18
  result = []
19
19
  if File.directory?(real_path)
@@ -1,3 +1,3 @@
1
1
  module BrowseEverything
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -0,0 +1,31 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'rails/generators'
3
+
4
+ class BrowseEverything::ConfigGenerator < Rails::Generators::Base
5
+ desc """
6
+ This generator makes the following changes to your application:
7
+ 1. Creates config/browse_everything_providers.yml with a placeholder value
8
+ 2. Modifies your app's routes.rb to mount BrowseEverything at /browse
9
+ """
10
+ source_root File.expand_path('../templates', __FILE__)
11
+
12
+ def inject_routes
13
+ insert_into_file "config/routes.rb", :after => ".draw do" do
14
+ %{
15
+ mount BrowseEverything::Engine => '/browse'}
16
+ end
17
+ end
18
+
19
+ def copy_example_config
20
+ copy_file "browse_everything_providers.yml.example", "config/browse_everything_providers.yml"
21
+ end
22
+
23
+ def insert_file_system_path
24
+ insert_into_file "config/browse_everything_providers.yml", :before => "# drop_box:" do
25
+ YAML.dump({ 'file_system' => { :home => Rails.root.to_s }})
26
+ end
27
+ end
28
+
29
+
30
+
31
+ end
@@ -0,0 +1,16 @@
1
+ #
2
+ # To make browse-everything aware of a provider, uncomment the info for that provider and add your API key information.
3
+ # The file_system provider can be a path to any directory on the server where your application is running.
4
+ #
5
+ # drop_box:
6
+ # :app_key: YOUR_DROPBOX_APP_KEY
7
+ # :app_secret: YOUR_DROPBOX_APP_SECRET
8
+ # box:
9
+ # :client_id: YOUR_BOX_CLIENT_ID
10
+ # :client_secret: YOUR_BOX_CLIENT_SECRET
11
+ # google_drive:
12
+ # :client_id: YOUR_GOOGLE_API_CLIENT_ID
13
+ # :client_secret: YOUR_GOOGLE_API_CLIENT_SECRET
14
+ # sky_drive:
15
+ # :client_id: YOUR_MS_LIVE_CONNECT_CLIENT_ID
16
+ # :client_secret: YOUR_MS_LIVE_CONNECT_CLIENT_SECRET
@@ -189,6 +189,45 @@ http_interactions:
189
189
  "expires": "Fri, 20 Sep 2013 19:39:01 +0000"}'
190
190
  http_version: '1.1'
191
191
  recorded_at: Fri, 20 Sep 2013 15:39:01 GMT
192
+ - request:
193
+ method: get
194
+ uri: https://api.dropbox.com/1/media/auto/Writer/Writer%20FAQ.txt
195
+ body:
196
+ encoding: UTF-8
197
+ string: ''
198
+ headers:
199
+ Accept: ! '*/*'
200
+ User-Agent: OfficialDropboxRubySDK/1.6.1
201
+ Authorization: Bearer FakeDropboxAccessToken01234567890ABCDEF_AAAAAAA987654321
202
+ Connection: close
203
+ Host: api.dropbox.com
204
+ response:
205
+ status:
206
+ code: '200'
207
+ message: OK
208
+ headers:
209
+ Server: nginx
210
+ Date: Fri, 20 Sep 2013 15:39:01 GMT
211
+ Content-Type: text/javascript
212
+ Transfer-Encoding: chunked
213
+ Connection: close
214
+ set-cookie: ! 'gvc=MjEyNTM5NjUyNDAyMDIwODUzNTU0MTY0NzA0ODU4MzczNTU0NDI%3D; expires=Wed,
215
+ 19 Sep 2018 15:39:01
216
+
217
+ GMT; Path=/; httponly'
218
+ x-server-response-time: '68'
219
+ x-dropbox-request-id: d8dbc2e2080168d6e34d85165aa69c0e
220
+ pragma: no-cache
221
+ cache-control: no-cache
222
+ x-dropbox-http-protocol: None
223
+ x-frame-options: SAMEORIGIN
224
+ X-RequestId: e03a6c0ded5f7088ba59ecd9e97234a6
225
+ body:
226
+ encoding: UTF-8
227
+ string: ! '{"url": "https://dl.dropboxusercontent.com/1/view/FakeDropboxAccessPath/Writer/Writer%20FAQ.txt",
228
+ "expires": "Fri, 20 Sep 2013 19:39:01 +0000"}'
229
+ http_version: '1.1'
230
+ recorded_at: Fri, 20 Sep 2013 15:39:01 GMT
192
231
  - request:
193
232
  method: get
194
233
  uri: https://api.dropbox.com/1/media/auto/Writer/Markdown%20Test.txt?
@@ -228,4 +267,43 @@ http_interactions:
228
267
  "expires": "Fri, 20 Sep 2013 19:39:02 +0000"}'
229
268
  http_version: '1.1'
230
269
  recorded_at: Fri, 20 Sep 2013 15:39:02 GMT
270
+ - request:
271
+ method: get
272
+ uri: https://api.dropbox.com/1/media/auto/Writer/Markdown%20Test.txt
273
+ body:
274
+ encoding: UTF-8
275
+ string: ''
276
+ headers:
277
+ Accept: ! '*/*'
278
+ User-Agent: OfficialDropboxRubySDK/1.6.1
279
+ Authorization: Bearer FakeDropboxAccessToken01234567890ABCDEF_AAAAAAA987654321
280
+ Connection: close
281
+ Host: api.dropbox.com
282
+ response:
283
+ status:
284
+ code: '200'
285
+ message: OK
286
+ headers:
287
+ Server: nginx
288
+ Date: Fri, 20 Sep 2013 15:39:02 GMT
289
+ Content-Type: text/javascript
290
+ Transfer-Encoding: chunked
291
+ Connection: close
292
+ set-cookie: ! 'gvc=NjgwODYwOTI2NTA5OTAyNzE3NzE4MDU3MzY0NTQ3NTYyNTYyNDE%3D; expires=Wed,
293
+ 19 Sep 2018 15:39:02
294
+
295
+ GMT; Path=/; httponly'
296
+ x-server-response-time: '78'
297
+ x-dropbox-request-id: b6fd9a3c039d2aea3def25f8f2f5ac3a
298
+ pragma: no-cache
299
+ cache-control: no-cache
300
+ x-dropbox-http-protocol: None
301
+ x-frame-options: SAMEORIGIN
302
+ X-RequestId: 30d2c0cf0122795ebce9bd5f26ce0c60
303
+ body:
304
+ encoding: UTF-8
305
+ string: ! '{"url": "https://dl.dropboxusercontent.com/1/view/FakeDropboxAccessPath/Writer/Markdown%20Test.txt",
306
+ "expires": "Fri, 20 Sep 2013 19:39:02 +0000"}'
307
+ http_version: '1.1'
308
+ recorded_at: Fri, 20 Sep 2013 15:39:02 GMT
231
309
  recorded_with: Charles Proxy
@@ -2,6 +2,11 @@ require 'rails/generators'
2
2
 
3
3
  class TestAppGenerator < Rails::Generators::Base
4
4
  source_root File.expand_path("../../../../support", __FILE__)
5
+
6
+ def run_config_generator
7
+ generate "browse_everything:config"
8
+ end
9
+
5
10
  def inject_css
6
11
  copy_file "../internal/app/assets/stylesheets/application.css", "app/assets/stylesheets/application.css.scss"
7
12
  remove_file "app/assets/stylesheets/application.css"
@@ -26,25 +31,15 @@ class TestAppGenerator < Rails::Generators::Base
26
31
  insert_into_file "config/routes.rb", :after => ".draw do" do
27
32
  %{
28
33
 
29
- mount BrowseEverything::Engine => '/browse'
30
34
  root :to => "file_handler#index"
31
35
  post '/file', :to => "file_handler#update"
32
36
  }
33
37
  end
34
38
  end
35
39
 
36
- def create_bev_configuration
37
- create_file "config/browse_everything_providers.yml" do
38
- YAML.dump({ 'file_system' => { :home => Rails.root.to_s }})
39
- end
40
- end
41
-
42
40
  def create_test_route
43
41
  copy_file "app/controllers/file_handler_controller.rb", "app/controllers/file_handler_controller.rb"
44
42
  copy_file "app/views/file_handler/index.html.erb", "app/views/file_handler/index.html.erb"
45
43
  end
46
44
 
47
- def copy_example_config
48
- copy_file "config/browse_everything_providers.yml.example", "config/browse_everything_providers.yml.example"
49
- end
50
45
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: browse-everything
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carolyn Cole
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2014-03-24 00:00:00.000000000 Z
15
+ date: 2014-04-01 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rails
@@ -266,6 +266,20 @@ dependencies:
266
266
  - - ! '>='
267
267
  - !ruby/object:Gem::Version
268
268
  version: '0'
269
+ - !ruby/object:Gem::Dependency
270
+ name: factory_girl_rails
271
+ requirement: !ruby/object:Gem::Requirement
272
+ requirements:
273
+ - - ! '>='
274
+ - !ruby/object:Gem::Version
275
+ version: '0'
276
+ type: :development
277
+ prerelease: false
278
+ version_requirements: !ruby/object:Gem::Requirement
279
+ requirements:
280
+ - - ! '>='
281
+ - !ruby/object:Gem::Version
282
+ version: '0'
269
283
  description: AJAX/Rails engine file browser for cloud storage services
270
284
  email:
271
285
  - cam156@psu.edu
@@ -317,6 +331,8 @@ files:
317
331
  - lib/browse_everything/engine.rb
318
332
  - lib/browse_everything/file_entry.rb
319
333
  - lib/browse_everything/version.rb
334
+ - lib/generators/browse_everything/config_generator.rb
335
+ - lib/generators/browse_everything/templates/browse_everything_providers.yml.example
320
336
  - spec/fixtures/file_system/dir_1/dir_3/file_3.m4v
321
337
  - spec/fixtures/file_system/dir_1/file_2.txt
322
338
  - spec/fixtures/file_system/dir_2/file_4.docx
@@ -327,7 +343,6 @@ files:
327
343
  - spec/spec_helper.rb.orig
328
344
  - spec/support/app/controllers/file_handler_controller.rb
329
345
  - spec/support/app/views/file_handler/index.html.erb
330
- - spec/support/config/browse_everything_providers.yml.example
331
346
  - spec/support/lib/generators/test_app_generator.rb
332
347
  - spec/unit/base_spec.rb
333
348
  - spec/unit/browser_spec.rb
@@ -372,7 +387,6 @@ test_files:
372
387
  - spec/spec_helper.rb.orig
373
388
  - spec/support/app/controllers/file_handler_controller.rb
374
389
  - spec/support/app/views/file_handler/index.html.erb
375
- - spec/support/config/browse_everything_providers.yml.example
376
390
  - spec/support/lib/generators/test_app_generator.rb
377
391
  - spec/unit/base_spec.rb
378
392
  - spec/unit/browser_spec.rb
@@ -1,15 +0,0 @@
1
- ---
2
- file_system:
3
- :home: SERVER_SIDE_BROWSE_ROOT
4
- box:
5
- :client_id: YOUR_BOX_CLIENT_ID
6
- :client_secret: YOUR_BOX_CLIENT_SECRET
7
- drop_box:
8
- :app_key: YOUR_DROPBOX_APP_KEY
9
- :app_secret: YOUR_DROPBOX_APP_SECRET
10
- google_drive:
11
- :client_id: YOUR_GOOGLE_API_CLIENT_ID
12
- :client_secret: YOUR_GOOGLE_API_CLIENT_SECRET
13
- sky_drive:
14
- :client_id: YOUR_MS_LIVE_CONNECT_CLIENT_ID
15
- :client_secret: YOUR_MS_LIVE_CONNECT_CLIENT_SECRET