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
@@ -7,7 +7,7 @@ module DropboxApi::Endpoints::Sharing
7
7
 
8
8
  include DropboxApi::Endpoints::OptionsValidator
9
9
 
10
- # @method add_folder_member(folder_id, members, options)
10
+ # @method add_folder_member(folder_id, members, options = {})
11
11
  # Allows an owner or editor (if the ACL update policy allows) of a shared
12
12
  # folder to add another member.
13
13
  #
@@ -16,16 +16,19 @@ module DropboxApi::Endpoints::Sharing
16
16
  #
17
17
  # Apps must have full Dropbox access to use this endpoint.
18
18
  #
19
+ # The +members+ parameter must be an Array. Each item in the array could
20
+ # be either a String or a {Metadata::AddMember} object.
21
+ #
19
22
  # @param folder_id [String] The ID for the shared folder.
20
23
  # @param members [Array<AddMember,String>] The intended list of members to
21
24
  # add. Added members will receive invites to join the shared folder.
22
- # @option quiet [Boolean] Whether added members should be notified via
23
- # email and device notifications of their invite. The default for this
24
- # field is False.
25
- # @option custom_message [String] Optional message to display to added
26
- # members in their invitation. This field is optional.
25
+ # @option options quiet [Boolean] Whether added members should be notified
26
+ # via email and device notifications of their invite. The default for
27
+ # this field is False.
28
+ # @option options custom_message [String] Optional message to display to
29
+ # added members in their invitation. This field is optional.
30
+ # @see DropboxApi::Metadata::Member
27
31
  add_endpoint :add_folder_member do |folder_id, members, options = {}|
28
- # TODO: It should be possible to take an email (String) as the argument.
29
32
  validate_options([:quiet, :custom_message], options)
30
33
  options[:quiet] ||= false
31
34
  options[:custom_message] ||= nil
@@ -42,7 +45,7 @@ module DropboxApi::Endpoints::Sharing
42
45
  members.map do |member|
43
46
  case member
44
47
  when String
45
- DropboxApi::Metadata::AddMember.new member
48
+ DropboxApi::Metadata::AddMember.build_from_string member
46
49
  when DropboxApi::Metadata::AddMember
47
50
  member
48
51
  else
@@ -7,24 +7,34 @@ module DropboxApi::Endpoints::Sharing
7
7
 
8
8
  include DropboxApi::Endpoints::OptionsValidator
9
9
 
10
- # @method list_folder_members(folder_id, actions, options)
10
+ # @method list_folder_members(folder_id, actions = [], options = {})
11
11
  # Returns shared folder membership by its folder ID.
12
12
  #
13
13
  # Apps must have full Dropbox access to use this endpoint.
14
14
  #
15
+ # @example List folder members.
16
+ # client.list_folder_members "1231273663"
17
+ #
18
+ # @example List folder members, with detail of permission to make owner.
19
+ # client.list_folder_members "1231273663", [:make_owner]
20
+ #
15
21
  # @param folder_id [String] The ID for the shared folder.
16
- # @option limit [Numeric] The maximum number of results that include
22
+ # @param actions [Array]
23
+ # This is an optional list of actions. The permissions for the actions
24
+ # requested will be included in the result.
25
+ # @option options
26
+ # limit [Numeric] The maximum number of results that include
17
27
  # members, groups and invitees to return per request. The default for
18
28
  # this field is 1000.
19
29
  # @return [SharedFolderMembers] Shared folder user and group membership.
20
- add_endpoint :list_folder_members do |folder_id, options = {}|
21
- # NOTE: This endpoint accepts an additional option `actions` which hasn't
22
- # been implemented.
30
+ # @see DropboxApi::Metadata::MemberActionCollection
31
+ add_endpoint :list_folder_members do |folder_id, actions = [], options = {}|
23
32
  validate_options([:limit], options)
24
33
  options[:limit] ||= 100
25
34
 
26
35
  perform_request options.merge({
27
- :shared_folder_id => folder_id
36
+ :shared_folder_id => folder_id,
37
+ :actions => DropboxApi::Metadata::MemberActionCollection.new(actions)
28
38
  })
29
39
  end
30
40
  end
