file_transfer 0.0.9 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d6e7704b3a187bdb4150db073a6d11f3e88faade
4
+ data.tar.gz: 87bbb29f0feba5e47dbf7cf52158a90838118b46
5
+ SHA512:
6
+ metadata.gz: b7592105dc8ccfbf3f165afa6b1be537fb23bab19db97f31f6a95e35bbbd715a2397e167a9fb94e9d33476313724275999931b70e8e7aae2d02bb79ac455fb0a
7
+ data.tar.gz: b2d501534bc726cc44d8ed8dac713d3d759af1f1039dfaca0c9cfdf3266dd1cf82cf6e0c4cb9f7c1ed7dd3c7990b8a2c86cc0d785225813112263737d7c927c9
data/lib/file_transfer.rb CHANGED
@@ -1,26 +1,20 @@
1
- require "file_transfer/version"
2
- require "file_transfer/file_transfer_handler"
3
- require "file_transfer/generic"
4
- require "file_transfer/ftp"
5
- require "file_transfer/sftp"
6
- require "file_transfer/ftps"
7
- require "net/ftp"
8
- require "net/sftp"
1
+ require 'file_transfer/version'
2
+ require 'file_transfer/file_transfer_handler'
3
+ require 'file_transfer/generic'
4
+ require 'file_transfer/ftp'
5
+ require 'file_transfer/sftp'
9
6
 
10
- ##
11
7
  # Module for file exchange from a locale directory to a remote directory and vice versa. Supported protocols are:
12
8
  #
13
9
  # * FTP
14
10
  # * SFTP
15
- # * FTPS
16
-
11
+ # * REST
17
12
  module FileTransfer
18
13
 
19
14
  ##
20
15
  # Uploads one or more files to a remote server. To upload files use the locale file paths, not the ruby class File.
21
16
  # Types are:
22
17
  # * <tt>:ftp</tt> - for FTP file upload
23
- # * <tt>:ftps</tt> - for FTPS file upload
24
18
  # * <tt>:sftp</tt> - for SFTP file upload
25
19
  #
26
20
  # Options are:
@@ -1,13 +1,17 @@
1
1
  module FileTransfer
2
2
 
3
3
  class FileTransferHandler
4
+ attr_reader :client
4
5
 
5
6
  def initialize(type, options)
6
7
  @type = type
7
8
  @options = options
8
- @ftp_obj = get_ftp_obj type, options
9
+ @client = get_client type, options
9
10
  end
10
11
 
12
+ # Uploads data to server
13
+ # @param paths [Array<Hash<Symbol, String>>] upload specification
14
+ # @return [Array]
11
15
  def upload(paths)
12
16
  paths = normalize_paths paths
13
17
  all_file_paths = []
@@ -20,7 +24,7 @@ module FileTransfer
20
24
  path_pattern = [path_pattern] unless path_pattern.kind_of?(Array)
21
25
  file_paths = []
22
26
  if File.exists?(path_pattern[0]) && File.directory?(path_pattern[0])
23
- path_pattern[1] = "*.*" if path_pattern.length < 2
27
+ path_pattern[1] = '*.*' if path_pattern.length < 2
24
28
  Dir.chdir(path_pattern[0])
25
29
  file_paths = Dir.glob(path_pattern[1])
26
30
  elsif File.exists?(path_pattern[0])
@@ -35,6 +39,9 @@ module FileTransfer
35
39
  all_file_paths
36
40
  end
37
41
 
42
+ # Downloads data from server
43
+ # @param paths [Array<Hash<Symbol, String>>] download specification
44
+ # @return [Array]
38
45
  def download(paths)
39
46
  paths = normalize_paths paths
40
47
  all_file_paths = []
@@ -52,29 +59,31 @@ module FileTransfer
52
59
  end
53
60
 
54
61
  def list(path)
55
- @ftp_obj.list path
62
+ client.list path
56
63
  end
57
64
 
58
65
  def remove(path)
59
- @ftp_obj.remove path
66
+ client.remove path
60
67
  end
61
68
 
62
69
  def rename(from_path, to_path)
63
- @ftp_obj.rename from_path, to_path
70
+ client.rename from_path, to_path
64
71
  end
65
72
 
66
73
  def close
67
- @ftp_obj.close
74
+ client.close
68
75
  end
69
76
 
70
77
  private
71
-
78
+ # @return [Array]
72
79
  def normalize_paths(paths)
73
80
  response = paths.kind_of?(Array) ? paths : [paths]
74
81
  Marshal.load(Marshal.dump(response))
