cloudfs 1.0.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/.yardopts +13 -0
- data/lib/cloudfs.rb +18 -0
- data/lib/cloudfs/account.rb +95 -0
- data/lib/cloudfs/client/connection.rb +154 -0
- data/lib/cloudfs/client/constants.rb +80 -0
- data/lib/cloudfs/client/error.rb +452 -0
- data/lib/cloudfs/client/utils.rb +93 -0
- data/lib/cloudfs/container.rb +51 -0
- data/lib/cloudfs/file.rb +209 -0
- data/lib/cloudfs/filesystem.rb +111 -0
- data/lib/cloudfs/filesystem_common.rb +228 -0
- data/lib/cloudfs/folder.rb +94 -0
- data/lib/cloudfs/item.rb +640 -0
- data/lib/cloudfs/media.rb +32 -0
- data/lib/cloudfs/rest_adapter.rb +1233 -0
- data/lib/cloudfs/session.rb +256 -0
- data/lib/cloudfs/share.rb +286 -0
- data/lib/cloudfs/user.rb +107 -0
- data/lib/cloudfs/version.rb +3 -0
- data/spec/account_spec.rb +93 -0
- data/spec/container_spec.rb +37 -0
- data/spec/file_spec.rb +134 -0
- data/spec/filesystem_spec.rb +16 -0
- data/spec/folder_spec.rb +106 -0
- data/spec/item_spec.rb +194 -0
- data/spec/session_spec.rb +102 -0
- data/spec/share_spec.rb +159 -0
- data/spec/user_spec.rb +70 -0
- metadata +124 -0
data/lib/cloudfs/user.rb
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
require_relative 'rest_adapter'
|
2
|
+
|
3
|
+
module CloudFS
|
4
|
+
# User class maintains user profile information
|
5
|
+
#
|
6
|
+
# @author Mrinal Dhillon
|
7
|
+
class User
|
8
|
+
|
9
|
+
# @!attribute [r] id
|
10
|
+
# @return [String] internal id of user
|
11
|
+
def id
|
12
|
+
@properties[:id]
|
13
|
+
end
|
14
|
+
|
15
|
+
# @!attribute [r] username
|
16
|
+
# @return [String] end-user's username
|
17
|
+
def username
|
18
|
+
@properties[:username]
|
19
|
+
end
|
20
|
+
|
21
|
+
# @!attribute [r] first_name
|
22
|
+
# @return [String] first name of user
|
23
|
+
def first_name
|
24
|
+
@properties[:first_name]
|
25
|
+
end
|
26
|
+
|
27
|
+
# @!attribute [r] last_name
|
28
|
+
# @return [String] last name of user
|
29
|
+
def last_name
|
30
|
+
@properties[:last_name]
|
31
|
+
end
|
32
|
+
|
33
|
+
# @!attribute [r] email
|
34
|
+
# @return [String] email id of user
|
35
|
+
def email
|
36
|
+
@properties[:email]
|
37
|
+
end
|
38
|
+
|
39
|
+
# @!attribute [r] created_at
|
40
|
+
# @return [Time] account creation time
|
41
|
+
def created_at
|
42
|
+
if @properties[:created_at]
|
43
|
+
Time.at(@properties[:created_at]/1000.0)
|
44
|
+
else
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# @!attribute [r] last_login
|
50
|
+
# @return [Time] last login time
|
51
|
+
def last_login
|
52
|
+
if @properties[:last_login]
|
53
|
+
Time.at(@properties[:last_login]/1000.0)
|
54
|
+
else
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# @param rest_adapter [RestAdapter] cloudfs RESTful api object
|
60
|
+
# @param [Hash] properties metadata of user
|
61
|
+
# @option properties [String] :username
|
62
|
+
# @option properties [Fixnum] :created_at in milliseconds since epoch
|
63
|
+
# @option properties [String] :first_name
|
64
|
+
# @option properties [String] :last_name
|
65
|
+
# @option properties [String] :email
|
66
|
+
# @option properties [Fixnum] :last_login in milliseconds since epoch
|
67
|
+
# @option properties [String] :id
|
68
|
+
def initialize(rest_adapter, ** properties)
|
69
|
+
fail RestAdapter::Errors::ArgumentError,
|
70
|
+
"invalid rest_adapter type #{rest_adapter.class}, expected CloudFS::Client" unless rest_adapter.is_a?(CloudFS::RestAdapter)
|
71
|
+
|
72
|
+
@rest_adapter = rest_adapter
|
73
|
+
set_user_info(** properties)
|
74
|
+
end
|
75
|
+
|
76
|
+
# @see #initialize
|
77
|
+
# @review required parameters
|
78
|
+
def set_user_info(** properties)
|
79
|
+
properties.fetch(:username) { fail RestAdapter::Errors::ArgumentError,
|
80
|
+
'Missing required username' }
|
81
|
+
properties.fetch(:id) { fail RestAdapter::Errors::ArgumentError,
|
82
|
+
'Missing required id' }
|
83
|
+
@properties = properties
|
84
|
+
end
|
85
|
+
|
86
|
+
# Refresh this user's metadata from server
|
87
|
+
# @return [User] returns self
|
88
|
+
def refresh
|
89
|
+
response = @rest_adapter.get_profile
|
90
|
+
set_user_info(** response)
|
91
|
+
self
|
92
|
+
end
|
93
|
+
|
94
|
+
# @return [String]
|
95
|
+
# @!visibility private
|
96
|
+
def to_s
|
97
|
+
str = "#{self.class}: username: #{@properties[:username]}"
|
98
|
+
str << ", first name: #{@properties[:first_name]}" unless RestAdapter::Utils.is_blank?(@properties[:first_name])
|
99
|
+
str << ", last name: #{@properties[:last_name]}" unless RestAdapter::Utils.is_blank?(@properties[:last_name])
|
100
|
+
str << ", email: #{@properties[:email]}" unless RestAdapter::Utils.is_blank?(@properties[:email])
|
101
|
+
str
|
102
|
+
end
|
103
|
+
|
104
|
+
alias inspect to_s
|
105
|
+
private :set_user_info
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe CloudFS::Account do
|
4
|
+
before do
|
5
|
+
session = CloudFS::Session.new(Configuration::HOST, Configuration::CLIENT_ID, Configuration::SECRET)
|
6
|
+
session.authenticate(Configuration::USERNAME, Configuration::PASSWORD)
|
7
|
+
@account_object = session.account
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'Get Account Id' do
|
11
|
+
it '#getid' do
|
12
|
+
@account_id = @account_object.id
|
13
|
+
@account_id.must_be_instance_of String
|
14
|
+
@account_id.length.must_equal 36
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'Get Storage Usage' do
|
19
|
+
it '#getstorageusage' do
|
20
|
+
@storage_usage = @account_object.storage_usage
|
21
|
+
@storage_usage.wont_be_nil
|
22
|
+
@storage_usage.must_be_instance_of Fixnum
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'Get storage limit' do
|
27
|
+
it '#getstoragelimit' do
|
28
|
+
@storage_limit = @account_object.storage_limit
|
29
|
+
@storage_limit.wont_be_nil
|
30
|
+
@storage_limit.must_be_instance_of Fixnum
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
describe 'Get over storage limit' do
|
36
|
+
it '#getoverstoragelimit' do
|
37
|
+
@over_storage_limit = @account_object.over_storage_limit
|
38
|
+
@over_storage_limit.wont_be_nil
|
39
|
+
@over_storage_limit.must_equal false
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'Get state id' do
|
44
|
+
it '#getstateid' do
|
45
|
+
@state_id = @account_object.state_id
|
46
|
+
@state_id.wont_be_nil
|
47
|
+
@state_id.must_be_instance_of String
|
48
|
+
@state_id.length.must_equal 5
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe 'Get state display name' do
|
53
|
+
it '#getstatedisplayname' do
|
54
|
+
@state_display_name = @account_object.state_display_name
|
55
|
+
@state_display_name.wont_be_nil
|
56
|
+
@state_display_name.must_be_instance_of String
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe 'Get plan display name' do
|
61
|
+
it '#getplandisplayname' do
|
62
|
+
@plan_display_name = @account_object.plan_display_name
|
63
|
+
@plan_display_name.wont_be_nil
|
64
|
+
@plan_display_name.must_be_instance_of String
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe 'Get plan id' do
|
69
|
+
it '#getplanid' do
|
70
|
+
@plan_id = @account_object.plan_id
|
71
|
+
@plan_id.wont_be_nil
|
72
|
+
@plan_id.must_be_instance_of String
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe 'Get session locale' do
|
77
|
+
it '#getsessionlocale' do
|
78
|
+
@session_locale = @account_object.session_locale
|
79
|
+
@session_locale.wont_be_nil
|
80
|
+
@session_locale.must_be_instance_of String
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe 'Get account locale' do
|
85
|
+
it '#getaccountlocale' do
|
86
|
+
@account_locale = @account_object.account_locale
|
87
|
+
@account_locale.wont_be_nil
|
88
|
+
@account_locale.must_be_instance_of String
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe CloudFS::Container do
|
4
|
+
before do
|
5
|
+
session = CloudFS::Session.new(Configuration::HOST, Configuration::CLIENT_ID, Configuration::SECRET)
|
6
|
+
session.authenticate(Configuration::USERNAME, Configuration::PASSWORD)
|
7
|
+
@subject = session.filesystem
|
8
|
+
@test_folder = @subject.root.create_folder(Configuration::TEST_FOLDER, exists: 'OVERWRITE')
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'Container Initialize' do
|
12
|
+
before do
|
13
|
+
@new_container = @test_folder.create_folder('container_test', exists: 'OVERWRITE')
|
14
|
+
end
|
15
|
+
it '#intialize' do
|
16
|
+
@new_container.type.must_equal 'folder'
|
17
|
+
@new_container.name.must_equal 'container_test'
|
18
|
+
end
|
19
|
+
after do
|
20
|
+
@new_container.delete
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'List Container' do
|
25
|
+
before do
|
26
|
+
@new_container = @test_folder.create_folder('container_test', exists: 'OVERWRITE')
|
27
|
+
end
|
28
|
+
it '#list' do
|
29
|
+
items = @test_folder.list
|
30
|
+
items.must_be_instance_of Array
|
31
|
+
end
|
32
|
+
after do
|
33
|
+
@new_container.delete
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/spec/file_spec.rb
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe CloudFS::File do
|
4
|
+
before do
|
5
|
+
session = CloudFS::Session.new(Configuration::HOST, Configuration::CLIENT_ID, Configuration::SECRET)
|
6
|
+
session.authenticate(Configuration::USERNAME, Configuration::PASSWORD)
|
7
|
+
@subject = session.filesystem
|
8
|
+
@test_folder = @subject.root.create_folder(Configuration::TEST_FOLDER, exists: 'OVERWRITE')
|
9
|
+
@file_folder =@test_folder.create_folder('file_test', exists: 'OVERWRITE')
|
10
|
+
@file = @file_folder.upload('file test', name: 'file_test.txt', exists: 'OVERWRITE', upload_io: true)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'Should have a file' do
|
14
|
+
@file.type.must_equal 'file'
|
15
|
+
@file.name.must_equal 'file_test.txt'
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'get mime' do
|
19
|
+
it '#mime' do
|
20
|
+
@filetype = @file.mime
|
21
|
+
@filetype.must_equal 'text/plain; charset=utf-8'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe 'get extension' do
|
26
|
+
it '#extension' do
|
27
|
+
@filetype = @file.extension
|
28
|
+
@filetype.must_equal 'txt'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'get size' do
|
33
|
+
it '#size' do
|
34
|
+
@filesize = @file.size
|
35
|
+
@filesize.must_equal 9
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe 'file read' do
|
40
|
+
it '#read' do
|
41
|
+
@read_full_data = @file.read
|
42
|
+
@file.rewind
|
43
|
+
@read_partial_data = @file.read(bytecount: 4)
|
44
|
+
@read_full_data.must_equal 'file test'
|
45
|
+
@read_partial_data.must_equal 'file'
|
46
|
+
end
|
47
|
+
after do
|
48
|
+
@file.rewind
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe 'file tell' do
|
53
|
+
it '#tell' do
|
54
|
+
@offset_before_read = @file.tell
|
55
|
+
@file.read
|
56
|
+
@offset_after_read = @file.tell
|
57
|
+
@offset_before_read.must_equal 0
|
58
|
+
@offset_after_read.must_equal 9
|
59
|
+
end
|
60
|
+
after do
|
61
|
+
@file.rewind
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe 'file rewind' do
|
66
|
+
it '#rewind' do
|
67
|
+
@offset_before_read = @file.tell
|
68
|
+
@file.read
|
69
|
+
@offset_after_read = @file.tell
|
70
|
+
@file.rewind
|
71
|
+
@offset_after_rewind = @file.tell
|
72
|
+
@offset_before_read.must_equal 0
|
73
|
+
@offset_after_read.must_equal 9
|
74
|
+
@offset_after_rewind.must_equal 0
|
75
|
+
end
|
76
|
+
after do
|
77
|
+
@file.rewind
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe 'file download' do
|
82
|
+
before do
|
83
|
+
logged_in_user = ENV['USER']
|
84
|
+
@file_path = '/home/' + logged_in_user + '/ruby-file-download'
|
85
|
+
|
86
|
+
@local_path_exist = File.directory?(@file_path)
|
87
|
+
|
88
|
+
if @local_path_exist == false
|
89
|
+
Dir.mkdir(@file_path)
|
90
|
+
end
|
91
|
+
|
92
|
+
@file_exist_before_download = File.exist?(@file_path + '/file_test.txt')
|
93
|
+
end
|
94
|
+
it '#download' do
|
95
|
+
file_size = 0
|
96
|
+
downloaded_size = 0
|
97
|
+
@file.download(@file_path) do |size, downloaded|
|
98
|
+
file_size = size
|
99
|
+
downloaded_size = downloaded
|
100
|
+
end
|
101
|
+
|
102
|
+
downloaded_size.must_equal file_size
|
103
|
+
@file_exist_after_download = File.exist?(@file_path + '/file_test.txt')
|
104
|
+
@file_exist_before_download.must_equal false
|
105
|
+
@file_exist_after_download.must_equal true
|
106
|
+
|
107
|
+
end
|
108
|
+
after do
|
109
|
+
if @file_exist_after_download == true
|
110
|
+
File.delete(@file_path + '/file_test.txt')
|
111
|
+
Dir.delete(@file_path)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe 'file download URL' do
|
117
|
+
it '#should return download url' do
|
118
|
+
url = @file.download_url
|
119
|
+
puts (url)
|
120
|
+
|
121
|
+
url.wont_be_nil
|
122
|
+
url.wont_be_empty
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
describe 'list file versions' do
|
127
|
+
it '#listfileversions' do
|
128
|
+
@file_versions = @file.versions
|
129
|
+
@file_versions.wont_be_nil
|
130
|
+
@file_versions.must_be_instance_of Array
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe CloudFS::FileSystem do
|
4
|
+
before do
|
5
|
+
session = CloudFS::Session.new(Configuration::HOST, Configuration::CLIENT_ID, Configuration::SECRET)
|
6
|
+
session.authenticate(Configuration::USERNAME, Configuration::PASSWORD)
|
7
|
+
@subject = session.filesystem
|
8
|
+
@test_folder = @subject.root.create_folder(Configuration::TEST_FOLDER, exists: 'OVERWRITE')
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'Should have a root' do
|
12
|
+
@subject.root.type.must_equal 'folder'
|
13
|
+
@subject.root.name.must_equal 'root'
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/spec/folder_spec.rb
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe CloudFS::Folder do
|
4
|
+
before do
|
5
|
+
session = CloudFS::Session.new(Configuration::HOST, Configuration::CLIENT_ID, Configuration::SECRET)
|
6
|
+
session.authenticate(Configuration::USERNAME, Configuration::PASSWORD)
|
7
|
+
@subject = session.filesystem
|
8
|
+
@test_folder = @subject.root.create_folder(Configuration::TEST_FOLDER, exists: 'OVERWRITE')
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'Creating a Folder' do
|
12
|
+
|
13
|
+
it '#create_folder' do
|
14
|
+
@create_folder = @test_folder.create_folder('folder_test')
|
15
|
+
@create_folder.type.must_equal 'folder'
|
16
|
+
|
17
|
+
@create_folder_rename = @test_folder.create_folder('folder_test', exists: 'RENAME')
|
18
|
+
@create_folder_rename.type.must_equal 'folder'
|
19
|
+
@create_folder_rename.name.must_equal 'folder_test (1)'
|
20
|
+
end
|
21
|
+
|
22
|
+
after do
|
23
|
+
@create_folder.delete
|
24
|
+
@create_folder_rename.delete
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe 'Uploading a File Via IO' do
|
29
|
+
|
30
|
+
before do
|
31
|
+
@create_folder = @test_folder.create_folder('folder_test')
|
32
|
+
end
|
33
|
+
|
34
|
+
it '#upload' do
|
35
|
+
@file = @create_folder.upload('file test', name:'file_test.txt', upload_io: true)
|
36
|
+
@file.type.must_equal 'file'
|
37
|
+
@file.name.must_equal 'file_test.txt'
|
38
|
+
end
|
39
|
+
|
40
|
+
after do
|
41
|
+
@create_folder.delete
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe 'Uploading Local File' do
|
46
|
+
|
47
|
+
before do
|
48
|
+
@create_folder = @test_folder.create_folder('folder_test')
|
49
|
+
logged_in_user = ENV['USER']
|
50
|
+
@directory_path = '/home/' + logged_in_user + '/file_upload'
|
51
|
+
@local_path_exist = File.directory?(@directory_path)
|
52
|
+
|
53
|
+
if @local_path_exist == false
|
54
|
+
Dir.mkdir(@directory_path)
|
55
|
+
end
|
56
|
+
|
57
|
+
@file_path = @directory_path + '/file_test.txt'
|
58
|
+
File.open(@file_path, 'w') {|f| f.write('test content') }
|
59
|
+
end
|
60
|
+
|
61
|
+
it '#upload' do
|
62
|
+
@file = @create_folder.upload(@file_path)
|
63
|
+
@file.type.must_equal 'file'
|
64
|
+
@file.name.must_equal 'file_test.txt'
|
65
|
+
end
|
66
|
+
|
67
|
+
after do
|
68
|
+
@create_folder.delete
|
69
|
+
File.delete(@file_path)
|
70
|
+
Dir.delete(@directory_path)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe 'Listing the folder content, traversing ' do
|
75
|
+
before do
|
76
|
+
@root_folder = @test_folder.create_folder('root_folder', exists: 'OVERWRITE')
|
77
|
+
@folder_child_01 = @root_folder.create_folder('folder_child_01', exists: 'OVERWRITE')
|
78
|
+
@folder_child_01.upload('folder child 01 content', name: 'folder_child_01.txt', upload_io: true)
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'Should show the child folders and files' do
|
82
|
+
root_folder_content = @root_folder.list
|
83
|
+
root_folder_content.length.must_equal 1
|
84
|
+
root_folder_content.first.name.must_equal 'folder_child_01'
|
85
|
+
|
86
|
+
child_folder_content = root_folder_content.first.list
|
87
|
+
child_folder_content.length.must_equal 1
|
88
|
+
child_folder_content.first.name.must_equal 'folder_child_01.txt'
|
89
|
+
|
90
|
+
@root_folder.delete(commit: false, force: true)
|
91
|
+
|
92
|
+
root_trash_folder = @root_folder.list
|
93
|
+
root_trash_folder.length.must_equal 1
|
94
|
+
root_trash_folder.first.name.must_equal 'folder_child_01'
|
95
|
+
|
96
|
+
first_trash_child = root_trash_folder.first.list
|
97
|
+
first_trash_child.length.must_equal 1
|
98
|
+
first_trash_child.first.name.must_equal 'folder_child_01.txt'
|
99
|
+
end
|
100
|
+
|
101
|
+
after do
|
102
|
+
@root_folder.delete(commit: true, force: true)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|