dropbox_api 0.1.1 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
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