75
82
  end
76
83
 
77
- def get_ftp_obj(type, options)
84
+ # Gets instance of client
85
+ # @param type [Symbol] type of client, possible values are: :ftp, :sftp or :ftps
86
+ def get_client(type, options)
78
87
  if type == :ftp
79
88
  Ftp.new options
80
89
  elsif type == :sftp
@@ -85,11 +94,11 @@ module FileTransfer
85
94
  end
86
95
 
87
96
  def _upload(from_path, to_path)
88
- @ftp_obj.upload from_path, to_path
97
+ client.upload from_path, to_path
89
98
  end
90
99
 
91
100
  def _download(from_path, to_path)
92
- @ftp_obj.download from_path, to_path
101
+ client.download from_path, to_path
93
102
  end
94
103
 
95
104
  end
@@ -1,17 +1,21 @@
1
- require "net/ftp"
1
+ require 'net/ftp'
2
2
 
3
3
  module FileTransfer
4
4
  class Ftp < Generic
5
+ attr_reader :ftp
5
6
 
6
7
  def initialize(options = {})
7
8
  super(options)
8
9
  end
9
10
 
11
+ # Gets directory listing from SFTP server
12
+ # @param dir [String] remote directory
13
+ # @param options [Hash<Symbol,String>] additional options
14
+ # @return [Array<String>] listing with all file paths
10
15
  def list(dir, options = {})
11
- connect if @ftp.closed?
12
- timeout(60) do
13
- @ftp.chdir dir
14
- result = @ftp.nlst
16
+ open_connection(60) do
17
+ ftp.chdir dir
18
+ result = ftp.nlst
15
19
  if options.has_key? :file_type
16
20
  result = result.select { |file_name| file_name.end_with? options[:file_type] }
17
21
  end
@@ -19,65 +23,89 @@ module FileTransfer
19
23
  end
20
24
  end
21
25
 
26
+ # Uploads file to FTP server
27
+ # @param from_path [String] locale directory
28
+ # @param to_path [String] remote directory
22
29
  def upload(from_path, to_path)
23
30
  to_path = split_path(to_path)
24
- connect if @ftp.closed?
25
- timeout(timeout_seconds) do
26
- @ftp.chdir to_path[:file_path]
27
- @ftp.putbinaryfile(from_path)
31
+ open_connection do
32
+ ftp.chdir to_path[:file_path]
33
+ ftp.putbinaryfile(from_path)
28
34
  end
29
35
  end
30
36
 
37
+ # Downloads data from FTP server
38
+ # @param from_path [String] remote path
39
+ # @param to_path [String] locale path
40
+ # @return [String] remote path of downloaded file
31
41
  def download(from_path, to_path)
32
42
  from_path = split_path(from_path)
33
- connect if @ftp.closed?
34
- timeout(timeout_seconds) do
35
- @ftp.chdir from_path[:file_path]
36
- @ftp.getbinaryfile(to_path, from_path[:file_name])
43
+ open_connection do
44
+ ftp.chdir from_path[:file_path]
45
+ ftp.getbinaryfile(to_path, from_path[:file_name])
37
46
  "#{from_path[:file_path]}/#{from_path[:file_name]}"
38
47
  end
39
48
  end
40
49
 
50
+ # Moves file from source to destination on FTP server
51
+ # @param from_path [String] remote source path
52
+ # @param to_path [String] remote destination path
41
53
  def move(from_path, to_path)
42
54
  from_path = split_path(from_path)
43
55
  to_path = split_path(to_path)
44
- connect if @ftp.closed?
45
- timeout(timeout_seconds) do
46
- @ftp.chdir from_path[:file_path]
47
- @ftp.rename from_path[:file_name], "#{to_path[:file_path]}/#{to_path[:file_name]}" if exist?("#{from_path[:file_name]}/#{from_path[:file_path]}")
56
+ open_connection do
57
+ ftp.chdir from_path[:file_path]
58
+ ftp.rename from_path[:file_name], "#{to_path[:file_path]}/#{to_path[:file_name]}" if exist?("#{from_path[:file_name]}/#{from_path[:file_path]}")
48
59
  end
49
60
  end
61
+ alias_method :rename, :move
50
62
 
63
+ # Checks if file exists on FTP server
64
+ # @param file_path [String] path to check
65
+ # @return [Boolean] true if file exists, otherwise false
51
66
  def exist?(file_path)
