net-sftp 2.0.5 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig ADDED
Binary file
@@ -1,4 +1,14 @@
1
1
 
2
+ === 2.1.0 / 06 Feb 2013
3
+
4
+ * Added public cert. All gem releases are now signed. See INSTALL in readme.
5
+ * Remove self-require, it causes a warning in Ruby 1.9.2. [jbarnette]
6
+ * Allow for upload to use the filename of the local file by default [czarneckid]
7
+ * Properly handle receiving less data than requested. [thedarkone]
8
+ * Added option to create directory on directory upload [Pablo Merino]
9
+ * Remove a warnings in tests [kachick]
10
+
11
+
2
12
  === 2.0.5 / 19 Aug 2010
3
13
 
4
14
  * Fixed missing StringIO exception in download! [Toby Bryans, Delano Mandelbaum]
data/LICENSE.txt ADDED
@@ -0,0 +1,19 @@
1
+ Copyright © 2008 Jamis Buck
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the ‘Software’), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
data/README.rdoc CHANGED
@@ -1,6 +1,12 @@
1
1
  = Net::SFTP
2
2
 
3
- * http://net-ssh.rubyforge.org/sftp
3
+ * Docs: http://net-ssh.github.com/net-sftp
4
+ * Issues: https://github.com/net-ssh/net-sftp/issues
5
+ * Codes: https://github.com/net-ssh/net-sftp
6
+ * Email: net-ssh@solutious.com
7
+
8
+ <em>As of v2.1.0, all gem releases are signed. See INSTALL.</em>
9
+
4
10
 
5
11
  == DESCRIPTION:
6
12
 
@@ -63,6 +69,19 @@ If you wish to run the tests, you'll need:
63
69
 
64
70
  * gem install net-sftp (might need sudo privileges)
65
71
 
72
+ However, in order to be sure the code you're installing hasn't been tampered with, it's recommended that you verify the signiture[http://docs.rubygems.org/read/chapter/21]. To do this, you need to add my public key as a trusted certificate (you only need to do this once):
73
+
74
+ # Add the public key as a trusted certificate
75
+ # (You only need to do this once)
76
+ $ curl -O https://raw.github.com/net-ssh/net-ssh/master/gem-public_cert.pem
77
+ $ gem cert --add gem-public_cert.pem
78
+
79
+ Then, when install the gem, do so with high security:
80
+
81
+ $ gem install net-ssh -P HighSecurity
82
+
83
+ If you don't add the public key, you'll see an error like "Couldn't verify data signature". If you're still having trouble let me know and I'll give you a hand.
84
+
66
85
  Or, if you prefer to do it the hard way (sans Rubygems):
67
86
 
68
87
  * tar xzf net-ssh-*.tgz
data/Rakefile CHANGED
@@ -1,30 +1,54 @@
1
- $LOAD_PATH.unshift "../net-ssh/lib"
2
- require './lib/net/sftp/version'
1
+ require "rubygems"
2
+ require "rake"
3
+ require "rake/clean"
4
+ require "rdoc/task"
3
5
 
4
- begin
5
- require 'echoe'
6
- rescue LoadError
7
- abort "You'll need to have `echoe' installed to use Net::SFTP's Rakefile"
8
- end
6
+ task :default => ["build"]
7
+ CLEAN.include [ 'pkg', 'rdoc' ]
8
+ name = "net-sftp"
9
9
 
10
+ $:.unshift File.join(File.dirname(__FILE__), 'lib')
11
+ require "net/sftp/version"
10
12
  version = Net::SFTP::Version::STRING.dup
11
- if ENV['SNAPSHOT'].to_i == 1
12
- version << "." << Time.now.utc.strftime("%Y%m%d%H%M%S")
13
- end
14
13
 
15
- Echoe.new('net-sftp', version) do |p|
16
- p.project = "net-ssh"
17
- p.changelog = "CHANGELOG.rdoc"
14
+ begin
15
+ require "jeweler"
16
+ Jeweler::Tasks.new do |s|
17
+ s.version = version
18
+ s.name = name
19
+ s.rubyforge_project = s.name
20
+ s.summary = "A pure Ruby implementation of the SFTP client protocol"
21
+ s.description = s.summary
22
+ s.email = "net-ssh@solutious.com"
23
+ s.homepage = "https://github.com/net-ssh/net-sftp"
24
+ s.authors = ["Jamis Buck", "Delano Mandelbaum"]
18
25
 
19
- p.author = "Jamis Buck"
20
- p.email = "netsftp@solutious.com"
21
- p.summary = "A pure Ruby implementation of the SFTP client protocol"
22
- p.url = "http://net-ssh.rubyforge.org/sftp"
26
+ s.add_dependency 'net-ssh', ">=2.6.4"
23
27
 
24
- p.dependencies = ["net-ssh >=2.0.9"]
28
+ s.add_development_dependency 'test-unit'
29
+ s.add_development_dependency 'mocha'
25
30
 
26
- p.need_zip = true
27
- p.include_rakefile = true
31
+ s.license = "MIT"
28
32
 
