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
@@ -1,12 +1,11 @@
1
1
  module DropboxApi::Metadata
2
- # NOTE: We should have a test to cover the initialization of this object.
3
- # Sample:
4
- # {
5
- # ".tag": "deleted",
6
- # "name": "file.txt",
7
- # "path_lower": "/file.txt",
8
- # "path_display": "/file.txt"
9
- # }
2
+ # Example of a serialized {Deleted} object:
3
+ # {
4
+ # ".tag": "deleted",
5
+ # "name": "file.txt",
6
+ # "path_lower": "/file.txt",
7
+ # "path_display": "/file.txt"
8
+ # }
10
9
  class Deleted < Base
11
10
  field :name, String
12
11
  field :path_lower, String
@@ -6,7 +6,8 @@ module DropboxApi::Metadata
6
6
  end
7
7
 
8
8
  def cast(object)
9
- if object.nil? && @options.include?(:optional)
9
+ if object.nil?
10
+ raise ArgumentError unless @options.include? :optional
10
11
  nil
11
12
  else
12
13
  force_cast object
@@ -27,7 +28,7 @@ module DropboxApi::Metadata
27
28
  elsif @type.ancestors.include? DropboxApi::Metadata::Base
28
29
  @type.new(object)
29
30
  else
30
- raise NotImplementedError, "Can't cast `#{type}`"
31
+ raise NotImplementedError, "Can't cast `#{@type}`"
31
32
  end
32
33
  end
33
34
  end
@@ -1,22 +1,21 @@
1
1
  module DropboxApi::Metadata
2
- # NOTE: We should have a test to cover the initialization of this object.
3
- # Sample:
4
- # {
5
- # ".tag": "file",
6
- # "name": "Prime_Numbers.txt",
7
- # "path_lower": "/homework/math/prime_numbers.txt",
8
- # "path_display": "/Homework/math/Prime_Numbers.txt",
9
- # "id": "id:a4ayc_80_OEAAAAAAAAAXw",
10
- # "client_modified": "2015-05-12T15:50:38Z",
11
- # "server_modified": "2015-05-12T15:50:38Z",
12
- # "rev": "a1c10ce0dd78",
13
- # "size": 7212,
14
- # "sharing_info": {
15
- # "read_only": true,
16
- # "parent_shared_folder_id": "84528192421",
17
- # "modified_by": "dbid:AAH4f99T0taONIb-OurWxbNQ6ywGRopQngc"
2
+ # Example of a serialized {File} object:
3
+ # {
4
+ # ".tag": "file",
5
+ # "name": "Prime_Numbers.txt",
6
+ # "path_lower": "/homework/math/prime_numbers.txt",
7
+ # "path_display": "/Homework/math/Prime_Numbers.txt",
8
+ # "id": "id:a4ayc_80_OEAAAAAAAAAXw",
9
+ # "client_modified": "2015-05-12T15:50:38Z",
10
+ # "server_modified": "2015-05-12T15:50:38Z",
11
+ # "rev": "a1c10ce0dd78",
12
+ # "size": 7212,
13
+ # "sharing_info": {
14
+ # "read_only": true,
15
+ # "parent_shared_folder_id": "84528192421",
16
+ # "modified_by": "dbid:AAH4f99T0taONIb-OurWxbNQ6ywGRopQngc"
17
+ # }
18
18
  # }
19
- # }
20
19
  class File < Base
21
20
  field :name, String
22
21
  field :path_lower, String
@@ -26,5 +25,9 @@ module DropboxApi::Metadata
26
25
  field :server_modified, Time
27
26
  field :rev, String
28
27
  field :size, Integer
28
+
29
+ def to_hash
30
+ super.merge(".tag" => "file")
31
+ end
29
32
  end
30
33
  end
@@ -1,34 +1,33 @@
1
1
  module DropboxApi::Metadata
