cloud_door 0.0.1 → 0.0.2

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.
@@ -0,0 +1,137 @@
1
+ require 'google/api_client'
2
+ require 'yaml'
3
+ require 'mimetype_fu'
4
+ require 'cloud_door/cloud_storage'
5
+
6
+ module CloudDoor
7
+ class GoogleDriveBridge
8
+ def initialize(credentials)
9
+ client = Google::APIClient.new(application_name: 'cloud_door')
10
+ client.authorization = credentials
11
+ drive = client.discovered_api('drive', 'v2')
12
+ @gclient = client
13
+ @gdrive = drive
14
+ end
15
+
16
+ def request_user
17
+ result = send_request('@gdrive.about.get')
18
+ result.data.user
19
+ end
20
+
21
+ def request_root_id
22
+ result = send_request('@gdrive.about.get')
23
+ result.data.root_folder_id
24
+ end
25
+
26
+ def request_dir(file_id)
27
+ dir_files = Array.new
28
+ page_token = nil
29
+ begin
30
+ parameters = {}
31
+ parameters['q'] = "'#{file_id}' in parents"
32
+ if page_token.to_s != ''
33
+ parameters['pageToken'] = page_token
34
+ end
35
+ api_result = send_request('@gdrive.files.list', parameters: parameters)
36
+ files = api_result.data
37
+ dir_files.concat(files.items)
38
+ page_token = files.next_page_token
39
+ end while page_token.to_s != ''
40
+ dir_files
41
+ end
42
+
43
+ def request_file(file_id)
44
+ result = send_request('@gdrive.files.get', {parameters: {'fileId' => file_id}})
45
+ result.data.to_hash
46
+ end
47
+
48
+ def request_download(file_id)
49
+ result = @gclient.execute(
50
+ api_method: @gdrive.files.get,
51
+ parameters: {'fileId' => file_id}
52
+ )
53
+ file = result.data
54
+ if file.download_url
55
+ result = @gclient.execute(:uri => file.download_url)
56
+ if result.status == 200
57
+ result.body
58
+ elsif result.status == 401
59
+ raise UnauthorizedException
60
+ else
61
+ raise HttpConnectionException
62
+ end
63
+ end
64
+ end
65
+
66
+ def request_upload(file_path, parent_id)
67
+ mime = File.mime_type?(File.open(file_path))
68
+ mime_type = mime[0, mime.index(';')]
69
+ file = @gdrive.files.insert.request_schema.new({
70
+ 'title' => file_path
71
+ })
72
+ if parent_id
73
+ file.parents = [{'id' => parent_id}]
74
+ end
75
+ media = Google::APIClient::UploadIO.new(file_path, mime_type)
76
+ result = @gclient.execute(
77
+ :api_method => @gdrive.files.insert,
78
+ :body_object => file,
79
+ :media => media,
80
+ :parameters => {
81
+ 'uploadType' => 'multipart',
82
+ 'alt' => 'json'
83
+ }
84
+ )
85
+ if result.status == 200
86
+ result
87
+ elsif result.status == 401
88
+ raise UnauthorizedException
89
+ else
90
+ raise HttpConnectionException
91
+ end
92
+ end
93
+
94
+ def request_delete(file_id)
95
+ send_request('@gdrive.files.delete', {parameters: {'fileId' => file_id}})
96
+ true
97
+ rescue => e
98
+ false
99
+ end
100
+
101
+ def request_mkdir(name, parent_id)
102
+ file = @gdrive.files.insert.request_schema.new({
103
+ 'title' => name,
104
+ 'mimeType' => 'application/vnd.google-apps.folder',
105
+ 'parents' => [{'id' => parent_id}]
106
+ })
107
+ result = @gclient.execute(
108
+ :api_method => @gdrive.files.insert,
109
+ :body_object => file
110
+ )
111
+ if result.status == 200
112
+ true
113
+ elsif result.status == 401
114
+ raise UnauthorizedException
115
+ else
116
+ raise HttpConnectionException
117
+ end
118
+ end
119
+
120
+ private
121
+
122
+ def send_request(api_method, parameters = {})
123
+ requests = {api_method: eval(api_method)}
124
+ requests.merge!(parameters)
125
+ result = @gclient.execute(requests)
126
+ if result.status == 200
127
+ result
128
+ elsif result.status == 401
129
+ raise UnauthorizedException
130
+ else
131
+ raise HttpConnectionException
132
+ end
133
+ end
134
+
135
+ end
136
+
137
+ end
@@ -28,11 +28,14 @@ module CloudDoor
28
28
  @root_id = ROOT_ID
