rapidshare-ext 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/History.md +9 -3
- data/README.md +93 -91
- data/lib/rapidshare-ext/api.rb +39 -22
- data/lib/rapidshare-ext/version.rb +1 -1
- data/rapidshare-ext.gemspec +1 -1
- data/test/integration/rapidshare-ext_test.rb +129 -11
- metadata +3 -3
data/History.md
CHANGED
@@ -1,4 +1,10 @@
|
|
1
|
-
## ver.0.0.
|
1
|
+
## ver. 0.0.4 2012-11-21
|
2
|
+
|
3
|
+
* [changed] folders_hierarchy(): :validate param added
|
4
|
+
* [changed] folders_hierarchy(), folder_path(): orphan pathes marked with "<undefined>" parts
|
5
|
+
* [changed] 100% code coverage
|
6
|
+
|
7
|
+
## ver. 0.0.3 2012-11-19
|
2
8
|
|
3
9
|
* [added] Downloading files by absolute path
|
4
10
|
* [added] File download url added to the return hash of file_info(). Url is represented by the :url key
|
@@ -10,11 +16,11 @@ It has began. We have the features as follows:
|
|
10
16
|
|
11
17
|
* [added] Creating folders
|
12
18
|
|
13
|
-
## ver.0.0.2 2012-11-18
|
19
|
+
## ver. 0.0.2 2012-11-18
|
14
20
|
|
15
21
|
Technical release. No features, no bug fixes.
|
16
22
|
|
17
|
-
## ver.0.0.1 2012-11-17
|
23
|
+
## ver. 0.0.1 2012-11-17
|
18
24
|
|
19
25
|
It has began. We have the features as follows:
|
20
26
|
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# Rapidshare::Ext
|
2
2
|
|
3
|
-
Makes your interactions with Rapidshare API more pleasant by providing new handy features: creating/moving/deleting files/folders in a user friendly way, upload files, etc.
|
3
|
+
Makes your interactions with the Rapidshare API more pleasant by providing new handy features: creating/moving/deleting files/folders in a user friendly way, upload files, etc.
|
4
4
|
|
5
|
-
This gem extends the existing one - https://github.com/defkode/rapidshare, so it has all features implemented
|
5
|
+
This gem extends the existing one - https://github.com/defkode/rapidshare, so it has all features have been implemented by the authors of the original gem at the moment.
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
@@ -26,6 +26,74 @@ api = Rapidshare::API.new(:login => 'my_login', :password => 'my_password')
|
|
26
26
|
api = Rapidshare::API.new(:cookie => 'cookie_here') # More preferable way
|
27
27
|
```
|
28
28
|
|
29
|
+
### Files
|
30
|
+
|
31
|
+
Now you can perform file download in two ways: by the HTTP url or by the absolute path.
|
32
|
+
|
33
|
+
First, by the HTTP url, as it has worked before:
|
34
|
+
```ruby
|
35
|
+
@rs.download "https://rapidshare.com/files/4226120320/upload_file_1.txt",
|
36
|
+
:downloads_dir => "/tmp",
|
37
|
+
:save_as => "file2.txt" # This doesn't work in the original gem at the moment because of Rapidshare API changes
|
38
|
+
|
39
|
+
# With a default local file name
|
40
|
+
@rs.download "https://rapidshare.com/files/4226120320/upload_file_1.txt",
|
41
|
+
:downloads_dir => "/tmp"
|
42
|
+
```
|
43
|
+
|
44
|
+
Download by absolute path:
|
45
|
+
```ruby
|
46
|
+
@rs.download "/foo/bar/baz/upload_file_1.txt",
|
47
|
+
:downloads_dir => "/tmp"
|
48
|
+
```
|
49
|
+
|
50
|
+
In both the first and second samples the result will be the same.
|
51
|
+
|
52
|
+
File uploading became very simple now:
|
53
|
+
```ruby
|
54
|
+
api.upload("/home/odiszapc/my_damn_cat.mov", :to => "/gallery/video", :as => "cat1.mov")
|
55
|
+
# => {
|
56
|
+
# :id => 1,
|
57
|
+
# :size => 12345, # File size in bytes
|
58
|
+
# :checksum => <MD5>,
|
59
|
+
# :url => <DOWNLOAD_URL>, # https://rapidshare/.......
|
60
|
+
# :already_exists? => true/false # Does the file already exists within a specific folder, real uploading will not being performed in this case
|
61
|
+
#}
|
62
|
+
```
|
63
|
+
Destination folder will be created automatically.
|
64
|
+
After uploading has been completed the file will be stored in a Rapidshare as "/gallery/video/cat1.mov"
|
65
|
+
You can easily get a download url after uploading:
|
66
|
+
```ruby
|
67
|
+
result = api.upload("/home/odiszapc/my_damn_cat.mov", :to => "/gallery/video", :as => "cat1.mov")
|
68
|
+
result[:url]
|
69
|
+
```
|
70
|
+
|
71
|
+
By default, file is uploaded to the root folder:
|
72
|
+
```ruby
|
73
|
+
api.upload("/home/odiszapc/my_damn_humster.mov")
|
74
|
+
```
|
75
|
+
|
76
|
+
Deleting files:
|
77
|
+
```ruby
|
78
|
+
api.remove_file("/putin/is/a/good/reason/to/live/abroad/ticket_to_Nicaragua.jpg")
|
79
|
+
```
|
80
|
+
|
81
|
+
Renaming files:
|
82
|
+
```ruby
|
83
|
+
api.rename_file("/foo/bar.rar", "baz.rar")
|
84
|
+
```
|
85
|
+
|
86
|
+
Moving files:
|
87
|
+
```ruby
|
88
|
+
api.move_file("/foo/bar/baz.rar", :to => "/foo") # new file path: "/foo/baz.rar"
|
89
|
+
api.move_file("/foo/bar/baz.rar") # move to a root folder
|
90
|
+
```
|
91
|
+
|
92
|
+
Get the file ID:
|
93
|
+
```ruby
|
94
|
+
api.file_id("/foo/bar/baz.rar") # => <ID>
|
95
|
+
```
|
96
|
+
|
29
97
|
### Folders
|
30
98
|
As you note you can have a hierarchy of folders in your account.
|
31
99
|
|
@@ -45,7 +113,7 @@ api.move_folder("/a/b/c", :to => "/a")
|
|
45
113
|
```
|
46
114
|
This moves folder "c" from directory "/a/b/" and places it under the directory "/a"
|
47
115
|
|
48
|
-
Get hierarchy of all folders in account:
|
116
|
+
Get the hierarchy of all folders in account:
|
49
117
|
```ruby
|
50
118
|
api.folders_hierarchy
|
51
119
|
# => {
|
@@ -58,30 +126,37 @@ api.folders_hierarchy
|
|
58
126
|
# }
|
59
127
|
```
|
60
128
|
|
61
|
-
Note, that after the folder hierarchy is generated first time
|
129
|
+
Note, that after the folder hierarchy is generated first time it's cached permanently to improve performance.
|
62
130
|
|
63
131
|
So, if you want to invalidate the cache just call the above method with trailing "!":
|
64
132
|
```ruby
|
65
133
|
api.folders_hierarchy!
|
66
134
|
```
|
67
135
|
|
68
|
-
If folder tree is inconsistent (orphans are found, see next paragraph for details) the Exception will be thrown
|
136
|
+
If folder tree is inconsistent (orphans are found, see next paragraph for details) the Exception will be thrown when you perform #folders_hierarchy.
|
137
|
+
To automatically normalize the tree, call the method with the :consistent flag:
|
69
138
|
```ruby
|
70
139
|
api.folders_hierarchy :consistent => true
|
71
140
|
```
|
72
|
-
Be careful with
|
141
|
+
Be careful with the tree consistency, orphan folders may contain a critical data.
|
73
142
|
|
74
|
-
A more secure way to deal with consistency is to fix orphans first and then generate
|
143
|
+
A more secure way to deal with folder consistency is to fix all orphans first and then generate folder tree:
|
75
144
|
```ruby
|
76
145
|
api.add_folder "/garbage"
|
77
146
|
api.move_orphans :to => "/garbage" # Collect all orphans and place them under the /garbage folder
|
78
147
|
tree = api.folders_hierarchy
|
79
148
|
```
|
80
149
|
|
150
|
+
Get the folder ID or path:
|
151
|
+
```ruby
|
152
|
+
id = api.folder_id("/foo/bar") # <ID>
|
153
|
+
api.folder_path(id) # "/foo/bar"
|
154
|
+
```
|
155
|
+
|
81
156
|
### Orphans
|
82
|
-
As mentioned
|
83
|
-
What does it mean? When you delete parent folder by its ID
|
84
|
-
For example,
|
157
|
+
As mentioned earlier, the Rapidshare has its common problem: the chance of orphan folders to be appeared.
|
158
|
+
What does it mean? When you delete parent folder by its ID the folder will be deleted without any of its child folders being deleted.
|
159
|
+
For example, let we have the basic directory tree:
|
85
160
|
```
|
86
161
|
ROOT
|
87
162
|
`-a <- RS API allows us to delete JUST THIS folder, so hierarchy relation between folders will be lost and the folders "c" and "b" will become orphans
|
@@ -89,15 +164,15 @@ ROOT
|
|
89
164
|
`-c
|
90
165
|
```
|
91
166
|
|
92
|
-
|
167
|
+
My know-how: orphan folders become invisible in your File Manager on the Rapidshare web site, so you may want to hide all the data in this way (stupid idea)
|
93
168
|
|
94
|
-
So, the best way to delete directory tree without washing away its consistency is the following:
|
169
|
+
So, the best way to delete some directory tree without washing away its consistency is the following:
|
95
170
|
```ruby
|
96
|
-
api.remove_folder "/a"
|
171
|
+
api.remove_folder "/a" # This will correctly delete all child directories
|
97
172
|
```
|
98
173
|
|
99
|
-
|
100
|
-
The next method detects all orphan folders in your account and moves them
|
174
|
+
But if you already have orphans in your account there is possible to fix them.
|
175
|
+
The next method detects all orphan folders in your account and moves them into a specific folder:
|
101
176
|
```ruby
|
102
177
|
move_orphans :to => "/"
|
103
178
|
```
|
@@ -107,82 +182,8 @@ Or we can just delete all of them (be careful):
|
|
107
182
|
remove_orphans!
|
108
183
|
```
|
109
184
|
|
110
|
-
Get the folder ID or path:
|
111
|
-
```ruby
|
112
|
-
id = api.folder_id("/foo/bar") # <ID>
|
113
|
-
api.folder_path(id) # "/foo/bar"
|
114
|
-
```
|
115
|
-
|
116
|
-
### Files
|
117
|
-
|
118
|
-
Now you can download files in two ways: by HTTP url or by absolute path.
|
119
|
-
|
120
|
-
By url, as it worked before:
|
121
|
-
```ruby
|
122
|
-
@rs.download "https://rapidshare.com/files/4226120320/upload_file_1.txt",
|
123
|
-
:downloads_dir => "/tmp",
|
124
|
-
:save_as => "file2.txt" # This doesn't work in the base rapidshare gem
|
125
|
-
|
126
|
-
# With a default local file name
|
127
|
-
@rs.download "https://rapidshare.com/files/4226120320/upload_file_1.txt",
|
128
|
-
:downloads_dir => "/tmp"
|
129
|
-
```
|
130
|
-
|
131
|
-
Download by the absolute path:
|
132
|
-
```ruby
|
133
|
-
@rs.download "/foo/bar/baz/upload_file_1.txt",
|
134
|
-
:downloads_dir => "/tmp"
|
135
|
-
```
|
136
|
-
|
137
|
-
For both first and second samples result will be the same
|
138
|
-
|
139
|
-
File uploading became very simple now:
|
140
|
-
```ruby
|
141
|
-
api.upload("/home/odiszapc/my_damn_cat.mov", :to => "/gallery/video", :as => "cat1.mov")
|
142
|
-
# => {
|
143
|
-
# :id => 1,
|
144
|
-
# :size => 12345, # File size in bytes
|
145
|
-
# :checksum => <MD5>,
|
146
|
-
# :url => <DOWNLOAD_URL>, # https://rapidshare/.......
|
147
|
-
# :already_exists? => true/false # Does the file already exists within a specific folder, real uploading will not being performed in this case
|
148
|
-
#}
|
149
|
-
```
|
150
|
-
Destination folder will be created automatically.
|
151
|
-
After uploading has been completed the file will be stored in a Rapidshare as "/gallery/video/cat1.mov"
|
152
|
-
You can easily get a download url after uploading:
|
153
|
-
```ruby
|
154
|
-
result = api.upload("/home/odiszapc/my_damn_cat.mov", :to => "/gallery/video", :as => "cat1.mov")
|
155
|
-
result[:url]
|
156
|
-
```
|
157
|
-
|
158
|
-
By default, file is uploaded to root folder:
|
159
|
-
```ruby
|
160
|
-
api.upload("/home/odiszapc/my_damn_humster.mov")
|
161
|
-
```
|
162
|
-
|
163
|
-
Deleting files:
|
164
|
-
```ruby
|
165
|
-
api.remove_file("/putin/is/a/good/reason/to/live/abroad/ticket_to_Nicaragua.jpg")
|
166
|
-
```
|
167
|
-
|
168
|
-
Renaming files:
|
169
|
-
```ruby
|
170
|
-
api.rename_file("/foo/bar.rar", "baz.rar")
|
171
|
-
```
|
172
|
-
|
173
|
-
Moving files:
|
174
|
-
```ruby
|
175
|
-
api.move_file("/foo/bar/baz.rar", :to => "/foo") # new file path: "/foo/baz.rar"
|
176
|
-
api.move_file("/foo/bar/baz.rar") # move to a root folder
|
177
|
-
```
|
178
|
-
|
179
|
-
Get the file ID:
|
180
|
-
```ruby
|
181
|
-
api.file_id("/foo/bar/baz.rar") # => <ID>
|
182
|
-
```
|
183
|
-
|
184
185
|
### Account
|
185
|
-
You can null your account by deleting all data stored inside. Be careful with it, because all you
|
186
|
+
You can null your account by deleting all data stored inside. Be careful with it, because all you lose all your data:
|
186
187
|
```ruby
|
187
188
|
api.erase_all_data!
|
188
189
|
```
|
@@ -193,4 +194,5 @@ api.erase_all_data!
|
|
193
194
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
194
195
|
3. Commit your changes (`git commit -am 'Added some feature'`)
|
195
196
|
4. Push to the branch (`git push origin my-new-feature`)
|
196
|
-
5. Create new Pull Request
|
197
|
+
5. Create new Pull Request
|
198
|
+
6. Open beer
|
data/lib/rapidshare-ext/api.rb
CHANGED
@@ -247,12 +247,18 @@ module Rapidshare
|
|
247
247
|
# Invalidate cached tree, default: false
|
248
248
|
# After each call of this method the generated tree will be saved as cache
|
249
249
|
# to avoid unnecessary queries to be performed fpr a future calls
|
250
|
+
# <tt>:validate</tt>::
|
251
|
+
# Validate tree after it has been generated, default: true
|
250
252
|
# <tt>:consistent</tt>::
|
251
253
|
# Delete all found orphans, default: false
|
254
|
+
# Ignored if :validate is set to false
|
252
255
|
def folders_hierarchy(params = {})
|
253
256
|
force_load = params.delete :force
|
254
257
|
from_folder_path = path_trim(params.delete(:from) || '/')
|
255
258
|
remove_orphans = params.delete(:consistent)
|
259
|
+
perform_validation = params.delete(:validate)
|
260
|
+
perform_validation = true if perform_validation.nil?
|
261
|
+
remove_orphans = false unless perform_validation
|
256
262
|
|
257
263
|
if @tree && !force_load
|
258
264
|
if from_folder_path.empty?
|
@@ -284,18 +290,19 @@ module Rapidshare
|
|
284
290
|
# Kill orphans
|
285
291
|
remove_orphans! if remove_orphans
|
286
292
|
|
287
|
-
# Validate folder tree consistency
|
288
293
|
@tree.each_pair do |folder_id, data|
|
289
|
-
|
290
|
-
if !parent_id.zero? && @tree[parent_id].nil?
|
291
|
-
|
292
|
-
error = "There is no parent folder with id ##{data[:parent]} for the folder \"#{data[:name]}\" [#{folder_id}]"
|
293
|
-
raise error
|
294
|
-
end
|
294
|
+
@tree[folder_id][:path] = folder_path folder_id
|
295
295
|
end
|
296
296
|
|
297
|
-
|
298
|
-
|
297
|
+
if perform_validation
|
298
|
+
# Validate folder tree consistency
|
299
|
+
@tree.each_pair do |folder_id, data|
|
300
|
+
parent_id = data[:parent]
|
301
|
+
if !parent_id.zero? && @tree[parent_id].nil?
|
302
|
+
error = "Directory tree consistency error. Parent folder ##{data[:parent]} for the folder \"#{data[:path]}\" [#{folder_id}] could not be found"
|
303
|
+
raise error
|
304
|
+
end
|
305
|
+
end
|
299
306
|
end
|
300
307
|
|
301
308
|
@tree = slice_tree @tree, :from => from_folder_path unless from_folder_path.empty?
|
@@ -358,18 +365,23 @@ module Rapidshare
|
|
358
365
|
# Example:
|
359
366
|
# move_orphans :to => "/"
|
360
367
|
def move_orphans(params = {})
|
361
|
-
new_folder =
|
362
|
-
|
363
|
-
|
364
|
-
|
368
|
+
new_folder = path_trim(params.delete(:to) || '/')
|
369
|
+
gaps = detect_gaps
|
370
|
+
|
371
|
+
if gaps.any?
|
372
|
+
params = {
|
373
|
+
:realfolder => gaps.join(','),
|
374
|
+
:newparent => new_folder
|
375
|
+
}.merge params
|
376
|
+
moverealfolder params
|
365
377
|
end
|
366
378
|
end
|
367
379
|
|
368
380
|
# Returns gap list between folders
|
369
381
|
# See #gap? for example
|
370
382
|
def detect_gaps
|
371
|
-
@tree = folders_hierarchy
|
372
|
-
@tree.keep_if do |folder_id, data|
|
383
|
+
@tree = folders_hierarchy :validate => false
|
384
|
+
@tree.dup.keep_if do |folder_id, data|
|
373
385
|
gap? folder_id # This is wrong
|
374
386
|
end.keys
|
375
387
|
end
|
@@ -378,7 +390,7 @@ module Rapidshare
|
|
378
390
|
# WARNING!!! All data will be lost!!!
|
379
391
|
# Use it carefully
|
380
392
|
def erase_all_data!
|
381
|
-
@tree = folders_hierarchy
|
393
|
+
@tree = folders_hierarchy! :validate => false
|
382
394
|
@tree.keys.each do |folder_id|
|
383
395
|
delrealfolder :realfolder => folder_id
|
384
396
|
end
|
@@ -387,13 +399,14 @@ module Rapidshare
|
|
387
399
|
|
388
400
|
# Check if folder with given id placed on the bottom of folder hierarchy
|
389
401
|
def root_folder?(folder_id)
|
390
|
-
@tree = folders_hierarchy
|
402
|
+
@tree = folders_hierarchy :validate => false
|
403
|
+
return false if @tree[folder_id].nil?
|
391
404
|
@tree[folder_id][:parent].zero?
|
392
405
|
end
|
393
406
|
|
394
407
|
# Check if the given folder has no parent
|
395
408
|
def gap?(folder_id)
|
396
|
-
@tree = folders_hierarchy
|
409
|
+
@tree = folders_hierarchy :validate => false
|
397
410
|
parent_id = @tree[folder_id][:parent]
|
398
411
|
@tree[parent_id].nil?
|
399
412
|
end
|
@@ -406,7 +419,8 @@ module Rapidshare
|
|
406
419
|
# `-b
|
407
420
|
# `-c
|
408
421
|
def orphan?(folder_id)
|
409
|
-
@tree = folders_hierarchy
|
422
|
+
@tree = folders_hierarchy :validate => false
|
423
|
+
return false if @tree[folder_id].nil?
|
410
424
|
parent_id = @tree[folder_id][:parent]
|
411
425
|
return false if root_folder? folder_id
|
412
426
|
return true if gap? folder_id
|
@@ -418,8 +432,11 @@ module Rapidshare
|
|
418
432
|
# api.folder_path(123) # -> "foo/bar/baz"
|
419
433
|
def folder_path(folder_id)
|
420
434
|
@tree = folders_hierarchy
|
421
|
-
|
422
|
-
|
435
|
+
|
436
|
+
folder_data = @tree[folder_id] || {:parent => 0, :name => "<undefined>", :path => "<undefined>"}
|
437
|
+
|
438
|
+
parent_id = folder_data[:parent]
|
439
|
+
path = (folder_path(parent_id) if parent_id.nonzero?).to_s + ('/' if parent_id.nonzero?).to_s + folder_data[:name]
|
423
440
|
parent_id.zero? ? "/#{path}" : path
|
424
441
|
end
|
425
442
|
|
@@ -456,7 +473,7 @@ module Rapidshare
|
|
456
473
|
# :licids,
|
457
474
|
# :sentby
|
458
475
|
# }
|
459
|
-
# See http://images.rapidshare.com/apidoc.txt for more details
|
476
|
+
# See the http://images.rapidshare.com/apidoc.txt for more details
|
460
477
|
def file_info(file_path, params = {})
|
461
478
|
folder_path = File.dirname file_path
|
462
479
|
file_name = File.basename file_path
|
data/rapidshare-ext.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |gem|
|
|
6
6
|
gem.version = Rapidshare::Ext::VERSION
|
7
7
|
gem.authors = ["odiszapc"]
|
8
8
|
gem.email = ["odiszapc@gmail.com"]
|
9
|
-
gem.description = %q{Extends the
|
9
|
+
gem.description = %q{Extends the original rapidshare gem with a set of handy features}
|
10
10
|
gem.summary = %q{Makes your interactions with Rapidshare API more pleasant by providing new handy features: creating/moving/deleting files/folders in a user friendly way, upload files, etc}
|
11
11
|
gem.homepage = "http://github.com/odiszapc/rapidshare-ext"
|
12
12
|
|
@@ -20,7 +20,7 @@ class RapidshareExtTest < Test::Unit::TestCase
|
|
20
20
|
end
|
21
21
|
|
22
22
|
context "Api" do
|
23
|
-
should "
|
23
|
+
should "upload file" do
|
24
24
|
upload_assertion = ->(resp, size_local, digest_local, remote_filename) do
|
25
25
|
assert_instance_of Hash, resp
|
26
26
|
assert_kind_of Integer, resp[:id]
|
@@ -62,7 +62,7 @@ class RapidshareExtTest < Test::Unit::TestCase
|
|
62
62
|
assert_true response[:already_exists?]
|
63
63
|
end
|
64
64
|
|
65
|
-
should "
|
65
|
+
should "download file" do
|
66
66
|
@rs.upload @upload_file_1, :to => "/a/b/c", :as => "upload_file_1.txt"
|
67
67
|
assert_not_nil @rs.file_info("/a/b/c/upload_file_1.txt")
|
68
68
|
|
@@ -85,7 +85,7 @@ class RapidshareExtTest < Test::Unit::TestCase
|
|
85
85
|
assert_equal @upload_file_1_md5, Digest::MD5.hexdigest(File.read("#@download_dir/file2.txt"))
|
86
86
|
end
|
87
87
|
|
88
|
-
should "
|
88
|
+
should "rename file" do
|
89
89
|
@rs.upload @upload_file_1, :to => "/a/b/c", :as => "upload_file_1.txt"
|
90
90
|
assert_not_nil @rs.file_info("/a/b/c/upload_file_1.txt")
|
91
91
|
|
@@ -99,7 +99,7 @@ class RapidshareExtTest < Test::Unit::TestCase
|
|
99
99
|
assert_equal info[:md5hex].downcase, @upload_file_1_md5
|
100
100
|
end
|
101
101
|
|
102
|
-
should "
|
102
|
+
should "move file" do
|
103
103
|
@rs.upload @upload_file_1, :to => "/a/b/c", :as => "upload_file_1.txt"
|
104
104
|
assert_not_nil @rs.file_info("/a/b/c/upload_file_1.txt")
|
105
105
|
|
@@ -114,7 +114,7 @@ class RapidshareExtTest < Test::Unit::TestCase
|
|
114
114
|
assert_equal info[:md5hex].downcase, @upload_file_1_md5
|
115
115
|
end
|
116
116
|
|
117
|
-
should "
|
117
|
+
should "delete file" do
|
118
118
|
@rs.upload @upload_file_1, :to => "/a/b/c", :as => "upload_file_1.txt"
|
119
119
|
assert_not_nil @rs.file_info("/a/b/c/upload_file_1.txt")
|
120
120
|
|
@@ -122,13 +122,13 @@ class RapidshareExtTest < Test::Unit::TestCase
|
|
122
122
|
assert_nil @rs.file_info("/a/b/c/upload_file_1.txt")
|
123
123
|
end
|
124
124
|
|
125
|
-
should "
|
125
|
+
should "folder id <=> path conversions" do
|
126
126
|
@rs.add_folder "/a/b/c"
|
127
127
|
id = @rs.folder_id("/a/b/c")
|
128
128
|
assert_equal "/a/b/c", @rs.folder_path(id)
|
129
129
|
end
|
130
130
|
|
131
|
-
should "
|
131
|
+
should "create folder" do
|
132
132
|
folder_id = @rs.add_folder "a/b/c"
|
133
133
|
assert_kind_of Integer, folder_id
|
134
134
|
assert_not_equal 0, folder_id
|
@@ -140,7 +140,7 @@ class RapidshareExtTest < Test::Unit::TestCase
|
|
140
140
|
assert_equal "/a", tree[tree[tree[folder_id][:parent]][:parent]][:path]
|
141
141
|
end
|
142
142
|
|
143
|
-
should "
|
143
|
+
should "move folder" do
|
144
144
|
folder_id = @rs.add_folder "/a/b/c"
|
145
145
|
assert_kind_of Integer, folder_id
|
146
146
|
assert_not_equal 0, folder_id
|
@@ -160,7 +160,7 @@ class RapidshareExtTest < Test::Unit::TestCase
|
|
160
160
|
assert_equal @rs.folder_id("/a"), tree[folder_id][:parent]
|
161
161
|
end
|
162
162
|
|
163
|
-
should "
|
163
|
+
should "remove folder" do
|
164
164
|
folder_id = @rs.add_folder "a/b/c"
|
165
165
|
assert_kind_of Integer, folder_id
|
166
166
|
assert_not_equal 0, folder_id
|
@@ -185,7 +185,7 @@ class RapidshareExtTest < Test::Unit::TestCase
|
|
185
185
|
end
|
186
186
|
|
187
187
|
|
188
|
-
should "
|
188
|
+
should "build folders tree" do
|
189
189
|
# Create folders
|
190
190
|
folder_a_id = @rs.add_folder "/a"
|
191
191
|
assert_kind_of Integer, folder_a_id
|
@@ -224,7 +224,7 @@ class RapidshareExtTest < Test::Unit::TestCase
|
|
224
224
|
assert_equal folder_b_id, sub_tree[folder_c_id][:parent]
|
225
225
|
end
|
226
226
|
|
227
|
-
should "
|
227
|
+
should "erase all account data" do
|
228
228
|
folder_id = @rs.add_folder "/a/b/c"
|
229
229
|
assert_kind_of Integer, folder_id
|
230
230
|
|
@@ -237,6 +237,124 @@ class RapidshareExtTest < Test::Unit::TestCase
|
|
237
237
|
folder_ids = @rs.folders_hierarchy.keys
|
238
238
|
assert_equal 0, folder_ids.count
|
239
239
|
end
|
240
|
+
|
241
|
+
should "move orphans" do
|
242
|
+
# Create folders
|
243
|
+
folder_a_id = @rs.add_folder "/a"
|
244
|
+
assert_kind_of Integer, folder_a_id
|
245
|
+
assert_not_equal 0, folder_a_id
|
246
|
+
|
247
|
+
folder_b_id = @rs.add_folder "/a/b"
|
248
|
+
assert_kind_of Integer, folder_b_id
|
249
|
+
assert_not_equal 0, folder_b_id
|
250
|
+
|
251
|
+
folder_c_id = @rs.add_folder "/a/b/c"
|
252
|
+
assert_kind_of Integer, folder_c_id
|
253
|
+
assert_not_equal 0, folder_c_id
|
254
|
+
|
255
|
+
@rs.reload!
|
256
|
+
|
257
|
+
assert_true @rs.root_folder? folder_a_id
|
258
|
+
assert_false @rs.root_folder? folder_b_id
|
259
|
+
assert_false @rs.root_folder? folder_c_id
|
260
|
+
|
261
|
+
assert_false @rs.orphan? folder_a_id
|
262
|
+
assert_false @rs.orphan? folder_b_id
|
263
|
+
assert_false @rs.orphan? folder_c_id
|
264
|
+
|
265
|
+
# Delete just folder "/a" to accomplish tree inconsistency
|
266
|
+
@rs.delrealfolder :realfolder => folder_a_id
|
267
|
+
@rs.reload! :validate => false
|
268
|
+
|
269
|
+
assert_equal [folder_b_id], @rs.detect_gaps
|
270
|
+
|
271
|
+
assert_false @rs.root_folder? folder_a_id
|
272
|
+
assert_false @rs.root_folder? folder_b_id
|
273
|
+
assert_false @rs.root_folder? folder_c_id
|
274
|
+
|
275
|
+
assert_false @rs.orphan? folder_a_id
|
276
|
+
assert_true @rs.orphan? folder_b_id
|
277
|
+
assert_true @rs.orphan? folder_c_id
|
278
|
+
|
279
|
+
# Move orphan folders to root folder
|
280
|
+
@rs.move_orphans :to => "/"
|
281
|
+
|
282
|
+
hierarchy_expected = {
|
283
|
+
folder_c_id => {:name=>"c", :parent => folder_b_id, :path => "/b/c"},
|
284
|
+
folder_b_id => {:name=>"b", :parent => 0, :path => "/b"},
|
285
|
+
}
|
286
|
+
assert_equal hierarchy_expected, @rs.folders_hierarchy!
|
287
|
+
end
|
288
|
+
|
289
|
+
should "delete orphans" do
|
290
|
+
# Create folders
|
291
|
+
folder_a_id = @rs.add_folder "/a"
|
292
|
+
assert_kind_of Integer, folder_a_id
|
293
|
+
assert_not_equal 0, folder_a_id
|
294
|
+
|
295
|
+
folder_b_id = @rs.add_folder "/a/b"
|
296
|
+
assert_kind_of Integer, folder_b_id
|
297
|
+
assert_not_equal 0, folder_b_id
|
298
|
+
|
299
|
+
folder_c_id = @rs.add_folder "/a/b/c"
|
300
|
+
assert_kind_of Integer, folder_c_id
|
301
|
+
assert_not_equal 0, folder_c_id
|
302
|
+
|
303
|
+
@rs.reload!
|
304
|
+
|
305
|
+
assert_true @rs.root_folder? folder_a_id
|
306
|
+
assert_false @rs.root_folder? folder_b_id
|
307
|
+
assert_false @rs.root_folder? folder_c_id
|
308
|
+
|
309
|
+
assert_false @rs.orphan? folder_a_id
|
310
|
+
assert_false @rs.orphan? folder_b_id
|
311
|
+
assert_false @rs.orphan? folder_c_id
|
312
|
+
|
313
|
+
# Delete just folder "/a" to accomplish tree inconsistency
|
314
|
+
@rs.delrealfolder :realfolder => folder_a_id
|
315
|
+
@rs.reload! :validate => false
|
316
|
+
|
317
|
+
@rs.remove_orphans!
|
318
|
+
|
319
|
+
hierarchy_expected = {
|
320
|
+
folder_c_id => {:name=>"c", :parent => folder_b_id, :path => "/b/c"},
|
321
|
+
folder_b_id => {:name=>"b", :parent => 0, :path => "/b"},
|
322
|
+
}
|
323
|
+
assert_equal ({}), @rs.folders_hierarchy!
|
324
|
+
end
|
325
|
+
|
326
|
+
should "work with invalid tree" do
|
327
|
+
# Create folders
|
328
|
+
folder_a_id = @rs.add_folder "/a"
|
329
|
+
assert_kind_of Integer, folder_a_id
|
330
|
+
assert_not_equal 0, folder_a_id
|
331
|
+
|
332
|
+
folder_b_id = @rs.add_folder "/a/b"
|
333
|
+
assert_kind_of Integer, folder_b_id
|
334
|
+
assert_not_equal 0, folder_b_id
|
335
|
+
|
336
|
+
folder_c_id = @rs.add_folder "/a/b/c"
|
337
|
+
assert_kind_of Integer, folder_c_id
|
338
|
+
assert_not_equal 0, folder_c_id
|
339
|
+
|
340
|
+
@rs.reload!
|
341
|
+
|
342
|
+
assert_true @rs.root_folder? folder_a_id
|
343
|
+
assert_false @rs.root_folder? folder_b_id
|
344
|
+
assert_false @rs.root_folder? folder_c_id
|
345
|
+
|
346
|
+
assert_false @rs.orphan? folder_a_id
|
347
|
+
assert_false @rs.orphan? folder_b_id
|
348
|
+
assert_false @rs.orphan? folder_c_id
|
349
|
+
|
350
|
+
# Delete just folder "/a" to accomplish tree inconsistency
|
351
|
+
@rs.delrealfolder :realfolder => folder_a_id
|
352
|
+
|
353
|
+
msg = "Directory tree consistency error. Parent folder ##{folder_a_id} for the folder \"/<undefined>/b\" [#{folder_b_id}] could not be found"
|
354
|
+
assert_raise_message(msg) do
|
355
|
+
@rs.reload! :validate => true
|
356
|
+
end
|
357
|
+
end
|
240
358
|
end
|
241
359
|
end
|
242
360
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rapidshare-ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rapidshare
|
@@ -107,7 +107,7 @@ dependencies:
|
|
107
107
|
- - ! '>='
|
108
108
|
- !ruby/object:Gem::Version
|
109
109
|
version: '0'
|
110
|
-
description: Extends the
|
110
|
+
description: Extends the original rapidshare gem with a set of handy features
|
111
111
|
email:
|
112
112
|
- odiszapc@gmail.com
|
113
113
|
executables: []
|