52
- connect if @ftp.closed?
53
- timeout(60) do
54
- result = @ftp.list "#{file_path}"
67
+ open_connection(60) do
68
+ result = ftp.list "#{file_path}"
55
69
  result && result.size > 0
56
70
  end
57
71
  end
58
72
 
73
+ def remove(file_path)
74
+ raise 'not yet implemented'
75
+ end
76
+
77
+ # Closes FTP connection
59
78
  def close
60
- if @ftp && !@ftp.closed?
79
+ if ftp && !ftp.closed?
61
80
  timeout(30) do
62
- @ftp.close
81
+ ftp.close
63
82
  end
64
83
  end
65
84
  end
66
85
 
86
+ # Opens new connection, if not already open
87
+ # @param conn_timeout [Integer] IDLE timeout in seconds
88
+ # @yield executes operation within open connection on server
89
+ def open_connection(conn_timeout = timeout_seconds)
90
+ connect if closed?
91
+ timeout(conn_timeout) do
92
+ yield if block_given?
93
+ end
94
+ end
95
+
67
96
  protected
68
97
 
69
98
  def closed?
70
- !@ftp || @ftp.closed?
99
+ !ftp || ftp.closed?
71
100
  end
72
101
 
73
102
  def connect
74
103
  timeout(30) do
75
104
  @ftp ||= Net::FTP.new
76
- @ftp.passive = true
77
- @ftp.connect(@host, @port)
78
- @ftp.login(@username, @password) if @username && @password
105
+ ftp.passive = true
106
+ ftp.connect(host, port)
107
+ ftp.login(username, password) if username && password
79
108
  end
80
109
  end
81
-
82
110
  end
83
111
  end
@@ -1,44 +1,56 @@
1
+ require 'net/sftp'
2
+
1
3
  module FileTransfer
2
4
 
3
5
  class Sftp < Generic
6
+ attr_reader :sftp
4
7
 
5
8
  def initialize(options = {})
6
9
  options[:port] ||= 22
7
10
  super(options)
8
11
  end
9
12
 
13
+ # Downloads data from SFTP server
14
+ # @param from_path [String] locale directory
15
+ # @param to_path [String] remote directory
10
16
  def download(from_path, to_path)
11
- connect if closed?
12
- timeout(timeout_seconds) do
13
- @sftp.download! from_path, to_path
17
+ open_connection do
18
+ sftp.download! from_path, to_path
14
19
  end
15
20
  end
16
21
 
22
+ # Uploads data to SFTP server
23
+ # @param from_path [String] locale directory
24
+ # @param to_path [String] remote directory
17
25
  def upload(from_path, to_path)
18
- connect if closed?
19
- timeout(timeout_seconds) do
20
- @sftp.upload! from_path, to_path
26
+ open_connection do
27
+ sftp.upload! from_path, to_path
21
28
  end
22
29
  end
23
30
 
31
+ # Gets directory listing from SFTP server
32
+ # @param path [String] remote directory
33
+ # @return [Array<String>] listing with all file paths
24
34
  def list(path)
25
- connect if closed?
26
- timeout(60) do
27
- @sftp.dir.entries path
35
+ open_connection(60) do
36
+ sftp.dir.entries path
28
37
  end
29
38
  end
30
39
 
40
+ # Deletes file / folder from SFTP server
41
+ # @param path [String] remote directory
31
42
  def remove(path)
32
- connect if closed?
33
- timeout(60) do
34
- @sftp.remove! path
43
+ open_connection(60) do
44
+ sftp.remove! path
35
45
  end
36
46
  end
37
47
 
48
+ # Moves file / folder from SFTP server
49
+ # @param from_path [String] remote source directory
50
+ # @param to_path [String] remote destination directory
38
51
  def rename(from_path, to_path)
39
- connect if closed?
40
- timeout(60) do
41
- @sftp.rename! from_path, to_path
52
+ open_connection(60) do
53
+ sftp.rename! from_path, to_path
42
54
  end
43
55
  end
44
56
 
@@ -46,6 +58,16 @@ module FileTransfer
46
58
  # do nothing
47
59
  end
48
60
 
61
+ # Opens new connection, if not already open
62
+ # @param conn_timeout [Integer] IDLE timeout in seconds
63
+ # @yield executes operation within open connection on server
64
+ def open_connection(conn_timeout = timeout_seconds)
65
+ connect if closed?
66
+ timeout(conn_timeout) do
67
+ yield if block_given?
68
+ end
69
+ end
70
+
49
71
  protected
50
72
 
51
73
  def connect
@@ -59,7 +81,7 @@ module FileTransfer
59
81
  end
