dropbox_api 0.1.1 → 0.1.3

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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/CHANGES.md +7 -0
  4. data/README.md +37 -12
  5. data/TODO.md +33 -3
  6. data/api_coverage.md +8 -6
  7. data/api_reference.md +25 -0
  8. data/lib/dropbox_api.rb +25 -1
  9. data/lib/dropbox_api/authenticator.rb +5 -9
  10. data/lib/dropbox_api/endpoints/base.rb +11 -0
  11. data/lib/dropbox_api/endpoints/files/get_thumbnail.rb +30 -6
  12. data/lib/dropbox_api/endpoints/files/upload.rb +18 -6
  13. data/lib/dropbox_api/endpoints/sharing/add_file_member.rb +60 -0
  14. data/lib/dropbox_api/endpoints/sharing/add_folder_member.rb +11 -8
  15. data/lib/dropbox_api/endpoints/sharing/list_folder_members.rb +16 -6
  16. data/lib/dropbox_api/endpoints/users/get_account_batch.rb +19 -0
  17. data/lib/dropbox_api/endpoints/users/get_current_account.rb +16 -0
  18. data/lib/dropbox_api/endpoints/users/get_space_usage.rb +16 -0
  19. data/lib/dropbox_api/errors/add_file_member_error.rb +6 -0
  20. data/lib/dropbox_api/errors/basic_error.rb +3 -0
  21. data/lib/dropbox_api/errors/file_member_action_error.rb +10 -0
  22. data/lib/dropbox_api/errors/sharing_file_access_error.rb +11 -0
  23. data/lib/dropbox_api/errors/too_many_requests_error.rb +19 -0
  24. data/lib/dropbox_api/metadata/access_level.rb +18 -0
  25. data/lib/dropbox_api/metadata/add_file_member_result.rb +19 -0
  26. data/lib/dropbox_api/metadata/add_member.rb +26 -54
  27. data/lib/dropbox_api/metadata/base.rb +53 -10
  28. data/lib/dropbox_api/metadata/basic_account.rb +19 -20
  29. data/lib/dropbox_api/metadata/deleted.rb +7 -8
  30. data/lib/dropbox_api/metadata/field.rb +3 -2
  31. data/lib/dropbox_api/metadata/file.rb +20 -17
  32. data/lib/dropbox_api/metadata/file_link.rb +26 -27
  33. data/lib/dropbox_api/metadata/file_member_action.rb +30 -0
  34. data/lib/dropbox_api/metadata/folder.rb +11 -8
  35. data/lib/dropbox_api/metadata/folder_sharing_info.rb +5 -6
  36. data/lib/dropbox_api/metadata/link_permissions.rb +9 -10
  37. data/lib/dropbox_api/metadata/member.rb +47 -0
  38. data/lib/dropbox_api/metadata/member_action_collection.rb +44 -0
  39. data/lib/dropbox_api/metadata/member_permission.rb +7 -0
  40. data/lib/dropbox_api/metadata/member_permission_list.rb +7 -0
  41. data/lib/dropbox_api/metadata/name.rb +7 -8
  42. data/lib/dropbox_api/metadata/parent_folder_access_info.rb +7 -0
  43. data/lib/dropbox_api/metadata/shared_folder.rb +14 -15
  44. data/lib/dropbox_api/metadata/shared_folder_policy.rb +5 -6
  45. data/lib/dropbox_api/metadata/space_allocation.rb +10 -0
  46. data/lib/dropbox_api/metadata/space_usage.rb +14 -0
  47. data/lib/dropbox_api/metadata/team_member_info.rb +9 -10
  48. data/lib/dropbox_api/result_builder.rb +1 -1
  49. data/lib/dropbox_api/results/add_file_member_result_list.rb +20 -0
  50. data/lib/dropbox_api/results/basic_account_batch.rb +7 -0
  51. data/lib/dropbox_api/version.rb +1 -1
  52. data/rails_setup.md +84 -0
  53. metadata +26 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e2ad8b305ace1f2190948fc945fa0858cde13892
4
- data.tar.gz: e939597633dfa2b79d9a2032722ab9ba33543f55
3
+ metadata.gz: fd04df06e2b79e0a102c34ada12761d414d92484
4
+ data.tar.gz: 2d71c761e4b9c05e0207633d2b0d984f434ffd4e
5
5
  SHA512:
