cloud_door 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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