heirloom 0.5.0rc1 → 0.5.0rc2

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -6,6 +6,8 @@
6
6
  * Fix error when .heirloom.yml does not exist.
7
7
  * Refactor cli option validation
8
8
  * Refactor cli specs
9
+ * Add -x to download to extract heirloom to given output path
10
+ * Verify -o specified in download is a directory
9
11
 
10
12
  ## v0.4.0:
11
13
 
@@ -2,6 +2,8 @@ module Heirloom
2
2
 
3
3
  class Downloader
4
4
 
5
+ include Heirloom::Misc::Tmp
6
+
5
7
  def initialize(args)
6
8
  @config = args[:config]
7
9
  @name = args[:name]
@@ -12,6 +14,8 @@ module Heirloom
12
14
  def download(args)
13
15
  region = args[:region]
14
16
  base_prefix = args[:base_prefix]
17
+ extract = args[:extract]
18
+ output = args[:output] ||= './'
15
19
 
16
20
  s3_downloader = Downloader::S3.new :config => @config,
17
21
  :logger => @logger,
@@ -20,16 +24,16 @@ module Heirloom
20
24
  bucket = get_bucket :region => region, :base_prefix => base_prefix
21
25
 
22
26
  @logger.info "Downloading s3://#{bucket}/#{key} from #{region}."
23
-
24
- file = s3_downloader.download_file :bucket => bucket,
25
- :key => key
26
-
27
- output = args[:output] ||= "./#{key.split('/').last}"
28
-
29
- @logger.info "Writing file to #{output}."
30
-
31
- File.open(output, 'w') do |local_file|
32
- local_file.write file
27
+ archive = s3_downloader.download_file :bucket => bucket,
28
+ :key => key
29
+
30
+ if extract
31
+ extracter = Extracter.new :config => @config
32
+ extracter.extract :archive => archive, :output => output
33
+ else
34
+ output_file = File.join output, file
35
+ @logger.info "Writing archive to '#{output_file}'."
36
+ File.open(output_file, 'w') { |local_file| local_file.write archive }
33
37
  end
34
38
 
35
39
  @logger.info "Download complete."
@@ -37,12 +41,16 @@ module Heirloom
37
41
 
38
42
  private
39
43
 
40
- def get_bucket(args)
41
- "#{args[:base_prefix]}-#{args[:region]}"
44
+ def file
45
+ "#{@id}.tar.gz"
42
46
  end
43
47
 
44
48
  def key
45
- "#{@name}/#{@id}.tar.gz"
49
+ "#{@name}/#{file}"
50
+ end
51
+
52
+ def get_bucket(args)
53
+ "#{args[:base_prefix]}-#{args[:region]}"
46
54
  end
47
55
 
48
56
  end
@@ -0,0 +1,38 @@
1
+ module Heirloom
2
+ class Extracter
3
+
4
+ include Heirloom::Misc::Tmp
5
+
6
+ def initialize(args)
7
+ @config = args[:config]
8
+ @logger = @config.logger
9
+ end
10
+
11
+ def extract(args)
12
+ @tmp_archive = random_archive
13
+
14
+ create_tmp_archive args[:archive]
15
+ extract_tmp_archive args[:output]
16
+ delete_tmp_archive
17
+ end
18
+
19
+ private
20
+
21
+ def create_tmp_archive(archive)
22
+ File.open(@tmp_archive, 'w') { |local_file| local_file.write archive }
23
+ end
24
+
25
+ def extract_tmp_archive(output)
26
+ @logger.info "Extracting archive to '#{output}'."
27
+ cmd = "tar xzf #{@tmp_archive} -C #{output}"
28
+ @logger.debug "Executing '#{cmd}'."
29
+ `#{cmd}`
30
+ end
31
+
32
+ def delete_tmp_archive
33
+ @logger.debug "Deleting '#{@tmp_archive}'."
34
+ File.delete @tmp_archive
35
+ end
36
+
37
+ end
38
+ end
@@ -4,6 +4,7 @@ require 'heirloom/archive/builder.rb'
4
4
  require 'heirloom/archive/updater.rb'
5
5
  require 'heirloom/archive/uploader.rb'
6
6
  require 'heirloom/archive/downloader.rb'
7
+ require 'heirloom/archive/extracter.rb'
7
8
  require 'heirloom/archive/authorizer.rb'
8
9
  require 'heirloom/archive/destroyer.rb'
9
10
  require 'heirloom/archive/verifier.rb'
@@ -14,14 +14,17 @@ module Heirloom
14
14
  :required => [:base_prefix, :name, :id, :output],
15
15
  :config => @config
16
16
 
17
+
17
18
  @archive = Archive.new :name => @opts[:name],
18
19
  :id => @opts[:id],
19
20
  :config => @config
20
21
  end