29
29
  @storage_name = STORAGE_NAME
30
30
  @session_id = session_id
31
+ @client = nil
31
32
  end
32
33
 
33
34
  def load_token
34
35
  token_file = File.basename(@token.token_file)
35
- @token = Token.load_token(token_file, @config.data_path, @session_id)
36
+ @token = Token.load_token(token_file, @config.data_path, @session_id)
37
+ @client = OneDriveApi.new(@token.access_token)
38
+ @token
36
39
  end
37
40
 
38
41
  def refresh_token
@@ -45,13 +48,14 @@ module CloudDoor
45
48
  handle_exception(e)
46
49
  end
47
50
 
48
- def login(login_account, login_password)
51
+ def login(login_account, login_password)
49
52
  @account.login_account = login_account
50
53
  @account.login_password = login_password
51
54
  url = login_browser
52
55
  info = request_get_token(url)
53
56
  raise NoDataException if info.nil?
54
57
  @session_id = reset_token(info)
58
+ @client = OneDriveApi.new(@token.access_token)
55
59
  items = pull_files
56
60
  @file_list.delete_file
57
61
  @file_list.write_file_list(items)
@@ -92,41 +96,34 @@ module CloudDoor
92
96
  end
93
97
 
94
98
  def request_user
95
- api = OneDriveApi.new(@token.access_token)
96
- api.request_user
99
+ @client.request_user
97
100
  end
98
101
 
99
102
  def request_dir
100
103
  file_id = @parent_id || @file_id || ROOT_ID
101
- api = OneDriveApi.new(@token.access_token)
102
- api.request_dir(file_id)
104
+ @client.request_dir(file_id)
103
105
  end
104
106
 
105
107
  def request_file
106
- api = OneDriveApi.new(@token.access_token)
107
- api.request_file(@file_id)
108
+ @client.request_file(@file_id)
108
109
  end
109
110
 
110
111
  def request_download
111
- api = OneDriveApi.new(@token.access_token)
112
- contens = api.request_download(@file_id)
112
+ contens = @client.request_download(@file_id)
113
113
  open("#{@file_name}", 'wb') { |file| file << contens }
114
114
  end
115
115
 
116
116
  def request_upload(file_path)
117
- api = OneDriveApi.new(@token.access_token)
118
- api.request_upload(file_path, @parent_id)
117
+ @client.request_upload(file_path, @parent_id)
119
118
  end
120
119
 
121
120
  def request_delete
122
- api = OneDriveApi.new(@token.access_token)
123
- api.request_delete(@file_id)
121
+ @client.request_delete(@file_id)
124
122
  end
125
123
 
126
124
  def request_mkdir
127
125
  parent_id = @parent_id || ROOT_ID
128
- api = OneDriveApi.new(@token.access_token)
129
- api.request_mkdir(@mkdir_name, parent_id)
126
+ @client.request_mkdir(@mkdir_name, parent_id)
130
127
  end
131
128
 
132
129
  def pull_files
@@ -1,7 +1,7 @@
1
1
  module CloudDoor
2
2
  class Token
3
3
  attr_accessor :token_file, :token_type, :expires_in, :scope, :access_token,
4
- :refresh_token, :user_id, :token_name
4
+ :refresh_token, :user_id, :token_name, :credentials
5
5
  attr_reader :data_path
6
6
 
7
7
  TOKEN_ITEMS = [
@@ -10,7 +10,8 @@ module CloudDoor
10
10
  'scope',
11
11
  'access_token',
12
12
  'refresh_token',
13
- 'user_id'
13
+ 'user_id',
14
+ 'credentials'
14
15
  ]
15
16
 
16
17
  def initialize(token_name, data_path, id = nil)
@@ -1,3 +1,3 @@
1
1
  module CloudDoor
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/cloud_door.rb CHANGED
@@ -6,6 +6,8 @@ require 'cloud_door/console'
6
6
  require 'cloud_door/dropbox'
7
7
  require 'cloud_door/exceptions'
8
8
  require 'cloud_door/file_list'
9
+ require 'cloud_door/google_drive'
10
+ require 'cloud_door/google_drive_bridge'
9
11
  require 'cloud_door/onedrive'