60
82
 
61
83
  def closed?
62
- !@sftp || @sftp.closed?
84
+ !sftp || sftp.closed?
63
85
  end
64
86
 
65
87
  end
@@ -1,3 +1,3 @@
1
1
  module FileTransfer # :nodoc:
2
- VERSION = '0.0.9' # :nodoc:
2
+ VERSION = '0.0.10' # :nodoc:
3
3
  end
@@ -1,152 +1,83 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  RSpec.configure do |c|
4
4
  c.filter_run_excluding :transaction => true
5
5
  end
6
6
 
7
7
  module FileTransfer
8
-
9
8
  describe FileTransferHandler do
10
-
11
- describe "#_upload", :transaction => true do
12
-
13
- end
14
-
15
- describe "#upload" do
16
-
17
- #it "should return an Array of JPG Files from one Folder" do
18
- # instance = FileTransferHandler.new :ftp, {}
19
- # this_path = File.dirname(__FILE__)
20
- # paths = {:from => ["#{this_path}/../test_files/folder2", "*.jpg"], :to => "/remote_path/"}
21
- # instance.stub(:_upload).and_return(true)
22
- # result = instance.upload(paths)
23
- # Dir.chdir(paths[:from][0])
24
- # result_array = Dir[paths[:from][1]]
25
- # result.should be_kind_of(Array)
26
- # result.should match_array(result_array)
27
- #
28
- # puts "--BEGIN OF TEST"
29
- # puts result
30
- # puts "--END OF TEST"
31
- #end
32
- #
33
- #it "should return an Array of JPG Files from all Subfolders incl. Root-Folder" do
34
- # instance = FileTransferHandler.new :ftp, {}
35
- # this_path = File.dirname(__FILE__)
36
- # paths = {:from => ["#{this_path}/../test_files/", "**/*.jpg"], :to => "/remote_path/"}
37
- # instance.stub(:_upload).and_return(true)
38
- # result = instance.upload(paths)
39
- # Dir.chdir(paths[:from][0])
40
- # result_array = Dir[paths[:from][1]]
41
- # result.should be_kind_of(Array)
42
- # result.should match_array(result_array)
43
- #
44
- # puts "--BEGIN OF TEST"
45
- # puts result
46
- # puts "--END OF TEST"
47
- #end
48
-
49
- it "should list from OTTO SFTP" do
50
- instance = FileTransferHandler.new :sftp, {
51
- :host => "sftp-dmz.otto.de",
52
- :username => "eosch",
53
- :password => "hot}Orm1",
54
- :port => 22
55
- }
56
- puts instance.list("/").inspect
57
- end
58
-
59
- it "should upload a test-file to OTTO SFTP" do
60
- instance = FileTransferHandler.new :sftp, {
61
- :host => "sftp-dmz.otto.de",
62
- :username => "eosch",
63
- :password => "hot}Orm1",
64
- :port => 22
65
- }
66
- this_path = File.dirname(__FILE__)
67
- paths = {:from => "#{this_path}/../test_files/empty_file.csv", :to => "/eosch/in/test/empty_file_1.csv"}
68
- result = instance.upload(paths)
69
- Dir.chdir("#{this_path}/../test_files/")
70
- result_array = Dir["*.csv"]
71
-
72
- result.should be_kind_of(Array)
73
- #result.should match_array(result_array)
74
-
75
- puts "--BEGIN OF TEST"
76
- puts result
77
- puts "--END OF TEST"
9
+ [:ftp, :sftp].each do |protocol|
10
+ context "#{protocol.to_s.upcase} client" do
11
+ let(:handler) { FileTransferHandler.new(protocol, {}) }
12
+
13
+ it "client is of type #{protocol.to_s.capitalize}" do
14
+ clazz = "FileTransfer::#{protocol.to_s.capitalize}".split('::').inject(Object) {|o,c| o.const_get c}
15
+ expect(handler.client).to a_kind_of(clazz)
16
+ end
17
+
18
+ describe '#list' do
19
+ it 'executes list on client' do
20
+ expect(handler.client).to receive(:list).with('path')
21
+ handler.list('path')
22
+ end
23
+ end
24
+
25
+ describe '#remove' do
26
+ it 'executes remove on client' do
27
+ expect(handler.client).to receive(:remove).with('path')
28
+ handler.remove('path')
29
+ end
30
+ end
31
+
32
+ describe '#rename' do
33
+ it 'executes rename on client' do
34
+ expect(handler.client).to receive(:rename).with('from', 'to')
35
+ handler.rename('from', 'to')
36
+ end
37
+ end
38
+
39
+ describe '#close' do
40
+ it 'executes close on client' do
41
+ expect(handler.client).to receive(:close)
42
+ handler.close
43
+ end
44
+ end
45
+
46
+ describe '#download' do
47
+ it 'executes download on client' do
48
+ expect(handler.client).to receive(:download).with('from', 'to')
49
+ handler.download([{:from => 'from', :to => 'to'}])
50
+ end
51
+ end
52
+
53
+ describe '#upload' do
54
+ context 'when destination is folder' do
55
+ before do
56
+ allow(File).to receive(:exists?) { true }
57
+ allow(File).to receive(:directory?) { true }
58
+ allow(Dir).to receive(:chdir)
59
+ allow(Dir).to receive(:glob) { %w(from/test.txt) }
60
+ end
61
+
62
+ it 'executes upload on client' do
63
+ expect(handler.client).to receive(:upload).with('from/test.txt', 'to')
64
+ handler.upload([{:from => 'from', :to => 'to'}])
65
+ end
66
+ end
67
+
68
+ context 'when destination is file' do
69
+ before do
70
+ allow(File).to receive(:exists?) { true }
71
+ allow(File).to receive(:directory?) { false }
72
+ end
73
+
74
+ it 'executes upload on client' do
75
+ expect(handler.client).to receive(:upload).with('from', 'to')
76
+ handler.upload([{:from => 'from', :to => 'to'}])
77
+ end
78
+ end
79
+ end
78
80
  end