2
- # NOTE: We should have a test to cover the initialization of this object.
3
- # Sample:
4
- # {
5
- # ".tag": "file",
6
- # "url": "https://www.dropbox.com/s/2sn712vy1ovegw8/Prime_Numbers.txt?dl=0",
7
- # "name": "Prime_Numbers.txt",
8
- # "link_permissions": {
9
- # "can_revoke": false,
10
- # "resolved_visibility": {
11
- # ".tag": "public"
2
+ # Example of a serialized {FileLink} object:
3
+ # {
4
+ # ".tag": "file",
5
+ # "url": "https://www.dropbox.com/s/2sn712vy1ovegw8/Prime_Numbers.txt?dl=0",
6
+ # "name": "Prime_Numbers.txt",
7
+ # "link_permissions": {
8
+ # "can_revoke": false,
9
+ # "resolved_visibility": {
10
+ # ".tag": "public"
11
+ # },
12
+ # "revoke_failure_reason": {
13
+ # ".tag": "owner_only"
14
+ # }
12
15
  # },
13
- # "revoke_failure_reason": {
14
- # ".tag": "owner_only"
16
+ # "client_modified": "2015-05-12T15:50:38Z",
17
+ # "server_modified": "2015-05-12T15:50:38Z",
18
+ # "rev": "a1c10ce0dd78",
19
+ # "size": 7212,
20
+ # "id": "id:a4ayc_80_OEAAAAAAAAAXw",
21
+ # "path_lower": "/homework/math/prime_numbers.txt",
22
+ # "team_member_info": {
23
+ # "team_info": {
24
+ # "id": "dbtid:AAFdgehTzw7WlXhZJsbGCLePe8RvQGYDr-I",
25
+ # "name": "Acme, Inc."
26
+ # },
27
+ # "display_name": "Roger Rabbit",
28
+ # "member_id": "dbmid:abcd1234"
15
29
  # }
16
- # },
17
- # "client_modified": "2015-05-12T15:50:38Z",
18
- # "server_modified": "2015-05-12T15:50:38Z",
19
- # "rev": "a1c10ce0dd78",
20
- # "size": 7212,
21
- # "id": "id:a4ayc_80_OEAAAAAAAAAXw",
22
- # "path_lower": "/homework/math/prime_numbers.txt",
23
- # "team_member_info": {
24
- # "team_info": {
25
- # "id": "dbtid:AAFdgehTzw7WlXhZJsbGCLePe8RvQGYDr-I",
26
- # "name": "Acme, Inc."
27
- # },
28
- # "display_name": "Roger Rabbit",
29
- # "member_id": "dbmid:abcd1234"
30
30
  # }
31
- # }
32
31
  class FileLink < Base
33
32
  field :url, String
34
33
  field :name, String
@@ -0,0 +1,30 @@
1
+ module DropboxApi::Metadata
2
+ # Example of a serialized FileMemberAction:
3
+ # {
4
+ # ".tag": "success",
5
+ # "success": {
6
+ # ".tag": "viewer"
7
+ # }
8
+ # }
9
+ class FileMemberAction < Base
10
+ class << self
11
+ def new(data)
12
+ tag = data[".tag"]
13
+ class_for(tag.to_sym).new(data[tag])
14
+ end
15
+
16
+ private
17
+
18
+ def class_for(tag)
19
+ case tag
20
+ when :success
21
+ DropboxApi::Metadata::AccessLevel
22
+ when :member_error
23
+ DropboxApi::Errors::FileMemberActionError
24
+ else
25
+ raise ArgumentError, "Unable to build individual result with `#{tag}`"
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,17 +1,20 @@
1
1
  module DropboxApi::Metadata
2
- # NOTE: We should have a test to cover the initialization of this object.
3
- # Sample:
4
- # {
5
- # "name": "arizona_baby",
6
- # "path_lower": "/arizona_baby",
7
- # "path_display": "/arizona_baby",
8
- # "id": "id:7eWkV5hcfzAAAAAAAAAAAQ"
9
- # }
2
+ # Example of a serialized {Folder} object:
3
+ # {
4
+ # "name": "arizona_baby",
5
+ # "path_lower": "/arizona_baby",
6
+ # "path_display": "/arizona_baby",
7
+ # "id": "id:7eWkV5hcfzAAAAAAAAAAAQ"
8
+ # }
10
9
  class Folder < Base
11
10
  field :name, String
12
11
  field :path_lower, String
13
12
  field :path_display, String
14
13
  field :id, String
15
14
  field :sharing_info, DropboxApi::Metadata::FolderSharingInfo, :optional