@@ -0,0 +1,19 @@
1
+ module DropboxApi::Endpoints::Users
2
+ class GetAccountBatch < DropboxApi::Endpoints::Rpc
3
+ Method = :post
4
+ Path = "/2/users/get_account_batch".freeze
5
+ ResultType = DropboxApi::Results::BasicAccountBatch
6
+ ErrorType = DropboxApi::Errors::GetAccountError
7
+
8
+ # @method get_account_batch(account_ids)
9
+ # Get information about multiple user accounts. At most 300 accounts may
10
+ # be queried per request.
11
+ #
12
+ # @param account_ids [Array<String>] List of user account identifiers. Should not
13
+ # contain any duplicate account IDs.
14
+ # @return [Array<BasicAccount>] Basic information about any account.
15
+ add_endpoint :get_account_batch do |account_ids|
16
+ perform_request :account_ids => account_ids
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,16 @@
1
+ module DropboxApi::Endpoints::Users
2
+ class GetCurrentAccount < DropboxApi::Endpoints::Rpc
3
+ Method = :post
4
+ Path = "/2/users/get_current_account".freeze
5
+ ResultType = DropboxApi::Metadata::BasicAccount
6
+ ErrorType = nil
7
+
8
+ # @method get_current_account
9
+ # Get information about the current user's account.
10
+ #
11
+ # @return [BasicAccount] Detailed information about the current user's account.
12
+ add_endpoint :get_current_account do
13
+ perform_request nil
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module DropboxApi::Endpoints::Users
2
+ class GetSpaceUsage < DropboxApi::Endpoints::Rpc
3
+ Method = :post
4
+ Path = "/2/users/get_space_usage".freeze
5
+ ResultType = DropboxApi::Metadata::SpaceUsage
6
+ ErrorType = nil
7
+
8
+ # @method get_space_usage
9
+ # Get the space usage information for the current user's account.
10
+ #
11
+ # @return [SpaceUsage] Information about a user's space usage and quota.
12
+ add_endpoint :get_space_usage do
13
+ perform_request nil
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ module DropboxApi::Errors
2
+ class AddFileMemberError < BasicError
3
+ ErrorSubtypes = {
4
+ }.freeze
5
+ end
6
+ end
@@ -52,12 +52,15 @@ module DropboxApi::Errors
52
52
  class InvalidCursorError < BasicError; end
53
53
  class InvalidDropboxIdError < BasicError; end
54
54
  class InvalidEmailError < BasicError; end
55
+ class InvalidFileError < BasicError; end
55
56
  class InvalidIdError < BasicError; end
57
+ class InvalidMemberError < BasicError; end
56
58
  class InvalidPathError < BasicError; end
57
59
  class InvalidRevisionError < BasicError; end
58
60
  class InvalidSettingsError < BasicError; end
59
61
  class IsAppFolderError < BasicError; end
60
62
  class IsFileError < BasicError; end
63
+ class IsFolderError < BasicError; end
61
64
  class IsOsxPackageError < BasicError; end
62
65
  class IsPublicFolderError < BasicError; end
63
66
  class MalformedPathError < BasicError; end
@@ -0,0 +1,10 @@
1
+ module DropboxApi::Errors
2
+ class FileMemberActionError < BasicError
3
+ ErrorSubtypes = {
4
+ :invalid_member => InvalidMemberError,
5
+ :no_permission => NoPermissionError,
6
+ :access_error => SharingFileAccessError,
7
+ :no_explicit_access => DropboxApi::Metadata::ParentFolderAccessInfo
8
+ }.freeze
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ module DropboxApi::Errors
2
+ class SharingFileAccessError < BasicError
3
+ ErrorSubtypes = {
4
+ :no_permission => NoPermissionError,
5
+ :invalid_file => InvalidFileError,
6
+ :is_folder => IsFolderError,
7
+ :inside_public_folder => InsidePublicFolderError,
8
+ :inside_osx_package => InsideOsxPackageError
9
+ }.freeze
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ module DropboxApi::Errors
2
+ class TooManyRequestsError < BasicError; end
3
+ class TooManyWriteOperationsError < TooManyRequestsError; end
4
+
5
+ class TooManyRequestsError
6
+ attr_accessor :retry_after
7
+
8
+ def self.build(message, metadata)
9
+ subtype, metadata = find_subtype metadata
10
+
11
+ subtype.new(message, metadata)
12
+ end
13
+
14
+ ErrorSubtypes = {
15
+ :too_many_requests => TooManyRequestsError,
16
+ :too_many_write_operations => TooManyWriteOperationsError
17
+ }
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ module DropboxApi::Metadata
2
+ # Example of a serialized {AccessLevel} object:
3
+ # {
4
+ # ".tag": "viewer"
5
+ # }
6
+ class AccessLevel < Base
7
+ def self.new(data)
8
+ case data
9
+ when Symbol
10
+ data
11
+ when Hash
12
+ data[".tag"].to_sym
13
+ else
14
+ raise ArgumentError, "Invalid value for AccessLevel: #{data.inspect}."
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ module DropboxApi::Metadata
2
+ # Example of a {AddFileMemberResult}:
3
+ # {
4
+ # "member":{
5
+ # ".tag": "email",
6
+ # "email": "somebody@test.com"
7
+ # },
8
+ # "result": {
9
+ # ".tag": "success",
10
+ # "success": {
11
+ # ".tag": "viewer"
12
+ # }
13
+ # }
14
+ # }
15
+ class AddFileMemberResult < Base
16
+ field :member, DropboxApi::Metadata::Member
17
+ field :result, DropboxApi::Metadata::FileMemberAction
18
+ end
19
+ end
@@ -1,62 +1,34 @@
1
1
  module DropboxApi::Metadata
