webtranslateit-safe 0.4.2 → 0.4.4
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 +4 -4
- data/CHANGELOG +22 -9
- data/bin/webtranslateit-safe +13 -13
- data/lib/webtranslateit/safe/archive.rb +9 -4
- data/lib/webtranslateit/safe/backup.rb +9 -2
- data/lib/webtranslateit/safe/cloudfiles.rb +21 -15
- data/lib/webtranslateit/safe/config/builder.rb +17 -8
- data/lib/webtranslateit/safe/config/node.rb +17 -10
- data/lib/webtranslateit/safe/ftp.rb +25 -25
- data/lib/webtranslateit/safe/gpg.rb +8 -2
- data/lib/webtranslateit/safe/gzip.rb +5 -1
- data/lib/webtranslateit/safe/local.rb +15 -11
- data/lib/webtranslateit/safe/mongodump.rb +12 -6
- data/lib/webtranslateit/safe/mysqldump.rb +9 -5
- data/lib/webtranslateit/safe/pgdump.rb +9 -9
- data/lib/webtranslateit/safe/pipe.rb +6 -0
- data/lib/webtranslateit/safe/s3.rb +28 -22
- data/lib/webtranslateit/safe/sftp.rb +42 -25
- data/lib/webtranslateit/safe/sink.rb +7 -2
- data/lib/webtranslateit/safe/source.rb +13 -9
- data/lib/webtranslateit/safe/stream.rb +14 -6
- data/lib/webtranslateit/safe/svndump.rb +5 -1
- data/lib/webtranslateit/safe/tmp_file.rb +16 -11
- data/lib/webtranslateit/safe.rb +12 -13
- metadata +3 -36
- data/.autotest +0 -3
- data/.document +0 -5
- data/.github/dependabot.yml +0 -26
- data/.github/release-drafter.yml +0 -36
- data/.github/workflows/ci.yml +0 -51
- data/.github/workflows/release-drafter.yml +0 -29
- data/.gitignore +0 -18
- data/.rspec +0 -3
- data/.rubocop.yml +0 -8
- data/.rubocop_todo.yml +0 -965
- data/Gemfile +0 -11
- data/Gemfile.lock +0 -89
- data/LICENSE.txt +0 -22
- data/Rakefile +0 -8
- data/TODO +0 -31
- data/lib/extensions/mktmpdir.rb +0 -45
- data/lib/webtranslateit/safe/version.rb +0 -5
- data/spec/integration/archive_integration_spec.rb +0 -89
- data/spec/integration/cleanup_spec.rb +0 -62
- data/spec/spec_helper.rb +0 -7
- data/spec/webtranslateit/safe/archive_spec.rb +0 -67
- data/spec/webtranslateit/safe/cloudfiles_spec.rb +0 -175
- data/spec/webtranslateit/safe/config_spec.rb +0 -307
- data/spec/webtranslateit/safe/gpg_spec.rb +0 -148
- data/spec/webtranslateit/safe/gzip_spec.rb +0 -64
- data/spec/webtranslateit/safe/local_spec.rb +0 -109
- data/spec/webtranslateit/safe/mongodump_spec.rb +0 -54
- data/spec/webtranslateit/safe/mysqldump_spec.rb +0 -83
- data/spec/webtranslateit/safe/pgdump_spec.rb +0 -45
- data/spec/webtranslateit/safe/s3_spec.rb +0 -168
- data/spec/webtranslateit/safe/svndump_spec.rb +0 -39
- data/templates/script.rb +0 -183
- data/webtranslateit-safe.gemspec +0 -31
data/Gemfile
DELETED
data/Gemfile.lock
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
webtranslateit-safe (0.4.2)
|
5
|
-
aws-s3
|
6
|
-
cloudfiles
|
7
|
-
net-sftp
|
8
|
-
|
9
|
-
GEM
|
10
|
-
remote: https://rubygems.org/
|
11
|
-
specs:
|
12
|
-
ast (2.4.2)
|
13
|
-
awesome_print (1.9.2)
|
14
|
-
aws-s3 (0.6.3)
|
15
|
-
builder
|
16
|
-
mime-types
|
17
|
-
xml-simple
|
18
|
-
builder (3.2.4)
|
19
|
-
cloudfiles (1.5.0.3)
|
20
|
-
json
|
21
|
-
diff-lcs (1.5.0)
|
22
|
-
json (2.6.3)
|
23
|
-
mime-types (3.4.1)
|
24
|
-
mime-types-data (~> 3.2015)
|
25
|
-
mime-types-data (3.2023.0218.1)
|
26
|
-
net-sftp (4.0.0)
|
27
|
-
net-ssh (>= 5.0.0, < 8.0.0)
|
28
|
-
net-ssh (7.1.0)
|
29
|
-
parallel (1.23.0)
|
30
|
-
parser (3.2.2.1)
|
31
|
-
ast (~> 2.4.1)
|
32
|
-
rainbow (3.1.1)
|
33
|
-
rake (13.0.6)
|
34
|
-
regexp_parser (2.8.0)
|
35
|
-
rexml (3.2.5)
|
36
|
-
rr (1.0.5)
|
37
|
-
rspec (3.12.0)
|
38
|
-
rspec-core (~> 3.12.0)
|
39
|
-
rspec-expectations (~> 3.12.0)
|
40
|
-
rspec-mocks (~> 3.12.0)
|
41
|
-
rspec-core (3.12.2)
|
42
|
-
rspec-support (~> 3.12.0)
|
43
|
-
rspec-expectations (3.12.3)
|
44
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
45
|
-
rspec-support (~> 3.12.0)
|
46
|
-
rspec-mocks (3.12.5)
|
47
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
48
|
-
rspec-support (~> 3.12.0)
|
49
|
-
rspec-support (3.12.0)
|
50
|
-
rubocop (1.51.0)
|
51
|
-
json (~> 2.3)
|
52
|
-
parallel (~> 1.10)
|
53
|
-
parser (>= 3.2.0.0)
|
54
|
-
rainbow (>= 2.2.2, < 4.0)
|
55
|
-
regexp_parser (>= 1.8, < 3.0)
|
56
|
-
rexml (>= 3.2.5, < 4.0)
|
57
|
-
rubocop-ast (>= 1.28.0, < 2.0)
|
58
|
-
ruby-progressbar (~> 1.7)
|
59
|
-
unicode-display_width (>= 2.4.0, < 3.0)
|
60
|
-
rubocop-ast (1.28.1)
|
61
|
-
parser (>= 3.2.1.0)
|
62
|
-
rubocop-capybara (2.18.0)
|
63
|
-
rubocop (~> 1.41)
|
64
|
-
rubocop-factory_bot (2.23.1)
|
65
|
-
rubocop (~> 1.33)
|
66
|
-
rubocop-rspec (2.22.0)
|
67
|
-
rubocop (~> 1.33)
|
68
|
-
rubocop-capybara (~> 2.17)
|
69
|
-
rubocop-factory_bot (~> 2.22)
|
70
|
-
ruby-progressbar (1.13.0)
|
71
|
-
unicode-display_width (2.4.2)
|
72
|
-
xml-simple (1.1.9)
|
73
|
-
rexml
|
74
|
-
|
75
|
-
PLATFORMS
|
76
|
-
arm64-darwin-22
|
77
|
-
x86_64-linux
|
78
|
-
|
79
|
-
DEPENDENCIES
|
80
|
-
awesome_print
|
81
|
-
rake
|
82
|
-
rr (~> 1.0.4)
|
83
|
-
rspec
|
84
|
-
rubocop
|
85
|
-
rubocop-rspec
|
86
|
-
webtranslateit-safe!
|
87
|
-
|
88
|
-
BUNDLED WITH
|
89
|
-
2.4.13
|
data/LICENSE.txt
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
Copyright (c) 2010-2013 Astrails Ltd.
|
2
|
-
|
3
|
-
MIT License
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
-
a copy of this software and associated documentation files (the
|
7
|
-
"Software"), to deal in the Software without restriction, including
|
8
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
-
permit persons to whom the Software is furnished to do so, subject to
|
11
|
-
the following conditions:
|
12
|
-
|
13
|
-
The above copyright notice and this permission notice shall be
|
14
|
-
included in all copies or substantial portions of the Software.
|
15
|
-
|
16
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
DELETED
data/TODO
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
- refactor
|
2
|
-
- refactor out global variables. pass a config object around instead
|
3
|
-
- common logging
|
4
|
-
- remove 1.8.6 support
|
5
|
-
- module registry
|
6
|
-
- base => prefix ?
|
7
|
-
- move requires into specific modules
|
8
|
-
- config.foo instead of config[:foo]
|
9
|
-
|
10
|
-
- features
|
11
|
-
- remote-only s3 support
|
12
|
-
- generic notifier support
|
13
|
-
- email notifier
|
14
|
-
- hipchat
|
15
|
-
- generic error notifier support
|
16
|
-
- email
|
17
|
-
- hipchat
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
- add 'silent'
|
22
|
-
- handle errors from mysqldump
|
23
|
-
- check that gpg is installed
|
24
|
-
- support percona XtraBackup as an option instead of mysqldump [patches anyone :) ?]
|
25
|
-
- backup validation:
|
26
|
-
- support for 'minsize' opition in backup that will check that produced backup is at least the expected size
|
27
|
-
this should catch many backup failure scenarious (like broken mysql connection, insufficient disk space etc.
|
28
|
-
- support differencial backups
|
29
|
-
- it should be fairly easy for filesystem backups using tar's built in incremental functionality.
|
30
|
-
- for mysql need to use XtraBackup
|
31
|
-
- or we can keep the previous dump locally and store only diff with the latest dump
|
data/lib/extensions/mktmpdir.rb
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
require 'tmpdir'
|
2
|
-
|
3
|
-
unless Dir.respond_to?(:mktmpdir)
|
4
|
-
# backward compat for 1.8.6
|
5
|
-
class Dir
|
6
|
-
def Dir.mktmpdir(prefix_suffix=nil, tmpdir=nil)
|
7
|
-
case prefix_suffix
|
8
|
-
when nil
|
9
|
-
prefix = 'd'
|
10
|
-
suffix = ''
|
11
|
-
when String
|
12
|
-
prefix = prefix_suffix
|
13
|
-
suffix = ''
|
14
|
-
when Array
|
15
|
-
prefix = prefix_suffix[0]
|
16
|
-
suffix = prefix_suffix[1]
|
17
|
-
else
|
18
|
-
raise ArgumentError, "unexpected prefix_suffix: #{prefix_suffix.inspect}"
|
19
|
-
end
|
20
|
-
tmpdir ||= Dir.tmpdir
|
21
|
-
t = Time.now.strftime('%Y%m%d')
|
22
|
-
n = nil
|
23
|
-
begin
|
24
|
-
path = "#{tmpdir}/#{prefix}#{t}-#{$$}-#{rand(0x100000000).to_s(36)}"
|
25
|
-
path << "-#{n}" if n
|
26
|
-
path << suffix
|
27
|
-
Dir.mkdir(path, 0700)
|
28
|
-
rescue Errno::EEXIST
|
29
|
-
n ||= 0
|
30
|
-
n += 1
|
31
|
-
retry
|
32
|
-
end
|
33
|
-
|
34
|
-
if block_given?
|
35
|
-
begin
|
36
|
-
yield path
|
37
|
-
ensure
|
38
|
-
FileUtils.remove_entry_secure path
|
39
|
-
end
|
40
|
-
else
|
41
|
-
path
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
@@ -1,89 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
require 'fileutils'
|
4
|
-
include FileUtils
|
5
|
-
|
6
|
-
describe 'tar backup' do
|
7
|
-
before(:all) do
|
8
|
-
# need both local and instance vars
|
9
|
-
# instance variables are used in tests
|
10
|
-
# local variables are used in the backup definition (instance vars can't be seen)
|
11
|
-
@root = root = 'tmp/archive_backup_example'
|
12
|
-
|
13
|
-
# clean state
|
14
|
-
rm_rf @root
|
15
|
-
mkdir_p @root
|
16
|
-
|
17
|
-
# create source tree
|
18
|
-
@src = src = "#{@root}/src"
|
19
|
-
mkdir_p "#{@src}/q/w/e"
|
20
|
-
mkdir_p "#{@src}/a/s/d"
|
21
|
-
|
22
|
-
File.open("#{@src}/qwe1", 'w') {|f| f.write('qwe') }
|
23
|
-
File.open("#{@src}/q/qwe2", 'w') {|f| f.write('qwe'*2) }
|
24
|
-
File.open("#{@src}/q/w/qwe3", 'w') {|f| f.write('qwe'*3) }
|
25
|
-
File.open("#{@src}/q/w/e/qwe4", 'w') {|f| f.write('qwe'*4) }
|
26
|
-
|
27
|
-
File.open("#{@src}/asd1", 'w') {|f| f.write('asd') }
|
28
|
-
File.open("#{@src}/a/asd2", 'w') {|f| f.write('asd' * 2) }
|
29
|
-
File.open("#{@src}/a/s/asd3", 'w') {|f| f.write('asd' * 3) }
|
30
|
-
|
31
|
-
@dst = dst = "#{@root}/backup"
|
32
|
-
mkdir_p @dst
|
33
|
-
|
34
|
-
@now = Time.now
|
35
|
-
@timestamp = @now.strftime('%y%m%d-%H%M')
|
36
|
-
|
37
|
-
stub(Time).now {@now} # Freeze
|
38
|
-
|
39
|
-
config = WebTranslateIt::Safe.safe do
|
40
|
-
local :path => "#{dst}/:kind"
|
41
|
-
tar do
|
42
|
-
archive :test1 do
|
43
|
-
files src
|
44
|
-
exclude "#{src}/q/w"
|
45
|
-
exclude "#{src}/q/w/e"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
WebTranslateIt::Safe.process config
|
50
|
-
|
51
|
-
@backup = "#{dst}/archive/archive-test1.#{@timestamp}.tar.gz"
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'should create backup file' do
|
55
|
-
File.exist?(@backup).should be true
|
56
|
-
end
|
57
|
-
|
58
|
-
describe 'after extracting' do
|
59
|
-
before(:all) do
|
60
|
-
# prepare target dir
|
61
|
-
@target = "#{@root}/test"
|
62
|
-
mkdir_p @target
|
63
|
-
system "tar -zxvf #{@backup} -C #{@target}"
|
64
|
-
|
65
|
-
@test = "#{@target}/#{@root}/src"
|
66
|
-
puts @test
|
67
|
-
end
|
68
|
-
|
69
|
-
it 'should include asd1/2/3' do
|
70
|
-
File.exist?("#{@test}/asd1").should be true
|
71
|
-
File.exist?("#{@test}/a/asd2").should be true
|
72
|
-
File.exist?("#{@test}/a/s/asd3").should be true
|
73
|
-
end
|
74
|
-
|
75
|
-
it 'should only include qwe 1 and 2 (no 3)' do
|
76
|
-
File.exist?("#{@test}/qwe1").should be true
|
77
|
-
File.exist?("#{@test}/q/qwe2").should be true
|
78
|
-
File.exist?("#{@test}/q/w/qwe3").should be false
|
79
|
-
File.exist?("#{@test}/q/w/e/qwe4").should be false
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'should preserve file content' do
|
83
|
-
File.read("#{@test}/qwe1").should == 'qwe'
|
84
|
-
File.read("#{@test}/q/qwe2").should == 'qweqwe'
|
85
|
-
File.read("#{@test}/a/s/asd3").should == 'asdasdasd'
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
require 'fileutils'
|
4
|
-
include FileUtils
|
5
|
-
|
6
|
-
describe 'tar backup' do
|
7
|
-
before(:all) do
|
8
|
-
# need both local and instance vars
|
9
|
-
# instance variables are used in tests
|
10
|
-
# local variables are used in the backup definition (instance vars can't be seen)
|
11
|
-
@root = root = 'tmp/cleanup_example'
|
12
|
-
|
13
|
-
# clean state
|
14
|
-
rm_rf @root
|
15
|
-
mkdir_p @root
|
16
|
-
|
17
|
-
# create source tree
|
18
|
-
@src = src = "#{@root}/src"
|
19
|
-
mkdir_p src
|
20
|
-
|
21
|
-
File.open(qwe = "#{@src}/qwe", 'w') {|f| f.write('qwe') }
|
22
|
-
|
23
|
-
@dst = dst = "#{@root}/backup"
|
24
|
-
mkdir_p "#{@dst}/archive"
|
25
|
-
|
26
|
-
@now = Time.now
|
27
|
-
@timestamp = @now.strftime('%y%m%d-%H%M')
|
28
|
-
|
29
|
-
stub(Time).now {@now} # Freeze
|
30
|
-
|
31
|
-
cp qwe, "#{dst}/archive/archive-foo.000001.tar.gz"
|
32
|
-
cp qwe, "#{dst}/archive/archive-foo.000002.tar.gz"
|
33
|
-
cp qwe, "#{dst}/archive/archive-foobar.000001.tar.gz"
|
34
|
-
cp qwe, "#{dst}/archive/archive-foobar.000002.tar.gz"
|
35
|
-
|
36
|
-
config = WebTranslateIt::Safe.safe do
|
37
|
-
local :path => "#{dst}/:kind"
|
38
|
-
tar do
|
39
|
-
keep :local => 1 # only leave the latest
|
40
|
-
archive :foo do
|
41
|
-
files src
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
WebTranslateIt::Safe.process config
|
46
|
-
|
47
|
-
@backup = "#{dst}/archive/archive-foo.#{@timestamp}.tar.gz"
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'should create backup file' do
|
51
|
-
File.exist?(@backup).should be true
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'should remove old backups' do
|
55
|
-
Dir["#{@dst}/archive/archive-foo.*"].should == [@backup]
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'should NOT remove backups with base having same prefix' do
|
59
|
-
Dir["#{@dst}/archive/archive-foobar.*"].sort.should == ["#{@dst}/archive/archive-foobar.000001.tar.gz", "#{@dst}/archive/archive-foobar.000002.tar.gz"]
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe WebTranslateIt::Safe::Archive do
|
4
|
-
|
5
|
-
def def_config
|
6
|
-
{
|
7
|
-
:options => 'OPTS',
|
8
|
-
:files => 'apples',
|
9
|
-
:exclude => 'oranges'
|
10
|
-
}
|
11
|
-
end
|
12
|
-
|
13
|
-
def archive(id = :foo, config = def_config)
|
14
|
-
WebTranslateIt::Safe::Archive.new(id, WebTranslateIt::Safe::Config::Node.new(nil, config))
|
15
|
-
end
|
16
|
-
|
17
|
-
after(:each) { WebTranslateIt::Safe::TmpFile.cleanup }
|
18
|
-
|
19
|
-
describe :backup do
|
20
|
-
before(:each) do
|
21
|
-
@archive = archive
|
22
|
-
stub(@archive).timestamp {'NOW'}
|
23
|
-
end
|
24
|
-
|
25
|
-
{
|
26
|
-
:id => 'foo',
|
27
|
-
:kind => 'archive',
|
28
|
-
:extension => '.tar',
|
29
|
-
:filename => 'archive-foo.NOW',
|
30
|
-
:command => 'tar -cf - OPTS --exclude=oranges apples',
|
31
|
-
}.each do |k, v|
|
32
|
-
it "should set #{k} to #{v}" do
|
33
|
-
@archive.backup.send(k).should == v
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe :tar_exclude_files do
|
39
|
-
it "should return '' when no excludes" do
|
40
|
-
archive(:foo, {}).send(:tar_exclude_files).should == ''
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'should accept single exclude as string' do
|
44
|
-
archive(:foo, {:exclude => 'bar'}).send(:tar_exclude_files).should == '--exclude=bar'
|
45
|
-
end
|
46
|
-
|
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
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
describe :tar_files do
|
53
|
-
it 'should raise RuntimeError when no files' do
|
54
|
-
lambda {
|
55
|
-
archive(:foo, {}).send(:tar_files)
|
56
|
-
}.should raise_error(RuntimeError, 'missing files for tar')
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'should accept single file as string' do
|
60
|
-
archive(:foo, {:files => 'foo'}).send(:tar_files).should == 'foo'
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'should accept multiple files as array' do
|
64
|
-
archive(:foo, {:files => ['foo', 'bar']}).send(:tar_files).should == 'foo bar'
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
@@ -1,175 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe WebTranslateIt::Safe::Cloudfiles do
|
4
|
-
|
5
|
-
def def_config
|
6
|
-
{
|
7
|
-
cloudfiles: {
|
8
|
-
container: '_container',
|
9
|
-
user: '_user',
|
10
|
-
api_key: '_api_key',
|
11
|
-
},
|
12
|
-
keep: { cloudfiles: 2 }
|
13
|
-
}
|
14
|
-
end
|
15
|
-
|
16
|
-
def def_backup(extra = {})
|
17
|
-
{
|
18
|
-
kind: '_kind',
|
19
|
-
filename: '/backup/somewhere/_kind-_id.NOW.bar',
|
20
|
-
extension: '.bar',
|
21
|
-
id: '_id',
|
22
|
-
timestamp: 'NOW'
|
23
|
-
}.merge(extra)
|
24
|
-
end
|
25
|
-
|
26
|
-
def cloudfiles(config = def_config, backup = def_backup)
|
27
|
-
WebTranslateIt::Safe::Cloudfiles.new(
|
28
|
-
WebTranslateIt::Safe::Config::Node.new.merge(config),
|
29
|
-
WebTranslateIt::Safe::Backup.new(backup)
|
30
|
-
)
|
31
|
-
end
|
32
|
-
|
33
|
-
describe :cleanup do
|
34
|
-
|
35
|
-
before(:each) do
|
36
|
-
@cloudfiles = cloudfiles
|
37
|
-
|
38
|
-
@files = [4,1,3,2].map { |i| "aaaaa#{i}" }
|
39
|
-
|
40
|
-
@container = 'container'
|
41
|
-
|
42
|
-
stub(@container).objects(prefix: '_kind/_id/_kind-_id.') { @files }
|
43
|
-
stub(@container).delete_object(anything)
|
44
|
-
|
45
|
-
stub(CloudFiles::Connection).
|
46
|
-
new('_user', '_api_key', true, false).stub!.
|
47
|
-
container('_container') {@container}
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'should check [:keep, :cloudfiles]' do
|
51
|
-
@cloudfiles.config[:keep].data['cloudfiles'] = nil
|
52
|
-
dont_allow(@cloudfiles.backup).filename
|
53
|
-
@cloudfiles.send :cleanup
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'should delete extra files' do
|
57
|
-
mock(@container).delete_object('aaaaa1')
|
58
|
-
mock(@container).delete_object('aaaaa2')
|
59
|
-
@cloudfiles.send :cleanup
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
describe :active do
|
65
|
-
before(:each) do
|
66
|
-
@cloudfiles = cloudfiles
|
67
|
-
end
|
68
|
-
|
69
|
-
it 'should be true when all params are set' do
|
70
|
-
expect(@cloudfiles.active?).to be_truthy
|
71
|
-
end
|
72
|
-
|
73
|
-
it 'should be false if container is missing' do
|
74
|
-
@cloudfiles.config[:cloudfiles].data['container'] = nil
|
75
|
-
expect(@cloudfiles.active?).to be_falsy
|
76
|
-
end
|
77
|
-
|
78
|
-
it 'should be false if user is missing' do
|
79
|
-
@cloudfiles.config[:cloudfiles].data['user'] = nil
|
80
|
-
expect(@cloudfiles.active?).to be_falsy
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'should be false if api_key is missing' do
|
84
|
-
@cloudfiles.config[:cloudfiles].data['api_key'] = nil
|
85
|
-
expect(@cloudfiles.active?).to be_falsy
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
describe :path do
|
90
|
-
before(:each) do
|
91
|
-
@cloudfiles = cloudfiles
|
92
|
-
end
|
93
|
-
it 'should use cloudfiles/path 1st' do
|
94
|
-
@cloudfiles.config[:cloudfiles].data['path'] = 'cloudfiles_path'
|
95
|
-
@cloudfiles.config[:local] = {path: 'local_path'}
|
96
|
-
@cloudfiles.send(:path).should == 'cloudfiles_path'
|
97
|
-
end
|
98
|
-
|
99
|
-
it 'should use local/path 2nd' do
|
100
|
-
@cloudfiles.config.merge local: {path: 'local_path'}
|
101
|
-
@cloudfiles.send(:path).should == 'local_path'
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'should use constant 3rd' do
|
105
|
-
@cloudfiles.send(:path).should == '_kind/_id'
|
106
|
-
end
|
107
|
-
|
108
|
-
end
|
109
|
-
|
110
|
-
describe :save do
|
111
|
-
def add_stubs(*stubs)
|
112
|
-
stubs.each do |s|
|
113
|
-
case s
|
114
|
-
when :connection
|
115
|
-
@connection = 'connection'
|
116
|
-
stub(CloudFiles::Authentication).new
|
117
|
-
stub(CloudFiles::Connection).
|
118
|
-
new('_user', '_api_key', true, false) {@connection}
|
119
|
-
when :file_size
|
120
|
-
stub(@cloudfiles).get_file_size('foo') {123}
|
121
|
-
when :create_container
|
122
|
-
@container = 'container'
|
123
|
-
stub(@container).create_object('_kind/_id/backup/somewhere/_kind-_id.NOW.bar.bar', true) {@object}
|
124
|
-
stub(@connection).create_container {@container}
|
125
|
-
when :file_open
|
126
|
-
stub(File).open('foo')
|
127
|
-
when :cloudfiles_store
|
128
|
-
@object = 'object'
|
129
|
-
stub(@object).write(nil) {true}
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
before(:each) do
|
135
|
-
@cloudfiles = cloudfiles(def_config, def_backup(path: 'foo'))
|
136
|
-
@full_path = '_kind/_id/backup/somewhere/_kind-_id.NOW.bar.bar'
|
137
|
-
end
|
138
|
-
|
139
|
-
it 'should fail if no backup.file is set' do
|
140
|
-
@cloudfiles.backup.path = nil
|
141
|
-
proc {@cloudfiles.send(:save)}.should raise_error(RuntimeError)
|
142
|
-
end
|
143
|
-
|
144
|
-
it 'should establish Cloud Files connection' do
|
145
|
-
add_stubs(:connection, :file_size, :create_container, :file_open, :cloudfiles_store)
|
146
|
-
@cloudfiles.send(:save)
|
147
|
-
end
|
148
|
-
|
149
|
-
it 'should open local file' do
|
150
|
-
add_stubs(:connection, :file_size, :create_container, :cloudfiles_store)
|
151
|
-
mock(File).open('foo')
|
152
|
-
@cloudfiles.send(:save)
|
153
|
-
end
|
154
|
-
|
155
|
-
it "should call write on the cloudfile object with files' descriptor" do
|
156
|
-
add_stubs(:connection, :file_size, :create_container, :cloudfiles_store)
|
157
|
-
stub(File).open('foo') {'qqq'}
|
158
|
-
mock(@object).write('qqq') {true}
|
159
|
-
@cloudfiles.send(:save)
|
160
|
-
end
|
161
|
-
|
162
|
-
it 'should upload file' do
|
163
|
-
add_stubs(:connection, :file_size, :create_container, :file_open, :cloudfiles_store)
|
164
|
-
@cloudfiles.send(:save)
|
165
|
-
end
|
166
|
-
|
167
|
-
it 'should fail on files bigger then 5G' do
|
168
|
-
add_stubs(:connection)
|
169
|
-
mock(File).stat('foo').stub!.size {5*1024*1024*1024+1}
|
170
|
-
mock(STDERR).puts(anything)
|
171
|
-
dont_allow(Benchmark).realtime
|
172
|
-
@cloudfiles.send(:save)
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|