15
+
16
+ def to_hash
17
+ super.merge(".tag" => "folder")
18
+ end
16
19
  end
17
20
  end
@@ -1,10 +1,9 @@
1
1
  module DropboxApi::Metadata
2
- # NOTE: We should have a test to cover the initialization of this object.
3
- # Sample:
4
- # {
5
- # "read_only": false,
6
- # "parent_shared_folder_id": "84528192421"
7
- # }
2
+ # Example of a serialized {FolderSharingInfo} object:
3
+ # {
4
+ # "read_only": false,
5
+ # "parent_shared_folder_id": "84528192421"
6
+ # }
8
7
  class FolderSharingInfo < Base
9
8
  field :read_only, :boolean
10
9
  field :parent_shared_folder_id, String, :optional
@@ -1,15 +1,14 @@
1
1
  module DropboxApi::Metadata
2
- # NOTE: We should have a test to cover the initialization of this object.
3
- # Sample:
4
- # {
5
- # "can_revoke": false,
6
- # "resolved_visibility": {
7
- # ".tag": "public"
8
- # },
9
- # "revoke_failure_reason": {
10
- # ".tag": "owner_only"
2
+ # Example of a serialized {LinkPermissions} object:
3
+ # {
4
+ # "can_revoke": false,
5
+ # "resolved_visibility": {
6
+ # ".tag": "public"
7
+ # },
8
+ # "revoke_failure_reason": {
9
+ # ".tag": "owner_only"
10
+ # }
11
11
  # }
12
- # }
13
12
  class LinkPermissions < Base
14
13
  field :can_revoke, :boolean
15
14
  field :resolved_visibility, Symbol, :optional
@@ -0,0 +1,47 @@
1
+ module DropboxApi::Metadata
2
+ # Examples of serialized {AddMember} objects:
3
+ # [
4
+ # {
5
+ # ".tag": "email",
6
+ # "email": "justin@example.com"
7
+ # }, {
8
+ # ".tag": "dropbox_id",
9
+ # "dropbox_id": "dbid:AAEufNrMPSPe0dMQijRP0N_aZtBJRm26W4Q"
10
+ # }
11
+ # ]
12
+ class Member < Base
13
+ class << self
14
+ def build_from_email_or_dropbox_id(email_or_id)
15
+ if email_or_id.start_with? "dbid:"
16
+ build_from_dropbox_id email_or_id
17
+ elsif email_or_id =~ /\A[^@\s]+@[^@\s]+\z/
18
+ build_from_email email_or_id
19
+ else
20
+ raise ArgumentError, "Invalid email or Dropbox ID: #{email_or_id}"
21
+ end
22
+ end
23
+
24
+ def build_from_dropbox_id(dropbox_id)
25
+ new({
26
+ :".tag" => :dropbox_id,
27
+ :dropbox_id => dropbox_id
28
+ })
29
+ end
30
+
31
+ def build_from_email(email)
32
+ new({
33
+ :".tag" => :email,
34
+ :email => email
35
+ })
36
+ end
37
+ end
38
+
39
+ def initialize(member)
40
+ @member = member
41
+ end
42
+
43
+ def to_hash
44
+ @member
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,44 @@
1
+ module DropboxApi::Metadata
2
+ # This represents a collection of actions that may be taken on members of a
3
+ # shared folder. Each action will be one of the following:
4
+ #
5
+ # - leave_a_copy: Allow the member to keep a copy of the folder when removing.
6
+ # - make_editor: Make the member an editor of the folder.
7
+ # - make_owner: Make the member an owner of the folder.
8
+ # - make_viewer: Make the member a viewer of the folder.
9
+ # - make_viewer_no_comment: Make the member a viewer of the folder without commenting permissions.
10
+ # - remove: Remove the member from the folder.
11
+ #
12
+ # TODO: Split this object in two: MemberAction & MemberActionList,
13
+ # DropboxApi::Metadata::MemberPermission will use it.
14
+ class MemberActionCollection < Array
15
+ ValidActions = [
16
+ :leave_a_copy,
17
+ :make_editor,
18
+ :make_owner,
19
+ :make_viewer,
20
+ :make_viewer_no_comment,
21
+ :remove
22
+ ]
23
+
24
+ def initialize(actions)
25
+ actions = symbolize actions
26
+ validate actions
27
+
28
+ super(actions)
29
+ end
30
+
31
+ private
32
+
33
+ def symbolize(actions)
34
+ actions.map &:to_sym
35
+ end
36
+
37
+ def validate(actions)
38
+ actions.each do |action|
39
+ raise ArgumentError,
40
+ "Invalid action: `#{action}`" unless ValidActions.include? action
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,7 @@
1
+ module DropboxApi::Metadata
2
+ class MemberPermission < Base
3
+ field :action, String # This is actually a MemberAction object
4
+ field :allow, :boolean
5
+ field :reason, String # This is actually a PermissionDeniedReason object
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module DropboxApi::Metadata
2
+ class MemberPermissionList < Array
3
+ def initialize(list)
4
+ super(list.map { |i| DropboxApi::Metadata::MemberPermission.new i })
5
+ end
6
+ end
7
+ end
@@ -1,12 +1,11 @@
1
1
  module DropboxApi::Metadata