6
- metadata.gz: c1ffbfd944bdf036ba31c0527fbc4fc28713d852788e696fb8a12bf07756a46d7ba99259cf5f6f5b3aa54cecf87ee5a112ddf57fbc91af2ae6a1945244d3604a
7
- data.tar.gz: d4aed46a8ab64d10d03e153c5a22e0aed0f874f682150f19277d8b9ba2ed0ad2fe5815a9a71a6ae29b22b2eec7454344cb95bf178bd1611ba538f4345e4bd90d
6
+ metadata.gz: 7cfaf692c3c6625378951ddd42108e12d667477fb9468b5d1648e0891b7cb45cedd93fb7a06dd5e018625baf1955c330824dba14604569e323ceb0ea3aae5ba2
7
+ data.tar.gz: 26d60eb6ddfb03c8e3c8b3219d0b1698c4360215b5edbdb39d096f8c7adffa131dbf1e470cb8be911ca58e3322b143d18939e360017e4f4eda6e1a9e170e5331
data/.yardopts ADDED
@@ -0,0 +1 @@
1
+ - api_coverage.md api_reference.md rails_setup.md
data/CHANGES.md ADDED
@@ -0,0 +1,7 @@
1
+ This file aims to compile all the breaking changes introduced in each version.
2
+
3
+ ### Version 0.2
4
+
5
+ - `list_folder_members` changed its signature from
6
+ `list_folder_members(folder_id, options = {})` to
7
+ `list_folder_members(folder_id, actions = [], options = {})`
data/README.md CHANGED
@@ -40,6 +40,9 @@ DropboxApi::Client.new
40
40
  #=> #<DropboxApi::Client ...>
41
41
  ```
42
42
 
43
+ Note that setting an ENV variable is only a feasible choice if you're only
44
+ using one account.
45
+
43
46
  #### Option A: Get your access token from the website
44
47
 
45
48
  The easiest way to obtain an access token is to get it from the Dropbox website.
@@ -54,17 +57,26 @@ to generate an access token.
54
57
 
55
58
  You can obtain an authorization code with this library:
56
59
 
57
- 1. `require "dropbox_api/authenticator"`
58
- 1. `authenticator = DropboxApi::Authenticator.new(CLIENT_ID, CLIENT_SECRET)`
59
- 2. `authenticator.authorize_url #=> "https://www.dropbox.com/..."`
60
- 3. Open the authorization URL in your browser, authorize the application and
61
- copy your code.
62
- 4. `auth_bearer = authenticator.get_token(CODE) #=> #<OAuth2::AccessToken ...>`
63
- 5. `auth_bearer.token #=> "VofXAX8D..."`. Keep this token!
60
+ ```ruby
61
+ authenticator = DropboxApi::Authenticator.new(CLIENT_ID, CLIENT_SECRET)
62
+ authenticator.authorize_url #=> "https://www.dropbox.com/..."
63
+
64
+ # Now you need to open the authorization URL in your browser,
65
+ # authorize the application and copy your code.
66
+
67
+ auth_bearer = authenticator.get_token(CODE) #=> #<OAuth2::AccessToken ...>`
68
+ auth_bearer.token #=> "VofXAX8D..."
69
+ # Keep this token, you'll need it to initialize a `DropboxApi::Client` object
70
+ ```
71
+
72
+ #### Standard OAuth 2 flow
73
+
74
+ This is what many web applications will use. The process is described in
75
+ Dropbox's [OAuth guide](https://www.dropbox.com/developers/reference/oauth-guide#oauth-2-on-the-web).
64
76
 
65
- #### Standard OAuth flow
77
+ If you have a Rails application, you might be interested in this [setup
78
+ guide](rails_setup.md).
66
79
 
67
- Not implemented yet. :(
68
80
 
69
81
  ### Performing API calls
70
82
 
@@ -86,11 +98,18 @@ result.has_more?
86
98
  #=> false
87
99
  ```
88
100
 