10
12
  require 'cloud_door/onedrive_api'
11
13
  require 'cloud_door/token'
@@ -191,6 +191,11 @@ EOF
191
191
  describe 'ls' do
192
192
  subject { console.ls(file_name) }
193
193
  let(:console) { create_console }
194
+ let(:token) { console.drive.storage.token }
195
+ let(:token_file) { console.drive.storage.token.token_file }
196
+ before(:each) do
197
+ open(token_file, 'wb') { |file| file << Marshal.dump(token) }
198
+ end
194
199
  context 'have files' do
195
200
  let(:file_name) { nil }
196
201
  let(:posit) do
@@ -259,11 +264,19 @@ EOF
259
264
  expect($terminal.output.string).to include(expects)
260
265
  end
261
266
  end
267
+ after(:each) do
268
+ File.delete(token_file) if File.exist?(token_file)
269
+ end
262
270
  end
263
271
 
264
272
  describe 'cd' do
265
273
  subject { console.cd(file_name) }
266
274
  let(:console) { create_console }
275
+ let(:token) { console.drive.storage.token }
276
+ let(:token_file) { console.drive.storage.token.token_file }
277
+ before(:each) do
278
+ open(token_file, 'wb') { |file| file << Marshal.dump(token) }
279
+ end
267
280
  context 'file_name not input' do
268
281
  let(:file_name) { nil }
269
282
  it do
@@ -330,11 +343,19 @@ EOF
330
343
  expect($terminal.output.string).to include(expects)
331
344
  end
332
345
  end
346
+ after(:each) do
347
+ File.delete(token_file) if File.exist?(token_file)
348
+ end
333
349
  end
334
350
 
335
351
  describe 'info' do
336
352
  subject { console.info(file_name) }
337
353
  let(:console) { create_console }
354
+ let(:token) { console.drive.storage.token }
355
+ let(:token_file) { console.drive.storage.token.token_file }
356
+ before(:each) do
357
+ open(token_file, 'wb') { |file| file << Marshal.dump(token) }
358
+ end
338
359
  context 'file_name not input' do
339
360
  let(:file_name) { nil }
340
361
  it do
@@ -377,12 +398,20 @@ EOF
377
398
  expect($terminal.output.string).to include(expects)
378
399
  end
379
400
  end
401
+ after(:each) do
402
+ File.delete(token_file) if File.exist?(token_file)
403
+ end
380
404
  end
381
405
 
382
406
  describe 'pwd' do
383
407
  subject { console.pwd }
384
408
  let(:console) { create_console }
385
409
  let(:posit) { '/top' }
410
+ let(:token) { console.drive.storage.token }
411
+ let(:token_file) { console.drive.storage.token.token_file }
412
+ before(:each) do
413
+ open(token_file, 'wb') { |file| file << Marshal.dump(token) }
414
+ end
386
415
  it do
387
416
  expect_any_instance_of(CloudDoor::OneDrive).to receive(:show_current_directory)
388
417
  .and_return(posit)
@@ -390,11 +419,19 @@ EOF
390
419
  expects = '/top'
391
420
  expect($terminal.output.string).to include(expects)
392
421
  end
422
+ after(:each) do
423
+ File.delete(token_file) if File.exist?(token_file)
424
+ end
393
425
  end
394
426
 
395
427
  describe 'download' do
396
428
  subject { console.download(file_name) }
397
429
  let(:console) { create_console }
430
+ let(:token) { console.drive.storage.token }
431
+ let(:token_file) { console.drive.storage.token.token_file }
432
+ before(:each) do
433
+ open(token_file, 'wb') { |file| file << Marshal.dump(token) }
434
+ end
398
435
  context 'file_name not input' do
399
436
  let(:file_name) { nil }
400
437
  it do
@@ -447,11 +484,19 @@ EOF
447
484
  expect($terminal.output.string).to include(expects)
448
485
  end
449
486
  end
487
+ after(:each) do
488
+ File.delete(token_file) if File.exist?(token_file)
489
+ end
450
490
  end
451
491
 
452
492
  describe 'upload' do
453
493
  subject { console.upload(file_name) }
454
494
  let(:console) { create_console }