21
22
 
22
23
  def download
24
+ ensure_directory :path => @opts[:output], :config => @config
23
25
  @archive.download :output => @opts[:output],
24
26
  :region => @opts[:region],
27
+ :extract => @opts[:extract],
25
28
  :base_prefix => @opts[:base_prefix]
26
29
  end
27
30
 
@@ -46,7 +49,8 @@ EOS
46
49
  opt :name, "Name of archive.", :type => :string
47
50
  opt :level, "Log level [debug|info|warn|error].", :type => :string,
48
51
  :default => 'info'
49
- opt :output, "Location to download archive.", :type => :string
52
+ opt :output, "Path to download archive.", :type => :string
53
+ opt :extract, "Extract the archive in the given output path.", :short => "-x"
50
54
  opt :region, "Region to download archive.", :type => :string,
51
55
  :default => 'us-west-1'
52
56
  opt :secret, "AWS Secret Access Key", :type => :string
@@ -36,6 +36,17 @@ module Heirloom
36
36
  exit 1 unless missing_opts.empty?
37
37
  end
38
38
 
39
+ def ensure_directory(args)
40
+ config = args[:config]
41
+ path = args[:path]
42
+ logger = config.logger
43
+
44
+ unless File.directory? path
45
+ logger.error "#{path} is not a directory."
46
+ exit 1
47
+ end
48
+ end
49
+
39
50
  def ensure_domain_exists(args)
40
51
  config = args[:config]
41
52
  name = args[:name]
@@ -1,11 +1,11 @@
1
- require 'tmpdir'
2
-
3
1
  module Heirloom
4
2
 
5
3
  class Directory
6
4
 
7
5
  attr_reader :local_build
8
6
 
7
+ include Heirloom::Misc::Tmp
8
+
9
9
  def initialize(args)
10
10
  @config = args[:config]
11
11
  @exclude = args[:exclude]
@@ -14,9 +14,7 @@ module Heirloom
14
14
  end
15
15
 
16
16
  def build_artifact_from_directory
17
- random_text = (0...8).map{65.+(Kernel.rand(25)).chr}.join
18
-
19
- @local_build = File.join(Dir.tmpdir, random_text + ".tar.gz")
17
+ @local_build = random_archive
20
18
 
21
19
  @logger.info "Building Heirloom '#{@local_build}' from '#{@path}'."
22
20
  @logger.info "Excluding #{@exclude.to_s}."
@@ -0,0 +1,12 @@
1
+ require 'tmpdir'
2
+
3
+ module Heirloom
4
+ module Misc
5
+ module Tmp
6
+ def random_archive
7
+ random_text = (0...8).map{65.+(Kernel.rand(25)).chr}.join
8
+ local_build = File.join(Dir.tmpdir, random_text + ".tar.gz")
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1 @@
1
+ require 'heirloom/misc/tmp'
@@ -1,3 +1,3 @@
1
1
  module Heirloom
2
- VERSION = "0.5.0rc1"
2
+ VERSION = "0.5.0rc2"
3
3
  end
data/lib/heirloom.rb CHANGED
@@ -1,6 +1,7 @@
1
+ require "heirloom/misc"
2
+ require "heirloom/config"
1
3
  require "heirloom/acl"
2
4
  require "heirloom/aws"
3
- require "heirloom/config"
4
5
  require "heirloom/logger"
5
6
  require "heirloom/archive"
6
7
  require "heirloom/directory"
@@ -22,22 +22,49 @@ describe Heirloom do
22
22
  @file_mock = mock 'file'
23
23
  end
24
24
 
25
- context "with base_prefix specified" do
25
+ context "extract set to false" do
26
26
  it "should download to the current path if output is not specified" do
27
27
  File.should_receive(:open).with('./123.tar.gz', 'w').
28
28
  and_return @file_mock
29
29
 
30
30
  @downloader.download :region => 'us-west-1',
31
- :base_prefix => 'bucket'
31
+ :base_prefix => 'bucket',
32
+ :extract => false
32
33
  end
33
34
 
34
35
  it "should download arhcive to specified output" do
35
- File.should_receive(:open).with('/tmp/file', 'w').
36
+ File.should_receive(:open).with('/tmp/dir/123.tar.gz', 'w').
36
37
  and_return @file_mock
37
38
 
38
- @downloader.download :output => '/tmp/file',
39
+ @downloader.download :output => '/tmp/dir',
39
40
  :region => 'us-west-1',
