dropbox_api 0.1.0
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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +3 -0
- data/.travis.yml +5 -0
- data/Gemfile +3 -0
- data/LICENSE +21 -0
- data/README.md +118 -0
- data/Rakefile +6 -0
- data/TODO.md +8 -0
- data/api_coverage.md +107 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/dropbox_api.gemspec +30 -0
- data/lib/dropbox_api.rb +102 -0
- data/lib/dropbox_api/authenticator.rb +20 -0
- data/lib/dropbox_api/client.rb +13 -0
- data/lib/dropbox_api/connection_builder.rb +17 -0
- data/lib/dropbox_api/endpoints/base.rb +44 -0
- data/lib/dropbox_api/endpoints/content_download.rb +33 -0
- data/lib/dropbox_api/endpoints/content_upload.rb +25 -0
- data/lib/dropbox_api/endpoints/files/copy.rb +22 -0
- data/lib/dropbox_api/endpoints/files/create_folder.rb +19 -0
- data/lib/dropbox_api/endpoints/files/delete.rb +25 -0
- data/lib/dropbox_api/endpoints/files/download.rb +16 -0
- data/lib/dropbox_api/endpoints/files/get_metadata.rb +29 -0
- data/lib/dropbox_api/endpoints/files/get_preview.rb +18 -0
- data/lib/dropbox_api/endpoints/files/get_temporary_link.rb +18 -0
- data/lib/dropbox_api/endpoints/files/get_thumbnail.rb +34 -0
- data/lib/dropbox_api/endpoints/files/list_folder.rb +38 -0
- data/lib/dropbox_api/endpoints/files/list_folder_continue.rb +21 -0
- data/lib/dropbox_api/endpoints/files/list_folder_get_latest_cursor.rb +40 -0
- data/lib/dropbox_api/endpoints/files/list_folder_longpoll.rb +36 -0
- data/lib/dropbox_api/endpoints/files/list_revisions.rb +27 -0
- data/lib/dropbox_api/endpoints/files/move.rb +22 -0
- data/lib/dropbox_api/endpoints/files/restore.rb +20 -0
- data/lib/dropbox_api/endpoints/files/search.rb +44 -0
- data/lib/dropbox_api/endpoints/files/upload.rb +26 -0
- data/lib/dropbox_api/endpoints/options_validator.rb +11 -0
- data/lib/dropbox_api/endpoints/rpc.rb +18 -0
- data/lib/dropbox_api/endpoints/rpc_notify.rb +11 -0
- data/lib/dropbox_api/endpoints/sharing/add_folder_member.rb +54 -0
- data/lib/dropbox_api/endpoints/sharing/create_shared_link_with_settings.rb +23 -0
- data/lib/dropbox_api/endpoints/sharing/list_folder_members.rb +31 -0
- data/lib/dropbox_api/endpoints/sharing/list_shared_links.rb +31 -0
- data/lib/dropbox_api/endpoints/sharing/share_folder.rb +58 -0
- data/lib/dropbox_api/endpoints/users/get_account.rb +17 -0
- data/lib/dropbox_api/errors/add_folder_member_error.rb +16 -0
- data/lib/dropbox_api/errors/add_member_selector_error.rb +11 -0
- data/lib/dropbox_api/errors/already_shared_error.rb +7 -0
- data/lib/dropbox_api/errors/basic_error.rb +83 -0
- data/lib/dropbox_api/errors/create_folder_error.rb +7 -0
- data/lib/dropbox_api/errors/create_shared_link_with_settings_error.rb +11 -0
- data/lib/dropbox_api/errors/delete_error.rb +8 -0
- data/lib/dropbox_api/errors/download_error.rb +7 -0
- data/lib/dropbox_api/errors/get_account_error.rb +7 -0
- data/lib/dropbox_api/errors/get_metadata_error.rb +7 -0
- data/lib/dropbox_api/errors/http_error.rb +6 -0
- data/lib/dropbox_api/errors/list_folder_continue_error.rb +8 -0
- data/lib/dropbox_api/errors/list_folder_error.rb +7 -0
- data/lib/dropbox_api/errors/list_folder_longpoll_error.rb +7 -0
- data/lib/dropbox_api/errors/list_revisions_error.rb +7 -0
- data/lib/dropbox_api/errors/list_shared_links_error.rb +8 -0
- data/lib/dropbox_api/errors/lookup_error.rb +11 -0
- data/lib/dropbox_api/errors/preview_error.rb +10 -0
- data/lib/dropbox_api/errors/relocation_error.rb +13 -0
- data/lib/dropbox_api/errors/restore_error.rb +9 -0
- data/lib/dropbox_api/errors/search_error.rb +7 -0
- data/lib/dropbox_api/errors/settings_error.rb +8 -0
- data/lib/dropbox_api/errors/share_folder_error.rb +11 -0
- data/lib/dropbox_api/errors/share_path_error.rb +17 -0
- data/lib/dropbox_api/errors/shared_folder_access_error.rb +10 -0
- data/lib/dropbox_api/errors/upload_error.rb +7 -0
- data/lib/dropbox_api/errors/upload_write_failed_error.rb +7 -0
- data/lib/dropbox_api/errors/write_conflict_error.rb +9 -0
- data/lib/dropbox_api/errors/write_error.rb +11 -0
- data/lib/dropbox_api/metadata/add_member.rb +62 -0
- data/lib/dropbox_api/metadata/base.rb +22 -0
- data/lib/dropbox_api/metadata/basic_account.rb +29 -0
- data/lib/dropbox_api/metadata/deleted.rb +15 -0
- data/lib/dropbox_api/metadata/field.rb +34 -0
- data/lib/dropbox_api/metadata/file.rb +30 -0
- data/lib/dropbox_api/metadata/file_link.rb +46 -0
- data/lib/dropbox_api/metadata/folder.rb +17 -0
- data/lib/dropbox_api/metadata/folder_link.rb +12 -0
- data/lib/dropbox_api/metadata/folder_sharing_info.rb +13 -0
- data/lib/dropbox_api/metadata/link_permissions.rb +19 -0
- data/lib/dropbox_api/metadata/name.rb +16 -0
- data/lib/dropbox_api/metadata/resource.rb +31 -0
- data/lib/dropbox_api/metadata/shared_folder.rb +26 -0
- data/lib/dropbox_api/metadata/shared_folder_policy.rb +12 -0
- data/lib/dropbox_api/metadata/shared_link.rb +26 -0
- data/lib/dropbox_api/metadata/team.rb +6 -0
- data/lib/dropbox_api/metadata/team_member_info.rb +17 -0
- data/lib/dropbox_api/middleware/decode_result.rb +26 -0
- data/lib/dropbox_api/result_builder.rb +31 -0
- data/lib/dropbox_api/results/base.rb +7 -0
- data/lib/dropbox_api/results/get_temporary_link_result.rb +11 -0
- data/lib/dropbox_api/results/list_folder_get_latest_cursor_result.rb +7 -0
- data/lib/dropbox_api/results/list_folder_longpoll_result.rb +15 -0
- data/lib/dropbox_api/results/list_folder_result.rb +22 -0
- data/lib/dropbox_api/results/list_revisions_result.rb +14 -0
- data/lib/dropbox_api/results/list_shared_links_result.rb +22 -0
- data/lib/dropbox_api/results/search/match.rb +15 -0
- data/lib/dropbox_api/results/search_result.rb +22 -0
- data/lib/dropbox_api/results/share_folder_launch.rb +14 -0
- data/lib/dropbox_api/results/shared_folder_members.rb +19 -0
- data/lib/dropbox_api/results/void_result.rb +4 -0
- data/lib/dropbox_api/version.rb +3 -0
- metadata +256 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module DropboxApi::Metadata
|
|
2
|
+
class Base
|
|
3
|
+
def self.field(name, type, *options)
|
|
4
|
+
@fields ||= {}
|
|
5
|
+
@fields[name] = DropboxApi::Metadata::Field.new(type, options)
|
|
6
|
+
|
|
7
|
+
attr_reader name
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.each_field
|
|
11
|
+
@fields.each do |name, field|
|
|
12
|
+
yield name, field
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def initialize(metadata)
|
|
17
|
+
self.class.each_field do |name, field|
|
|
18
|
+
instance_variable_set "@#{name}", field.cast(metadata[name.to_s])
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
# }
|
|
19
|
+
class BasicAccount < Base
|
|
20
|
+
field :account_id, String
|
|
21
|
+
field :name, DropboxApi::Metadata::Name
|
|
22
|
+
field :email, String
|
|
23
|
+
field :email_verified, :boolean
|
|
24
|
+
field :disabled, :boolean
|
|
25
|
+
field :is_teammate, :boolean
|
|
26
|
+
field :profile_photo_url, String
|
|
27
|
+
field :team_member_id, :boolean
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
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
|
+
# }
|
|
10
|
+
class Deleted < Base
|
|
11
|
+
field :name, String
|
|
12
|
+
field :path_lower, String
|
|
13
|
+
field :path_display, String
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module DropboxApi::Metadata
|
|
2
|
+
class Field
|
|
3
|
+
def initialize(type, options = [])
|
|
4
|
+
@type = type
|
|
5
|
+
@options = options
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def cast(object)
|
|
9
|
+
if object.nil? && @options.include?(:optional)
|
|
10
|
+
nil
|
|
11
|
+
else
|
|
12
|
+
force_cast object
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def force_cast(object)
|
|
17
|
+
if @type == String
|
|
18
|
+
object.to_s
|
|
19
|
+
elsif @type == Time
|
|
20
|
+
Time.new(object)
|
|
21
|
+
elsif @type == Integer
|
|
22
|
+
object.to_i
|
|
23
|
+
elsif @type == Symbol
|
|
24
|
+
object[".tag"].to_sym
|
|
25
|
+
elsif @type == :boolean
|
|
26
|
+
object.to_s == "true"
|
|
27
|
+
elsif @type.ancestors.include? DropboxApi::Metadata::Base
|
|
28
|
+
@type.new(object)
|
|
29
|
+
else
|
|
30
|
+
raise NotImplementedError, "Can't cast `#{type}`"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
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"
|
|
18
|
+
# }
|
|
19
|
+
# }
|
|
20
|
+
class File < Base
|
|
21
|
+
field :name, String
|
|
22
|
+
field :path_lower, String
|
|
23
|
+
field :path_display, String
|
|
24
|
+
field :id, String
|
|
25
|
+
field :client_modified, Time
|
|
26
|
+
field :server_modified, Time
|
|
27
|
+
field :rev, String
|
|
28
|
+
field :size, Integer
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
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"
|
|
12
|
+
# },
|
|
13
|
+
# "revoke_failure_reason": {
|
|
14
|
+
# ".tag": "owner_only"
|
|
15
|
+
# }
|
|
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
|
+
# }
|
|
31
|
+
# }
|
|
32
|
+
class FileLink < Base
|
|
33
|
+
field :url, String
|
|
34
|
+
field :name, String
|
|
35
|
+
field :link_permissions, DropboxApi::Metadata::LinkPermissions
|
|
36
|
+
field :client_modified, Time
|
|
37
|
+
field :server_modified, Time
|
|
38
|
+
field :rev, String
|
|
39
|
+
field :size, Integer
|
|
40
|
+
field :id, String, :optional
|
|
41
|
+
field :expires, Time, :optional
|
|
42
|
+
field :path_lower, String, :optional
|
|
43
|
+
field :team_member_info, DropboxApi::Metadata::TeamMemberInfo, :optional
|
|
44
|
+
field :content_owner_team_info, DropboxApi::Metadata::Team, :optional
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
# }
|
|
10
|
+
class Folder < Base
|
|
11
|
+
field :name, String
|
|
12
|
+
field :path_lower, String
|
|
13
|
+
field :path_display, String
|
|
14
|
+
field :id, String
|
|
15
|
+
field :sharing_info, DropboxApi::Metadata::FolderSharingInfo, :optional
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module DropboxApi::Metadata
|
|
2
|
+
class FolderLink < Base
|
|
3
|
+
field :url, String
|
|
4
|
+
field :name, String
|
|
5
|
+
field :link_permissions, DropboxApi::Metadata::LinkPermissions
|
|
6
|
+
field :id, String, :optional
|
|
7
|
+
field :expires, Time, :optional
|
|
8
|
+
field :path_lower, String, :optional
|
|
9
|
+
field :team_member_info, DropboxApi::Metadata::TeamMemberInfo, :optional
|
|
10
|
+
field :content_owner_team_info, DropboxApi::Metadata::Team, :optional
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
+
# }
|
|
8
|
+
class FolderSharingInfo < Base
|
|
9
|
+
field :read_only, :boolean
|
|
10
|
+
field :parent_shared_folder_id, String, :optional
|
|
11
|
+
field :shared_folder_id, String, :optional
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
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"
|
|
11
|
+
# }
|
|
12
|
+
# }
|
|
13
|
+
class LinkPermissions < Base
|
|
14
|
+
field :can_revoke, :boolean
|
|
15
|
+
field :resolved_visibility, Symbol, :optional
|
|
16
|
+
field :requested_visibility, Symbol, :optional
|
|
17
|
+
field :revoke_failure_reason, Symbol, :optional
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
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
|
+
# },
|
|
10
|
+
class Name < Base
|
|
11
|
+
field :given_name, String
|
|
12
|
+
field :surname, String
|
|
13
|
+
field :familiar_name, String
|
|
14
|
+
field :display_name, String
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module DropboxApi::Metadata
|
|
2
|
+
# This class is used as an adapter so we can create an object of the pertinent
|
|
3
|
+
# class when we need to infer the type from the data.
|
|
4
|
+
#
|
|
5
|
+
# For example, calling Resource.new({".tag" => "file", :name => ...}) will
|
|
6
|
+
# instantiate a `File` object.
|
|
7
|
+
#
|
|
8
|
+
# So this could initalize an object of either `File`, `Folder` or `Deleted`.
|
|
9
|
+
class Resource
|
|
10
|
+
class << self
|
|
11
|
+
def new(data)
|
|
12
|
+
class_for(data[".tag"].to_sym).new(data)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def class_for(tag)
|
|
18
|
+
case tag
|
|
19
|
+
when :file
|
|
20
|
+
DropboxApi::Metadata::File
|
|
21
|
+
when :folder
|
|
22
|
+
DropboxApi::Metadata::Folder
|
|
23
|
+
when :deleted
|
|
24
|
+
DropboxApi::Metadata::Deleted
|
|
25
|
+
else
|
|
26
|
+
raise ArgumentError, "Unable to infer resource type for `#{tag}`"
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
# }
|
|
17
|
+
class SharedFolder < Base
|
|
18
|
+
field :access_type, String
|
|
19
|
+
field :is_team_folder, :boolean
|
|
20
|
+
field :policy, DropboxApi::Metadata::SharedFolderPolicy
|
|
21
|
+
field :path_lower, String
|
|
22
|
+
field :name, String
|
|
23
|
+
field :shared_folder_id, Integer
|
|
24
|
+
field :time_invited, Time
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
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
|
+
# }
|
|
8
|
+
class SharedFolderPolicy < Base
|
|
9
|
+
field :acl_update_policy, Symbol
|
|
10
|
+
field :shared_link_policy, Symbol
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module DropboxApi::Metadata
|
|
2
|
+
# This class is used as an adapter so we can create an object of the pertinent
|
|
3
|
+
# class when we need to infer the type from the data.
|
|
4
|
+
#
|
|
5
|
+
# This same pattern is used in `DropboxApi::Metadata::Resource`
|
|
6
|
+
class SharedLink
|
|
7
|
+
class << self
|
|
8
|
+
def new(data)
|
|
9
|
+
class_for(data[".tag"].to_sym).new(data)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
def class_for(tag)
|
|
15
|
+
case tag
|
|
16
|
+
when :file
|
|
17
|
+
DropboxApi::Metadata::FileLink
|
|
18
|
+
when :folder
|
|
19
|
+
DropboxApi::Metadata::FolderLink
|
|
20
|
+
else
|
|
21
|
+
raise ArgumentError, "Unable to infer resource type for `#{tag}`"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module DropboxApi::Metadata
|
|
2
|
+
# NOTE: We should have a test to cover the initialization of this object.
|
|
3
|
+
# Sample:
|
|
4
|
+
# {
|
|
5
|
+
# "team_info": {
|
|
6
|
+
# "id": "dbtid:AAFdgehTzw7WlXhZJsbGCLePe8RvQGYDr-I",
|
|
7
|
+
# "name": "Acme, Inc."
|
|
8
|
+
# },
|
|
9
|
+
# "display_name": "Roger Rabbit",
|
|
10
|
+
# "member_id": "dbmid:abcd1234"
|
|
11
|
+
# }
|
|
12
|
+
class TeamMemberInfo < Base
|
|
13
|
+
field :team_info, DropboxApi::Metadata::Team
|
|
14
|
+
field :display_name, String
|
|
15
|
+
field :member_id, String, :optional
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module DropboxApi::MiddleWare
|
|
2
|
+
class DecodeResult < Faraday::Middleware
|
|
3
|
+
def call(rq_env)
|
|
4
|
+
@app.call(rq_env).on_complete do |rs_env|
|
|
5
|
+
if !rs_env[:response_headers]['Dropbox-Api-Result'].nil?
|
|
6
|
+
rs_env[:api_result] = decode rs_env[:response_headers]['Dropbox-Api-Result']
|
|
7
|
+
elsif rs_env[:response_headers]['content-type'] == 'application/json'
|
|
8
|
+
rs_env[:api_result] = decode rs_env[:body]
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def decode(json)
|
|
14
|
+
# Dropbox may send a response with the string 'null' in its body, this
|
|
15
|
+
# would be a void result. `add_folder_member` is an example of an
|
|
16
|
+
# endpoint without return values.
|
|
17
|
+
if json == "null"
|
|
18
|
+
{}
|
|
19
|
+
else
|
|
20
|
+
JSON.parse json
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
Faraday::Response.register_middleware :decode_result => DecodeResult
|
|
26
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module DropboxApi
|
|
2
|
+
class ResultBuilder
|
|
3
|
+
def initialize(response_data)
|
|
4
|
+
@response_data = response_data
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def error_summary
|
|
8
|
+
@response_data["error_summary"]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def error
|
|
12
|
+
@response_data["error"]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def has_error?
|
|
16
|
+
!error_summary.nil?
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def success?
|
|
20
|
+
!has_error?
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def build(result_class)
|
|
24
|
+
result_class.new(@response_data)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def build_error(error_type)
|
|
28
|
+
error_type.build(error_summary, error)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|