495
+ let(:token) { console.drive.storage.token }
496
+ let(:token_file) { console.drive.storage.token.token_file }
497
+ before(:each) do
498
+ open(token_file, 'wb') { |file| file << Marshal.dump(token) }
499
+ end
455
500
  context 'file_name not input' do
456
501
  let(:file_name) { nil }
457
502
  it do
@@ -534,11 +579,19 @@ EOF
534
579
  expect($terminal.output.string).to include(expects)
535
580
  end
536
581
  end
582
+ after(:each) do
583
+ File.delete(token_file) if File.exist?(token_file)
584
+ end
537
585
  end
538
586
 
539
587
  describe 'rm' do
540
588
  subject { console.rm(file_name) }
541
589
  let(:console) { create_console }
590
+ let(:token) { console.drive.storage.token }
591
+ let(:token_file) { console.drive.storage.token.token_file }
592
+ before(:each) do
593
+ open(token_file, 'wb') { |file| file << Marshal.dump(token) }
594
+ end
542
595
  context 'file_name not input' do
543
596
  let(:file_name) { nil }
544
597
  it do
@@ -591,11 +644,19 @@ EOF
591
644
  expect($terminal.output.string).to include(expects)
592
645
  end
593
646
  end
647
+ after(:each) do
648
+ File.delete(token_file) if File.exist?(token_file)
649
+ end
594
650
  end
595
651
 
596
652
  describe 'mkdir' do
597
653
  subject { console.mkdir(mkdir_name) }
598
654
  let(:console) { create_console }
655
+ let(:token) { console.drive.storage.token }
656
+ let(:token_file) { console.drive.storage.token.token_file }
657
+ before(:each) do
658
+ open(token_file, 'wb') { |file| file << Marshal.dump(token) }
659
+ end
599
660
  context 'mkdir_name not input' do
600
661
  let(:mkdir_name) { nil }
601
662
  it do
@@ -629,5 +690,8 @@ EOF
629
690
  expect($terminal.output.string).to include(expects)
630
691
  end
631
692
  end
693
+ after(:each) do
694
+ File.delete(token_file) if File.exist?(token_file)
695
+ end
632
696
  end
633
697
  end
@@ -1,6 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Dropbox' do
4
+ let(:storage) do
5
+ storage = create_storage(CloudDoor::Dropbox)
6
+ storage.load_token
7
+ storage
8
+ end
9
+
4
10
  describe 'reset_token' do
5
11
  subject { storage.reset_token(token_value) }
6
12
  let(:storage) { create_storage(CloudDoor::Dropbox) }
@@ -23,7 +29,6 @@ describe 'Dropbox' do
23
29
 
24
30
  describe 'show_user' do
25
31
  subject { storage.show_user }
26
- let(:storage) { create_storage(CloudDoor::Dropbox) }
27
32
  context 'success' do
28
33
  let(:posit) { {'name' => 'dropbox'} }
29
34
  it do
@@ -36,7 +41,6 @@ describe 'Dropbox' do
36
41
 
37
42
  describe 'show_files' do
38
43
  subject { storage.show_files(file_name) }
39
- let(:storage) { create_storage(CloudDoor::Dropbox) }
40
44
  let(:list_file) { storage.file_list.list_file }
41
45
  context 'success' do
42
46
  let(:file_name) { nil }
@@ -90,7 +94,6 @@ describe 'Dropbox' do
90
94
 
91
95
  describe 'change_directory' do
92
96
  subject { storage.change_directory(file_name) }
93
- let(:storage) { create_storage(CloudDoor::Dropbox) }
94
97
  let(:list_file) { storage.file_list.list_file }
95
98
  context 'success' do
96
99
  let(:file_name) { 'folder1' }
@@ -153,13 +156,11 @@ describe 'Dropbox' do
153
156
 
154
157
  describe 'show_current_directory' do
155
158
  subject { storage.show_current_directory }
156
- let(:storage) { create_storage(CloudDoor::Dropbox) }
157
159
  it { is_expected.to eq('/top') }
158
160
  end
159
161
 
160
162
  describe 'show_property' do
161
163
  subject { storage.show_property(file_name) }
162
- let(:storage) { create_storage(CloudDoor::Dropbox) }
163
164
  let(:list_file) { storage.file_list.list_file }
164
165
  before(:each) do
165
166
  list = [{'items' => {'file1' => {'id' => '/file1', 'type' => 'file'}}}]
@@ -290,7 +291,6 @@ describe 'Dropbox' do
290
291
 