2
- # NOTE: We should have a test to cover the initialization of this object.
3
- # Sample:
4
- # {
5
- # "given_name": "Franz",
6
- # "surname": "Ferdinand",
7
- # "familiar_name": "Franz",
8
- # "display_name": "Franz Ferdinand (Personal)"
9
- # },
2
+ # Example of a serialized {Name} object:
3
+ # {
4
+ # "given_name": "Franz",
5
+ # "surname": "Ferdinand",
6
+ # "familiar_name": "Franz",
7
+ # "display_name": "Franz Ferdinand (Personal)"
8
+ # }
10
9
  class Name < Base
11
10
  field :given_name, String
12
11
  field :surname, String
@@ -0,0 +1,7 @@
1
+ module DropboxApi::Metadata
2
+ class ParentFolderAccessInfo < Base
3
+ field :folder_name, String
4
+ field :shared_folder_id, String
5
+ field :permissions, DropboxApi::Metadata::MemberPermissionList
6
+ end
7
+ end
@@ -1,19 +1,18 @@
1
1
  module DropboxApi::Metadata
2
- # NOTE: We should have a test to cover the initialization of this object.
3
- # Sample:
4
- # {
5
- # ".tag" => "complete",
6
- # "access_type" => {".tag"=>"owner"},
7
- # "is_team_folder" => false,
8
- # "policy" => {
9
- # "acl_update_policy" => { ".tag" => "owner" },
10
- # "shared_link_policy" => { ".tag" => "anyone" }
11
- # },
12
- # "path_lower" => "/folder_a",
13
- # "name" => "folder_a",
14
- # "shared_folder_id" => "1231266557",
15
- # "time_invited" => "2016-06-04T10:00:35Z"
16
- # }
2
+ # Example of a serialized {SharedFolder} object:
3
+ # {
4
+ # ".tag" => "complete",
5
+ # "access_type" => {".tag"=>"owner"},
6
+ # "is_team_folder" => false,
7
+ # "policy" => {
8
+ # "acl_update_policy" => { ".tag" => "owner" },
9
+ # "shared_link_policy" => { ".tag" => "anyone" }
10
+ # },
11
+ # "path_lower" => "/folder_a",
12
+ # "name" => "folder_a",
13
+ # "shared_folder_id" => "1231266557",
14
+ # "time_invited" => "2016-06-04T10:00:35Z"
15
+ # }
17
16
  class SharedFolder < Base
18
17
  field :access_type, String
19
18
  field :is_team_folder, :boolean
@@ -1,10 +1,9 @@
1
1
  module DropboxApi::Metadata
2
- # NOTE: We should have a test to cover the initialization of this object.
3
- # Sample:
4
- # {
5
- # "acl_update_policy" => { ".tag" => "owner" },
6
- # "shared_link_policy" => { ".tag" => "anyone" }
7
- # }
2
+ # Example of a serialized {SharedFolderPolicy} object:
3
+ # {
4
+ # "acl_update_policy" => { ".tag" => "owner" },
5
+ # "shared_link_policy" => { ".tag" => "anyone" }
6
+ # }
8
7
  class SharedFolderPolicy < Base
9
8
  field :acl_update_policy, Symbol
10
9
  field :shared_link_policy, Symbol