yandex_disk 1.0.0

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 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