2
- # Examples of serialized `AddMember` objects:
3
- #
4
- # {
5
- # "member": {
6
- # ".tag": "email",
7
- # "email": "justin@example.com"
2
+ # Examples of serialized {AddMember} objects:
3
+ # {
4
+ # "member": {
5
+ # ".tag": "email",
6
+ # "email": "justin@example.com"
7
+ # },
8
+ # "access_level": {
9
+ # ".tag": "editor"
10
+ # }
8
11
  # },
9
- # "access_level": {
10
- # ".tag": "editor"
12
+ # {
13
+ # "member": {
14
+ # ".tag": "dropbox_id",
15
+ # "dropbox_id": "dbid:AAEufNrMPSPe0dMQijRP0N_aZtBJRm26W4Q"
16
+ # },
17
+ # "access_level": {
18
+ # ".tag": "viewer"
19
+ # }
11
20
  # }
12
- # },
13
- # {
14
- # "member": {
15
- # ".tag": "dropbox_id",
16
- # "dropbox_id": "dbid:AAEufNrMPSPe0dMQijRP0N_aZtBJRm26W4Q"
17
- # },
18
- # "access_level": {
19
- # ".tag": "viewer"
20
- # }
21
- # }
22
- class AddMember
23
- # Builds an AddMember object that can be used as an argument for
24
- # `add_folder_member`.
25
- #
26
- # @param member [String] Email address or Dropbox ID.
27
- # @param acl [:editor, :viewer] Access level, defaults to :editor.
28
- def initialize(member, acl = :editor)
29
- @member = member
30
- @acl = acl
31
- end
32
-
33
- def to_hash
34
- {
35
- :member => member_to_hash,
36
- :access_level => acl_to_hash
37
- }
38
- end
39
-
40
- private
41
-
42
- def member_to_hash
43
- if @member.start_with? "dbid:"
44
- {
45
- :".tag" => :dropbox_id,
46
- :dropbox_id => @member
47
- }
48
- else
49
- {
50
- :".tag" => :email,
51
- :email => @member
52
- }
21
+ class AddMember < Base
22
+ class << self
23
+ def build_from_string(member, access_level = :editor)
24
+ new({
25
+ "member" => Member.build_from_email_or_dropbox_id(member),
26
+ "access_level" => access_level
27
+ })
53
28
  end
54
29
  end
55
30
 
56
- def acl_to_hash
57
- {
58
- :".tag" => @acl
59
- }
60
- end
31
+ field :member, DropboxApi::Metadata::Member
32
+ field :access_level, DropboxApi::Metadata::AccessLevel
61
33
  end
62
34
  end
@@ -1,22 +1,65 @@
1
1
  module DropboxApi::Metadata
2
2
  class Base
3
- def self.field(name, type, *options)
4
- @fields ||= {}
5
- @fields[name] = DropboxApi::Metadata::Field.new(type, options)
3
+ class << self
4
+ attr_reader :fields
6
5
 
7
- attr_reader name
8
- end
6
+ def field(name, type, *options)
7
+ @fields ||= {}
8
+ @fields[name] = DropboxApi::Metadata::Field.new(type, options)
9
9
 
10
- def self.each_field
11
- @fields.each do |name, field|
12
- yield name, field
10
+ attr_reader name
13
11
  end
14
12
  end
15
13
 
