Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lib/dropbox.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
require_relative 'dropbox/account'
require_relative 'dropbox/metadata'
require_relative 'dropbox/upload_session_cursor'
require_relative 'dropbox/team'
require_relative 'dropbox/link_permissions'

# A small library for accessing the new Dropbox API. All of the Dropbox API
# endpoints are implemented as methods on {Dropbox::Client}.
Expand Down
18 changes: 18 additions & 0 deletions lib/dropbox/client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,24 @@ def get_space_usage
SpaceUsage.new(resp)
end

# Create a shared link with custom settings.
#
# @param [String] path
# @return [Dropbox::FileLinkMetadata, Dropbox::FolderLinkMetadata] entry
def create_shared_link_with_settings(path)
resp = request('/sharing/create_shared_link_with_settings', path: path)
case resp['.tag']
when 'file'
FileLinkMetadata.new(resp)
when 'folder'
FolderLinkMetadata.new(resp)
when 'failed'
resp['failed']['.tag']
else
raise ClientError.unknown_response_type(resp['.tag'])
end
end

private
def parse_tagged_response(resp)
case resp['.tag']
Expand Down
34 changes: 34 additions & 0 deletions lib/dropbox/link_permissions.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
module Dropbox
class Visibility
attr_reader :tag

def initialize(attrs={})
@tag = attrs['.tag']
end
end

class SharedLinkAccessFailureReason
attr_reader :tag

def initialize(attrs={})
@tag = attrs['.tag']
end
end

class LinkPermissions
attr_reader :can_revoke, :resolved_visibility, :requested_visibility, :revoke_failure_reason

def initialize(attrs={})
@can_revoke = attrs['can_revoke']
if visibility = attrs.delete('resolved_visibility')
@resolved_visibility = visibility
end
if visibility = attrs.delete('requested_visibility')
@requested_visibility = visibility
end
if reason = attrs.delete('revoke_failure_reason')
@revoke_failure_reason = reason
end
end
end
end
34 changes: 34 additions & 0 deletions lib/dropbox/metadata.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,38 @@ def ==(cmp)
# Contains the metadata of a deleted file.
class DeletedMetadata < Metadata
end

# Contains the metadata of a sharing content.
module SharingMetadata
def self.included(base)
base.class_eval do
attr_reader :url, :link_permissions, :expires, :team_member_info, :content_owner_team_info
end
end

def initialize(attrs={})
super(attrs)
@url = attrs['url']
@link_permissions = LinkPermissions.new(attrs['link_permissions'])
if expires = attrs.delete('expires')
@expires= Time.parse(expires)
end
if team_member_info = attrs.delete('team_member_info')
@team_member_info = TeamMemberInfo.new(team_member_info)
end
if content_owner_team_info = attrs.delete('content_owner_team_info')
@content_owner_team_info = TeamMemberInfo.new(content_owner_team_info)
end
end
end

# Contains the metadata of a shared file.
class FileLinkMetadata < FileMetadata
include SharingMetadata
end

# Contains the metadata of a shared folder.
class FolderLinkMetadata < FolderMetadata
include SharingMetadata
end
end
20 changes: 20 additions & 0 deletions lib/dropbox/team.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
module Dropbox
class Team
attr_reader :id, :name

def initialize(attrs={})
@id = attrs['id']
@name = attrs['name']
end
end

class TeamMemberInfo
attr_reader :team_info, :display_name, :memeber_id

def initialize(attrs={})
@team_info = Team.new(attrs['team_info'])
@display_name = attrs['display_name']
@member_id = attrs['member_id']
end
end
end
31 changes: 31 additions & 0 deletions test/stubs/create_shared_file_link_with_settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
HTTP/1.1 200 OK
Content-Type: application/json

{
".tag": "file",
"url": "https://www.dropbox.com/s/2sn712vy1ovegw8/Prime_Numbers.txt?dl=0",
"name": "Prime_Numbers.txt",
"link_permissions": {
"can_revoke": false,
"resolved_visibility": {
".tag": "public"
},
"revoke_failure_reason": {
".tag": "owner_only"
}
},
"client_modified": "2015-05-12T15:50:38Z",
"server_modified": "2015-05-12T15:50:38Z",
"rev": "a1c10ce0dd78",
"size": 7212,
"id": "id:a4ayc_80_OEAAAAAAAAAXw",
"path_lower": "/homework/math/prime_numbers.txt",
"team_member_info": {
"team_info": {
"id": "dbtid:AAFdgehTzw7WlXhZJsbGCLePe8RvQGYDr-I",
"name": "Acme, Inc."
},
"display_name": "Roger Rabbit",
"member_id": "dbmid:abcd1234"
}
}
27 changes: 27 additions & 0 deletions test/stubs/create_shared_folder_link_with_settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
HTTP/1.1 200 OK
Content-Type: application/json

{
".tag": "folder",
"url": "https://www.dropbox.com/sh/s6fvw6ol7rmqo1x/AAAgWRSbjmYDvPpDB30Sykjfa?dl=0",
"name": "Math",
"link_permissions": {
"can_revoke": false,
"resolved_visibility": {
".tag": "public"
},
"revoke_failure_reason": {
".tag": "owner_only"
}
},
"id": "id:a4ayc_80_OEAAAAAAAAAXw",
"path_lower": "/homework/math",
"team_member_info": {
"team_info": {
"id": "dbtid:AAFdgehTzw7WlXhZJsbGCLePe8RvQGYDr-I",
"name": "Acme, Inc."
},
"display_name": "Roger Rabbit",
"member_id": "dbmid:abcd1234"
}
}
35 changes: 35 additions & 0 deletions test/test_sharing.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
require 'test_helper'

class DropboxSharingTest < Minitest::Test
def setup
@client = Dropbox::Client.new('super-fake-access-token-1234567890000000000000000000000000000000')
end

def test_create_shared_link_with_setting_for_file
stub_request(:post, url('sharing/create_shared_link_with_settings')).to_return(stub('create_shared_file_link_with_settings'))
file = @client.create_shared_link_with_settings('/Homework/Prime_Numbers.txt')

assert file.is_a?(Dropbox::FileLinkMetadata)
assert_equal 'https://www.dropbox.com/s/2sn712vy1ovegw8/Prime_Numbers.txt?dl=0', file.url
assert_match /^id:[a-z0-9_-]+$/i, file.id
assert_equal 'Prime_Numbers.txt', file.name
assert file.server_modified.is_a?(Time)
assert_match /^[a-z0-9_-]+$/i, file.rev
assert_equal 7212, file.size
assert file.link_permissions.is_a?(Dropbox::LinkPermissions)
assert file.team_member_info.is_a?(Dropbox::TeamMemberInfo)
end

def test_create_shared_link_with_setting_for_folder
stub_request(:post, url('sharing/create_shared_link_with_settings')).to_return(stub('create_shared_folder_link_with_settings'))
folder = @client.create_shared_link_with_settings('/Homework/math')

assert folder.is_a?(Dropbox::FolderLinkMetadata)
assert_equal 'https://www.dropbox.com/sh/s6fvw6ol7rmqo1x/AAAgWRSbjmYDvPpDB30Sykjfa?dl=0', folder.url
assert_match /^id:[a-z0-9_-]+$/i, folder.id
assert_equal 'Math', folder.name
assert folder.link_permissions.is_a?(Dropbox::LinkPermissions)
assert folder.team_member_info.is_a?(Dropbox::TeamMemberInfo)
end
end