40
- :base_prefix => 'bucket'
41
+ :base_prefix => 'bucket',
42
+ :extract => false
43
+ end
44
+ end
45
+
46
+ context "extract set to true" do
47
+ before do
48
+ @extracter_mock = mock 'extracter'
49
+ Heirloom::Extracter.should_receive(:new).with(:config => @config_mock).
50
+ and_return @extracter_mock
51
+ end
52
+
53
+ it "should download and extract the to specified output" do
54
+ @extracter_mock.should_receive(:extract).with :archive => 'filename',
55
+ :output => '/tmp/dir'
56
+ @downloader.download :output => '/tmp/dir',
57
+ :region => 'us-west-1',
58
+ :base_prefix => 'bucket',
59
+ :extract => true
60
+ end
61
+
62
+ it "should download and extract the to the cwd" do
63
+ @extracter_mock.should_receive(:extract).with :archive => 'filename',
64
+ :output => './'
65
+ @downloader.download :region => 'us-west-1',
66
+ :base_prefix => 'bucket',
67
+ :extract => true
41
68
  end
42
69
  end
43
70
 
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe Heirloom do
4
+
5
+ before do
6
+ @logger_stub = stub 'logger', :info => true, :debug => true
7
+ @config_mock = mock 'config'
8
+ @config_mock.stub :logger => @logger_stub
9
+ @extracter = Heirloom::Extracter.new :config => @config_mock
10
+ end
11
+
12
+ it "should extract the given archive object into the output directory" do
13
+ @extracter.should_receive(:random_archive).and_return '/tmp/file'
14
+ File.should_receive(:open).with('/tmp/file', 'w')
15
+ Heirloom::Extracter.any_instance.should_receive(:`).
16
+ with('tar xzf /tmp/file -C /output')
17
+ File.should_receive(:delete).with '/tmp/file'
18
+ @extracter.extract :archive => 'test', :output => '/output'
19
+ end
20
+
21
+ end
@@ -9,6 +9,7 @@ describe Heirloom do
9
9
  :level => 'info',
10
10
  :output => '/tmp/test123',
11
11
  :region => 'us-east-1',
12
+ :extract => false,
12
13
  :base_prefix => 'base' }
13
14
  @logger_stub = stub 'logger'
14
15
  @config_mock = mock 'config'
@@ -35,7 +36,12 @@ describe Heirloom do
35
36
  it "should download an archive" do
36
37
  @archive_mock.should_receive(:download).with :output => '/tmp/test123',
37
38
  :region => 'us-east-1',
38
- :base_prefix => 'base'
39
+ :base_prefix => 'base',
40
+ :extract => false
41
+ @cli_download.should_receive(:ensure_directory).
42
+ with(:config => @config_mock,
43
+ :path => '/tmp/test123').
44
+ and_return true
39
45
  @cli_download.download
40
46
  end
41
47
 
@@ -90,6 +90,31 @@ describe Heirloom do
90
90
 
91
91
  end
92
92
 
93
+ context "test ensure directory" do
94
+ before do
95
+ @logger_stub = mock 'logger', :error => true
96
+ @config_mock = mock 'config'
97
+ @config_mock.stub :logger => @logger_stub
98
+ @object = Object.new
99
+ @object.extend Heirloom::CLI::Shared
100
+ end
101
+
102
+ it "should exit when path is not a directory" do
103
+ File.should_receive(:directory?).with('/tmp/test').
104
+ and_return false
105
+ lambda { @object.ensure_directory(:path => '/tmp/test',
106
+ :config => @config_mock) }.
107
+ should raise_error SystemExit
108
+ end
109
+
110
+ it "should not exit when path is a directory" do
111
+ File.should_receive(:directory?).with('/tmp/test').
112
+ and_return true
113
+ @object.ensure_directory :path => '/tmp/test', :config => @config_mock
114
+ end
115
+
116
+ end
117
+
93
118
  context "testing ensure domain" do
94
119
  before do
95
120
  @archive_mock = mock 'archive'
@@ -10,14 +10,14 @@ describe Heirloom::Directory do
10
10
  @directory = Heirloom::Directory.new :config => @config_mock,
11
11
  :exclude => ['.', '..', 'dont_pack_me'],
12
12
  :path => '/target/dir'
13
+ @directory.stub :random_archive => '/tmp/dir/file.tar.gz'
13
14
  output_mock = double 'output mock'
14
15
  Dir.stub :tmpdir => '/tmp/dir'
15
- Kernel.stub :rand => 0
16
16
  Dir.should_receive(:entries).with('/target/dir').
17
17
  exactly(2).times.
18
18
  and_return(['pack_me', '.hidden', 'dont_pack_me'])
19
19
  Heirloom::Directory.any_instance.should_receive(:`).
20
- with("tar czf /tmp/dir/AAAAAAAA.tar.gz pack_me .hidden").
20
+ with("tar czf /tmp/dir/file.tar.gz pack_me .hidden").
21
21
  and_return output_mock
22
22
  end
23
23
 
@@ -29,7 +29,9 @@ describe Heirloom::Directory do
29
29
  context 'when unable to create the tar' do