14
+ # Takes in a hash containing all the attributes required to initialize the
15
+ # object.
16
+ #
17
+ # Each hash entry should have a key which identifies a field and its value,
18
+ # so a valid call would be something like this:
19
+ #
20
+ # DropboxApi::Metadata::File.new({
21
+ # "name" => "a.jpg",
22
+ # "path_lower" => "/a.jpg",
23
+ # "path_display" => "/a.jpg",
24
+ # "id" => "id:evvfE6q6cK0AAAAAAAAB2w",
25
+ # "client_modified" => "2016-10-19T17:17:34Z",
26
+ # "server_modified" => "2016-10-19T17:17:34Z",
27
+ # "rev" => "28924061bdd",
28
+ # "size" => 396317
29
+ # })
30
+ #
31
+ # @raise [ArgumentError] If a required attribute is missing.
32
+ # @param metadata [Hash]
16
33
  def initialize(metadata)
17
- self.class.each_field do |name, field|
18
- instance_variable_set "@#{name}", field.cast(metadata[name.to_s])
34
+ self.class.fields.keys.each do |field_name|
35
+ self[field_name] = metadata[field_name.to_s]
19
36
  end
20
37
  end
38
+
39
+ def to_hash
40
+ Hash[self.class.fields.keys.map do |field_name|
41
+ [field_name.to_s, serialized_field(field_name)]
42
+ end.select { |k, v| !v.nil? }]
43
+ end
44
+
45
+ def serialized_field(field_name)
46
+ value = send field_name
47
+ case value
48
+ when Time
49
+ value.utc.strftime("%FT%TZ")
50
+ when DropboxApi::Metadata
51
+ value.to_hash
52
+ else
53
+ value
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ def []=(name, value)
60
+ instance_variable_set "@#{name}", self.class.fields[name].cast(value)
61
+ rescue ArgumentError
62
+ raise ArgumentError, "Invalid value for `#{name}`: #{value.inspect}."
63
+ end
21
64
  end
22
65
  end
@@ -1,29 +1,28 @@
1
1
  module DropboxApi::Metadata
2
- # NOTE: We should have a test to cover the initialization of this object.
3
- # Sample:
4
- # {
5
- # "account_id": "dbid:AAH4f99T0taONIb-OurWxbNQ6ywGRopQngc",
6
- # "name": {
7
- # "given_name": "Franz",
8
- # "surname": "Ferdinand",
9
- # "familiar_name": "Franz",
10
- # "display_name": "Franz Ferdinand (Personal)"
11
- # },
12
- # "email": "franz@dropbox.com",
13
- # "email_verified": true,
14
- # "disabled": false,
15
- # "is_teammate": true,
16
- # "profile_photo_url": "https://dl-web.dropbox.com/account_photo/get/dbid%3AAAH4f99T0taONIb-OurWxbNQ6ywGRopQngc?vers=1453416696524&size=128x128",
17
- # "team_member_id": "dbmid:AAHhy7WsR0x-u4ZCqiDl5Fz5zvuL3kmspwU"
18
- # }
2
+ # Example of a serialized {BasicAccount} object:
3
+ # {
4
+ # "account_id": "dbid:AAH4f99T0taONIb-OurWxbNQ6ywGRopQngc",
5
+ # "name": {
6
+ # "given_name": "Franz",
7
+ # "surname": "Ferdinand",
8
+ # "familiar_name": "Franz",
9
+ # "display_name": "Franz Ferdinand (Personal)"
10
+ # },
11
+ # "email": "franz@dropbox.com",
12
+ # "email_verified": true,
13
+ # "disabled": false,
14
+ # "is_teammate": true,
15
+ # "profile_photo_url": "https://dl-web.dropbox.com/account_photo/get/dbid%3AAAH4f99T0taONIb-OurWxbNQ6ywGRopQngc?vers=1453416696524&size=128x128",
16
+ # "team_member_id": "dbmid:AAHhy7WsR0x-u4ZCqiDl5Fz5zvuL3kmspwU"
17
+ # }
19
18
  class BasicAccount < Base
20
19
  field :account_id, String
21
20
  field :name, DropboxApi::Metadata::Name
22
21
  field :email, String
23
22
  field :email_verified, :boolean
24
23
  field :disabled, :boolean
25
- field :is_teammate, :boolean
26
- field :profile_photo_url, String
27
- field :team_member_id, :boolean
24
+ field :is_teammate, :boolean, :optional
25
+ field :profile_photo_url, String, :optional
26
+ field :team_member_id, :boolean, :optional
28
27
  end
29
28
  end