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.
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