89
- Refer to the documentation to see the details for each endpoint.
101
+ Refer to the
102
+ [documentation](http://www.rubydoc.info/gems/dropbox_api)
103
+ to see the details for each endpoint, you can find them all in the following
104
+ 3 modules:
105
+
106
+ - [Files](http://www.rubydoc.info/gems/dropbox_api/DropboxApi/Endpoints/Files)
107
+ - [Sharing](http://www.rubydoc.info/gems/dropbox_api/DropboxApi/Endpoints/Sharing)
108
+ - [Users](http://www.rubydoc.info/gems/dropbox_api/DropboxApi/Endpoints/Users)
90
109
 
91
110
  ## Dependencies
92
111
 
93
- ###Network adapter
112
+ ### Network adapter
94
113
 
95
114
  This gem uses [faraday](https://github.com/lostisland/faraday#faraday).
96
115
  So it should work on any network library.
@@ -109,7 +128,13 @@ commits and tags, and push the `.gem` file to
109
128
  ## Contributing
110
129
 
111
130
  Any help will be much appreciated. It should be quite easy to implement most
112
- of the [endpoints that are still pending](api_coverage.md).
131
+ of the [endpoints that are still pending](api_coverage.md) by looking at the
132
+ exising implementations (check out the `dropbox_api/endpoints` folder).
133
+
134
+ If you want to help but you're unsure how to get started, please get in touch
135
+ by opening an issue.
136
+
137
+ Here's the standard way to submit code updates:
113
138
 
114
139
  1. Fork it ( https://github.com/Jesus/dropbox_api/fork )
115
140
  2. Create your feature branch (`git checkout -b my-new-feature`)
data/TODO.md CHANGED
@@ -1,8 +1,38 @@
1
- # Goals to publish v0.1
1
+ # Week
2
2
 
3
- - Write a tutorial showing how to set up authentication in a Rails app.
4
- - Add a small module for configuration. Needs to contain the OAuth bearer.
3
+ TOKEN: VofXAX8DO1sAAAAAAAADiXbd__inZjFI0OTsK9ao8AAKmshXqdbnjOnXz7XylBbf
4
+
5
+ - add_file_member
6
+ - Refactor MemberActionCollection
7
+ - Implement DropboxApi::Metadata::Base#to_hash
8
+
9
+ - get_file_metadata
10
+ - get_folder_metadata
11
+ - get_shared_link_file
12
+ - get_shared_link_metadata
13
+ - list_shared_folders
14
+ - continue_list_shared_folders
15
+ - share_folder
16
+ - add_folder_member
17
+ - mount_folder
18
+ - list_folder_members
19
+ - relinquish_folder_membership
20
+ - transfer_folder
21
+
22
+ # Short term goals
23
+
24
+ - Remove dependency on faraday.
25
+ - Complete full [API coverage](api_coverage.md).
5
26
 
6
27
  # Further on
7
28
 
29
+ - Improve the API reference page, help here:
30
+ http://gnuu.org/2009/11/18/customizing-yard-templates/
8
31
  - Supporting streams would be great.
32
+ - Add a layer to handle pagination, use `Enumerable`.
33
+
34
+ # Release guide
35
+
36
+ 1. Bump version in `version.rb`.
37
+ 2. Create tag and write release notes in Github.com.
38
+ 3.
data/api_coverage.md CHANGED
@@ -1,3 +1,5 @@
1
+ # @title API Implementation Coverage
2
+
1
3
  **IMPORTANT: This document is work in progress. Information isn't accurate.**
2
4
 
3
5
  The Dropbox API changes frequently, so you may find out that the feature that
@@ -38,7 +40,7 @@ API call | Status
38
40
  `/save_url` | 🌑
39
41
  `/save_url/check_job_status` | 🌑
40
42
  `/search` | 🌕
41
- `/upload` | 🌕
43
+ `/upload` | 🌔
42
44
  `/upload_session/append` | 🌑
43
45
  `/upload_session/append_v2` | 🌑
44
46
  `/upload_session/finish` | 🌑
@@ -49,7 +51,7 @@ API call | Status
49
51
  ## Sharing namespace
50
52
  API call | Status
51
53
  --- | :---:
52
- `/add_file_member` | 🌑
54
+ `/add_file_member` | 🌔
53
55
  `/add_folder_member` | 🌕
54
56
  `/change_file_member_access` | 🌑
55
57
  `/check_job_status` | 🌑
@@ -66,7 +68,7 @@ API call | Status
66
68
  `/list_file_members` | 🌑
67
69
  `/list_file_members/batch` | 🌑
68
70
  `/list_file_members/continue` | 🌑
69
- `/list_folder_members` | 🌓
71
+ `/list_folder_members` | 🌕
70
72
  `/list_folder_members/continue` | 🌑
71
73
  `/list_folders` | 🌑
72
74
  `/list_folders/continue` | 🌑
@@ -96,9 +98,9 @@ API call | Status
96
98
  API call | Status
97
99
  --- | :---:
98
100
  `/get_account` | 🌕
99
- `/get_account_batch` | 🌑
100
- `/get_current_account` | 🌑
101
- `/get_space_usage` | 🌑
101
+ `/get_account_batch` | 🌕
102
+ `/get_current_account` | 🌕
103
+ `/get_space_usage` | 🌕
102
104
 
103
105
 
104
106
  ## Dropbox Business API
data/api_reference.md ADDED
@@ -0,0 +1,25 @@
1
+ # @title API Reference
2
+
3
+ {render:DropboxApi::Endpoints::Files::Copy#copy}
4
+ {render:DropboxApi::Endpoints::Files::CreateFolder#create_folder}
5
+ {render:DropboxApi::Endpoints::Files::Delete#delete}
6
+ {render:DropboxApi::Endpoints::Files::Download#download}
7
+ {render:DropboxApi::Endpoints::Files::GetMetadata#get_metadata}
8
+ {render:DropboxApi::Endpoints::Files::GetPreview#get_preview}
9
+ {render:DropboxApi::Endpoints::Files::GetTemporaryLink#get_temporary_link}
10
+ {render:DropboxApi::Endpoints::Files::GetThumbnail#get_thumbnail}
11
+ {render:DropboxApi::Endpoints::Files::ListFolder#list_folder}
12
+ {render:DropboxApi::Endpoints::Files::ListFolderContinue#list_folder_continue}
13
+ {render:DropboxApi::Endpoints::Files::ListFolderGetLatestCursor#list_folder_get_latest_cursor}
14
+ {render:DropboxApi::Endpoints::Files::ListFolderLongpoll#list_folder_longpoll}
15
+ {render:DropboxApi::Endpoints::Files::ListRevisions#list_revisions}
16
+ {render:DropboxApi::Endpoints::Files::Move#move}
17
+ {render:DropboxApi::Endpoints::Files::Restore#restore}
18
+ {render:DropboxApi::Endpoints::Files::Search#search}
19
+ {render:DropboxApi::Endpoints::Files::Upload#upload}
20
+
21
+ {render:DropboxApi::Endpoints::Sharing::AddFolderMember#add_folder_member}
22
+ {render:DropboxApi::Endpoints::Sharing::CreateSharedLinkWithSettings#create_shared_link_with_settings}
23
+ {render:DropboxApi::Endpoints::Sharing::ListFolderMembers#list_folder_members}
24
+ {render:DropboxApi::Endpoints::Sharing::ListSharedLinks#list_shared_links}
25
+ {render:DropboxApi::Endpoints::Sharing::ShareFolder#share_folder}
data/lib/dropbox_api.rb CHANGED
@@ -1,16 +1,28 @@
1
1
  require 'dropbox_api/version'
2
2
 
3
+ require 'time'
3
4
  require 'json'
4
5
  require 'faraday'
5
6
 
7
+ require 'dropbox_api/authenticator'
8
+
6
9
  require 'dropbox_api/middleware/decode_result'
7
10
 
8
11
  require 'dropbox_api/metadata/field'
9
- require 'dropbox_api/metadata/add_member'
10
12
  require 'dropbox_api/metadata/base'
13
+
14
+ require 'dropbox_api/metadata/access_level'
15
+ require 'dropbox_api/metadata/member'
16
+ require 'dropbox_api/metadata/add_member'
11
17
  require 'dropbox_api/metadata/name'
18
+ require 'dropbox_api/metadata/file_member_action'
19
+ require 'dropbox_api/metadata/member_permission'
20
+ require 'dropbox_api/metadata/member_permission_list'
21
+ require 'dropbox_api/metadata/add_file_member_result'
22
+ require 'dropbox_api/metadata/parent_folder_access_info'
12
23
  require 'dropbox_api/metadata/basic_account'
13
24
  require 'dropbox_api/metadata/link_permissions'
25
+ require 'dropbox_api/metadata/member_action_collection'
14
26
  require 'dropbox_api/metadata/team'
15
27
  require 'dropbox_api/metadata/team_member_info'
16
28
  require 'dropbox_api/metadata/file'
@@ -23,6 +35,8 @@ require 'dropbox_api/metadata/shared_folder'
23
35
  require 'dropbox_api/metadata/file_link'
24
36
  require 'dropbox_api/metadata/folder_link'
25
37
  require 'dropbox_api/metadata/shared_link'
38
+ require 'dropbox_api/metadata/space_allocation'
39
+ require 'dropbox_api/metadata/space_usage'
26
40
 
27
41
  require 'dropbox_api/errors/http_error'
28
42
  require 'dropbox_api/errors/basic_error'
@@ -40,6 +54,8 @@ require 'dropbox_api/errors/create_folder_error'
40
54
  require 'dropbox_api/errors/create_shared_link_with_settings_error'
41
55
  require 'dropbox_api/errors/delete_error'
42
56
  require 'dropbox_api/errors/download_error'
57
+ require 'dropbox_api/errors/sharing_file_access_error'
58
+ require 'dropbox_api/errors/file_member_action_error'
43
59
  require 'dropbox_api/errors/get_metadata_error'
44
60
  require 'dropbox_api/errors/list_folder_error'
45
61
  require 'dropbox_api/errors/list_revisions_error'
@@ -51,11 +67,15 @@ require 'dropbox_api/errors/add_member_selector_error'
51
67
  require 'dropbox_api/errors/shared_folder_access_error'
52
68
  require 'dropbox_api/errors/upload_write_failed_error'
53
69
  require 'dropbox_api/errors/upload_error'
70
+ require 'dropbox_api/errors/add_file_member_error'
54
71
  require 'dropbox_api/errors/add_folder_member_error'
72
+ require 'dropbox_api/errors/too_many_requests_error'
55
73
  require 'dropbox_api/errors/get_account_error'
56
74
 
57
75
  require 'dropbox_api/result_builder'
58
76
  require 'dropbox_api/results/base'
77
+ require 'dropbox_api/results/basic_account_batch'
78
+ require 'dropbox_api/results/add_file_member_result_list'
59
79
  require 'dropbox_api/results/get_temporary_link_result'
60
80
  require 'dropbox_api/results/list_folder_result'
61
81
  require 'dropbox_api/results/list_revisions_result'
@@ -94,9 +114,13 @@ require 'dropbox_api/endpoints/files/move'
94
114
  require 'dropbox_api/endpoints/files/restore'
95
115
  require 'dropbox_api/endpoints/files/search'
96
116
  require 'dropbox_api/endpoints/files/upload'
117
+ require 'dropbox_api/endpoints/sharing/add_file_member'
97
118
  require 'dropbox_api/endpoints/sharing/add_folder_member'
98
119
  require 'dropbox_api/endpoints/sharing/list_folder_members'
99
120
  require 'dropbox_api/endpoints/sharing/share_folder'
100
121
  require 'dropbox_api/endpoints/sharing/list_shared_links'
101
122
  require 'dropbox_api/endpoints/sharing/create_shared_link_with_settings'
102
123
  require 'dropbox_api/endpoints/users/get_account'
124
+ require 'dropbox_api/endpoints/users/get_account_batch'
125
+ require 'dropbox_api/endpoints/users/get_current_account'
126
+ require 'dropbox_api/endpoints/users/get_space_usage'
@@ -2,19 +2,15 @@ require 'oauth2'
2
2
 
3
3
  module DropboxApi
4
4
  class Authenticator < OAuth2::Client
5
+ extend Forwardable
6
+
5
7
  def initialize(client_id, client_secret)
6
- @oauth_client = OAuth2::Client.new(client_id, client_secret, {
8
+ @auth_code = OAuth2::Client.new(client_id, client_secret, {
7
9
  :authorize_url => 'https://www.dropbox.com/1/oauth2/authorize',
8
10
  :token_url => 'https://api.dropboxapi.com/1/oauth2/token'
9
- })
10
- end
11
-
12
- def authorize_url
13
- @oauth_client.auth_code.authorize_url
11
+ }).auth_code
14
12
  end
15
13
 
16
- def get_token(oauth_code)
17
- @oauth_client.auth_code.get_token oauth_code
18
- end
14
+ def_delegators :@auth_code, :authorize_url, :get_token
19
15
  end
20
16
  end
@@ -16,11 +16,22 @@ module DropboxApi::Endpoints
16
16
  end
17
17
 
18
18
  def process_response(raw_response)
19
+ # Official Dropbox documentation for HTTP error codes:
20
+ # https://www.dropbox.com/developers/documentation/http/documentation#error-handling
19
21
  case raw_response.status
20
22
  when 200, 409
21
23
  # Status code 409 is "Endpoint-specific error". We need to look at
22
24
  # the response body to build an exception.
23
25
  build_result(raw_response.env[:api_result])
26
+ when 429
27
+ error = DropboxApi::Errors::TooManyRequestsError.build(
28
+ raw_response.env[:api_result]["error_summary"],
29
+ raw_response.env[:api_result]["error"]["reason"]
30
+ )
31
+
32
+ error.retry_after = raw_response.headers["retry-after"].to_i
33
+
34
+ raise error
24
35
  else
25
36
  raise DropboxApi::Errors::HttpError,
26
37
  "HTTP #{raw_response.status}: #{raw_response.body}"
@@ -14,13 +14,37 @@ module DropboxApi::Endpoints::Files
14
14
  # jpg, jpeg, png, tiff, tif, gif and bmp. Photos that are larger than 20MB
15
15
  # in size won't be converted to a thumbnail.
16
16
  #
17
+ # @example
18
+ # # Save thumbnail to a local file
19
+ # client = DropboxApi::Client.new
20
+ # file = File.open("thumbnail.png", "w")
21
+ # client.get_thumbnail "/dropbox_image.png" do |thumbnail_content|
22
+ # file.write thumbnail_content
23
+ # end
24
+ # file.close
25
+ # @example
26
+ # # Save thumbnail to a local file with .jpg format
27
+ # client = DropboxApi::Client.new
28
+ # file = File.open("thumbnail.jpg", "w")
29
+ # client.get_thumbnail("/dropbox_image.png", :format => :jpeg) do |thumbnail_content|
30
+ # file.write thumbnail_content
31
+ # end
32
+ # file.close
33
+ # @example
34
+ # # Upload thumbnail to Amazon S3 (assuming you're using their SDK)
35
+ # s3_object = AWS::S3.new.s3.buckets['my-bucket'].objects['key']
36
+ # #=> <AWS::S3::S3Object ...>
37
+ # client = DropboxApi::Client.new
38
+ # client.get_thumbnail "/dropbox_image.png" do |thumbnail_content|
39
+ # s3_object.write thumbnail_content
40
+ # end
17
41
  # @param path [String] The path to the image file you want to thumbnail.
18
- # @option format [:jpeg, :png] The format for the thumbnail image, jpeg
19
- # (default) or png. For images that are photos, jpeg should be preferred,
20
- # while png is better for screenshots and digital arts. The default is
21
- # :jpeg.
22
- # @option size [:w32h32, :w64h64, :w128h128, :w640h480, :w1024h768] The
23
- # size for the thumbnail image. The default is :w64h64
42
+ # @option options format [:jpeg, :png] The format for the thumbnail image,
43
+ # +:jpeg+ (default) or +:png+. For images that are photos, +:jpeg+ should be
44
+ # preferred, while png is better for screenshots and digital arts. The
45
+ # default is +:jpeg+.
46
+ # @option options size [:w32h32, :w64h64, :w128h128, :w640h480, :w1024h768]
47
+ # The size for the thumbnail image. The default is +:w64h64+.
24
48
  add_endpoint :get_thumbnail do |path, options = {}, &block|
25
49
  validate_options([:format, :size], options)
26
50
  options[:format] ||= :jpeg
@@ -5,16 +5,28 @@ module DropboxApi::Endpoints::Files
5
5
  ResultType = DropboxApi::Metadata::File
6
6
  ErrorType = DropboxApi::Errors::UploadError
7
7
 
8
- # @method upload(path)
9
- # Create a new file with the contents provided in the request.
8
+ # @method upload(path, content, options = {})
9
+ # Creates a new file.
10
+ #
10
11
  # Do not use this to upload a file larger than 150 MB. Instead, create an
11
12
  # upload session with #upload_session_start().
12
13
  #
14
+ # @example
15
+ # client = DropboxApi::Client.new
16
+ # file_content = IO.read "local_image.png"
17
+ # client.upload "/image.png", file_content
18
+ # #=> #<DropboxApi::Metadata::File: @name="image.png" ...>
19
+ # @example
20
+ # client = DropboxApi::Client.new
21
+ # client.upload "/file.txt", "Contents of a plain text file."
22
+ # #=> #<DropboxApi::Metadata::File: @name="file.txt" ...>
13
23
  # @param path [String] Path in the user's Dropbox to save the file.
14
- # @option autorename [Boolean] If there's a conflict, as determined by
15
- # mode, have the Dropbox server try to autorename the file to avoid
16
- # conflict. The default for this field is False.
17
- # @option mute [Boolean] Normally, users are made aware of any file
24
+ # @param content The contents of the file that will be uploaded. This
25
+ # could be the result of the +IO::read+ method.
26
+ # @option options autorename [Boolean] If there's a conflict, as
27
+ # determined by mode, have the Dropbox server try to autorename the
28
+ # file to avoid conflict. The default for this field is False.
29
+ # @option options mute [Boolean] Normally, users are made aware of any file
18
30
  # modifications in their Dropbox account via notifications in the client
19
31
  # software. If true, this tells the clients that this modification
20
32
  # shouldn't result in a user notification. The default for this field is
@@ -0,0 +1,60 @@
1
+ module DropboxApi::Endpoints::Sharing
2
+ class AddFileMember < DropboxApi::Endpoints::Rpc
3
+ Method = :post
4
+ Path = "/2/sharing/add_file_member".freeze
5
+ ResultType = DropboxApi::Results::AddFileMemberResultList
6
+ ErrorType = DropboxApi::Errors::AddFileMemberError
7
+
8
+ include DropboxApi::Endpoints::OptionsValidator
9
+
10
+ # @method add_file_member(file, members, options = {})
11
+ # Adds specified members to a file.
12
+ #
13
+ # The +members+ parameter must be an Array. Each item in the array could
14
+ # be either a String or a {Metadata::Member} object, which allows more
15
+ # advanced options.
16
+ #
17
+ # @param file [String] File to which to add members. It can be a path or
18
+ # an ID such as +id:3kmLmQFnf1AAAAAAAAAAAw+.
19
+ # @param members [Array<Member,String>] Members to add. Note that even
20
+ # an email address is given, this may result in a user being directy
21
+ # added to the membership if that email is the user's main account email.
22
+ # @option options quiet [Boolean] Whether added members should be notified
23
+ # via email and device notifications of their invite. The default for
24
+ # this field is +false+.
25
+ # @option options custom_message [String] Message to send to added members
26
+ # in their invitation. This field is optional.
27
+ # @option options access_level [AccessLevel] AccessLevel union object,
28
+ # describing what access level we want to give new members. The default
29
+ # for this is +:viewer+.
30
+ # @option options add_message_as_comment [String] Optional message to
31
+ # display to added members in their invitation. This field is optional.
32
+ add_endpoint :add_file_member do |file, members, options = {}|
33
+ validate_options([:quiet, :custom_message], options)
34
+ options[:quiet] ||= false
35
+ options[:custom_message] ||= nil
36
+ options[:access_level] ||= :viewer
37
+ options[:add_message_as_comment] ||= false
38
+
39
+ perform_request options.merge({
40
+ :file => file,
41
+ :members => build_members_param(members)
42
+ })
43
+ end
44
+
45
+ private
46
+
47
+ def build_members_param(members)
48
+ members.map do |member|
49
+ case member
50
+ when String
51
+ DropboxApi::Metadata::Member.build_from_email_or_dropbox_id member
52
+ when DropboxApi::Metadata::Member
53
+ member
54
+ else
55
+ raise ArgumentError, "Invalid argument type `#{member.class.name}`"
56
+ end
57
+ end.map(&:to_hash)
58
+ end
59
+ end
60
+ end