291
292
  describe 'download_file' do
292
293
  subject { storage.download_file(file_name) }
293
- let(:storage) { create_storage(CloudDoor::Dropbox) }
294
294
  let(:list_file) { storage.file_list.list_file }
295
295
  context 'success' do
296
296
  let(:file_name) { 'file1' }
@@ -334,7 +334,6 @@ describe 'Dropbox' do
334
334
 
335
335
  describe 'upload_file' do
336
336
  subject { storage.upload_file(file_name) }
337
- let(:storage) { create_storage(CloudDoor::Dropbox) }
338
337
  let(:list_file) { storage.file_list.list_file }
339
338
  let(:up_file) { 'upload' }
340
339
  context 'success' do
@@ -373,7 +372,6 @@ describe 'Dropbox' do
373
372
 
374
373
  describe 'delete_file' do
375
374
  subject { storage.delete_file(file_name) }
376
- let(:storage) { create_storage(CloudDoor::Dropbox) }
377
375
  let(:list_file) { storage.file_list.list_file }
378
376
  context 'success' do
379
377
  let(:file_name) { 'file1' }
@@ -412,7 +410,6 @@ describe 'Dropbox' do
412
410
 
413
411
  describe 'make_directory' do
414
412
  subject { storage.make_directory(mkdir_name) }
415
- let(:storage) { create_storage(CloudDoor::Dropbox) }
416
413
  let(:list_file) { storage.file_list.list_file }
417
414
  context 'success' do
418
415
  let(:mkdir_name) { 'folder1' }
@@ -443,7 +440,6 @@ describe 'Dropbox' do
443
440
 
444
441
  describe 'assign_upload_file_name' do
445
442
  subject { storage.assign_upload_file_name(file_name) }
446
- let(:storage) { create_storage(CloudDoor::Dropbox) }
447
443
  context 'file' do
448
444
  let(:file_name) { 'testfile' }
449
445
  it { is_expected.to eq file_name }
@@ -462,7 +458,6 @@ describe 'Dropbox' do
462
458
 
463
459
  describe 'file_exist?' do
464
460
  subject { storage.file_exist?(file_name) }
465
- let(:storage) { create_storage(CloudDoor::Dropbox) }
466
461
  let(:list_file) { storage.file_list.list_file }
467
462
  before(:each) do
468
463
  list = [{'items' => {'file1' => {'id' => '/file1', 'type' => 'file'}}}]
@@ -502,7 +497,6 @@ describe 'Dropbox' do
502
497
 
503
498
  describe 'has_file?' do
504
499
  subject { storage.has_file?(file_name) }
505
- let(:storage) { create_storage(CloudDoor::Dropbox) }
506
500
  let(:list_file) { storage.file_list.list_file }
507
501
  before(:each) do
508
502
  file1 = {'id' => '/file1', 'type' => 'file'}
@@ -515,7 +509,12 @@ describe 'Dropbox' do
515
509
  context 'return true' do
516
510
  context 'count > 0' do
517
511
  let(:file_name) { 'folder1' }
518
- let(:posit) { {'path' => '/foler1', 'count' => 5} }
512
+ let(:posit) do
513
+ {'contents' => [
514
+ {'path' => '/file1', 'name' => 'file1', 'is_dir' => false},
515
+ {'path' => '/folder1', 'name' => 'folder1', 'is_dir' => true},
516
+ ]}
517
+ end
519
518
  before(:each) do
520
519
  storage.stub(:file_exist?)
521
520
  .with(file_name)
@@ -536,7 +535,7 @@ describe 'Dropbox' do
536
535
  end
537
536
  context 'count == 0' do
538
537
  let(:file_name) { 'folder1' }
539
- let(:posit) { {'path' => '/foler1', 'count' => 0} }
538
+ let(:posit) { {'contents' => []} }
540
539
  before(:each) do
541
540
  storage.stub(:file_exist?)
542
541
  .with(file_name)
@@ -574,7 +573,6 @@ describe 'Dropbox' do
574
573
 
575
574
  describe 'file?' do
576
575
  subject { storage.file?(file_name) }
577
- let(:storage) { create_storage(CloudDoor::Dropbox) }
578
576
  let(:list_file) { storage.file_list.list_file }
579
577
  let(:access_token) { storage.token.access_token }
580
578
  before(:each) do