29
- p.rdoc_pattern = /^(lib|README.rdoc|CHANGELOG.rdoc)/
33
+ s.signing_key = File.join('/mnt/gem/', 'gem-private_key.pem')
34
+ s.cert_chain = ['gem-public_cert.pem']
35
+ end
36
+ Jeweler::GemcutterTasks.new
37
+ rescue LoadError
38
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
39
+ end
40
+
41
+ extra_files = %w[LICENSE.txt THANKS.txt CHANGES.txt ]
42
+ RDoc::Task.new do |rdoc|
43
+ rdoc.rdoc_dir = "rdoc"
44
+ rdoc.title = "#{name} #{version}"
45
+ rdoc.generator = 'hanna' # gem install hanna-nouveau
46
+ rdoc.main = 'README.rdoc'
47
+ rdoc.rdoc_files.include("README*")
48
+ rdoc.rdoc_files.include("bin/*.rb")
49
+ rdoc.rdoc_files.include("lib/**/*.rb")
50
+ extra_files.each { |file|
51
+ rdoc.rdoc_files.include(file) if File.exists?(file)
52
+ }
30
53
  end
54
+
@@ -0,0 +1,20 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDNjCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQUFADBBMQ8wDQYDVQQDDAZkZWxh
3
+ bm8xGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZFgNj
4
+ b20wHhcNMTMwMjA2MTE1NzQ1WhcNMTQwMjA2MTE1NzQ1WjBBMQ8wDQYDVQQDDAZk
5
+ ZWxhbm8xGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZ
6
+ FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDg1hMtl0XsMuUK
7
+ AKTgYWv3gjj7vuEsE2EjT+vyBg8/LpqVVwZziiaebJT9IZiQ+sCFqbiakj0b53pI
8
+ hg1yOaBEmH6/W0L7rwzqaRV9sW1eJs9JxFYQCnd67zUnzj8nnRlOjG+hhIG+Vsij
9
+ npsGbt28pefuNZJjO5q2clAlfSniIIHfIsU7/StEYu6FUGOjnwryZ0r5yJlr9RrE
10
+ Gs+q0DW8QnZ9UpAfuDFQZuIqeKQFFLE7nMmCGaA+0BN1nLl3fVHNbLHq7Avk8+Z+
11
+ ZuuvkdscbHlO/l+3xCNQ5nUnHwq0ADAbMLOlmiYYzqXoWLjmeI6me/clktJCfN2R
12
+ oZG3UQvvAgMBAAGjOTA3MAkGA1UdEwQCMAAwHQYDVR0OBBYEFMSJOEtHzE4l0azv
13
+ M0JK0kKNToK1MAsGA1UdDwQEAwIEsDANBgkqhkiG9w0BAQUFAAOCAQEAtOdE73qx
14
+ OH2ydi9oT2hS5f9G0y1Z70Tlwh+VGExyfxzVE9XwC+iPpJxNraiHYgF/9/oky7ZZ
15
+ R9q0/tJneuhAenZdiQkX7oi4O3v9wRS6YHoWBxMPFKVRLNTzvVJsbmfpCAlp5/5g
16
+ ps4wQFy5mibElGVlOobf/ghqZ25HS9J6kd0/C/ry0AUtTogsL7TxGwT4kbCx63ub
17
+ 3vywEEhsJUzfd97GCABmtQfRTldX/j7F1z/5wd8p+hfdox1iibds9ZtfaZA3KzKn
18
+ kchWN9B6zg9r1XMQ8BM2Jz0XoPanPe354+lWwjpkRKbFow/ZbQHcCLCq24+N6b6g
19
+ dgKfNDzwiDpqCA==
20
+ -----END CERTIFICATE-----
@@ -318,7 +318,6 @@ module Net; module SFTP; module Operations
318
318
  request = sftp.read(entry.handle, entry.offset, read_size, &method(:on_read))
319
319
  request[:entry] = entry
320
320
  request[:offset] = entry.offset
321
- entry.offset += read_size
322
321
  end
323
322
 
324
323
  # Called when a read from a file finishes. If the read was successful
@@ -335,6 +334,7 @@ module Net; module SFTP; module Operations
335
334
  elsif !response.ok?
336
335
  raise "read #{entry.remote}: #{response}"
337
336
  else
337
+ entry.offset += response[:data].bytesize
338
338
  update_progress(:get, entry, response.request[:offset], response[:data])
339
339
  entry.sink.write(response[:data])
340
340
  download_next_chunk(entry)
@@ -1,5 +1,4 @@
1
1
  require 'net/ssh/loggable'
2
- require 'net/sftp/operations/file'
3
2
 
4
3
  module Net; module SFTP; module Operations
5
4
 
@@ -30,6 +30,9 @@ module Net; module SFTP; module Operations
30
30
  # This will upload "/path/to/directory", it's contents, it's subdirectories,
31
31
  # and their contents, recursively, to "/path/to/remote" on the remote server.
32
32
  #
33
+ # For uploading a directory without creating it, do
34
+ # sftp.upload!("/path/to/directory", "/path/to/remote", :mkdir => false)
35
+ #
33
36
  # If you want to send data to a file on the remote server, but the data is
34
37
  # in memory, you can pass an IO object and upload it's contents:
35
38
  #
@@ -157,12 +160,17 @@ module Net; module SFTP; module Operations
157
160
  @remote_cwd = remote
158
161
 
159
162
  @active += 1