79
-
80
- it "should download the test-file from OTTO SFTP" do
81
- instance = FileTransferHandler.new :sftp, {
82
- :host => "sftp-dmz.otto.de",
83
- :username => "eosch",
84
- :password => "hot}Orm1",
85
- :port => 22
86
- }
87
- this_path = File.dirname(__FILE__)
88
- paths = {:from => "/eosch/in/test/empty_file_1.csv", :to => "#{this_path}/../test_files/empty_file_from_sftp.csv"}
89
- result = instance.download(paths)
90
- Dir.chdir("#{this_path}/../test_files/")
91
- result_array = Dir["*.csv"]
92
-
93
- result.should be_kind_of(Array)
94
- #result.should match_array(result_array)
95
-
96
- puts "--BEGIN OF TEST"
97
- puts result
98
- puts "--END OF TEST"
99
- end
100
-
101
- it "should rename the test-file from OTTO SFTP" do
102
- instance = FileTransferHandler.new :sftp, {
103
- :host => "sftp-dmz.otto.de",
104
- :username => "eosch",
105
- :password => "hot}Orm1",
106
- :port => 22
107
- }
108
- result = instance.rename "/eosch/in/test/empty_file_1.csv", "/eosch/in/test/empty_file_1.csv_old"
109
- end
110
-
111
- #it "should return an Array of various Files" do
112
- # instance = FileTransferHandler.new :ftp, {}
113
- # this_path = File.dirname(__FILE__)
114
- # paths = [
115
- # {:from => [
116
- # ["#{this_path}/../test_files/", "**/*.txt"],
117
- # "#{this_path}/../test_files/folder1/"
118
- # ],
119
- # :to => "/remote_path/"
120
- # },
121
- # {:from => ["#{this_path}/../test_files/folder2/", "[jt]*.jpg"], :to => "/remote_path/"}
122
- # ]
123
- #
124
- # instance.stub(:_upload).and_return(true)
125
- # result = instance.upload(paths)
126
- #
127
- # Dir.chdir(paths[0][:from][0][0])
128
- # result_array = Dir[paths[0][:from][0][1]]
129
- #
130
- # Dir.chdir(paths[0][:from][1])
131
- # Dir["*.*"].each do |f|
132
- # result_array.push f
133
- # end
134
- #
135
- # Dir.chdir(paths[1][:from][0])
136
- # Dir[paths[1][:from][1]].each do |f|
137
- # result_array.push f
138
- # end
139
- #
140
- # result.should be_kind_of(Array)
141
- # result.should match_array(result_array)
142
- #
143
- # puts "--BEGIN OF TEST"
144
- # puts result
145
- # puts "--END OF TEST"
146
- #end
147
-
148
81
  end
149
-
150
82
  end
151
-
152
83
  end
