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.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile +4 -0
  5. data/Guardfile +7 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +204 -0
  8. data/Rakefile +11 -0
  9. data/bin/dropbox +133 -0
  10. data/bin/onedrive +133 -0
  11. data/cloud_door.gemspec +38 -0
  12. data/cloud_door_config.yml +12 -0
  13. data/data/.gitkeep +0 -0
  14. data/data/testlist +0 -0
  15. data/lib/cloud_door.rb +114 -0
  16. data/lib/cloud_door/account.rb +27 -0
  17. data/lib/cloud_door/cloud_storage.rb +294 -0
  18. data/lib/cloud_door/cloud_yaml.rb +45 -0
  19. data/lib/cloud_door/config.rb +61 -0
  20. data/lib/cloud_door/console.rb +334 -0
  21. data/lib/cloud_door/dropbox.rb +166 -0
  22. data/lib/cloud_door/exceptions.rb +153 -0
  23. data/lib/cloud_door/file_list.rb +164 -0
  24. data/lib/cloud_door/onedrive.rb +180 -0
  25. data/lib/cloud_door/onedrive_api.rb +169 -0
  26. data/lib/cloud_door/token.rb +67 -0
  27. data/lib/cloud_door/version.rb +3 -0
  28. data/log/.gitkeep +0 -0
  29. data/spec/cloud_door/account_spec.rb +96 -0
  30. data/spec/cloud_door/cloud_storage_spec.rb +10 -0
  31. data/spec/cloud_door/cloud_yaml_spec.rb +32 -0
  32. data/spec/cloud_door/config_spec.rb +95 -0
  33. data/spec/cloud_door/console_spec.rb +633 -0
  34. data/spec/cloud_door/dropbox_spec.rb +625 -0
  35. data/spec/cloud_door/file_list_spec.rb +451 -0
  36. data/spec/cloud_door/onedrive_api_spec.rb +256 -0
  37. data/spec/cloud_door/onedrive_spec.rb +652 -0
  38. data/spec/cloud_door/token_spec.rb +81 -0
  39. data/spec/fabricators/account_fabricator.rb +5 -0
  40. data/spec/fabricators/cloud_yaml_fabricator.rb +5 -0
  41. data/spec/fabricators/config_fabrication.rb +5 -0
  42. data/spec/fabricators/token_fabricator.rb +10 -0
  43. data/spec/spec_helper.rb +55 -0
  44. metadata +380 -0
@@ -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
@@ -0,0 +1,12 @@
1
+ ---
2
+ global:
3
+ data_path: './data/'
4
+ session_flg: 0
5
+ onedrive:
6
+ client_id:
7
+ client_secret:
8
+ redirect_url:
9
+ dropbox:
10
+ client_id:
11
+ client_secret:
12
+ redirect_url:
File without changes
Binary file
@@ -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