160
- sftp.mkdir(remote) do |response|
161
- @active -= 1
162
- raise StatusException.new(response, "mkdir `#{remote}'") unless response.ok?
163
- (options[:requests] || RECURSIVE_READERS).to_i.times do
164
- break unless process_next_entry
163
+ if @options[:mkdir]
164
+ sftp.mkdir(remote) do |response|
165
+ @active -= 1
166
+ raise StatusException.new(response, "mkdir `#{remote}'") unless response.ok?
167
+ (options[:requests] || RECURSIVE_READERS).to_i.times do
168
+ break unless process_next_entry
169
+ end
165
170
  end
171
+ else
172
+ @active -= 1
173
+ process_next_entry
166
174
  end
167
175
  else
168
176
  raise ArgumentError, "expected a file to upload" unless local.respond_to?(:read) || ::File.exists?(local)
@@ -94,12 +94,12 @@ module Net; module SFTP
94
94
  #
95
95
  # uploader = sftp.upload("/local/path", "/remote/path")
96
96
  # uploader.wait
97
- def upload(local, remote, options={}, &block)
97
+ def upload(local, remote = File.basename(local), options={}, &block)
98
98
  Operations::Upload.new(self, local, remote, options, &block)
99
99
  end
100
100
 
101
101
  # Identical to #upload, but blocks until the upload is complete.
102
- def upload!(local, remote, options={}, &block)
102
+ def upload!(local, remote = File.basename(local), options={}, &block)
103
103
  upload(local, remote, options, &block).wait
104
104
  end
105
105
 
@@ -5,8 +5,8 @@ module Net; module SFTP
5
5
  # Describes the current version of the Net::SFTP library.
6
6
  class Version < Net::SSH::Version
7
7
  MAJOR = 2
8
- MINOR = 0
9
- TINY = 5
8
+ MINOR = 1
9
+ TINY = 0
10
10
 
11
11
  # The current version, as a Version instance
12
12
  CURRENT = new(MAJOR, MINOR, TINY)
data/net-sftp.gemspec CHANGED
@@ -1,34 +1,106 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
1
4
  # -*- encoding: utf-8 -*-
2
5
 
3
6
  Gem::Specification.new do |s|
4
- s.name = %q{net-sftp}
5
- s.version = "2.0.5"
7
+ s.name = "net-sftp"
8
+ s.version = "2.1.0"
6
9
 