@@ -0,0 +1,133 @@
1
+ require 'spec_helper'
2
+
3
+ module FileTransfer
4
+ describe Ftp do
5
+ let(:ftp_client) { Ftp.new }
6
+ let(:ftp) { double('ftp').as_null_object }
7
+
8
+ before do
9
+ allow(ftp_client).to receive(:ftp) { ftp }
10
+ end
11
+
12
+ context 'within open connection' do
13
+ before do
14
+ allow(ftp_client).to receive(:open_connection).and_yield
15
+ end
16
+
17
+ describe '#list' do
18
+ it 'changes directory to destination' do
19
+ expect(ftp).to receive(:chdir).with('dir')
20
+ ftp_client.list('dir')
21
+ end
22
+
23
+ it 'gets directory listing' do
24
+ expect(ftp).to receive(:nlst)
25
+ ftp_client.list('dir')
26
+ end
27
+
28
+ it 'returns directory listing' do
29
+ allow(ftp).to receive(:nlst) { %w(file1 file2) }
30
+ expect(ftp_client.list('dir')).to eq(%w(file1 file2))
31
+ end
32
+
33
+ context 'when option file_type is defined' do
34
+ it 'filters files with given file_type' do
35
+ allow(ftp).to receive(:nlst) { %w(file1 file2.txt) }
36
+ expect(ftp_client.list('dir', :file_type => '.txt')).to eq(%w(file2.txt))
37
+ end
38
+ end
39
+ end
40
+
41
+ describe '#upload' do
42
+ it 'changes directory to destination' do
43
+ expect(ftp).to receive(:chdir).with('to')
44
+ ftp_client.upload('from/test.txt', 'to/test.txt')
45
+ end
46
+
47
+ it 'uploads to FTP server' do
48
+ expect(ftp).to receive(:putbinaryfile).with('from/test.txt')
49
+ ftp_client.upload('from/test.txt', 'to/test.txt')
50
+ end
51
+ end
52
+
53
+ describe '#download' do
54
+ it 'changes directory to destination' do
55
+ expect(ftp).to receive(:chdir).with('from')
56
+ ftp_client.download('from/test.txt', 'to/test.txt')
57
+ end
58
+
59
+ it 'downloads from FTP server' do
60
+ expect(ftp).to receive(:getbinaryfile).with('to/test.txt', 'test.txt')
61
+ ftp_client.download('from/test.txt', 'to/test.txt')
62
+ end
63
+
64
+ it 'returns file path' do
65
+ expect(ftp_client.download('from/test.txt', 'to/test.txt')).to eq('from/test.txt')
66
+ end
67
+ end
68
+
69
+ describe '#move' do
70
+ it 'changes directory to destination' do
71
+ expect(ftp).to receive(:chdir).with('dir1')
72
+ ftp_client.move('dir1/test.txt', 'dir2/test.txt')
73
+ end
74
+
75
+ it 'moves file from current to new destination' do
76
+ expect(ftp).to receive(:rename).with('test.txt', 'dir2/test.txt')
77
+ ftp_client.move('dir1/test.txt', 'dir2/test.txt')
78
+ end
79
+ end
80
+
81
+ describe '#exist?' do
82
+ it 'gets list' do
83
+ expect(ftp).to receive(:list).with('dir1/test.txt')
84
+ ftp_client.exist?('dir1/test.txt')
85
+ end
86
+
87
+ context 'when file exists' do
88
+ before do
89
+ allow(ftp).to receive(:list) { %w(dir1/test.txt) }
90
+ end
91
+
92
+ it 'gets true' do
93
+ expect(ftp_client.exist?('dir1/test.txt')).to be_truthy
94
+ end
95
+ end
96
+
97
+ context 'when file does not exist' do
98
+ before do
99
+ allow(ftp).to receive(:list) { [] }
100
+ end
101
+
102
+ it 'gets false' do
103
+ expect(ftp_client.exist?('dir1/test.txt')).to be_falsey
104
+ end
105
+ end
106
+ end
107
+ end
108
+
109
+ describe '#close' do
110
+ context 'when connection is open' do
111
+ before do
112
+ allow(ftp).to receive(:closed?) { false }
113
+ end
114
+
115
+ it 'closes connection' do
116
+ expect(ftp).to receive(:close)
117
+ ftp_client.close
118
+ end
119
+ end
120
+
121
+ context 'when connection is closed' do
122
+ before do
123
+ allow(ftp).to receive(:closed?) { true }
124
+ end
125
+
126
+ it 'do nothing' do
127
+ expect(ftp).to_not receive(:close)
128
+ ftp_client.close
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
@@ -2,6 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  module FileTransfer
4
4
  describe Sftp do
5
+ let(:sftp_client) { Sftp.new }
5
6
 
