heirloom 0.9.0 → 0.10.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.
- data/.rvmrc +1 -1
- data/CHANGELOG +7 -0
- data/README.md +1 -11
- data/lib/heirloom.rb +2 -0
- data/lib/heirloom/acl/s3.rb +8 -9
- data/lib/heirloom/archive/authorizer.rb +3 -1
- data/lib/heirloom/archive/destroyer.rb +3 -3
- data/lib/heirloom/archive/downloader.rb +4 -4
- data/lib/heirloom/archive/reader.rb +15 -5
- data/lib/heirloom/archive/uploader.rb +13 -9
- data/lib/heirloom/archive/writer.rb +2 -0
- data/lib/heirloom/cipher.rb +2 -0
- data/lib/heirloom/cipher/data.rb +37 -19
- data/lib/heirloom/cipher/file.rb +23 -22
- data/lib/heirloom/cipher/shared.rb +19 -0
- data/lib/heirloom/cli/upload.rb +2 -1
- data/lib/heirloom/directory/directory.rb +12 -1
- data/lib/heirloom/exceptions.rb +11 -0
- data/lib/heirloom/uploader/s3.rb +34 -23
- data/lib/heirloom/utils.rb +1 -0
- data/lib/heirloom/utils/file.rb +30 -0
- data/lib/heirloom/version.rb +1 -1
- data/spec/acl/s3_spec.rb +1 -1
- data/spec/archive/authorizer_spec.rb +25 -13
- data/spec/archive/destroyer_spec.rb +1 -1
- data/spec/archive/downloader_spec.rb +4 -4
- data/spec/archive/reader_spec.rb +19 -5
- data/spec/archive/uploader_spec.rb +47 -20
- data/spec/cipher/data_spec.rb +52 -35
- data/spec/cipher/file_spec.rb +23 -9
- data/spec/cli/upload_spec.rb +1 -0
- data/spec/directory/directory_spec.rb +36 -10
- data/spec/uploader/s3_spec.rb +64 -0
- data/spec/utils/file_spec.rb +30 -0
- metadata +22 -14
data/spec/cipher/file_spec.rb
CHANGED
@@ -3,28 +3,42 @@ require 'spec_helper'
|
|
3
3
|
describe Heirloom do
|
4
4
|
before do
|
5
5
|
@logger_mock = mock 'logger', :info => true
|
6
|
-
@logger_mock.stub :info
|
6
|
+
@logger_mock.stub :info => true,
|
7
|
+
:debug => true
|
7
8
|
@config_mock = mock 'config'
|
8
9
|
@config_mock.stub :logger => @logger_mock
|
9
10
|
@tempfile_stub = stub 'tempfile', :path => '/path_to_encrypted_archive',
|
10
11
|
:close! => true
|
11
12
|
Tempfile.stub :new => @tempfile_stub
|
12
|
-
@aes_mock = mock 'aes'
|
13
|
-
@aes_mock.stub :random_iv => 'firstsixteenchar'
|
14
|
-
OpenSSL::Cipher::AES256.should_receive(:new).
|
15
|
-
with(:CBC).and_return @aes_mock
|
16
13
|
@file = Heirloom::Cipher::File.new :config => @config_mock
|
17
14
|
end
|
18
15
|
|
19
16
|
it "should encrypt the given file" do
|
20
|
-
@
|
21
|
-
|
22
|
-
@
|
23
|
-
|
17
|
+
@file.should_receive(:which).with('gpg').and_return true
|
18
|
+
command = 'gpg --batch --yes -c --cipher-algo AES256 --passphrase mysecret --output /path_to_encrypted_archive /file 2>&1'
|
19
|
+
@file.should_receive(:`).with command
|
20
|
+
$?.stub :success? => true
|
24
21
|
FileUtils.should_receive(:mv).
|
25
22
|
with('/path_to_encrypted_archive', '/file')
|
26
23
|
@file.encrypt_file(:file => '/file',
|
27
24
|
:secret => 'mysecret').should be_true
|
28
25
|
end
|
29
26
|
|
27
|
+
it "should return false if gpg is not in the path" do
|
28
|
+
@file.should_receive(:which).with('gpg').and_return false
|
29
|
+
@logger_mock.should_receive(:error)
|
30
|
+
@file.encrypt_file(:file => '/file',
|
31
|
+
:secret => 'mysecret').should be_false
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should return false if gpg returns non zero code" do
|
35
|
+
@file.should_receive(:which).with('gpg').and_return true
|
36
|
+
@logger_mock.should_receive(:error)
|
37
|
+
command = 'gpg --batch --yes -c --cipher-algo AES256 --passphrase mysecret --output /path_to_encrypted_archive /file 2>&1'
|
38
|
+
@file.should_receive(:`).with command
|
39
|
+
$?.stub :success? => false
|
40
|
+
@file.encrypt_file(:file => '/file',
|
41
|
+
:secret => 'mysecret').should be_false
|
42
|
+
end
|
43
|
+
|
30
44
|
end
|
data/spec/cli/upload_spec.rb
CHANGED
@@ -5,24 +5,28 @@ describe Heirloom::Directory do
|
|
5
5
|
describe 'build_artifact_from_directory' do
|
6
6
|
before do
|
7
7
|
@config_mock = double 'config'
|
8
|
-
@logger_stub = stub :debug => 'true',
|
8
|
+
@logger_stub = stub :debug => 'true',
|
9
|
+
:info => 'true',
|
10
|
+
:warn => 'true',
|
11
|
+
:error => 'true'
|
9
12
|
@config_mock.stub(:logger).and_return(@logger_stub)
|
10
13
|
@directory = Heirloom::Directory.new :config => @config_mock,
|
11
14
|
:exclude => ['.', '..', 'dont_pack_me'],
|
12
15
|
:path => '/dir',
|
13
16
|
:file => '/tmp/file.tar.gz'
|
14
|
-
output_mock = double 'output mock'
|
15
|
-
Dir.should_receive(:entries).with('/dir').
|
16
|
-
exactly(2).times.
|
17
|
-
and_return ['pack_me', '.hidden',
|
18
|
-
'with a space', 'dont_pack_me']
|
19
|
-
Heirloom::Directory.any_instance.should_receive(:`).
|
20
|
-
with("cd /dir && tar czf /tmp/file.tar.gz 'pack_me' '.hidden' 'with a space'").
|
21
|
-
and_return output_mock
|
22
17
|
end
|
23
18
|
|
24
19
|
context 'when succesful' do
|
25
20
|
before do
|
21
|
+
@directory.should_receive(:which).with('tar').and_return true
|
22
|
+
output_mock = double 'output mock'
|
23
|
+
command = "cd /dir && tar czf /tmp/file.tar.gz 'pack_me' '.hidden' 'with a space'"
|
24
|
+
files = ['pack_me', '.hidden', 'with a space', 'dont_pack_me']
|
25
|
+
Heirloom::Directory.any_instance.should_receive(:`).
|
26
|
+
with(command).
|
27
|
+
and_return output_mock
|
28
|
+
Dir.should_receive(:entries).with('/dir').
|
29
|
+
and_return files
|
26
30
|
$?.stub :success? => true
|
27
31
|
end
|
28
32
|
|
@@ -53,7 +57,17 @@ describe Heirloom::Directory do
|
|
53
57
|
end
|
54
58
|
|
55
59
|
context 'when unable to create the tar' do
|
56
|
-
before
|
60
|
+
before do
|
61
|
+
@directory.should_receive(:which).with('tar').and_return true
|
62
|
+
output_mock = double 'output mock'
|
63
|
+
command = "cd /dir && tar czf /tmp/file.tar.gz 'pack_me' '.hidden' 'with a space'"
|
64
|
+
files = ['pack_me', '.hidden', 'with a space', 'dont_pack_me']
|
65
|
+
Heirloom::Directory.any_instance.should_receive(:`).
|
66
|
+
with(command).
|
67
|
+
and_return output_mock
|
68
|
+
Dir.should_receive(:entries).with('/dir').and_return files
|
69
|
+
$?.stub(:success?).and_return(false)
|
70
|
+
end
|
57
71
|
|
58
72
|
it "build should return false" do
|
59
73
|
@directory.build_artifact_from_directory(:secret => nil).should be_false
|
@@ -65,6 +79,18 @@ describe Heirloom::Directory do
|
|
65
79
|
end
|
66
80
|
end
|
67
81
|
|
82
|
+
context 'when required executable is missing' do
|
83
|
+
before do
|
84
|
+
files = ['pack_me', '.hidden', 'with a space', 'dont_pack_me']
|
85
|
+
Dir.should_receive(:entries).with('/dir').and_return files
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should return false if tar is not in path" do
|
89
|
+
@directory.should_receive(:which).with('tar').and_return false
|
90
|
+
@directory.build_artifact_from_directory(:secret => nil).should be_false
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
68
94
|
end
|
69
95
|
|
70
96
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Heirloom::Uploader::S3 do
|
4
|
+
before do
|
5
|
+
@logger_stub = stub 'logger stub', :info => true,
|
6
|
+
:warn => true,
|
7
|
+
:debug => true
|
8
|
+
@config_stub = stub 'config stub', :logger => @logger_stub
|
9
|
+
@s3 = Heirloom::Uploader::S3.new :config => @config_stub,
|
10
|
+
:logger => @logger_stub,
|
11
|
+
:region => 'us-west-1'
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should upload the file to s3" do
|
15
|
+
@options = { :bucket => 'bucket',
|
16
|
+
:file => 'file',
|
17
|
+
:id => 'id',
|
18
|
+
:key_name => 'key_name',
|
19
|
+
:key_folder => 'key_folder',
|
20
|
+
:name => 'name',
|
21
|
+
:public_readable => true }
|
22
|
+
@s3_mock = mock 's3 mock'
|
23
|
+
@bucket_mock = mock 'bucket mock'
|
24
|
+
@files_mock = mock 'files mock'
|
25
|
+
@file_mock = mock 'file mock'
|
26
|
+
@body_mock = mock 'body mock'
|
27
|
+
Heirloom::AWS::S3.should_receive(:new).
|
28
|
+
with(:config => @config_stub,
|
29
|
+
:region => 'us-west-1').
|
30
|
+
and_return @s3_mock
|
31
|
+
@s3_mock.should_receive(:get_bucket).
|
32
|
+
with('bucket').
|
33
|
+
and_return @bucket_mock
|
34
|
+
@bucket_mock.should_receive(:files).and_return(@files_mock)
|
35
|
+
File.should_receive(:open).with('file').and_return @body_mock
|
36
|
+
@files_mock.should_receive(:create).
|
37
|
+
with :key => "key_folder/key_name",
|
38
|
+
:body => @body_mock,
|
39
|
+
:public => true
|
40
|
+
@body_mock.should_receive(:close)
|
41
|
+
@s3.upload_file @options
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should add endpoint attributes for the file to simpledb" do
|
45
|
+
simpledb_mock = mock 'simpledb mock'
|
46
|
+
options = { :bucket => 'bucket',
|
47
|
+
:id => 'id',
|
48
|
+
:key_name => 'key_name',
|
49
|
+
:name => 'name' }
|
50
|
+
Heirloom::AWS::SimpleDB.should_receive(:new).
|
51
|
+
with(:config => @config_stub).
|
52
|
+
and_return simpledb_mock
|
53
|
+
simpledb_mock.should_receive(:put_attributes).
|
54
|
+
with("heirloom_name", "id",
|
55
|
+
{ "us-west-1-s3-url" => "s3://bucket/name/key_name" } )
|
56
|
+
simpledb_mock.should_receive(:put_attributes).
|
57
|
+
with("heirloom_name", "id",
|
58
|
+
{ "us-west-1-http-url" => "http://s3-us-west-1.amazonaws.com/bucket/name/key_name" } )
|
59
|
+
simpledb_mock.should_receive(:put_attributes).
|
60
|
+
with("heirloom_name", "id",
|
61
|
+
{ "us-west-1-https-url" => "https://s3-us-west-1.amazonaws.com/bucket/name/key_name" } )
|
62
|
+
@s3.add_endpoint_attributes options
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Heirloom::Utils::File do
|
4
|
+
before do
|
5
|
+
@object = Object.new
|
6
|
+
@object.extend Heirloom::Utils::File
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should return the path to a present executable" do
|
10
|
+
@object.stub :path => '/test1:/test2'
|
11
|
+
::File.should_receive(:executable?).
|
12
|
+
with('/test1/test1234').
|
13
|
+
and_return false
|
14
|
+
::File.should_receive(:executable?).
|
15
|
+
with('/test2/test1234').
|
16
|
+
and_return true
|
17
|
+
@object.which('test1234').should == '/test2/test1234'
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should return nil if the executable does not exist" do
|
21
|
+
@object.stub :path => '/test1:/test2'
|
22
|
+
::File.should_receive(:executable?).
|
23
|
+
with('/test1/test1234').
|
24
|
+
and_return false
|
25
|
+
::File.should_receive(:executable?).
|
26
|
+
with('/test2/test1234').
|
27
|
+
and_return false
|
28
|
+
@object.which('test1234').should be_nil
|
29
|
+
end
|
30
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: heirloom
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70327489259240 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 2.11.0
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70327489259240
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &70327489258580 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70327489258580
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: fog
|
38
|
-
requirement: &
|
38
|
+
requirement: &70327489582820 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 1.6.0
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70327489582820
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: trollop
|
49
|
-
requirement: &
|
49
|
+
requirement: &70327489581740 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - =
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '2.0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70327489581740
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: xml-simple
|
60
|
-
requirement: &
|
60
|
+
requirement: &70327489581060 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: 1.1.2
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70327489581060
|
69
69
|
description: I help build and manage building tar.gz files and deploying them into
|
70
70
|
the cloud
|
71
71
|
email:
|
@@ -115,6 +115,7 @@ files:
|
|
115
115
|
- lib/heirloom/cipher.rb
|
116
116
|
- lib/heirloom/cipher/data.rb
|
117
117
|
- lib/heirloom/cipher/file.rb
|
118
|
+
- lib/heirloom/cipher/shared.rb
|
118
119
|
- lib/heirloom/cli.rb
|
119
120
|
- lib/heirloom/cli/authorize.rb
|
120
121
|
- lib/heirloom/cli/catalog.rb
|
@@ -137,9 +138,12 @@ files:
|
|
137
138
|
- lib/heirloom/directory/directory.rb
|
138
139
|
- lib/heirloom/downloader.rb
|
139
140
|
- lib/heirloom/downloader/s3.rb
|
141
|
+
- lib/heirloom/exceptions.rb
|
140
142
|
- lib/heirloom/logger.rb
|
141
143
|
- lib/heirloom/uploader.rb
|
142
144
|
- lib/heirloom/uploader/s3.rb
|
145
|
+
- lib/heirloom/utils.rb
|
146
|
+
- lib/heirloom/utils/file.rb
|
143
147
|
- lib/heirloom/version.rb
|
144
148
|
- spec/acl/s3_spec.rb
|
145
149
|
- spec/archive/authorizer_spec.rb
|
@@ -186,6 +190,8 @@ files:
|
|
186
190
|
- spec/downloader/s3_spec.rb
|
187
191
|
- spec/logger_spec.rb
|
188
192
|
- spec/spec_helper.rb
|
193
|
+
- spec/uploader/s3_spec.rb
|
194
|
+
- spec/utils/file_spec.rb
|
189
195
|
homepage: ''
|
190
196
|
licenses: []
|
191
197
|
post_install_message:
|
@@ -200,7 +206,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
200
206
|
version: '0'
|
201
207
|
segments:
|
202
208
|
- 0
|
203
|
-
hash: -
|
209
|
+
hash: -166474931629253916
|
204
210
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
205
211
|
none: false
|
206
212
|
requirements:
|
@@ -209,7 +215,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
209
215
|
version: '0'
|
210
216
|
segments:
|
211
217
|
- 0
|
212
|
-
hash: -
|
218
|
+
hash: -166474931629253916
|
213
219
|
requirements: []
|
214
220
|
rubyforge_project: heirloom
|
215
221
|
rubygems_version: 1.8.16
|
@@ -262,3 +268,5 @@ test_files:
|
|
262
268
|
- spec/downloader/s3_spec.rb
|
263
269
|
- spec/logger_spec.rb
|
264
270
|
- spec/spec_helper.rb
|
271
|
+
- spec/uploader/s3_spec.rb
|
272
|
+
- spec/utils/file_spec.rb
|