cloud_door 0.0.1
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/.gitignore +23 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/Guardfile +7 -0
- data/LICENSE.txt +22 -0
- data/README.md +204 -0
- data/Rakefile +11 -0
- data/bin/dropbox +133 -0
- data/bin/onedrive +133 -0
- data/cloud_door.gemspec +38 -0
- data/cloud_door_config.yml +12 -0
- data/data/.gitkeep +0 -0
- data/data/testlist +0 -0
- data/lib/cloud_door.rb +114 -0
- data/lib/cloud_door/account.rb +27 -0
- data/lib/cloud_door/cloud_storage.rb +294 -0
- data/lib/cloud_door/cloud_yaml.rb +45 -0
- data/lib/cloud_door/config.rb +61 -0
- data/lib/cloud_door/console.rb +334 -0
- data/lib/cloud_door/dropbox.rb +166 -0
- data/lib/cloud_door/exceptions.rb +153 -0
- data/lib/cloud_door/file_list.rb +164 -0
- data/lib/cloud_door/onedrive.rb +180 -0
- data/lib/cloud_door/onedrive_api.rb +169 -0
- data/lib/cloud_door/token.rb +67 -0
- data/lib/cloud_door/version.rb +3 -0
- data/log/.gitkeep +0 -0
- data/spec/cloud_door/account_spec.rb +96 -0
- data/spec/cloud_door/cloud_storage_spec.rb +10 -0
- data/spec/cloud_door/cloud_yaml_spec.rb +32 -0
- data/spec/cloud_door/config_spec.rb +95 -0
- data/spec/cloud_door/console_spec.rb +633 -0
- data/spec/cloud_door/dropbox_spec.rb +625 -0
- data/spec/cloud_door/file_list_spec.rb +451 -0
- data/spec/cloud_door/onedrive_api_spec.rb +256 -0
- data/spec/cloud_door/onedrive_spec.rb +652 -0
- data/spec/cloud_door/token_spec.rb +81 -0
- data/spec/fabricators/account_fabricator.rb +5 -0
- data/spec/fabricators/cloud_yaml_fabricator.rb +5 -0
- data/spec/fabricators/config_fabrication.rb +5 -0
- data/spec/fabricators/token_fabricator.rb +10 -0
- data/spec/spec_helper.rb +55 -0
- metadata +380 -0
data/cloud_door.gemspec
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'cloud_door/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'cloud_door'
|
8
|
+
spec.version = CloudDoor::VERSION
|
9
|
+
spec.authors = ['Kotaro Hibi']
|
10
|
+
spec.email = ['hibiheion@gmail.com']
|
11
|
+
spec.summary = %q{This gem can access different cloud storage through same interface.}
|
12
|
+
spec.description = %q{This gem can access different cloud storage through same interface.
|
13
|
+
This gem supports OneDrive and Dropbox, now.
|
14
|
+
It will be supported also google drive in the future.}
|
15
|
+
spec.homepage = 'https://github.com/KotaroHibi/cloud_door'
|
16
|
+
spec.license = 'MIT'
|
17
|
+
|
18
|
+
spec.files = `git ls-files -z`.split("\x0")
|
19
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
21
|
+
spec.require_paths = ['lib']
|
22
|
+
|
23
|
+
spec.add_development_dependency 'bundler', '~> 1.6'
|
24
|
+
spec.add_development_dependency 'rake', '~> 10.3', '>= 10.3.2'
|
25
|
+
spec.add_runtime_dependency 'rest-client', '~> 1.6', '>= 1.6.7'
|
26
|
+
spec.add_runtime_dependency 'commander', '~> 4.2', '>= 4.2.0'
|
27
|
+
spec.add_runtime_dependency 'rubyzip', '~> 1.1', '>= 1.1.4'
|
28
|
+
spec.add_runtime_dependency 'watir', '~> 5.0', '>= 5.0.0'
|
29
|
+
spec.add_runtime_dependency 'watir-webdriver', '~> 0.6', '>= 0.6.9'
|
30
|
+
spec.add_runtime_dependency 'dropbox-sdk', '~> 1.6', '>= 1.6.4'
|
31
|
+
# test libraries
|
32
|
+
spec.add_development_dependency 'rspec', '~> 2.99', '>= 2.99.0'
|
33
|
+
spec.add_development_dependency 'webmock', '~> 1.18', '>= 1.18.0'
|
34
|
+
spec.add_development_dependency 'guard-rspec', '~> 4.2', '>= 4.2.10'
|
35
|
+
spec.add_development_dependency 'terminal-notifier-guard', '~> 1.5', '>= 1.5.3'
|
36
|
+
spec.add_development_dependency 'fabrication', '~> 2.11', '>= 2.11.2'
|
37
|
+
spec.add_development_dependency 'rubocop', '~> 0.23', '>= 0.23.0'
|
38
|
+
end
|
data/data/.gitkeep
ADDED
File without changes
|
data/data/testlist
ADDED
Binary file
|
data/lib/cloud_door.rb
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'cloud_door/account'
|
2
|
+
require 'cloud_door/config'
|
3
|
+
require 'cloud_door/cloud_storage'
|
4
|
+
require 'cloud_door/cloud_yaml'
|
5
|
+
require 'cloud_door/console'
|
6
|
+
require 'cloud_door/dropbox'
|
7
|
+
require 'cloud_door/exceptions'
|
8
|
+
require 'cloud_door/file_list'
|
9
|
+
require 'cloud_door/onedrive'
|
10
|
+
require 'cloud_door/onedrive_api'
|
11
|
+
require 'cloud_door/token'
|
12
|
+
require 'cloud_door/version'
|
13
|
+
|
14
|
+
module CloudDoor
|
15
|
+
class CloudDoor
|
16
|
+
attr_accessor :storage
|
17
|
+
|
18
|
+
def initialize(storage_klass, session_id = nil)
|
19
|
+
@storage = storage_klass.new(session_id)
|
20
|
+
end
|
21
|
+
|
22
|
+
def login(login_account, login_password)
|
23
|
+
@storage.login(login_account, login_password)
|
24
|
+
end
|
25
|
+
|
26
|
+
def load_token
|
27
|
+
@storage.load_token
|
28
|
+
end
|
29
|
+
|
30
|
+
def refresh_token
|
31
|
+
@storage.refresh_token
|
32
|
+
end
|
33
|
+
|
34
|
+
def show_storage_name
|
35
|
+
@storage.show_storage_name
|
36
|
+
end
|
37
|
+
|
38
|
+
def show_configuration
|
39
|
+
@storage.show_configuration
|
40
|
+
end
|
41
|
+
|
42
|
+
def update_configuration(configs)
|
43
|
+
@storage.update_configuration(configs)
|
44
|
+
end
|
45
|
+
|
46
|
+
def configuration_init?
|
47
|
+
@storage.configuration_init?
|
48
|
+
end
|
49
|
+
|
50
|
+
def show_account
|
51
|
+
@storage.show_account
|
52
|
+
end
|
53
|
+
|
54
|
+
def update_account(accounts)
|
55
|
+
@storage.update_account(accounts)
|
56
|
+
end
|
57
|
+
|
58
|
+
def isset_account?
|
59
|
+
@storage.isset_account?
|
60
|
+
end
|
61
|
+
|
62
|
+
def show_user
|
63
|
+
@storage.show_user
|
64
|
+
end
|
65
|
+
|
66
|
+
def show_files(file_name = nil)
|
67
|
+
@storage.show_files(file_name)
|
68
|
+
end
|
69
|
+
|
70
|
+
def change_directory(file_name)
|
71
|
+
@storage.change_directory(file_name)
|
72
|
+
end
|
73
|
+
|
74
|
+
def show_current_directory
|
75
|
+
@storage.show_current_directory
|
76
|
+
end
|
77
|
+
|
78
|
+
def show_property(file_name)
|
79
|
+
@storage.show_property(file_name)
|
80
|
+
end
|
81
|
+
|
82
|
+
def delete_file(file_name)
|
83
|
+
@storage.delete_file(file_name)
|
84
|
+
end
|
85
|
+
|
86
|
+
def download_file(file_name)
|
87
|
+
@storage.download_file(file_name)
|
88
|
+
end
|
89
|
+
|
90
|
+
def upload_file(file_name)
|
91
|
+
@storage.upload_file(file_name)
|
92
|
+
end
|
93
|
+
|
94
|
+
def make_directory(mkdir_name)
|
95
|
+
@storage.make_directory(mkdir_name)
|
96
|
+
end
|
97
|
+
|
98
|
+
def file_exist?(file_name)
|
99
|
+
@storage.file_exist?(file_name)
|
100
|
+
end
|
101
|
+
|
102
|
+
def has_file?(file_name)
|
103
|
+
@storage.has_file?(file_name)
|
104
|
+
end
|
105
|
+
|
106
|
+
def file?(file_name)
|
107
|
+
@storage.file?(file_name)
|
108
|
+
end
|
109
|
+
|
110
|
+
def assign_upload_file_name(file_name)
|
111
|
+
@storage.assign_upload_file_name(file_name)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'cloud_door/cloud_yaml'
|
2
|
+
|
3
|
+
module CloudDoor
|
4
|
+
class Account < CloudYaml
|
5
|
+
attr_accessor :login_account, :login_password
|
6
|
+
|
7
|
+
ACCOUNT_FILE = 'account.yml'
|
8
|
+
|
9
|
+
ACCOUNT_ITEMS = [
|
10
|
+
'login_account',
|
11
|
+
'login_password'
|
12
|
+
]
|
13
|
+
|
14
|
+
def initialize(storage, data_path)
|
15
|
+
@storage = storage
|
16
|
+
@file = data_path + ACCOUNT_FILE
|
17
|
+
@items = ACCOUNT_ITEMS
|
18
|
+
@login_account = ''
|
19
|
+
@login_password = ''
|
20
|
+
load_yaml
|
21
|
+
end
|
22
|
+
|
23
|
+
def isset_account?
|
24
|
+
!(login_account.empty? || login_password.empty?)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,294 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'date'
|
4
|
+
require 'zip'
|
5
|
+
require 'watir-webdriver'
|
6
|
+
require 'cgi'
|
7
|
+
require 'cgi/session'
|
8
|
+
require 'cloud_door/account'
|
9
|
+
require 'cloud_door/config'
|
10
|
+
require 'cloud_door/exceptions'
|
11
|
+
require 'cloud_door/file_list'
|
12
|
+
require 'cloud_door/token'
|
13
|
+
|
14
|
+
module CloudDoor
|
15
|
+
class CloudStorage
|
16
|
+
attr_accessor :root_id, :storage_name
|
17
|
+
# regular expression pattern of parent directory
|
18
|
+
PARENT_DIR_PAT = /..\//
|
19
|
+
PICK_METHODS = %w(request_user request_dir request_file)
|
20
|
+
|
21
|
+
# there is abstract method. should define there method
|
22
|
+
ABSTRACT_METHODS = %w(
|
23
|
+
load_token
|
24
|
+
login
|
25
|
+
request_user
|
26
|
+
request_dir
|
27
|
+
request_file
|
28
|
+
request_download
|
29
|
+
request_upload
|
30
|
+
request_delete
|
31
|
+
request_mkdir
|
32
|
+
pull_files
|
33
|
+
format_property
|
34
|
+
)
|
35
|
+
|
36
|
+
def initialize
|
37
|
+
# should make inherited subclass
|
38
|
+
raise AbstractClassException
|
39
|
+
end
|
40
|
+
|
41
|
+
def method_missing(method, *args)
|
42
|
+
if ABSTRACT_METHODS.include?(method.to_s)
|
43
|
+
raise AbstractMethodException, "'#{method.to_s}' is abstract method. please define on subclass."
|
44
|
+
else
|
45
|
+
super
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def show_storage_name
|
50
|
+
@storage_name
|
51
|
+
end
|
52
|
+
|
53
|
+
def show_configuration
|
54
|
+
@config
|
55
|
+
end
|
56
|
+
|
57
|
+
def update_configuration(configs)
|
58
|
+
@config.update_yaml(configs)
|
59
|
+
end
|
60
|
+
|
61
|
+
def configuration_init?
|
62
|
+
@config.init?
|
63
|
+
end
|
64
|
+
|
65
|
+
def show_account
|
66
|
+
@account
|
67
|
+
end
|
68
|
+
|
69
|
+
def update_account(accounts)
|
70
|
+
@account.update_yaml(accounts)
|
71
|
+
end
|
72
|
+
|
73
|
+
def isset_account?
|
74
|
+
@account.isset_account?
|
75
|
+
end
|
76
|
+
|
77
|
+
def reset_token(token_value)
|
78
|
+
raise TokenClassException unless @token.is_a?(Token)
|
79
|
+
@token.set_attributes(token_value)
|
80
|
+
session_id = nil
|
81
|
+
if @config.session_use?
|
82
|
+
cgi = CGI.new
|
83
|
+
session = CGI::Session.new(cgi)
|
84
|
+
session_id = session.session_id
|
85
|
+
@token.set_locate(session_id)
|
86
|
+
@file_list.set_locate(session_id)
|
87
|
+
end
|
88
|
+
@token.write_token
|
89
|
+
session_id
|
90
|
+
rescue => e
|
91
|
+
handle_exception(e)
|
92
|
+
end
|
93
|
+
|
94
|
+
def show_user
|
95
|
+
request_user
|
96
|
+
rescue => e
|
97
|
+
handle_exception(e)
|
98
|
+
end
|
99
|
+
|
100
|
+
def show_files(file_name = nil)
|
101
|
+
@file_name = file_name
|
102
|
+
raise SetIDException unless set_file_id
|
103
|
+
raise NotDirectoryException if file?(file_name)
|
104
|
+
pull_files
|
105
|
+
rescue => e
|
106
|
+
handle_exception(e)
|
107
|
+
end
|
108
|
+
|
109
|
+
def change_directory(file_name)
|
110
|
+
raise FileNameEmptyException if file_name.nil? || file_name.empty?
|
111
|
+
@file_name = file_name
|
112
|
+
raise SetIDException unless set_file_id
|
113
|
+
raise NotDirectoryException if file?(file_name)
|
114
|
+
items = pull_files
|
115
|
+
@file_list.write_file_list(items, @file_id, @file_name)
|
116
|
+
items
|
117
|
+
rescue => e
|
118
|
+
handle_exception(e)
|
119
|
+
end
|
120
|
+
|
121
|
+
def show_current_directory
|
122
|
+
@file_list.pull_current_dir
|
123
|
+
end
|
124
|
+
|
125
|
+
def show_property(file_name)
|
126
|
+
raise FileNameEmptyException if file_name.nil? || file_name.empty?
|
127
|
+
@file_name = file_name
|
128
|
+
raise SetIDException unless set_file_id
|
129
|
+
unless file_exist?(file_name)
|
130
|
+
raise FileNotExistsException, "'#{@file_name}' is not exists on cloud."
|
131
|
+
end
|
132
|
+
info = request_file
|
133
|
+
raise NoDataException if info.nil? || !info.is_a?(Hash)
|
134
|
+
format_property(info)
|
135
|
+
rescue => e
|
136
|
+
handle_exception(e)
|
137
|
+
end
|
138
|
+
|
139
|
+
def download_file(file_name)
|
140
|
+
raise FileNameEmptyException if file_name.nil? || file_name.empty?
|
141
|
+
@file_name = file_name
|
142
|
+
raise SetIDException unless set_file_id
|
143
|
+
raise NotFileException unless file?(file_name)
|
144
|
+
request_download
|
145
|
+
File.exist?(@file_name)
|
146
|
+
rescue => e
|
147
|
+
handle_exception(e)
|
148
|
+
end
|
149
|
+
|
150
|
+
def upload_file(file_name)
|
151
|
+
@up_file_name = file_name
|
152
|
+
raise FileNameEmptyException if @up_file_name.nil? || @up_file_name.empty?
|
153
|
+
unless File.exist?(@up_file_name)
|
154
|
+
raise FileNotExistsException, "'#{@up_file_name}' is not exists on local."
|
155
|
+
end
|
156
|
+
@parent_id = pull_parent_id
|
157
|
+
up_file = assign_upload_file_name(file_name)
|
158
|
+
compress_file if File.directory?(@up_file_name)
|
159
|
+
# if not raise error, judge that's success
|
160
|
+
request_upload(up_file)
|
161
|
+
update_file_list
|
162
|
+
File.delete(up_file) if File.directory?(@up_file_name)
|
163
|
+
true
|
164
|
+
rescue => e
|
165
|
+
unless e.is_a?(FileNameEmptyException)
|
166
|
+
File.delete(up_file) if File.directory?(@up_file_name)
|
167
|
+
end
|
168
|
+
handle_exception(e)
|
169
|
+
end
|
170
|
+
|
171
|
+
def delete_file(file_name)
|
172
|
+
@file_name = file_name
|
173
|
+
raise FileNameEmptyException if @file_name.nil? || @file_name.empty?
|
174
|
+
raise SetIDException unless set_file_id
|
175
|
+
# if not raise error, judge that's success
|
176
|
+
request_delete
|
177
|
+
@parent_id = pull_parent_id
|
178
|
+
update_file_list
|
179
|
+
true
|
180
|
+
rescue => e
|
181
|
+
handle_exception(e)
|
182
|
+
end
|
183
|
+
|
184
|
+
def make_directory(mkdir_name)
|
185
|
+
@mkdir_name = mkdir_name
|
186
|
+
raise DirectoryNameEmptyException if @mkdir_name.nil? || @mkdir_name.empty?
|
187
|
+
@parent_id = pull_parent_id
|
188
|
+
# if not raise error, judge that's success
|
189
|
+
request_mkdir
|
190
|
+
update_file_list
|
191
|
+
true
|
192
|
+
rescue => e
|
193
|
+
handle_exception(e)
|
194
|
+
end
|
195
|
+
|
196
|
+
def file_exist?(file_name)
|
197
|
+
if file_name =~ PARENT_DIR_PAT
|
198
|
+
return !@file_list.top?(file_name)
|
199
|
+
end
|
200
|
+
@parent_id = pull_parent_id
|
201
|
+
items = pull_files
|
202
|
+
@parent_id = nil
|
203
|
+
return false if items.empty? || !items.is_a?(Hash)
|
204
|
+
items.key?(file_name)
|
205
|
+
rescue => e
|
206
|
+
handle_exception(e)
|
207
|
+
end
|
208
|
+
|
209
|
+
def has_file?(file_name)
|
210
|
+
raise FileNameEmptyException if file_name.nil? || file_name.empty?
|
211
|
+
@file_name = file_name
|
212
|
+
raise SetIDException unless set_file_id
|
213
|
+
return false if file?(file_name)
|
214
|
+
info = show_property(file_name)
|
215
|
+
raise NoDataException if info.nil? || !info.is_a?(Hash) || !info.key?('count')
|
216
|
+
(info['count'] > 0)
|
217
|
+
rescue => e
|
218
|
+
handle_exception(e)
|
219
|
+
end
|
220
|
+
|
221
|
+
def file?(file_name)
|
222
|
+
return false if file_name.nil? || file_name.empty?
|
223
|
+
return false if file_name =~ PARENT_DIR_PAT
|
224
|
+
properties = @file_list.pull_file_properties(file_name)
|
225
|
+
return false unless properties
|
226
|
+
properties['type'] == 'file' ? true : false
|
227
|
+
end
|
228
|
+
|
229
|
+
def assign_upload_file_name(file_name)
|
230
|
+
if File.directory?(file_name)
|
231
|
+
"#{file_name}.zip"
|
232
|
+
else
|
233
|
+
file_name
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
private
|
238
|
+
|
239
|
+
def set_file_id
|
240
|
+
if @file_name.nil? || @file_name.empty?
|
241
|
+
mode = 'current'
|
242
|
+
elsif @file_name =~ PARENT_DIR_PAT
|
243
|
+
mode = 'parent'
|
244
|
+
else
|
245
|
+
mode = 'target'
|
246
|
+
end
|
247
|
+
file_id = @file_list.convert_name_to_id(mode, @file_name)
|
248
|
+
return false if file_id.is_a?(FalseClass)
|
249
|
+
@file_id = file_id
|
250
|
+
true
|
251
|
+
end
|
252
|
+
|
253
|
+
def pick_cloud_info(method, key)
|
254
|
+
if PICK_METHODS.include?(method)
|
255
|
+
info = send(method)
|
256
|
+
else
|
257
|
+
raise RequestMethodNotFoundException, "#{method} is not defined."
|
258
|
+
end
|
259
|
+
raise NoDataException if info.nil? || !info.is_a?(Hash)
|
260
|
+
unless info.key?(key)
|
261
|
+
raise RequestPropertyNotFoundException, "not have '#{key}' property."
|
262
|
+
end
|
263
|
+
info[key]
|
264
|
+
rescue => e
|
265
|
+
handle_exception(e)
|
266
|
+
end
|
267
|
+
|
268
|
+
def pull_parent_id
|
269
|
+
parent_id = @file_list.pull_parent_id
|
270
|
+
parent_id || @root_id
|
271
|
+
end
|
272
|
+
|
273
|
+
def update_file_list
|
274
|
+
items = pull_files
|
275
|
+
@file_list.write_file_list(items)
|
276
|
+
end
|
277
|
+
|
278
|
+
def compress_file
|
279
|
+
filename = @up_file_name
|
280
|
+
zip_file_name = "#{filename}.zip"
|
281
|
+
directory = filename
|
282
|
+
Zip::File.open(zip_file_name, Zip::File::CREATE) do |zipfile|
|
283
|
+
Dir[File.join(directory, '**', '**')].each do |file|
|
284
|
+
zipfile.add(file, file)
|
285
|
+
end
|
286
|
+
end
|
287
|
+
zip_file_name
|
288
|
+
end
|
289
|
+
|
290
|
+
def handle_exception(e)
|
291
|
+
raise
|
292
|
+
end
|
293
|
+
end
|
294
|
+
end
|