6
7
  describe '.new' do
7
8
  context 'when port is defined in options parameter' do
@@ -18,5 +19,74 @@ module FileTransfer
18
19
  end
19
20
  end
20
21
  end
22
+
23
+ describe '#open_connection' do
24
+ context 'when connection is closed' do
25
+ before do
26
+ allow(sftp_client).to receive(:closed?) { true }
27
+ end
28
+
29
+ it 'connects to SFTP server' do
30
+ expect(sftp_client).to receive(:connect)
31
+ sftp_client.open_connection
32
+ end
33
+ end
34
+
35
+ context 'when connection is open' do
36
+ before do
37
+ allow(sftp_client).to receive(:closed?) { false }
38
+ end
39
+
40
+ it 'use current open connection' do
41
+ expect(sftp_client).to_not receive(:connect)
42
+ sftp_client.open_connection
43
+ end
44
+ end
45
+ end
46
+
47
+ context 'within open connection' do
48
+ let(:sftp) { double('sftp') }
49
+ before do
50
+ allow(sftp_client).to receive(:open_connection).and_yield
51
+ allow(sftp_client).to receive(:sftp) { sftp }
52
+ end
53
+
54
+ describe '#download' do
55
+ it 'downloads from SFTP server' do
56
+ expect(sftp).to receive(:download!).with('from', 'to')
57
+ sftp_client.download('from', 'to')
58
+ end
59
+ end
60
+
61
+ describe '#upload' do
62
+ it 'uploads to SFTP server' do
63
+ expect(sftp).to receive(:upload!).with('from', 'to')
64
+ sftp_client.upload('from', 'to')
65
+ end
66
+ end
67
+
68
+ describe '#list' do
69
+ let(:dir) { double('dir') }
70
+ it 'gets directory listing from SFTP server' do
71
+ expect(sftp).to receive(:dir) { dir }
72
+ expect(dir).to receive(:entries).with('path')
73
+ sftp_client.list('path')
74
+ end
75
+ end
76
+
77
+ describe '#remove' do
78
+ it 'removes file / folder from SFTP server' do
79
+ expect(sftp).to receive(:remove!).with('path')
80
+ sftp_client.remove('path')
81
+ end
82
+ end
83
+
84
+ describe '#rename' do
85
+ it 'moves file / folder from SFTP server' do
86
+ expect(sftp).to receive(:rename!).with('from', 'to')
87
+ sftp_client.rename('from', 'to')
88
+ end
89
+ end
90
+ end
21
91
  end
22
92
  end
metadata CHANGED
@@ -1,139 +1,119 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: file_transfer
3
- version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.0.9
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.10
6
5
  platform: ruby
7
- authors:
8
- - impac GmbH
9
- autorequire:
6
+ authors:
7
+ - impac AG
8
+ autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
-
13
- date: 2016-03-24 00:00:00 +01:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
17
- name: rspec
18
- prerelease: false
19
- requirement: &id001 !ruby/object:Gem::Requirement
20
- none: false
21
- requirements:
22
- - - ">="
23
- - !ruby/object:Gem::Version
24
- version: "0"
25
- type: :development
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
28
- name: rake
29
- prerelease: false
30
- requirement: &id002 !ruby/object:Gem::Requirement
31
- none: false
32
- requirements:
33
- - - ~>
34
- - !ruby/object:Gem::Version
35
- version: 0.9.2.2
36
- type: :development
37
- version_requirements: *id002
38
- - !ruby/object:Gem::Dependency
39
- name: jruby-pageant
40
- prerelease: false
41
- requirement: &id003 !ruby/object:Gem::Requirement
42
- none: false
43
- requirements:
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: "0"
47
- type: :development
48
- version_requirements: *id003
49
- - !ruby/object:Gem::Dependency
50
- name: jruby-openssl
51
- prerelease: false
52
- requirement: &id004 !ruby/object:Gem::Requirement
53
- none: false
54
- requirements:
55
- - - "="
56
- - !ruby/object:Gem::Version
57
- version: 0.7.6.1
58
- type: :development
59
- version_requirements: *id004
60
- - !ruby/object:Gem::Dependency
61
- name: net-sftp
62
- prerelease: false
63
- requirement: &id005 !ruby/object:Gem::Requirement
64
- none: false
65
- requirements:
66
- - - ~>
67
- - !ruby/object:Gem::Version
68
- version: 2.0.5
69
- type: :runtime
70
- version_requirements: *id005
71
- - !ruby/object:Gem::Dependency
72
- name: net-ssh
73
- prerelease: false
74
- requirement: &id006 !ruby/object:Gem::Requirement
75
- none: false
76
- requirements:
77
- - - ~>
78
- - !ruby/object:Gem::Version
79
- version: 2.5.2
80
- type: :runtime
81
- version_requirements: *id006
11
+ date: 2016-04-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ name: rspec
20
+ prerelease: false
21
+ type: :development
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ name: rake
34
+ prerelease: false
35
+ type: :development
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ name: net-sftp
48
+ prerelease: false
49
+ type: :runtime
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: 3.0.0
61
+ name: net-ssh
62
+ prerelease: false
63
+ type: :runtime
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "<"
67
+ - !ruby/object:Gem::Version
68
+ version: 3.0.0
82
69
  description: File Transfer Handler for multiple Protocols