30
30
  before { $?.stub(:success?).and_return(false) }
31
31
 
32
- it { @directory.build_artifact_from_directory.should be_false }
32
+ it "should build return false" do
33
+ @directory.build_artifact_from_directory.should be_false
34
+ end
33
35
  end
34
36
 
35
37
  end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Heirloom do
4
+
5
+ describe 'misc' do
6
+ before do
7
+ @object = Object.new
8
+ @object.extend Heirloom::Misc::Tmp
9
+ end
10
+
11
+ it "should return a temporary archive file" do
12
+ Kernel.stub :rand => 0
13
+ Dir.stub :tmpdir => '/tmp'
14
+ @object.random_archive.should == '/tmp/AAAAAAAA.tar.gz'
15
+ end
16
+
17
+ end
18
+
19
+ 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.5.0rc1
4
+ version: 0.5.0rc2
5
5
  prerelease: 5
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-08-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70238839864540 !ruby/object:Gem::Requirement
16
+ requirement: &70122355909400 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70238839864540
24
+ version_requirements: *70122355909400
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: fog
27
- requirement: &70238839863940 !ruby/object:Gem::Requirement
27
+ requirement: &70122355908680 !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: :runtime
34
34
  prerelease: false
35
- version_requirements: *70238839863940
35
+ version_requirements: *70122355908680
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: grit
38
- requirement: &70238839863260 !ruby/object:Gem::Requirement
38
+ requirement: &70122355908000 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70238839863260
46
+ version_requirements: *70122355908000
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: logger
49
- requirement: &70238839862320 !ruby/object:Gem::Requirement
49
+ requirement: &70122355907160 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70238839862320
57
+ version_requirements: *70122355907160
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: trollop
60
- requirement: &70238839861680 !ruby/object:Gem::Requirement
60
+ requirement: &70122355906660 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70238839861680
68
+ version_requirements: *70122355906660
69
69
  description: I help build and manage building tar.gz files and deploying them into
70
70
  the cloud
71
71
  email:
@@ -92,6 +92,7 @@ files:
92
92
  - lib/heirloom/archive/builder.rb
93
93
  - lib/heirloom/archive/destroyer.rb
94
94
  - lib/heirloom/archive/downloader.rb
95
+ - lib/heirloom/archive/extracter.rb
95
96
  - lib/heirloom/archive/lister.rb
96
97
  - lib/heirloom/archive/reader.rb
97
98
  - lib/heirloom/archive/updater.rb
@@ -118,6 +119,8 @@ files:
118
119
  - lib/heirloom/downloader.rb
119
120
  - lib/heirloom/downloader/s3.rb
120
121
  - lib/heirloom/logger.rb
122
+ - lib/heirloom/misc.rb
123
+ - lib/heirloom/misc/tmp.rb
121
124
  - lib/heirloom/uploader.rb
122
125
  - lib/heirloom/uploader/s3.rb
123
126
  - lib/heirloom/version.rb
@@ -127,6 +130,7 @@ files:
127
130
  - spec/archive/builder_spec.rb
128
131
  - spec/archive/destroyer_spec.rb
129
132
  - spec/archive/downloader_spec.rb
133
+ - spec/archive/extracter_spec.rb
130
134
  - spec/archive/lister_spec.rb
131
135
  - spec/archive/reader_spec.rb
132
136
  - spec/archive/updater_spec.rb
@@ -149,6 +153,7 @@ files:
149
153
  - spec/directory/git_directory_spec.rb
150
154
  - spec/downloader/s3_spec.rb
151
155
  - spec/logger_spec.rb
156
+ - spec/misc/tmp_spec.rb
152
157
  - spec/spec_helper.rb
153
158
  homepage: ''
154
159
  licenses: []
@@ -164,7 +169,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
164
169
  version: '0'
165
170
  segments:
166
171
  - 0
167
- hash: 911003878403684883
172
+ hash: -3832291684396607232
168
173
  required_rubygems_version: !ruby/object:Gem::Requirement
169
174
  none: false
170
175
  requirements:
@@ -183,6 +188,7 @@ test_files:
183
188
  - spec/archive/builder_spec.rb
184
189
  - spec/archive/destroyer_spec.rb
185
190
  - spec/archive/downloader_spec.rb
191
+ - spec/archive/extracter_spec.rb
186
192
  - spec/archive/lister_spec.rb
187
193
  - spec/archive/reader_spec.rb
188
194
  - spec/archive/updater_spec.rb
@@ -205,4 +211,5 @@ test_files:
205
211
  - spec/directory/git_directory_spec.rb
206
212
  - spec/downloader/s3_spec.rb
207
213
  - spec/logger_spec.rb
214
+ - spec/misc/tmp_spec.rb
208
215
  - spec/spec_helper.rb