parallel_sftp 0.3.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0899099ab70f5bc7db699b0efb103fc2670fa1519b7aff996a095abeef41caed'
4
- data.tar.gz: e83babc2dd7d491cb3a32f7699a23b9366f243973ca6d6c4ae6b4b4b1075a627
3
+ metadata.gz: 0a657d1c03cf2c2cab3dc64d29b1fbe4667a18d35ecf936c1508b55bf3640602
4
+ data.tar.gz: f11b5a058313b8d588fe5e92d9bbe627e8770cc0f89ec19756a71d27d250c891
5
5
  SHA512:
6
- metadata.gz: 33c36ce67292ba5fc79873d4db509bbd665e1a21968cad089ea530e0cf053f51f3cf8f17b5521c25a3696ebf9df392067c558176fcefde279667049796d35e35
7
- data.tar.gz: 5a947dffa20be7cb1969166c4231b0588db67f21e1d070a3e3a8fdd5eb3beea628a95717f36e8107e1b60780311b6d309114692dd1bf5742be8f4b35538d626a
6
+ metadata.gz: cbb88481f950b81974dcf9b8327297ea845db25f7c29b1bd409883cb108e7876b217502e7c63bd767945b699ca8814fc021ea73e90d25bde6da2b0785770d241
7
+ data.tar.gz: f43b354fcd285d2a07d7ae34bebfa80a234a0c319d13805c118c66c9e0c662ffe59ce7cd06d3b699664dcb71824cd3ed5d0ce6f5360eda802fa6997e888eb06a
data/CHANGELOG.md CHANGED
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.0] - 2026-02-05
11
+
12
+ ### Added
13
+ - `verbose` option for debugging lftp output - prints command and lftp messages to stderr
14
+ - `xfer:clobber on` setting to allow overwriting existing files
15
+
16
+ ### Fixed
17
+ - Resume now works correctly on first download attempt (previously always disabled)
18
+ - First attempt respects user's `resume` setting; only retries after corruption use fresh download
19
+
20
+ ## [0.3.1] - 2026-02-05
21
+
22
+ ### Added
23
+ - Runtime dependencies `ed25519` and `bcrypt_pbkdf` for net-ssh Ed25519 key support
24
+
10
25
  ## [0.3.0] - 2026-02-05
11
26
 
12
27
  ### Added
@@ -51,10 +51,14 @@ module ParallelSftp
51
51
  def download_with_retry(remote_path, local_path, options, segments, parallel_retries)
52
52
  current_segments = segments
53
53
  retries_at_current_segments = 0
54
+ first_attempt = true
54
55
 
55
56
  loop do
56
57
  begin
57
- return execute_download(remote_path, local_path, options.merge(segments: current_segments, resume: false))
58
+ # First attempt: respect user's resume setting; retries: always fresh download
59
+ use_resume = first_attempt ? options.fetch(:resume, true) : false
60
+ first_attempt = false
61
+ return execute_download(remote_path, local_path, options.merge(segments: current_segments, resume: use_resume))
58
62
  rescue ZipIntegrityError => e
59
63
  cleanup_corrupted_download(local_path)
60
64
 
@@ -100,7 +104,8 @@ module ParallelSftp
100
104
  download = Download.new(
101
105
  lftp_command,
102
106
  on_progress: options[:on_progress],
103
- on_segment_progress: options[:on_segment_progress]
107
+ on_segment_progress: options[:on_segment_progress],
108
+ verbose: options[:verbose]
104
109
  )
105
110
  download.execute
106
111
  end
@@ -11,10 +11,11 @@ module ParallelSftp
11
11
  # Default interval for polling the status file (in seconds)
12
12
  DEFAULT_POLL_INTERVAL = 1
13
13
 
14
- def initialize(lftp_command, on_progress: nil, on_segment_progress: nil)
14
+ def initialize(lftp_command, on_progress: nil, on_segment_progress: nil, verbose: false)
15
15
  @lftp_command = lftp_command
16
16
  @on_progress = on_progress
17
17
  @on_segment_progress = on_segment_progress
18
+ @verbose = verbose
18
19
  @output_buffer = []
19
20
  @progress_parser = ProgressParser.new
20
21
  @segment_parser = SegmentProgressParser.new
@@ -41,6 +42,11 @@ module ParallelSftp
41
42
  exit_status = nil
42
43
  status_file = status_file_path
43
44
 
45
+ if @verbose
46
+ $stderr.puts "[lftp] Command: lftp -c '...'"
47
+ $stderr.puts "[lftp] Status file: #{status_file}"
48
+ end
49
+
44
50
  Open3.popen2e(*lftp_command.to_command) do |stdin, stdout_stderr, wait_thr|
45
51
  stdin.close
46
52
 
@@ -49,6 +55,7 @@ module ParallelSftp
49
55
 
50
56
  stdout_stderr.each_line do |line|
51
57
  @output_buffer << line
58
+ $stderr.puts "[lftp] #{line}" if @verbose
52
59
  process_output_line(line)
53
60
  end
54
61
 
@@ -30,7 +30,8 @@ module ParallelSftp
30
30
  "set net:max-retries #{max_retries}",
31
31
  "set net:reconnect-interval-base #{reconnect_interval}",
32
32
  "set sftp:auto-confirm yes",
33
- "set ssl:verify-certificate no"
33
+ "set ssl:verify-certificate no",
34
+ "set xfer:clobber on"
34
35
  ]
35
36
 
36
37
  # Add custom SSH connect program if configured (for legacy host key algorithms)
@@ -1,3 +1,3 @@
1
1
  module ParallelSftp
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
data/lib/parallel_sftp.rb CHANGED
@@ -121,7 +121,8 @@ module ParallelSftp
121
121
  reconnect_interval: options[:reconnect_interval],
122
122
  sftp_connect_program: options[:sftp_connect_program],
123
123
  on_progress: options[:on_progress],
124
- on_segment_progress: options[:on_segment_progress]
124
+ on_segment_progress: options[:on_segment_progress],
125
+ verbose: options[:verbose]
125
126
  )
126
127
  end
127
128
  end
@@ -29,6 +29,10 @@ Gem::Specification.new do |spec|
29
29
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
30
30
  spec.require_paths = ["lib"]
31
31
 
32
+ # Runtime dependencies for net-ssh Ed25519 key support
33
+ spec.add_runtime_dependency "ed25519", ">= 1.2", "< 2.0"
34
+ spec.add_runtime_dependency "bcrypt_pbkdf", ">= 1.0", "< 2.0"
35
+
32
36
  spec.add_development_dependency "bundler", ">= 1.17"
33
37
  spec.add_development_dependency "rake", ">= 12.0"
34
38
  spec.add_development_dependency "rspec", "~> 3.0"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parallel_sftp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nestor G Pestelos Jr
@@ -9,6 +9,46 @@ bindir: exe
9
9
  cert_chain: []
10
10
  date: 1980-01-01 00:00:00.000000000 Z
11
11
  dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: ed25519
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '1.2'
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '2.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '1.2'
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '2.0'
32
+ - !ruby/object:Gem::Dependency
33
+ name: bcrypt_pbkdf
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '1.0'
39
+ - - "<"
40
+ - !ruby/object:Gem::Version
41
+ version: '2.0'
42
+ type: :runtime
43
+ prerelease: false
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '1.0'
49
+ - - "<"
50
+ - !ruby/object:Gem::Version
51
+ version: '2.0'
12
52
  - !ruby/object:Gem::Dependency
13
53
  name: bundler
14
54
  requirement: !ruby/object:Gem::Requirement