83
- email:
84
- - info@impac.ch
70
+ email:
71
+ - md@impac.ch
85
72
  executables: []
86
-
87
73
  extensions: []
88
-
89
74
  extra_rdoc_files: []
90
-
91
- files:
92
- - lib/file_transfer.rb
93
- - lib/file_transfer/file_transfer_handler.rb
94
- - lib/file_transfer/ftp.rb
95
- - lib/file_transfer/ftps.rb
96
- - lib/file_transfer/generic.rb
97
- - lib/file_transfer/sftp.rb
98
- - lib/file_transfer/version.rb
99
- - spec/file_transfer_spec.rb
100
- - spec/spec_helper.rb
101
- - spec/file_transfer/file_transfer_handler_spec.rb
102
- - spec/file_transfer/generic_spec.rb
103
- - spec/file_transfer/sftp_spec.rb
104
- - spec/test_files/empty_file.csv
105
- has_rdoc: true
106
- homepage: http://www.impac.ch
75
+ files:
76
+ - lib/file_transfer.rb
77
+ - lib/file_transfer/file_transfer_handler.rb
78
+ - lib/file_transfer/ftp.rb
79
+ - lib/file_transfer/generic.rb
80
+ - lib/file_transfer/sftp.rb
81
+ - lib/file_transfer/version.rb
82
+ - spec/file_transfer/file_transfer_handler_spec.rb
83
+ - spec/file_transfer/ftp_spec.rb
84
+ - spec/file_transfer/generic_spec.rb
85
+ - spec/file_transfer/sftp_spec.rb
86
+ - spec/file_transfer_spec.rb
87
+ - spec/spec_helper.rb
88
+ - spec/test_files/empty_file.csv
89
+ homepage:
107
90
  licenses: []
108
-
109
- post_install_message:
91
+ metadata: {}
92
+ post_install_message:
110
93
  rdoc_options: []
111
-
112
- require_paths:
113
- - lib
114
- required_ruby_version: !ruby/object:Gem::Requirement
115
- none: false
116
- requirements:
117
- - - ">="
118
- - !ruby/object:Gem::Version
119
- version: "0"
120
- required_rubygems_version: !ruby/object:Gem::Requirement
121
- none: false
122
- requirements:
123
- - - ">="
124
- - !ruby/object:Gem::Version
125
- version: "0"
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
126
106
  requirements: []
127
-
128
- rubyforge_project:
129
- rubygems_version: 1.5.1
130
- signing_key:
131
- specification_version: 3
132
- summary: Transfer Files from and to FTP/SFTP/FTPS
133
- test_files:
134
- - spec/file_transfer_spec.rb
135
- - spec/spec_helper.rb
136
- - spec/file_transfer/file_transfer_handler_spec.rb
137
- - spec/file_transfer/generic_spec.rb
138
- - spec/file_transfer/sftp_spec.rb
139
- - spec/test_files/empty_file.csv
107
+ rubyforge_project:
108
+ rubygems_version: 2.4.8
109
+ signing_key:
110
+ specification_version: 4
111
+ summary: Transfer Files from and to FTP/SFTP
112
+ test_files:
113
+ - spec/file_transfer_spec.rb
114
+ - spec/spec_helper.rb
115
+ - spec/file_transfer/file_transfer_handler_spec.rb
116
+ - spec/file_transfer/ftp_spec.rb
117
+ - spec/file_transfer/generic_spec.rb
118
+ - spec/file_transfer/sftp_spec.rb
119
+ - spec/test_files/empty_file.csv
@@ -1,5 +0,0 @@
1
- module FileTransfer
2
- class Ftps
3
- # To change this template use File | Settings | File Templates.
4
- end
5
- end