7
- s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
- s.authors = ["Jamis Buck"]
9
- s.date = %q{2010-08-19}
10
- s.description = %q{A pure Ruby implementation of the SFTP client protocol}
11
- s.email = %q{netsftp@solutious.com}
12
- s.extra_rdoc_files = ["CHANGELOG.rdoc", "lib/net/sftp/constants.rb", "lib/net/sftp/errors.rb", "lib/net/sftp/operations/dir.rb", "lib/net/sftp/operations/download.rb", "lib/net/sftp/operations/file.rb", "lib/net/sftp/operations/file_factory.rb", "lib/net/sftp/operations/upload.rb", "lib/net/sftp/packet.rb", "lib/net/sftp/protocol/01/attributes.rb", "lib/net/sftp/protocol/01/base.rb", "lib/net/sftp/protocol/01/name.rb", "lib/net/sftp/protocol/02/base.rb", "lib/net/sftp/protocol/03/base.rb", "lib/net/sftp/protocol/04/attributes.rb", "lib/net/sftp/protocol/04/base.rb", "lib/net/sftp/protocol/04/name.rb", "lib/net/sftp/protocol/05/base.rb", "lib/net/sftp/protocol/06/attributes.rb", "lib/net/sftp/protocol/06/base.rb", "lib/net/sftp/protocol/base.rb", "lib/net/sftp/protocol.rb", "lib/net/sftp/request.rb", "lib/net/sftp/response.rb", "lib/net/sftp/session.rb", "lib/net/sftp/version.rb", "lib/net/sftp.rb", "README.rdoc"]
13
- s.files = ["CHANGELOG.rdoc", "lib/net/sftp/constants.rb", "lib/net/sftp/errors.rb", "lib/net/sftp/operations/dir.rb", "lib/net/sftp/operations/download.rb", "lib/net/sftp/operations/file.rb", "lib/net/sftp/operations/file_factory.rb", "lib/net/sftp/operations/upload.rb", "lib/net/sftp/packet.rb", "lib/net/sftp/protocol/01/attributes.rb", "lib/net/sftp/protocol/01/base.rb", "lib/net/sftp/protocol/01/name.rb", "lib/net/sftp/protocol/02/base.rb", "lib/net/sftp/protocol/03/base.rb", "lib/net/sftp/protocol/04/attributes.rb", "lib/net/sftp/protocol/04/base.rb", "lib/net/sftp/protocol/04/name.rb", "lib/net/sftp/protocol/05/base.rb", "lib/net/sftp/protocol/06/attributes.rb", "lib/net/sftp/protocol/06/base.rb", "lib/net/sftp/protocol/base.rb", "lib/net/sftp/protocol.rb", "lib/net/sftp/request.rb", "lib/net/sftp/response.rb", "lib/net/sftp/session.rb", "lib/net/sftp/version.rb", "lib/net/sftp.rb", "Rakefile", "README.rdoc", "setup.rb", "test/common.rb", "test/protocol/01/test_attributes.rb", "test/protocol/01/test_base.rb", "test/protocol/01/test_name.rb", "test/protocol/02/test_base.rb", "test/protocol/03/test_base.rb", "test/protocol/04/test_attributes.rb", "test/protocol/04/test_base.rb", "test/protocol/04/test_name.rb", "test/protocol/05/test_base.rb", "test/protocol/06/test_attributes.rb", "test/protocol/06/test_base.rb", "test/protocol/test_base.rb", "test/test_all.rb", "test/test_dir.rb", "test/test_download.rb", "test/test_file.rb", "test/test_file_factory.rb", "test/test_packet.rb", "test/test_protocol.rb", "test/test_request.rb", "test/test_response.rb", "test/test_session.rb", "test/test_upload.rb", "Manifest", "net-sftp.gemspec"]
14
- s.homepage = %q{http://net-ssh.rubyforge.org/sftp}
15
- s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Net-sftp", "--main", "README.rdoc"]
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jamis Buck", "Delano Mandelbaum"]
12
+ s.cert_chain = ["gem-public_cert.pem"]
13
+ s.date = "2013-02-06"
14
+ s.description = "A pure Ruby implementation of the SFTP client protocol"
15
+ s.email = "net-ssh@solutious.com"
16
+ s.extra_rdoc_files = [
17
+ "LICENSE.txt",
18
+ "README.rdoc"
19
+ ]
20
+ s.files = [
21
+ "CHANGES.txt",
22
+ "LICENSE.txt",
23
+ "Manifest",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "gem-public_cert.pem",
27
+ "lib/net/sftp.rb",
28
+ "lib/net/sftp/constants.rb",
29
+ "lib/net/sftp/errors.rb",
30
+ "lib/net/sftp/operations/dir.rb",
31
+ "lib/net/sftp/operations/download.rb",
32
+ "lib/net/sftp/operations/file.rb",
33
+ "lib/net/sftp/operations/file_factory.rb",
34
+ "lib/net/sftp/operations/upload.rb",
35
+ "lib/net/sftp/packet.rb",
36
+ "lib/net/sftp/protocol.rb",
37
+ "lib/net/sftp/protocol/01/attributes.rb",
38
+ "lib/net/sftp/protocol/01/base.rb",
39
+ "lib/net/sftp/protocol/01/name.rb",
40
+ "lib/net/sftp/protocol/02/base.rb",
41
+ "lib/net/sftp/protocol/03/base.rb",
42
+ "lib/net/sftp/protocol/04/attributes.rb",
43
+ "lib/net/sftp/protocol/04/base.rb",
44
+ "lib/net/sftp/protocol/04/name.rb",
45
+ "lib/net/sftp/protocol/05/base.rb",
46
+ "lib/net/sftp/protocol/06/attributes.rb",
47
+ "lib/net/sftp/protocol/06/base.rb",
48
+ "lib/net/sftp/protocol/base.rb",
49
+ "lib/net/sftp/request.rb",
50
+ "lib/net/sftp/response.rb",
51
+ "lib/net/sftp/session.rb",
52
+ "lib/net/sftp/version.rb",
53
+ "net-sftp.gemspec",
54
+ "setup.rb",
55
+ "test/common.rb",
56
+ "test/protocol/01/test_attributes.rb",
57
+ "test/protocol/01/test_base.rb",
58
+ "test/protocol/01/test_name.rb",
59
+ "test/protocol/02/test_base.rb",
60
+ "test/protocol/03/test_base.rb",
61
+ "test/protocol/04/test_attributes.rb",
62
+ "test/protocol/04/test_base.rb",
63
+ "test/protocol/04/test_name.rb",
64
+ "test/protocol/05/test_base.rb",
65
+ "test/protocol/06/test_attributes.rb",
66
+ "test/protocol/06/test_base.rb",
67
+ "test/protocol/test_base.rb",
68
+ "test/test_all.rb",
69
+ "test/test_dir.rb",
70
+ "test/test_download.rb",
71
+ "test/test_file.rb",
72
+ "test/test_file_factory.rb",
73
+ "test/test_packet.rb",
74
+ "test/test_protocol.rb",
75
+ "test/test_request.rb",
76
+ "test/test_response.rb",
77
+ "test/test_session.rb",
78
+ "test/test_upload.rb"
79
+ ]
80
+ s.homepage = "https://github.com/net-ssh/net-sftp"
81
+ s.licenses = ["MIT"]
16
82
  s.require_paths = ["lib"]
17
- s.rubyforge_project = %q{net-ssh}
18
- s.rubygems_version = %q{1.3.7}
19
- s.summary = %q{A pure Ruby implementation of the SFTP client protocol}
20
- s.test_files = ["test/test_all.rb"]
83
+ s.rubyforge_project = "net-sftp"
84
+ s.rubygems_version = "1.8.25"
85
+ s.signing_key = "/mnt/gem/gem-private_key.pem"
86
+ s.summary = "A pure Ruby implementation of the SFTP client protocol"
21
87
 
22
88
  if s.respond_to? :specification_version then
23
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
24
89
  s.specification_version = 3
25
90
 
26
91
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
27
- s.add_runtime_dependency(%q<net-ssh>, [">= 2.0.9"])
92
+ s.add_runtime_dependency(%q<net-ssh>, [">= 2.6.4"])
93
+ s.add_development_dependency(%q<test-unit>, [">= 0"])
94
+ s.add_development_dependency(%q<mocha>, [">= 0"])
28
95
  else
29
- s.add_dependency(%q<net-ssh>, [">= 2.0.9"])
96
+ s.add_dependency(%q<net-ssh>, [">= 2.6.4"])
97
+ s.add_dependency(%q<test-unit>, [">= 0"])
98
+ s.add_dependency(%q<mocha>, [">= 0"])
30
99
  end
31
100
  else
32
- s.add_dependency(%q<net-ssh>, [">= 2.0.9"])
101
+ s.add_dependency(%q<net-ssh>, [">= 2.6.4"])
102
+ s.add_dependency(%q<test-unit>, [">= 0"])
103
+ s.add_dependency(%q<mocha>, [">= 0"])
33
104
  end
34
105
  end
106
+
data/test/common.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'test/unit'
2
- require 'mocha'
2
+ require 'mocha/setup'
3
3
  require 'stringio'
4
4
 
5
5
  begin
data/test/test_all.rb CHANGED
@@ -3,5 +3,5 @@
3
3
  #puts Net::SSH::Version::CURRENT
4
4
  require 'common'
5
5
  Dir.chdir(File.dirname(__FILE__)) do
6
- Dir['**/test_*.rb'].each { |file| require(file) }
6
+ Dir['**/test_*.rb'].each { |file| require(file) unless file == File.basename(__FILE__) }
7
7
  end
@@ -1,6 +1,8 @@
1
1
  require "common"
2
2
 
3
3
  class DownloadTest < Net::SFTP::TestCase
4
+ FXP_DATA_CHUNK_SIZE = 1024
5
+
4
6
  def setup
5
7
  prepare_progress!
6
8
  end
@@ -30,6 +32,19 @@ class DownloadTest < Net::SFTP::TestCase
30
32
  assert_equal text, file.string
31
33
  end
32
34
 
35
+ def test_download_large_file_should_handle_too_large_read_size
36
+ local = "/path/to/local"
37
+ remote = "/path/to/remote"
38
+ text = "0123456789" * 1024
39
+
40
+ # some servers put upper bound on the max read_size value and send less data than requested
41
+ too_large_read_size = FXP_DATA_CHUNK_SIZE + 1
42
+ file = prepare_large_file_download(local, remote, text, too_large_read_size)
43
+
44
+ assert_scripted_command { sftp.download(remote, local, :read_size => too_large_read_size) }
45
+ assert_equal text, file.string
46
+ end
47
+
33
48
  def test_download_large_file_with_progress_should_report_progress
34
49
  local = "/path/to/local"
35
50
  remote = "/path/to/remote"
@@ -121,25 +136,29 @@ class DownloadTest < Net::SFTP::TestCase
121
136
  channel.gets_packet(FXP_HANDLE, :long, 0, :string, "handle")
122
137
  channel.sends_packet(FXP_READ, :long, 1, :string, "handle", :int64, 0, :long, 32_000)
123
138
  channel.gets_packet(FXP_DATA, :long, 1, :string, text)
124
- channel.sends_packet(FXP_READ, :long, 2, :string, "handle", :int64, 32_000, :long, 32_000)
139
+ channel.sends_packet(FXP_READ, :long, 2, :string, "handle", :int64, text.bytesize, :long, 32_000)
125
140
  channel.gets_packet(FXP_STATUS, :long, 2, :long, 1)
126
141
  channel.sends_packet(FXP_CLOSE, :long, 3, :string, "handle")
127
142
  channel.gets_packet(FXP_STATUS, :long, 3, :long, 0)
128
143
  end
129
144
  end
130
145
 
131
- def prepare_large_file_download(local, remote, text)
146
+ def prepare_large_file_download(local, remote, text, requested_chunk_size = FXP_DATA_CHUNK_SIZE)
132
147
  expect_sftp_session :server_version => 3 do |channel|
133
148
  channel.sends_packet(FXP_OPEN, :long, 0, :string, remote, :long, 0x01, :long, 0)
134
149
  channel.gets_packet(FXP_HANDLE, :long, 0, :string, "handle")
135
- 10.times do |n|
136
- channel.sends_packet(FXP_READ, :long, n+1, :string, "handle", :int64, n*1024, :long, 1024)
137
- channel.gets_packet(FXP_DATA, :long, n+1, :string, text[n*1024,1024])
150
+ offset = 0
151
+ data_packet_count = (text.bytesize / FXP_DATA_CHUNK_SIZE.to_f).ceil
152
+ data_packet_count.times do |n|
153
+ payload = text[n*FXP_DATA_CHUNK_SIZE,FXP_DATA_CHUNK_SIZE]
154
+ channel.sends_packet(FXP_READ, :long, n+1, :string, "handle", :int64, offset, :long, requested_chunk_size)
155
+ offset += payload.bytesize
156
+ channel.gets_packet(FXP_DATA, :long, n+1, :string, payload)
138
157
  end
139
- channel.sends_packet(FXP_READ, :long, 11, :string, "handle", :int64, 10240, :long, 1024)
140
- channel.gets_packet(FXP_STATUS, :long, 11, :long, 1)
141
- channel.sends_packet(FXP_CLOSE, :long, 12, :string, "handle")
142
- channel.gets_packet(FXP_STATUS, :long, 12, :long, 0)
158
+ channel.sends_packet(FXP_READ, :long, data_packet_count + 1, :string, "handle", :int64, offset, :long, requested_chunk_size)
159
+ channel.gets_packet(FXP_STATUS, :long, data_packet_count + 1, :long, 1)
160
+ channel.sends_packet(FXP_CLOSE, :long, data_packet_count + 2, :string, "handle")
161
+ channel.gets_packet(FXP_STATUS, :long, data_packet_count + 2, :long, 0)
143
162
  end
144
163
 
145
164
  file = StringIO.new
@@ -182,6 +201,8 @@ class DownloadTest < Net::SFTP::TestCase
182
201
  # <- 15:STATUS(0)
183
202
 
184
203
  def prepare_directory_tree_download(local, remote)
204
+ file1_contents = "contents of file1"
205
+ file2_contents = "contents of file2"
185
206
  expect_sftp_session :server_version => 3 do |channel|
186
207
  channel.sends_packet(FXP_OPENDIR, :long, 0, :string, remote)
187
208
  channel.gets_packet(FXP_HANDLE, :long, 0, :string, "dir1")
@@ -214,8 +235,8 @@ class DownloadTest < Net::SFTP::TestCase
214
235
  channel.sends_packet(FXP_OPEN, :long, 8, :string, File.join(remote, "subdir1", "file2"), :long, 0x01, :long, 0)
215
236
  channel.sends_packet(FXP_READDIR, :long, 9, :string, "dir2")
216
237
 
217
- channel.gets_packet(FXP_DATA, :long, 6, :string, "contents of file1")
218
- channel.sends_packet(FXP_READ, :long, 10, :string, "file1", :int64, 32_000, :long, 32_000)
238
+ channel.gets_packet(FXP_DATA, :long, 6, :string, file1_contents)
239
+ channel.sends_packet(FXP_READ, :long, 10, :string, "file1", :int64, file1_contents.bytesize, :long, 32_000)
219
240
 
220
241
  channel.gets_packet(FXP_STATUS, :long, 7, :long, 0)
221
242
  channel.gets_packet(FXP_HANDLE, :long, 8, :string, "file2")
@@ -227,8 +248,8 @@ class DownloadTest < Net::SFTP::TestCase
227
248
  channel.gets_packet(FXP_STATUS, :long, 10, :long, 1)
228
249
  channel.sends_packet(FXP_CLOSE, :long, 13, :string, "file1")
229
250
 
230
- channel.gets_packet(FXP_DATA, :long, 11, :string, "contents of file2")
231
- channel.sends_packet(FXP_READ, :long, 14, :string, "file2", :int64, 32_000, :long, 32_000)
251
+ channel.gets_packet(FXP_DATA, :long, 11, :string, file2_contents)
252
+ channel.sends_packet(FXP_READ, :long, 14, :string, "file2", :int64, file2_contents.bytesize, :long, 32_000)
232
253
 
233
254
  channel.gets_packet(FXP_STATUS, :long, 12, :long, 0)
234
255
  channel.gets_packet(FXP_STATUS, :long, 13, :long, 0)
data/test/test_upload.rb CHANGED
@@ -10,6 +10,20 @@ class UploadTest < Net::SFTP::TestCase
10
10
  assert_scripted_command { sftp.upload("/path/to/local", "/path/to/remote") }
11
11
  end
12
12
 
13
+ def test_upload_file_without_remote_uses_filename_of_local_file
14
+ expect_file_transfer("/path/to/local", "local", "here are the contents")
15
+
16
+ assert_scripted_command do
17
+ sftp.upload("/path/to/local") { |*args| record_progress(args) }
18
+ end
19
+
20
+ assert_progress_reported_open(:remote => "local")
21
+ assert_progress_reported_put(0, "here are the contents", :remote => "local")
22
+ assert_progress_reported_close(:remote => "local")
23
+ assert_progress_reported_finish
24
+ assert_no_more_reported_events
25
+ end
26
+
13
27
  def test_upload_file_with_progress_should_report_progress
14
28
  expect_file_transfer("/path/to/local", "/path/to/remote", "here are the contents")
15
29
 
@@ -96,7 +110,7 @@ class UploadTest < Net::SFTP::TestCase
96
110
  prepare_directory
97
111
 
98
112
  assert_scripted_command do
99
- sftp.upload("/path/to/local", "/path/to/remote")
113
+ sftp.upload("/path/to/local", "/path/to/remote", :mkdir => true)
100
114
  end
101
115
  end
102
116
 
@@ -104,7 +118,7 @@ class UploadTest < Net::SFTP::TestCase
104
118
  prepare_directory
105
119
 
106
120
  assert_scripted_command do
107
- sftp.upload("/path/to/local", "/path/to/remote") { |*args| record_progress(args) }
121
+ sftp.upload("/path/to/local", "/path/to/remote", :mkdir => true) { |*args| record_progress(args) }
108
122
  end
109
123
 
110
124
  assert_progress_reported_open(:remote => "/path/to/remote/file1")
@@ -216,4 +230,4 @@ class UploadTest < Net::SFTP::TestCase
216
230
 
217
231
  expect_file(local, data)
218
232
  end
219
- end
233
+ end
metadata CHANGED
@@ -1,76 +1,108 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: net-sftp
3
- version: !ruby/object:Gem::Version
4
- hash: 5
5
- prerelease: false
6
- segments:
7
- - 2
8
- - 0
9
- - 5
10
- version: 2.0.5
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.1.0
5
+ prerelease:
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Jamis Buck
9
+ - Delano Mandelbaum
14
10
  autorequire:
15
11
  bindir: bin
16
- cert_chain: []
17
-
18
- date: 2010-08-19 00:00:00 -04:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ cert_chain:
13
+ - !binary |-
14
+ LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUROakNDQWg2Z0F3SUJB
15
+ Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJCTVE4d0RRWURWUVFEREFaa1pX
16
+ eGgKYm04eEdUQVhCZ29Ka2lhSmsvSXNaQUVaRmdsemIyeDFkR2x2ZFhNeEV6
17
+ QVJCZ29Ka2lhSmsvSXNaQUVaRmdOagpiMjB3SGhjTk1UTXdNakEyTVRFMU56
18
+ UTFXaGNOTVRRd01qQTJNVEUxTnpRMVdqQkJNUTh3RFFZRFZRUUREQVprClpX
19
+ eGhibTh4R1RBWEJnb0praWFKay9Jc1pBRVpGZ2x6YjJ4MWRHbHZkWE14RXpB
20
+ UkJnb0praWFKay9Jc1pBRVoKRmdOamIyMHdnZ0VpTUEwR0NTcUdTSWIzRFFF
21
+ QkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEZzFoTXRsMFhzTXVVSwpBS1RnWVd2
22
+ M2dqajd2dUVzRTJFalQrdnlCZzgvTHBxVlZ3WnppaWFlYkpUOUlaaVErc0NG
23
+ cWJpYWtqMGI1M3BJCmhnMXlPYUJFbUg2L1cwTDdyd3pxYVJWOXNXMWVKczlK
24
+ eEZZUUNuZDY3elVuemo4bm5SbE9qRytoaElHK1ZzaWoKbnBzR2J0MjhwZWZ1
25
+ TlpKak81cTJjbEFsZlNuaUlJSGZJc1U3L1N0RVl1NkZVR09qbndyeVowcjV5
26
+ SmxyOVJyRQpHcytxMERXOFFuWjlVcEFmdURGUVp1SXFlS1FGRkxFN25NbUNH
27
+ YUErMEJOMW5MbDNmVkhOYkxIcTdBdms4K1orClp1dXZrZHNjYkhsTy9sKzN4
28
+ Q05RNW5Vbkh3cTBBREFiTUxPbG1pWVl6cVhvV0xqbWVJNm1lL2Nsa3RKQ2ZO
29
+ MlIKb1pHM1VRdnZBZ01CQUFHak9UQTNNQWtHQTFVZEV3UUNNQUF3SFFZRFZS
30
+ ME9CQllFRk1TSk9FdEh6RTRsMGF6dgpNMEpLMGtLTlRvSzFNQXNHQTFVZER3
31
+ UUVBd0lFc0RBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQXRPZEU3M3F4Ck9I
32
+ MnlkaTlvVDJoUzVmOUcweTFaNzBUbHdoK1ZHRXh5Znh6VkU5WHdDK2lQcEp4
33
+ TnJhaUhZZ0YvOS9va3k3WloKUjlxMC90Sm5ldWhBZW5aZGlRa1g3b2k0TzN2
34
+ OXdSUzZZSG9XQnhNUEZLVlJMTlR6dlZKc2JtZnBDQWxwNS81ZwpwczR3UUZ5
35
+ NW1pYkVsR1ZsT29iZi9naHFaMjVIUzlKNmtkMC9DL3J5MEFVdFRvZ3NMN1R4
36
+ R3dUNGtiQ3g2M3ViCjN2eXdFRWhzSlV6ZmQ5N0dDQUJtdFFmUlRsZFgvajdG
37
+ MXovNXdkOHAraGZkb3gxaWliZHM5WnRmYVpBM0t6S24Ka2NoV045QjZ6Zzly
38
+ MVhNUThCTTJKejBYb1BhblBlMzU0K2xXd2pwa1JLYkZvdy9aYlFIY0NMQ3Ey
39
+ NCtONmI2ZwpkZ0tmTkR6d2lEcHFDQT09Ci0tLS0tRU5EIENFUlRJRklDQVRF
40
+ LS0tLS0K
41
+ date: 2013-02-06 00:00:00.000000000 Z
42
+ dependencies:
43
+ - !ruby/object:Gem::Dependency
22
44
  name: net-ssh
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
45
+ requirement: !ruby/object:Gem::Requirement
25
46
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 29
30
- segments:
31
- - 2
32
- - 0
33
- - 9
34
- version: 2.0.9
47
+ requirements:
48
+ - - ! '>='
49
+ - !ruby/object:Gem::Version
50
+ version: 2.6.4
35
51
  type: :runtime
36
- version_requirements: *id001
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ! '>='
57
+ - !ruby/object:Gem::Version
58
+ version: 2.6.4
59
+ - !ruby/object:Gem::Dependency
60
+ name: test-unit
61
+ requirement: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ! '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: mocha
77
+ requirement: !ruby/object:Gem::Requirement
78
+ none: false
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ! '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
37
91
  description: A pure Ruby implementation of the SFTP client protocol
38
- email: netsftp@solutious.com
92
+ email: net-ssh@solutious.com
39
93
  executables: []
40
-
41
94
  extensions: []
42
-
43
- extra_rdoc_files:
44
- - CHANGELOG.rdoc
45
- - lib/net/sftp/constants.rb
46
- - lib/net/sftp/errors.rb
47
- - lib/net/sftp/operations/dir.rb
48
- - lib/net/sftp/operations/download.rb
49
- - lib/net/sftp/operations/file.rb
50
- - lib/net/sftp/operations/file_factory.rb
51
- - lib/net/sftp/operations/upload.rb
52
- - lib/net/sftp/packet.rb
53
- - lib/net/sftp/protocol/01/attributes.rb
54
- - lib/net/sftp/protocol/01/base.rb
55
- - lib/net/sftp/protocol/01/name.rb
56
- - lib/net/sftp/protocol/02/base.rb
57
- - lib/net/sftp/protocol/03/base.rb
58
- - lib/net/sftp/protocol/04/attributes.rb
59
- - lib/net/sftp/protocol/04/base.rb
60
- - lib/net/sftp/protocol/04/name.rb
61
- - lib/net/sftp/protocol/05/base.rb
62
- - lib/net/sftp/protocol/06/attributes.rb
63
- - lib/net/sftp/protocol/06/base.rb
64
- - lib/net/sftp/protocol/base.rb
65
- - lib/net/sftp/protocol.rb
66
- - lib/net/sftp/request.rb
67
- - lib/net/sftp/response.rb
68
- - lib/net/sftp/session.rb
69
- - lib/net/sftp/version.rb
70
- - lib/net/sftp.rb
95
+ extra_rdoc_files:
96
+ - LICENSE.txt
97
+ - README.rdoc
98
+ files:
99
+ - CHANGES.txt
100
+ - LICENSE.txt
101
+ - Manifest
71
102
  - README.rdoc
72
- files:
73
- - CHANGELOG.rdoc
103
+ - Rakefile
104
+ - gem-public_cert.pem
105
+ - lib/net/sftp.rb
74
106
  - lib/net/sftp/constants.rb
75
107
  - lib/net/sftp/errors.rb
76
108
  - lib/net/sftp/operations/dir.rb
@@ -79,6 +111,7 @@ files:
79
111
  - lib/net/sftp/operations/file_factory.rb
80
112
  - lib/net/sftp/operations/upload.rb
81
113
  - lib/net/sftp/packet.rb
114
+ - lib/net/sftp/protocol.rb
82
115
  - lib/net/sftp/protocol/01/attributes.rb
83
116
  - lib/net/sftp/protocol/01/base.rb
84
117
  - lib/net/sftp/protocol/01/name.rb
@@ -91,14 +124,11 @@ files:
91
124
  - lib/net/sftp/protocol/06/attributes.rb
92
125
  - lib/net/sftp/protocol/06/base.rb
93
126
  - lib/net/sftp/protocol/base.rb
94
- - lib/net/sftp/protocol.rb
95
127
  - lib/net/sftp/request.rb
96
128
  - lib/net/sftp/response.rb
97
129
  - lib/net/sftp/session.rb
98
130
  - lib/net/sftp/version.rb
99
- - lib/net/sftp.rb
100
- - Rakefile
101
- - README.rdoc
131
+ - net-sftp.gemspec
102
132
  - setup.rb
103
133
  - test/common.rb
104
134
  - test/protocol/01/test_attributes.rb
@@ -124,47 +154,29 @@ files:
124
154
  - test/test_response.rb
125
155
  - test/test_session.rb
126
156
  - test/test_upload.rb
127
- - Manifest
128
- - net-sftp.gemspec
129
- has_rdoc: true
130
- homepage: http://net-ssh.rubyforge.org/sftp
131
- licenses: []
132
-
157
+ homepage: https://github.com/net-ssh/net-sftp
158
+ licenses:
159
+ - MIT
133
160
  post_install_message:
134
- rdoc_options:
135
- - --line-numbers
136
- - --inline-source
137
- - --title
138
- - Net-sftp
139
- - --main
140
- - README.rdoc
141
- require_paths:
161
+ rdoc_options: []
162
+ require_paths:
142
163
  - lib
143
- required_ruby_version: !ruby/object:Gem::Requirement
164
+ required_ruby_version: !ruby/object:Gem::Requirement
144
165
  none: false
145
- requirements:
146
- - - ">="
147
- - !ruby/object:Gem::Version
148
- hash: 3
149
- segments:
150
- - 0
151
- version: "0"
152
- required_rubygems_version: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ! '>='
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ required_rubygems_version: !ruby/object:Gem::Requirement
153
171
  none: false
154
- requirements:
155
- - - ">="
156
- - !ruby/object:Gem::Version
157
- hash: 11
158
- segments:
159
- - 1
160
- - 2
161
- version: "1.2"
172
+ requirements:
173
+ - - ! '>='
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
162
176
  requirements: []
163
-
164
- rubyforge_project: net-ssh
165
- rubygems_version: 1.3.7
177
+ rubyforge_project: net-sftp
178
+ rubygems_version: 1.8.25
166
179
  signing_key:
167
180
  specification_version: 3
168
181
  summary: A pure Ruby implementation of the SFTP client protocol
169
- test_files:
170
- - test/test_all.rb
182
+ test_files: []
metadata.gz.sig ADDED
@@ -0,0 +1,3 @@
1
+ ��!ˮ��alL
2
+ ��q�XNTw��-G�J�WǙY݄r��a�J3%�h��s(
3
+ RNZ��%91�#�.�����[���?��jm�t,a����f����V���$7�rf�sQ/��"-i�!�y�҂8���YG}���Hj|��ayF�?��J\QN�b�:�ę�!E<�h��-0VT%�{U2�е���b����Kc۰̌cU�)>ci�L��e�,�í��D�.f۩{��zV��AV�����ތ��'���%�o