dropbox_api 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE +21 -0
  7. data/README.md +118 -0
  8. data/Rakefile +6 -0
  9. data/TODO.md +8 -0
  10. data/api_coverage.md +107 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +7 -0
  13. data/dropbox_api.gemspec +30 -0
  14. data/lib/dropbox_api.rb +102 -0
  15. data/lib/dropbox_api/authenticator.rb +20 -0
  16. data/lib/dropbox_api/client.rb +13 -0
  17. data/lib/dropbox_api/connection_builder.rb +17 -0
  18. data/lib/dropbox_api/endpoints/base.rb +44 -0
  19. data/lib/dropbox_api/endpoints/content_download.rb +33 -0
  20. data/lib/dropbox_api/endpoints/content_upload.rb +25 -0
  21. data/lib/dropbox_api/endpoints/files/copy.rb +22 -0
  22. data/lib/dropbox_api/endpoints/files/create_folder.rb +19 -0
  23. data/lib/dropbox_api/endpoints/files/delete.rb +25 -0
  24. data/lib/dropbox_api/endpoints/files/download.rb +16 -0
  25. data/lib/dropbox_api/endpoints/files/get_metadata.rb +29 -0
  26. data/lib/dropbox_api/endpoints/files/get_preview.rb +18 -0
  27. data/lib/dropbox_api/endpoints/files/get_temporary_link.rb +18 -0
  28. data/lib/dropbox_api/endpoints/files/get_thumbnail.rb +34 -0
  29. data/lib/dropbox_api/endpoints/files/list_folder.rb +38 -0
  30. data/lib/dropbox_api/endpoints/files/list_folder_continue.rb +21 -0
  31. data/lib/dropbox_api/endpoints/files/list_folder_get_latest_cursor.rb +40 -0
  32. data/lib/dropbox_api/endpoints/files/list_folder_longpoll.rb +36 -0
  33. data/lib/dropbox_api/endpoints/files/list_revisions.rb +27 -0
  34. data/lib/dropbox_api/endpoints/files/move.rb +22 -0
  35. data/lib/dropbox_api/endpoints/files/restore.rb +20 -0
  36. data/lib/dropbox_api/endpoints/files/search.rb +44 -0
  37. data/lib/dropbox_api/endpoints/files/upload.rb +26 -0
  38. data/lib/dropbox_api/endpoints/options_validator.rb +11 -0
  39. data/lib/dropbox_api/endpoints/rpc.rb +18 -0
  40. data/lib/dropbox_api/endpoints/rpc_notify.rb +11 -0
  41. data/lib/dropbox_api/endpoints/sharing/add_folder_member.rb +54 -0
  42. data/lib/dropbox_api/endpoints/sharing/create_shared_link_with_settings.rb +23 -0
  43. data/lib/dropbox_api/endpoints/sharing/list_folder_members.rb +31 -0
  44. data/lib/dropbox_api/endpoints/sharing/list_shared_links.rb +31 -0
  45. data/lib/dropbox_api/endpoints/sharing/share_folder.rb +58 -0
  46. data/lib/dropbox_api/endpoints/users/get_account.rb +17 -0
  47. data/lib/dropbox_api/errors/add_folder_member_error.rb +16 -0
  48. data/lib/dropbox_api/errors/add_member_selector_error.rb +11 -0
  49. data/lib/dropbox_api/errors/already_shared_error.rb +7 -0
  50. data/lib/dropbox_api/errors/basic_error.rb +83 -0
  51. data/lib/dropbox_api/errors/create_folder_error.rb +7 -0
  52. data/lib/dropbox_api/errors/create_shared_link_with_settings_error.rb +11 -0
  53. data/lib/dropbox_api/errors/delete_error.rb +8 -0
  54. data/lib/dropbox_api/errors/download_error.rb +7 -0
  55. data/lib/dropbox_api/errors/get_account_error.rb +7 -0
  56. data/lib/dropbox_api/errors/get_metadata_error.rb +7 -0
  57. data/lib/dropbox_api/errors/http_error.rb +6 -0
  58. data/lib/dropbox_api/errors/list_folder_continue_error.rb +8 -0
  59. data/lib/dropbox_api/errors/list_folder_error.rb +7 -0
  60. data/lib/dropbox_api/errors/list_folder_longpoll_error.rb +7 -0
  61. data/lib/dropbox_api/errors/list_revisions_error.rb +7 -0
  62. data/lib/dropbox_api/errors/list_shared_links_error.rb +8 -0
  63. data/lib/dropbox_api/errors/lookup_error.rb +11 -0
  64. data/lib/dropbox_api/errors/preview_error.rb +10 -0
  65. data/lib/dropbox_api/errors/relocation_error.rb +13 -0
  66. data/lib/dropbox_api/errors/restore_error.rb +9 -0
  67. data/lib/dropbox_api/errors/search_error.rb +7 -0
  68. data/lib/dropbox_api/errors/settings_error.rb +8 -0
  69. data/lib/dropbox_api/errors/share_folder_error.rb +11 -0
  70. data/lib/dropbox_api/errors/share_path_error.rb +17 -0
  71. data/lib/dropbox_api/errors/shared_folder_access_error.rb +10 -0
  72. data/lib/dropbox_api/errors/upload_error.rb +7 -0
  73. data/lib/dropbox_api/errors/upload_write_failed_error.rb +7 -0
  74. data/lib/dropbox_api/errors/write_conflict_error.rb +9 -0
  75. data/lib/dropbox_api/errors/write_error.rb +11 -0
  76. data/lib/dropbox_api/metadata/add_member.rb +62 -0
  77. data/lib/dropbox_api/metadata/base.rb +22 -0
  78. data/lib/dropbox_api/metadata/basic_account.rb +29 -0
  79. data/lib/dropbox_api/metadata/deleted.rb +15 -0
  80. data/lib/dropbox_api/metadata/field.rb +34 -0
  81. data/lib/dropbox_api/metadata/file.rb +30 -0
  82. data/lib/dropbox_api/metadata/file_link.rb +46 -0
  83. data/lib/dropbox_api/metadata/folder.rb +17 -0
  84. data/lib/dropbox_api/metadata/folder_link.rb +12 -0
  85. data/lib/dropbox_api/metadata/folder_sharing_info.rb +13 -0
  86. data/lib/dropbox_api/metadata/link_permissions.rb +19 -0
  87. data/lib/dropbox_api/metadata/name.rb +16 -0
  88. data/lib/dropbox_api/metadata/resource.rb +31 -0
  89. data/lib/dropbox_api/metadata/shared_folder.rb +26 -0
  90. data/lib/dropbox_api/metadata/shared_folder_policy.rb +12 -0
  91. data/lib/dropbox_api/metadata/shared_link.rb +26 -0
  92. data/lib/dropbox_api/metadata/team.rb +6 -0
  93. data/lib/dropbox_api/metadata/team_member_info.rb +17 -0
  94. data/lib/dropbox_api/middleware/decode_result.rb +26 -0
  95. data/lib/dropbox_api/result_builder.rb +31 -0
  96. data/lib/dropbox_api/results/base.rb +7 -0
  97. data/lib/dropbox_api/results/get_temporary_link_result.rb +11 -0
  98. data/lib/dropbox_api/results/list_folder_get_latest_cursor_result.rb +7 -0
  99. data/lib/dropbox_api/results/list_folder_longpoll_result.rb +15 -0
  100. data/lib/dropbox_api/results/list_folder_result.rb +22 -0
  101. data/lib/dropbox_api/results/list_revisions_result.rb +14 -0
  102. data/lib/dropbox_api/results/list_shared_links_result.rb +22 -0
  103. data/lib/dropbox_api/results/search/match.rb +15 -0
  104. data/lib/dropbox_api/results/search_result.rb +22 -0
  105. data/lib/dropbox_api/results/share_folder_launch.rb +14 -0
  106. data/lib/dropbox_api/results/shared_folder_members.rb +19 -0
  107. data/lib/dropbox_api/results/void_result.rb +4 -0
  108. data/lib/dropbox_api/version.rb +3 -0
  109. 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,6 @@
1
+ module DropboxApi::Metadata
2
+ class Team < Base
3
+ field :id, String
4
+ field :name, String
5
+ end
6
+ 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