webtranslateit-safe 0.4.0 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +445 -32
- data/CHANGELOG +8 -5
- data/Gemfile.lock +1 -1
- data/bin/webtranslateit-safe +13 -13
- data/lib/webtranslateit/safe/archive.rb +4 -9
- data/lib/webtranslateit/safe/backup.rb +2 -9
- data/lib/webtranslateit/safe/cloudfiles.rb +1 -1
- data/lib/webtranslateit/safe/config/builder.rb +6 -16
- data/lib/webtranslateit/safe/config/node.rb +14 -21
- data/lib/webtranslateit/safe/ftp.rb +26 -26
- data/lib/webtranslateit/safe/gpg.rb +2 -8
- data/lib/webtranslateit/safe/gzip.rb +1 -5
- data/lib/webtranslateit/safe/local.rb +12 -16
- data/lib/webtranslateit/safe/mongodump.rb +6 -13
- data/lib/webtranslateit/safe/mysqldump.rb +5 -9
- data/lib/webtranslateit/safe/pgdump.rb +9 -9
- data/lib/webtranslateit/safe/pipe.rb +0 -6
- data/lib/webtranslateit/safe/s3.rb +1 -1
- data/lib/webtranslateit/safe/sftp.rb +25 -33
- data/lib/webtranslateit/safe/sink.rb +4 -9
- data/lib/webtranslateit/safe/source.rb +9 -13
- data/lib/webtranslateit/safe/stream.rb +6 -14
- data/lib/webtranslateit/safe/svndump.rb +1 -5
- data/lib/webtranslateit/safe/tmp_file.rb +11 -16
- data/lib/webtranslateit/safe/version.rb +1 -5
- data/lib/webtranslateit/safe.rb +9 -11
- data/spec/webtranslateit/safe/archive_spec.rb +20 -20
- data/spec/webtranslateit/safe/cloudfiles_spec.rb +1 -1
- data/spec/webtranslateit/safe/config_spec.rb +31 -31
- data/spec/webtranslateit/safe/gpg_spec.rb +35 -35
- data/spec/webtranslateit/safe/gzip_spec.rb +11 -11
- data/spec/webtranslateit/safe/local_spec.rb +27 -27
- data/spec/webtranslateit/safe/mongodump_spec.rb +23 -23
- data/spec/webtranslateit/safe/mysqldump_spec.rb +30 -30
- data/spec/webtranslateit/safe/pgdump_spec.rb +13 -13
- data/spec/webtranslateit/safe/s3_spec.rb +1 -1
- data/spec/webtranslateit/safe/svndump_spec.rb +9 -9
- data/webtranslateit-safe.gemspec +6 -7
- metadata +3 -3
@@ -1,7 +1,5 @@
|
|
1
1
|
module WebTranslateIt
|
2
|
-
|
3
2
|
module Safe
|
4
|
-
|
5
3
|
class Sftp < Sink
|
6
4
|
|
7
5
|
protected
|
@@ -15,42 +13,38 @@ module WebTranslateIt
|
|
15
13
|
end
|
16
14
|
|
17
15
|
def save
|
18
|
-
raise 'pipe-streaming not supported for SFTP.' unless @backup.path
|
16
|
+
raise RuntimeError, 'pipe-streaming not supported for SFTP.' unless @backup.path
|
19
17
|
|
20
18
|
puts "Uploading #{host}:#{full_path} via SFTP" if verbose? || dry_run?
|
21
19
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
begin
|
39
|
-
sftp.mkdir!(folder)
|
40
|
-
rescue StandardError
|
41
|
-
Net::SFTP::StatusException
|
20
|
+
unless dry_run? || local_only?
|
21
|
+
opts = {}
|
22
|
+
opts[:password] = password if password
|
23
|
+
opts[:port] = port if port
|
24
|
+
Net::SFTP.start(host, user, opts) do |sftp|
|
25
|
+
puts "Sending #{@backup.path} to #{full_path}" if verbose?
|
26
|
+
begin
|
27
|
+
sftp.upload! @backup.path, full_path
|
28
|
+
rescue Net::SFTP::StatusException
|
29
|
+
puts "Ensuring remote path (#{path}) exists" if verbose?
|
30
|
+
# mkdir -p
|
31
|
+
folders = path.split('/')
|
32
|
+
folders.each_index do |i|
|
33
|
+
folder = folders[0..i].join('/')
|
34
|
+
puts "Creating #{folder} on remote" if verbose?
|
35
|
+
sftp.mkdir!(folder) rescue Net::SFTP::StatusException
|
42
36
|
end
|
37
|
+
retry
|
43
38
|
end
|
44
|
-
retry
|
45
39
|
end
|
40
|
+
puts '...done' if verbose?
|
46
41
|
end
|
47
|
-
puts '...done' if verbose?
|
48
42
|
end
|
49
43
|
|
50
44
|
def cleanup
|
51
45
|
return if local_only? || dry_run?
|
52
46
|
|
53
|
-
return unless
|
47
|
+
return unless keep = config[:keep, :sftp]
|
54
48
|
|
55
49
|
puts "listing files: #{host}:#{base}*" if verbose?
|
56
50
|
opts = {}
|
@@ -59,11 +53,11 @@ module WebTranslateIt
|
|
59
53
|
Net::SFTP.start(host, user, opts) do |sftp|
|
60
54
|
files = sftp.dir.glob(path, File.basename("#{base}*"))
|
61
55
|
|
62
|
-
puts
|
56
|
+
puts files.collect {|x| x.name } if verbose?
|
63
57
|
|
64
|
-
files = files
|
65
|
-
|
66
|
-
|
58
|
+
files = files.
|
59
|
+
collect {|x| x.name }.
|
60
|
+
sort
|
67
61
|
|
68
62
|
cleanup_with_limit(files, keep) do |f|
|
69
63
|
file = File.join(path, f)
|
@@ -90,7 +84,5 @@ module WebTranslateIt
|
|
90
84
|
end
|
91
85
|
|
92
86
|
end
|
93
|
-
|
94
87
|
end
|
95
|
-
|
96
|
-
end
|
88
|
+
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
module WebTranslateIt
|
2
|
-
|
3
2
|
module Safe
|
4
|
-
|
5
3
|
class Sink < Stream
|
6
4
|
|
7
5
|
def process
|
@@ -17,7 +15,7 @@ module WebTranslateIt
|
|
17
15
|
# base is used in 'cleanup' to find all files that begin with base. the '.'
|
18
16
|
# at the end is essential to distinguish b/w foo.* and foobar.* archives for example
|
19
17
|
def base
|
20
|
-
@base ||= File.join(path,
|
18
|
+
@base ||= File.join(path, File.basename(@backup.filename).split('.').first + '.')
|
21
19
|
end
|
22
20
|
|
23
21
|
def full_path
|
@@ -25,16 +23,13 @@ module WebTranslateIt
|
|
25
23
|
end
|
26
24
|
|
27
25
|
# call block on files to be removed (all except for the LAST 'limit' files
|
28
|
-
def cleanup_with_limit(files, limit, &)
|
26
|
+
def cleanup_with_limit(files, limit, &block)
|
29
27
|
return unless files.size > limit
|
30
28
|
|
31
29
|
to_remove = files[0..(files.size - limit - 1)]
|
32
30
|
# TODO: validate here
|
33
|
-
to_remove.each(&)
|
31
|
+
to_remove.each(&block)
|
34
32
|
end
|
35
|
-
|
36
33
|
end
|
37
|
-
|
38
34
|
end
|
39
|
-
|
40
|
-
end
|
35
|
+
end
|
@@ -1,14 +1,10 @@
|
|
1
1
|
module WebTranslateIt
|
2
|
-
|
3
2
|
module Safe
|
4
|
-
|
5
3
|
class Source < Stream
|
6
4
|
|
7
5
|
attr_accessor :id
|
8
|
-
|
9
6
|
def initialize(id, config)
|
10
|
-
@id = id.to_s
|
11
|
-
@config = config
|
7
|
+
@id, @config = id.to_s, config
|
12
8
|
end
|
13
9
|
|
14
10
|
def timestamp
|
@@ -25,13 +21,12 @@ module WebTranslateIt
|
|
25
21
|
|
26
22
|
def backup
|
27
23
|
return @backup if @backup
|
28
|
-
|
29
24
|
@backup = Backup.new(
|
30
|
-
id
|
31
|
-
kind
|
32
|
-
extension
|
33
|
-
command
|
34
|
-
timestamp
|
25
|
+
:id => @id,
|
26
|
+
:kind => kind,
|
27
|
+
:extension => extension,
|
28
|
+
:command => command,
|
29
|
+
:timestamp => timestamp
|
35
30
|
)
|
36
31
|
# can't do this in the initializer hash above since
|
37
32
|
# filename() calls expand() which requires @backup
|
@@ -40,12 +35,13 @@ module WebTranslateIt
|
|
40
35
|
@backup
|
41
36
|
end
|
42
37
|
|
38
|
+
protected
|
39
|
+
|
43
40
|
def self.human_name
|
44
41
|
name.split('::').last.downcase
|
45
42
|
end
|
46
43
|
|
47
44
|
end
|
48
|
-
|
49
45
|
end
|
50
|
-
|
51
46
|
end
|
47
|
+
|
@@ -1,22 +1,17 @@
|
|
1
1
|
module WebTranslateIt
|
2
|
-
|
3
2
|
module Safe
|
4
|
-
|
5
3
|
class Stream
|
6
4
|
|
7
5
|
attr_accessor :config, :backup
|
8
|
-
|
9
6
|
def initialize(config, backup)
|
10
|
-
@config = config
|
11
|
-
@backup = backup
|
7
|
+
@config, @backup = config, backup
|
12
8
|
end
|
13
|
-
|
14
9
|
# FIXME: move to Backup
|
15
10
|
def expand(path)
|
16
|
-
path
|
17
|
-
|
18
|
-
|
19
|
-
|
11
|
+
path .
|
12
|
+
gsub(/:kind\b/, @backup.kind.to_s) .
|
13
|
+
gsub(/:id\b/, @backup.id.to_s) .
|
14
|
+
gsub(/:timestamp\b/, @backup.timestamp)
|
20
15
|
end
|
21
16
|
|
22
17
|
private
|
@@ -32,9 +27,6 @@ module WebTranslateIt
|
|
32
27
|
def dry_run?
|
33
28
|
config[:dry_run]
|
34
29
|
end
|
35
|
-
|
36
30
|
end
|
37
|
-
|
38
31
|
end
|
39
|
-
|
40
|
-
end
|
32
|
+
end
|
@@ -1,10 +1,7 @@
|
|
1
1
|
require 'tmpdir'
|
2
2
|
module WebTranslateIt
|
3
|
-
|
4
3
|
module Safe
|
5
|
-
|
6
4
|
module TmpFile
|
7
|
-
|
8
5
|
@keep_files = []
|
9
6
|
|
10
7
|
def self.tmproot
|
@@ -15,21 +12,22 @@ module WebTranslateIt
|
|
15
12
|
begin
|
16
13
|
FileUtils.remove_entry_secure tmproot
|
17
14
|
rescue ArgumentError => e
|
18
|
-
|
19
|
-
|
20
|
-
puts <<~ERR
|
15
|
+
if e.message =~ /parent directory is world writable/
|
16
|
+
puts <<-ERR
|
21
17
|
|
22
18
|
|
23
|
-
|
24
|
-
|
25
|
-
|
19
|
+
********************************************************************************
|
20
|
+
It looks like you have wrong permissions on your TEMP directory. The usual
|
21
|
+
case is when you have world writable TEMP directory withOUT the sticky bit.
|
26
22
|
|
27
|
-
|
23
|
+
Try "chmod +t" on it.
|
28
24
|
|
29
|
-
|
25
|
+
********************************************************************************
|
30
26
|
|
31
|
-
|
32
|
-
|
27
|
+
ERR
|
28
|
+
else
|
29
|
+
raise
|
30
|
+
end
|
33
31
|
end
|
34
32
|
@tmproot = nil
|
35
33
|
end
|
@@ -45,9 +43,6 @@ module WebTranslateIt
|
|
45
43
|
@keep_files << file # so that it will not get gcollected and removed from filesystem until the end
|
46
44
|
file.path
|
47
45
|
end
|
48
|
-
|
49
46
|
end
|
50
|
-
|
51
47
|
end
|
52
|
-
|
53
48
|
end
|
data/lib/webtranslateit/safe.rb
CHANGED
@@ -38,25 +38,25 @@ require 'webtranslateit/safe/sftp'
|
|
38
38
|
require 'webtranslateit/safe/ftp'
|
39
39
|
|
40
40
|
module WebTranslateIt
|
41
|
-
|
42
41
|
module Safe
|
43
|
-
|
44
42
|
ROOT = File.join(File.dirname(__FILE__), '..', '..')
|
45
43
|
|
46
|
-
def safe(&)
|
47
|
-
Config::Node.new(&)
|
44
|
+
def safe(&block)
|
45
|
+
Config::Node.new(&block)
|
48
46
|
end
|
49
47
|
|
50
48
|
def process(config)
|
49
|
+
|
51
50
|
[[Mysqldump, [:mysqldump, :databases]],
|
52
51
|
[Pgdump, [:pgdump, :databases]],
|
53
52
|
[Mongodump, [:mongodump, :databases]],
|
54
53
|
[Archive, [:tar, :archives]],
|
55
|
-
[Svndump, [:svndump, :repos]]
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
54
|
+
[Svndump, [:svndump, :repos]]
|
55
|
+
].each do |klass, path|
|
56
|
+
if collection = config[*path]
|
57
|
+
collection.each do |name, c|
|
58
|
+
klass.new(name, c).backup.run(c, :gpg, :gzip, :local, :s3, :cloudfiles, :sftp, :ftp)
|
59
|
+
end
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
@@ -64,7 +64,5 @@ module WebTranslateIt
|
|
64
64
|
end
|
65
65
|
module_function :safe
|
66
66
|
module_function :process
|
67
|
-
|
68
67
|
end
|
69
|
-
|
70
68
|
end
|
@@ -4,9 +4,9 @@ describe WebTranslateIt::Safe::Archive do
|
|
4
4
|
|
5
5
|
def def_config
|
6
6
|
{
|
7
|
-
options
|
8
|
-
files
|
9
|
-
exclude
|
7
|
+
:options => 'OPTS',
|
8
|
+
:files => 'apples',
|
9
|
+
:exclude => 'oranges'
|
10
10
|
}
|
11
11
|
end
|
12
12
|
|
@@ -19,49 +19,49 @@ describe WebTranslateIt::Safe::Archive do
|
|
19
19
|
describe :backup do
|
20
20
|
before(:each) do
|
21
21
|
@archive = archive
|
22
|
-
stub(@archive).timestamp {
|
22
|
+
stub(@archive).timestamp {'NOW'}
|
23
23
|
end
|
24
24
|
|
25
25
|
{
|
26
|
-
id
|
27
|
-
kind
|
28
|
-
extension
|
29
|
-
filename
|
30
|
-
command
|
26
|
+
:id => 'foo',
|
27
|
+
:kind => 'archive',
|
28
|
+
:extension => '.tar',
|
29
|
+
:filename => 'archive-foo.NOW',
|
30
|
+
:command => 'tar -cf - OPTS --exclude=oranges apples',
|
31
31
|
}.each do |k, v|
|
32
|
-
it "
|
32
|
+
it "should set #{k} to #{v}" do
|
33
33
|
@archive.backup.send(k).should == v
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
38
|
describe :tar_exclude_files do
|
39
|
-
it "
|
39
|
+
it "should return '' when no excludes" do
|
40
40
|
archive(:foo, {}).send(:tar_exclude_files).should == ''
|
41
41
|
end
|
42
42
|
|
43
|
-
it '
|
44
|
-
archive(:foo, {exclude
|
43
|
+
it 'should accept single exclude as string' do
|
44
|
+
archive(:foo, {:exclude => 'bar'}).send(:tar_exclude_files).should == '--exclude=bar'
|
45
45
|
end
|
46
46
|
|
47
|
-
it '
|
48
|
-
archive(:foo, {exclude
|
47
|
+
it 'should accept multiple exclude as array' do
|
48
|
+
archive(:foo, {:exclude => ['foo', 'bar']}).send(:tar_exclude_files).should == '--exclude=foo --exclude=bar'
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
52
|
describe :tar_files do
|
53
|
-
it '
|
53
|
+
it 'should raise RuntimeError when no files' do
|
54
54
|
lambda {
|
55
55
|
archive(:foo, {}).send(:tar_files)
|
56
56
|
}.should raise_error(RuntimeError, 'missing files for tar')
|
57
57
|
end
|
58
58
|
|
59
|
-
it '
|
60
|
-
archive(:foo, {files
|
59
|
+
it 'should accept single file as string' do
|
60
|
+
archive(:foo, {:files => 'foo'}).send(:tar_files).should == 'foo'
|
61
61
|
end
|
62
62
|
|
63
|
-
it '
|
64
|
-
archive(:foo, {files
|
63
|
+
it 'should accept multiple files as array' do
|
64
|
+
archive(:foo, {:files => ['foo', 'bar']}).send(:tar_files).should == 'foo bar'
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe WebTranslateIt::Safe::Config do
|
4
|
-
it '
|
4
|
+
it 'should parse example config' do
|
5
5
|
config = WebTranslateIt::Safe::Config::Node.new do
|
6
6
|
|
7
7
|
dry_run false
|
@@ -47,7 +47,7 @@ describe WebTranslateIt::Safe::Config do
|
|
47
47
|
database :blog
|
48
48
|
|
49
49
|
database :production do
|
50
|
-
keep local
|
50
|
+
keep :local => 3
|
51
51
|
|
52
52
|
gpg do
|
53
53
|
password 'custom-production-pass'
|
@@ -69,7 +69,7 @@ describe WebTranslateIt::Safe::Config do
|
|
69
69
|
database :blog
|
70
70
|
|
71
71
|
database :production do
|
72
|
-
keep local
|
72
|
+
keep :local => 3
|
73
73
|
|
74
74
|
skip_tables [:logger_exceptions, :request_logs]
|
75
75
|
end
|
@@ -102,7 +102,7 @@ describe WebTranslateIt::Safe::Config do
|
|
102
102
|
end
|
103
103
|
|
104
104
|
archive :misc do
|
105
|
-
files ['/backup/*.rb']
|
105
|
+
files [ '/backup/*.rb' ]
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
@@ -125,13 +125,13 @@ describe WebTranslateIt::Safe::Config do
|
|
125
125
|
'key' => 's3 key',
|
126
126
|
'secret' => 'secret',
|
127
127
|
'bucket' => 'bucket',
|
128
|
-
'path' => 'path1'
|
128
|
+
'path' => 'path1',
|
129
129
|
},
|
130
130
|
|
131
131
|
'sftp' => {
|
132
132
|
'user' => 'sftp user',
|
133
133
|
'password' => 'sftp password',
|
134
|
-
'host' => 'sftp host'
|
134
|
+
'host' => 'sftp host',
|
135
135
|
},
|
136
136
|
|
137
137
|
'gpg' => {'password' => 'astrails', 'key' => 'gpg-key'},
|
@@ -149,11 +149,11 @@ describe WebTranslateIt::Safe::Config do
|
|
149
149
|
'databases' => {
|
150
150
|
'blog' => {},
|
151
151
|
'production' => {
|
152
|
-
|
153
|
-
|
154
|
-
'skip_tables' => ['logger_exceptions', 'request_logs']
|
155
|
-
}
|
156
|
-
}
|
152
|
+
'keep' => {'local' => 3},
|
153
|
+
'gpg' => {'password' => 'custom-production-pass'},
|
154
|
+
'skip_tables' => ['logger_exceptions', 'request_logs'],
|
155
|
+
},
|
156
|
+
},
|
157
157
|
},
|
158
158
|
|
159
159
|
'pgdump' => {
|
@@ -166,15 +166,15 @@ describe WebTranslateIt::Safe::Config do
|
|
166
166
|
'databases' => {
|
167
167
|
'blog' => {},
|
168
168
|
'production' => {
|
169
|
-
|
170
|
-
'skip_tables' => ['logger_exceptions', 'request_logs']
|
171
|
-
}
|
172
|
-
}
|
169
|
+
'keep' => {'local' => 3},
|
170
|
+
'skip_tables' => ['logger_exceptions', 'request_logs'],
|
171
|
+
},
|
172
|
+
},
|
173
173
|
},
|
174
174
|
|
175
175
|
'svndump' => {
|
176
176
|
'repos' => {
|
177
|
-
'my_repo'
|
177
|
+
'my_repo'=> {
|
178
178
|
'repo_path' => '/home/svn/my_repo'
|
179
179
|
}
|
180
180
|
}
|
@@ -187,10 +187,10 @@ describe WebTranslateIt::Safe::Config do
|
|
187
187
|
'dot-configs' => {'files' => ['/home/*/.[^.]*']},
|
188
188
|
'blog' => {
|
189
189
|
'files' => ['/var/www/blog.astrails.com/'],
|
190
|
-
'exclude' => ['/var/www/blog.astrails.com/log', '/var/www/blog.astrails.com/tmp']
|
190
|
+
'exclude' => ['/var/www/blog.astrails.com/log', '/var/www/blog.astrails.com/tmp'],
|
191
191
|
},
|
192
|
-
'misc' => {'files' => ['/backup/*.rb']}
|
193
|
-
}
|
192
|
+
'misc' => { 'files' => ['/backup/*.rb'] },
|
193
|
+
},
|
194
194
|
},
|
195
195
|
|
196
196
|
'mongodump' => {
|
@@ -206,7 +206,7 @@ describe WebTranslateIt::Safe::Config do
|
|
206
206
|
config.to_hash.should == expected
|
207
207
|
end
|
208
208
|
|
209
|
-
it '
|
209
|
+
it 'should make an array from multivalues' do
|
210
210
|
config = WebTranslateIt::Safe::Config::Node.new do
|
211
211
|
skip_tables 'a'
|
212
212
|
skip_tables 'b'
|
@@ -219,13 +219,13 @@ describe WebTranslateIt::Safe::Config do
|
|
219
219
|
expected = {
|
220
220
|
'skip_tables' => ['a', 'b'],
|
221
221
|
'files' => ['/foo', '/bar'],
|
222
|
-
'exclude' => ['/foo/bar', '/foo/bar/baz']
|
222
|
+
'exclude' => ['/foo/bar', '/foo/bar/baz'],
|
223
223
|
}
|
224
224
|
|
225
225
|
config.to_hash.should == expected
|
226
226
|
end
|
227
227
|
|
228
|
-
it '
|
228
|
+
it 'should raise error on key duplication' do
|
229
229
|
proc do
|
230
230
|
WebTranslateIt::Safe::Config::Node.new do
|
231
231
|
path 'foo'
|
@@ -234,7 +234,7 @@ describe WebTranslateIt::Safe::Config do
|
|
234
234
|
end.should raise_error(ArgumentError, "duplicate value for 'path'")
|
235
235
|
end
|
236
236
|
|
237
|
-
it '
|
237
|
+
it 'should accept hash as data' do
|
238
238
|
WebTranslateIt::Safe::Config::Node.new do
|
239
239
|
tar do
|
240
240
|
archive 'blog', files: 'foo', exclude: ['aaa', 'bbb']
|
@@ -251,7 +251,7 @@ describe WebTranslateIt::Safe::Config do
|
|
251
251
|
}
|
252
252
|
end
|
253
253
|
|
254
|
-
it '
|
254
|
+
it 'should accept hash as data and a block' do
|
255
255
|
WebTranslateIt::Safe::Config::Node.new do
|
256
256
|
tar do
|
257
257
|
archive 'blog', files: 'foo' do
|
@@ -270,21 +270,21 @@ describe WebTranslateIt::Safe::Config do
|
|
270
270
|
}
|
271
271
|
end
|
272
272
|
|
273
|
-
it '
|
273
|
+
it 'should accept multiple levels of data hash' do
|
274
274
|
config = WebTranslateIt::Safe::Config::Node.new nil, tar: {
|
275
|
-
s3: {bucket: '_bucket', key: '_key', secret: '_secret'},
|
276
|
-
keep: {s3: 2}
|
275
|
+
s3: { bucket: '_bucket', key: '_key', secret: '_secret', },
|
276
|
+
keep: { s3: 2 }
|
277
277
|
}
|
278
278
|
|
279
279
|
config.to_hash.should == {
|
280
280
|
'tar' => {
|
281
|
-
's3' => {'bucket' => '_bucket', 'key' => '_key', 'secret' => '_secret'},
|
282
|
-
'keep' => {'s3' => 2}
|
281
|
+
's3' => { 'bucket' => '_bucket', 'key' => '_key', 'secret' => '_secret', },
|
282
|
+
'keep' => { 's3' => 2 }
|
283
283
|
}
|
284
284
|
}
|
285
285
|
end
|
286
|
-
|
287
|
-
it '
|
286
|
+
|
287
|
+
it 'should set multi value as array' do
|
288
288
|
config = WebTranslateIt::Safe::Config::Node.new do
|
289
289
|
tar do
|
290
290
|
archive 'foo' do
|