yandex_disk 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZDJiNmU3ZWM2ZWUwMzVmMzU0NmJmMTBkMzczZjU4NmY1ODk1OGNiYg==
5
+ data.tar.gz: !binary |-
6
+ NjE3MjRiM2Y0YzAxNmE2ZGFmNmM0ZGQwZGNhZWRlMTFlMTdhNGJkZA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ OTgyMzRkZDUwYmFlNjMyYzU3ZDIwZmViNWVhZGQ4MzkwNGQ5NDhlNmI5OGY3
10
+ ZTM1MzRhMzA0YjMxMDJiMjU3MjA1YmJkYTdhMDBmYWQ5NWI2YzBjNGVhMTc2
11
+ ZDA5NjcyZWRhYjdlODUxMzliYzZjNzdiZDE3YjczYTVjZmNmNWE=
12
+ data.tar.gz: !binary |-
13
+ YTg0OTZjMTU1OTBjMDJhYTcwOTNhYWYyMjI0ZWY1ZDliZTBlYjVkMmZkNjFk
14
+ YjA3Mzk2NWMyZDM2NTM4ZTc3YTNlOWUxNmU3YjRiZTMxOGI2ODkyMzEyOWVl
15
+ MzkyMjA4NjQxMjJmMTk5M2E0M2Y1Yzk5N2ZjYTU2NjhhOGM4NDU=
@@ -0,0 +1,343 @@
1
+ require 'net/http'
2
+ require 'uri'
3
+ require 'zlib'
4
+ require 'base64'
5
+ require 'rexml/document'
6
+
7
+ require 'yandex_disk/cfg'
8
+ require 'yandex_disk/ext'
9
+ require 'yandex_disk/chunked'
10
+
11
+ module YandexDisk
12
+ class RequestError < Exception; end
13
+
14
+ class Api
15
+
16
+ def initialize(login, pwd)
17
+ @token = 'Basic ' + Base64.encode64("#{login}:#{pwd}")
18
+ end
19
+
20
+ # TODO gzip file when sending
21
+ # Example:
22
+ # yd.upload('/home/graph.pdf', 'my/work')
23
+ # => true
24
+ #
25
+ # Arguments:
26
+ # file: path to file
27
+ # path: path to yandex disk directory (default is <b>root</b>)
28
+ # options:
29
+ # chunk_size: file chunk size (default is 100)
30
+ # force: create path structure if not exist (raise <b>RequestError</b> if <b>path</b> not exist for default)
31
+ def upload(file, path = '', options = {})
32
+ # valid file?
33
+ raise RequestError, "File not found." if file.nil? || !File.file?(file)
34
+ # create path
35
+ create_path(path) if options[:force]
36
+ options[:chunk_size] ||= 100
37
+ @file = File.open(file)
38
+ options[:headers] = {'Expect' => '100-continue',
39
+ #'Content-Encoding' => 'gzip',
40
+ 'Transfer-Encoding' => 'chunked',
41
+ 'content-type' => 'application/binary'}
42
+
43
+ send_request(:put, options.merge({:path => File.join( path, File.basename(file) )}))
44
+ @file.close
45
+ return true
46
+ end
47
+
48
+ # Example:
49
+ # yd.download('/home/graph.pdf', '/home')
50
+ # => true
51
+ #
52
+ # Arguments:
53
+ # file: path to yandex disk file
54
+ # save_path: path to save
55
+ def download(file, save_path)
56
+ option = {:path => file,
57
+ :headers => {'TE' => 'chunked',
58
+ 'Accept-Encoding' => 'gzip'}}
59
+
60
+ send_request(:get, option)
61
+
62
+ data = nil
63
+ # unzip if zipped
64
+ if @response.header['Content-Encoding'] == 'gzip'
65
+ sio = StringIO.new( @response.body )
66
+ gz = Zlib::GzipReader.new( sio )
67
+ data = gz.read
68
+ else
69
+ data = @response.body
70
+ end
71
+ File.open(File.join(save_path, file.split('/').last), 'w'){|f| f.write(data)}
72
+
73
+ return true
74
+ end
75
+
76
+ # Example:
77
+ # yd.create_path('/home/my/photos')
78
+ # => true
79
+ #
80
+ # Arguments:
81
+ # path: path to yandex disk directory hierarchy
82
+ def create_path(path)
83
+ c_path = ''
84
+ path.split('/').each do |p|
85
+ next if p.empty?
86
+ c_path << p + '/'
87
+ send_request(:mkcol, {:path => c_path})
88
+ end
89
+ end
90
+ alias_method :mkdir, :create_path
91
+
92
+ # Example:
93
+ # yd.size
94
+ # => {:available => 312312, :used => 3123}
95
+ def size
96
+ body = '<?xml version="1.0" encoding="utf-8"?><D:propfind xmlns:D="DAV:"><D:prop><D:quota-available-bytes/><D:quota-used-bytes/></D:prop></D:propfind>'
97
+ send_propfind(0, {:body => body})
98
+ xml = REXML::Document.new(@response.body)
99
+ prop = 'd:multistatus/d:response/d:propstat/d:prop/'
100
+
101
+ return {:available => xml.elements[prop + 'd:quota-available-bytes'].text.to_i,
102
+ :used => xml.elements[prop + 'd:quota-used-bytes'].text.to_i}
103
+ end
104
+
105
+ # Example:
106
+ # yd.exist?('/home/graph.pdf')
107
+ # => true
108
+ #
109
+ # Arguments:
110
+ # path: path to yandex disk directory or file
111
+ def exist?(path)
112
+ body = '<?xml version="1.0" encoding="utf-8"?><propfind xmlns="DAV:"><prop><displayname/></prop></propfind>'
113
+ send_propfind(0, {:path => path, :body => body})
114
+ return true
115
+ rescue RequestError
116
+ return false
117
+ end
118
+
119
+ # Example:
120
+ # yd.properties('/home/graph.pdf')
121
+ # =>
122
+ # {:name => 'graph.pdf',
123
+ # :created => (Time),
124
+ # :updated => (Time),
125
+ # :type => 'pdf',
126
+ # :size => 42432,
127
+ # :is_file => true,
128
+ # :public_url => nil}
129
+ #
130
+ # Arguments:
131
+ # path: path to yandex disk directory or file
132
+ def properties(path)
133
+ body = '<?xml version="1.0" encoding="utf-8"?><propfind xmlns="DAV:"><prop><displayname/><creationdate/><getlastmodified/><getcontenttype/><getcontentlength/><public_url xmlns="urn:yandex:disk:meta"/></prop></propfind>'
134
+ send_propfind(0, {:path => path, :body => body})
135
+ prop = 'd:multistatus/d:response/d:propstat/d:prop/'
136
+ xml = REXML::Document.new(@response.body)
137
+ type = xml.elements[prop + 'd:getcontenttype'].text
138
+ size = xml.elements[prop + 'd:getcontentlength'].text.to_i
139
+
140
+ return {:name => xml.elements[prop + 'd:displayname'].text,
141
+ :created => xml.elements[prop + 'd:getlastmodified'].text,
142
+ :updated => xml.elements[prop + 'd:getlastmodified'].text,
143
+ :type => type ? type : 'dir',
144
+ :size => size,
145
+ :is_file => size > 0,
146
+ :public_url => xml.elements[prop + 'public_url'].text}
147
+ end
148
+
149
+ # Example:
150
+ # yd.files('/home')
151
+ # =>
152
+ # [{:name => 'graph.pdf',
153
+ # :created => (Time),
154
+ # :updated => (Time),
155
+ # :type => 'pdf',
156
+ # :size => 42432,
157
+ # :is_file => true}]
158
+ #
159
+ # Arguments:
160
+ # path: path to yandex disk directory (default is <b>root</b>)
161
+ # with_root: include information of root directory or not (<b>false</b> for default)
162
+ def files(path = '', with_root = true)
163
+ send_propfind(1, {:path => path})
164
+ xml = REXML::Document.new(@response.body)
165
+ prop = 'd:propstat/d:prop/'
166
+ files = []
167
+ xml.elements.each('d:multistatus/d:response') do |res|
168
+ name = URI.decode(res.elements[prop + 'd:displayname'].text)
169
+ next if !with_root && path.split('/').last == name
170
+ size = res.elements[prop + 'd:getcontentlength'].text.to_i
171
+
172
+ files << {:name => name,
173
+ :path => URI.decode(res.elements['d:href'].text),
174
+ :created => res.elements[prop + 'd:creationdate'].text,
175
+ :updated => res.elements[prop + 'd:getlastmodified'].text,
176
+ :size => size,
177
+ :is_file => size > 0}
178
+ end
179
+ return files
180
+ end
181
+
182
+ # Example:
183
+ # yd.copy('/home/graph.pdf', 'my/work')
184
+ # => true
185
+ #
186
+ # Arguments:
187
+ # from: path to yandex disk directory or file
188
+ # to: path to yandex disk directory
189
+ def copy(from, to)
190
+ move_copy(:copy, from, to)
191
+ end
192
+ alias_method :cp, :copy
193
+
194
+ # Example:
195
+ # yd.move('/home/graph.pdf', 'my/work')
196
+ # => true
197
+ #
198
+ # Arguments:
199
+ # from: path to yandex disk directory or file
200
+ # to: path to yandex disk directory
201
+ def move(from, to)
202
+ move_copy(:move, from, to)
203
+ end
204
+ alias_method :mv, :move
205
+
206
+ # Example:
207
+ # yd.delete('/home/graph.pdf')
208
+ # => true
209
+ #
210
+ # Arguments:
211
+ # path: path to yandex disk directory or file
212
+ def delete(path)
213
+ send_request(:delete, {:path => path})
214
+ end
215
+ alias_method :del, :delete
216
+
217
+ # Example:
218
+ # yd.set_public('/home/graph.pdf')
219
+ # => http://yadi.sk/d/#############
220
+ #
221
+ # Arguments:
222
+ # path: path to yandex disk directory or file
223
+ def set_public(path)
224
+ body = '<propertyupdate xmlns="DAV:"><set><prop><public_url xmlns="urn:yandex:disk:meta">true</public_url></prop></set></propertyupdate>'
225
+ send_request(:proppatch, {:path => path, :body => body})
226
+ xml = REXML::Document.new(@response.body)
227
+ return xml.elements['d:multistatus/d:response/d:propstat/d:prop/public_url'].text
228
+ end
229
+
230
+ # Example:
231
+ # yd.set_private('/home/graph.pdf')
232
+ # => true
233
+ #
234
+ # Arguments:
235
+ # path: path to yandex disk directory or file
236
+ def set_private(path)
237
+ body = '<propertyupdate xmlns="DAV:"><remove><prop><public_url xmlns="urn:yandex:disk:meta" /></prop></remove></propertyupdate>'
238
+ send_request(:proppatch, {:path => path, :body => body})
239
+ xml = REXML::Document.new(@response.body)
240
+ return xml.elements['d:multistatus/d:response/d:propstat/d:prop/public_url'].text.nil?
241
+ end
242
+
243
+ # Example:
244
+ # yd.preview('/home/cat.jpg', 128, '/home/photo')
245
+ # => true
246
+ #
247
+ # Arguments:
248
+ # path: path to yandex disk file
249
+ # size: preview size (for details visit http://api.yandex.com/disk/doc/dg/reference/preview.xml)
250
+ # save_to: path to save
251
+ def preview(path, size, save_to)
252
+ send_request(:get, {:path => path, :preview => size.to_s})
253
+ File.open(File.join(save_to, path.split('/').last), 'w'){|f| f.write(@response.body)}
254
+ end
255
+
256
+ ########## private ##########
257
+ private
258
+
259
+ def create_dest(from, to)
260
+ prop = properties(from)
261
+ to = prop[:is_file] ? to.gsub(/\/$/,'') + '/' + prop[:name] : to
262
+ return '/' + to
263
+ end
264
+
265
+ def move_copy(method, from, to)
266
+ send_request(method, {:path => from,
267
+ :headers => {'Destination' => create_dest(from, to)}})
268
+ end
269
+
270
+ def send_propfind(depth, options = {})
271
+ headers = {:headers => {'Depth' => depth.to_s,
272
+ 'Content-Type' => 'text/xml; charset="utf-8"'}}
273
+ send_request(:propfind, options.merge!(headers))
274
+ end
275
+
276
+ def send_request(method, args = {})
277
+ # headers
278
+ headers = {'Authorization' => @token}
279
+ headers.merge!(args[:headers]) if args[:headers]
280
+ uri = URI.parse(YandexDisk::API_URL)
281
+ # path
282
+ path = ''
283
+ begin
284
+ unless args[:path].blank?
285
+ path = URI.encode( args[:path].split('/').reject{|it| it.blank?}.join('/') )
286
+ raise Exception if path.empty?
287
+ # image preview
288
+ path << "?preview&size=#{args[:preview]}" if args[:preview]
289
+ end
290
+ rescue Exception => e
291
+ raise RequestError, 'Path has bad format.'
292
+ end
293
+ request_path = uri.request_uri + path
294
+ # init
295
+ http = Net::HTTP.new(uri.host, uri.port)
296
+ # ssl
297
+ if uri.scheme == 'https'
298
+ http.use_ssl = true
299
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
300
+ end
301
+ # debug
302
+ http.set_debug_output($stderr) if YandexDisk::DEBUG
303
+ # method
304
+ req = nil
305
+ case method
306
+ when :put then
307
+ req = Net::HTTP::Put.new(request_path, headers)
308
+ req.body_stream = Chunked.new(@file, args[:chunk_size])
309
+ when :get then
310
+ req = Net::HTTP::Get.new(request_path, headers)
311
+ when :mkcol then
312
+ req = Net::HTTP::Mkcol.new(request_path, headers)
313
+ when :propfind then
314
+ req = Net::HTTP::Propfind.new(request_path, headers)
315
+ when :copy then
316
+ req = Net::HTTP::Copy.new(request_path, headers)
317
+ when :move then
318
+ req = Net::HTTP::Move.new(request_path, headers)
319
+ when :delete then
320
+ req = Net::HTTP::Delete.new(request_path, headers)
321
+ when :proppatch
322
+ req = Net::HTTP::Proppatch.new(request_path, headers)
323
+ else
324
+ raise RequestError, "Method #{method} not supported."
325
+ end
326
+ # start
327
+ req.body = args[:body] if args[:body]
328
+ http.start{|h| @response = h.request(req) }
329
+ successful?(method, request_path)
330
+ end
331
+
332
+ def successful?(method, path)
333
+ if [200, 201, 207].include?(@response.code.to_i) ||
334
+ @response.body.include?('resource already exists') ||
335
+ (method == :delete && @response.body.include?('resource not found'))
336
+ true
337
+ else
338
+ raise RequestError, "#{@response.code.to_i} #{@response.message}: #{@response.body} on #{path}"
339
+ end
340
+ end
341
+ end
342
+
343
+ end
@@ -0,0 +1,7 @@
1
+ module YandexDisk
2
+ VERSION = '1.0.0'
3
+ HOME_PAGE = 'https://github.com/denwwer/yandex_disk'
4
+ API_URL = 'https://webdav.yandex.ru'
5
+ # DON'T TURN ON DEBUG FOR PRODUCTION
6
+ DEBUG = false
7
+ end
@@ -0,0 +1,23 @@
1
+ # gist from sasimpson
2
+ module YandexDisk
3
+ class Chunked
4
+ def initialize(data, chunk_size)
5
+ @size = chunk_size
6
+ if data.respond_to? :read
7
+ @file = data
8
+ end
9
+ end
10
+
11
+ def read(foo)
12
+ if @file
13
+ @file.read(@size)
14
+ end
15
+ end
16
+ def eof!
17
+ @file.eof!
18
+ end
19
+ def eof?
20
+ @file.eof?
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ module YandexDisk
2
+ class ::String
3
+ def blank?
4
+ self.nil? || !self || self.strip.empty?
5
+ end
6
+ end
7
+
8
+ class ::Object
9
+ def blank?
10
+ self.nil? || !self || self.empty?
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module YandexDisk
2
+ require 'yandex_disk/api'
3
+
4
+ class << self
5
+ def version
6
+ YandexDisk::VERSION
7
+ end
8
+
9
+ def login(login, pwd)
10
+ Api.new(login, pwd)
11
+ end
12
+ end
13
+ end
data/spec/files/README ADDED
@@ -0,0 +1,6 @@
1
+ Files was deleted for decrease gem size.
2
+ Required files for test:
3
+ sample.txt*
4
+ sample.jpg
5
+
6
+ *will be created automatically when run test
Binary file
@@ -0,0 +1 @@
1
+ Hi developer.
@@ -0,0 +1,39 @@
1
+ # encoding: UTF-8
2
+ require 'simplecov'
3
+ SimpleCov.start
4
+ require 'rubygems'
5
+ require 'bundler/setup'
6
+ require 'yandex_disk'
7
+ require 'fileutils'
8
+
9
+ RSpec.configure do |config|
10
+ config.fail_fast = true
11
+ config.before(:each) do
12
+ init_test_files
13
+ end
14
+ end
15
+
16
+ # login and password for yandex disk
17
+ LOGIN = ''
18
+ PWD = ''
19
+
20
+ # test settings
21
+ FILES_PATH = File.dirname(__FILE__) + '/files'
22
+ DOWNLOAD_PATH = FILES_PATH + '/downloads'
23
+ FILE_TEXT = 'Hi developer.'
24
+
25
+ def init_test_files
26
+ FileUtils.mkdir_p(DOWNLOAD_PATH) if !Dir.exist?(DOWNLOAD_PATH)
27
+ @text_file = FILES_PATH + '/sample.txt'
28
+ File.open(@text_file, 'w+'){|f| f.write(FILE_TEXT)} unless File.file? @text_file
29
+ @text_file.freeze
30
+ @image_file = FILES_PATH + '/sample.jpg'
31
+ @image_file.freeze
32
+ raise Exception, "File sample.jpg not found in #{FILES_PATH}" unless File.file? @image_file
33
+ end
34
+
35
+ def clear!
36
+ @yd.delete('/my').should be_true
37
+ FileUtils.rm_rf DOWNLOAD_PATH
38
+ end
39
+
@@ -0,0 +1,180 @@
1
+ #encoding: UTF-8
2
+ require 'spec_helper'
3
+ require 'net/http'
4
+ require 'uri'
5
+ require 'fastimage'
6
+
7
+ describe YandexDisk do
8
+
9
+ it 'should return version' do
10
+ YandexDisk.version.should equal YandexDisk::VERSION
11
+ end
12
+
13
+ describe 'validate' do
14
+ it 'authorization' do
15
+ yd = YandexDisk.login('', '')
16
+ expect{yd.size}.to raise_error YandexDisk::RequestError
17
+ end
18
+
19
+ it 'file' do
20
+ yd = YandexDisk.login('', '')
21
+ expect{yd.upload('not/exist/file')}.to raise_error YandexDisk::RequestError
22
+ end
23
+ end
24
+
25
+ describe 'api' do
26
+ before(:each) do
27
+ @yd = YandexDisk.login(LOGIN, PWD)
28
+ end
29
+
30
+ it 'should return available and used space' do
31
+ size = @yd.size
32
+ expect(size[:used] > 0 && size[:available] > 0).to be_true
33
+ end
34
+
35
+ it 'should return list of files' do
36
+ @yd.files.each do |item|
37
+ [:name, :path, :created, :updated, :size, :is_file].each{|res| expect(!item[res].to_s.empty?).to be_true}
38
+ end
39
+ end
40
+
41
+ it 'should return file or dir properties' do
42
+ # file
43
+ @yd.upload(@text_file, 'my', {:force => true})
44
+ properties1 = @yd.properties('my/' + File.basename(@text_file))
45
+ [:created, :updated, :type, :size, :is_file].each{|res| expect(properties1[res].to_s.empty?).to be_false}
46
+ properties1[:type].should eq 'text/plain'
47
+ # dir
48
+ dir = '/my/photo'
49
+ @yd.create_path(dir)
50
+ properties2 = @yd.properties(dir)
51
+ properties2[:is_file].should be_false
52
+ clear!
53
+ end
54
+
55
+ describe 'directory' do
56
+ it 'should be created' do
57
+ dir = 'my/photos/cats'
58
+ @yd.create_path(dir).should be_true
59
+ @yd.properties(dir)[:is_file].should be_false
60
+ end
61
+
62
+ it 'should be copied' do
63
+ # create directories with Cyrillic name
64
+ src = 'my/старые файлы'
65
+ des = 'my/здесь новые файлы'
66
+
67
+ @yd.create_path(src)
68
+ @yd.create_path(des)
69
+ # create 2 files
70
+ files = {'file1.txt' => 'data one', 'file2.txt' => 'data two'}
71
+ files.each do |file, text|
72
+ new_file = File.join(FILES_PATH, file)
73
+ File.open(new_file, 'w'){|f| f.write(text)}
74
+ @yd.upload(new_file, src).should be_true
75
+ end
76
+ # copy directory
77
+ @yd.copy(src, des)
78
+ # check files
79
+ @yd.files(src, false).size.should eq 2
80
+ files.each do |file, text|
81
+ download_and_validate(File.join(des, file), text)
82
+ end
83
+ # clear
84
+ files.each{|file, text| File.delete( File.join(FILES_PATH, file) )}
85
+ end
86
+
87
+ after(:each) do
88
+ clear!
89
+ end
90
+ end
91
+
92
+ describe 'file' do
93
+ it 'should be uploaded' do
94
+ @yd.upload(@text_file, 'my', {:force => true}).should be_true
95
+ end
96
+
97
+ it 'should be downloaded and valid' do
98
+ @yd.upload(@text_file, 'my', {:force => true}).should be_true
99
+ path = 'my/' + File.basename(@text_file)
100
+ download_and_validate(path)
101
+ end
102
+ # its related to copy dir
103
+ it 'should by copied to new directory' do
104
+ @yd.upload(@text_file, 'my', {:force => true})
105
+ f_name = File.basename(@text_file)
106
+ file = 'my/' + f_name
107
+ new_path = 'my/text'
108
+ @yd.create_path(new_path)
109
+ @yd.copy(file, new_path)
110
+ # file still exist in src path
111
+ @yd.exist?(file).should be_true
112
+ download_and_validate(File.join(new_path, f_name))
113
+ end
114
+
115
+ it 'should by moved to new directory' do
116
+ @yd.upload(@text_file, 'my', {:force => true})
117
+ f_name = File.basename(@text_file)
118
+ file = 'my/' + f_name
119
+ new_path = 'my/text'
120
+ @yd.create_path(new_path)
121
+ @yd.move(file, new_path)
122
+ # file not exist in src path
123
+ @yd.exist?(file).should be_false
124
+ download_and_validate(File.join(new_path, f_name))
125
+ end
126
+
127
+ it 'should by deleted' do
128
+ # upload file
129
+ @yd.upload(@text_file)
130
+ f_name = File.basename(@text_file)
131
+ download_and_validate(f_name)
132
+ @yd.delete(f_name)
133
+ @yd.exist?(f_name).should be_false
134
+ end
135
+
136
+ it 'should be public'do
137
+ @yd.upload(@image_file, 'my', {:force => true})
138
+ # mask: http://yadi.sk/d/#############
139
+ expect(@yd.set_public('my/' + File.basename(@image_file)) =~ /http:\/\/yadi\.sk\/d\/.+/).to be_true
140
+ end
141
+
142
+ it 'should be private'do
143
+ @yd.upload(@text_file, 'my', {:force => true})
144
+ f_name = 'my/' + File.basename(@text_file)
145
+ # mask: http://yadi.sk/d/#############
146
+ expect(@yd.set_public(f_name) =~ /http:\/\/yadi\.sk\/d\/.+/).to be_true
147
+ expect(@yd.set_private(f_name)).to be_true
148
+ end
149
+
150
+ describe 'preview' do
151
+ before(:each)do
152
+ @yd.upload(@image_file, 'my', {:force => true}).should be_true
153
+ @f_name = File.basename(@image_file)
154
+ end
155
+
156
+ it 'should return image in M size'do
157
+ @yd.preview('my/' + @f_name, 'm', DOWNLOAD_PATH)
158
+ File.file?( File.join(DOWNLOAD_PATH, @f_name) ).should be_true
159
+ end
160
+
161
+ it 'should return image in 300x250 size'do
162
+ @yd.preview('my/' + @f_name, '300x250', DOWNLOAD_PATH)
163
+ FastImage.size( File.join(DOWNLOAD_PATH, @f_name) ).should eq [300, 250]
164
+ end
165
+ end
166
+
167
+ after(:each) do
168
+ clear!
169
+ end
170
+ end
171
+
172
+ end
173
+
174
+ def download_and_validate(download_file, text = FILE_TEXT)
175
+ @yd.download(download_file, DOWNLOAD_PATH).should be_true
176
+ file = download_file.split('/').last
177
+ expect( File.read( File.join(DOWNLOAD_PATH, file) ) ).to eq(text)
178
+ end
179
+
180
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yandex_disk
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Boris Murga
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-10-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: simplecov
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: fastimage
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: An easy-to-use client library for Yandex Disk API
56
+ email: denwwer.c4@gmail.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - lib/yandex_disk.rb
62
+ - lib/yandex_disk/chunked.rb
63
+ - lib/yandex_disk/ext.rb
64
+ - lib/yandex_disk/api.rb
65
+ - lib/yandex_disk/cfg.rb
66
+ - spec/spec_helper.rb
67
+ - spec/files/README
68
+ - spec/files/sample.jpg
69
+ - spec/files/sample.txt
70
+ - spec/yandex_disk_spec.rb
71
+ homepage: https://github.com/denwwer/yandex_disk
72
+ licenses:
73
+ - MIT
74
+ metadata: {}
75
+ post_install_message: Thanks for installation, check https://github.com/denwwer/yandex_disk
76
+ for news.
77
+ rdoc_options: []
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ! '>='
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirements: []
91
+ rubyforge_project:
92
+ rubygems_version: 2.1.9
93
+ signing_key:
94
+ specification_version: 4
95
+ summary: API for Yandex Disk
96
+ test_files:
97
+ - spec/spec_helper.rb
98
+ - spec/files/README
99
+ - spec/files/sample.jpg
100
+ - spec/files/sample.txt
101
+ - spec/yandex_disk_spec.rb