heirloom 0.3.1 → 0.4.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.
Files changed (43) hide show
  1. data/CHANGELOG +7 -0
  2. data/README.md +1 -1
  3. data/Rakefile +6 -0
  4. data/lib/heirloom/archive/builder.rb +29 -29
  5. data/lib/heirloom/archive/destroyer.rb +27 -18
  6. data/lib/heirloom/archive/downloader.rb +12 -14
  7. data/lib/heirloom/archive/lister.rb +2 -1
  8. data/lib/heirloom/archive/reader.rb +22 -15
  9. data/lib/heirloom/archive/updater.rb +2 -1
  10. data/lib/heirloom/archive.rb +5 -2
  11. data/lib/heirloom/aws/simpledb.rb +15 -2
  12. data/lib/heirloom/cli/authorize.rb +12 -7
  13. data/lib/heirloom/cli/build.rb +29 -20
  14. data/lib/heirloom/cli/destroy.rb +11 -4
  15. data/lib/heirloom/cli/download.rb +11 -4
  16. data/lib/heirloom/cli/list.rb +15 -6
  17. data/lib/heirloom/cli/shared.rb +10 -1
  18. data/lib/heirloom/cli/show.rb +14 -5
  19. data/lib/heirloom/cli/update.rb +14 -6
  20. data/lib/heirloom/cli.rb +1 -2
  21. data/lib/heirloom/directory/directory.rb +16 -18
  22. data/lib/heirloom/directory/git_directory.rb +1 -1
  23. data/lib/heirloom/uploader/s3.rb +4 -3
  24. data/lib/heirloom/version.rb +1 -1
  25. data/spec/archive/builder_spec.rb +60 -58
  26. data/spec/archive/destroyer_spec.rb +9 -10
  27. data/spec/archive/downloader_spec.rb +2 -2
  28. data/spec/archive/lister_spec.rb +1 -1
  29. data/spec/archive/reader_spec.rb +92 -81
  30. data/spec/archive/updater_spec.rb +1 -1
  31. data/spec/archive_spec.rb +15 -6
  32. data/spec/aws/simpledb_spec.rb +35 -0
  33. data/spec/cli/authorize_spec.rb +34 -0
  34. data/spec/cli/build_spec.rb +57 -0
  35. data/spec/cli/destroy_spec.rb +33 -0
  36. data/spec/cli/download_spec.rb +37 -0
  37. data/spec/cli/list_spec.rb +34 -0
  38. data/spec/cli/shared_spec.rb +68 -34
  39. data/spec/cli/show_spec.rb +34 -0
  40. data/spec/cli/update_spec.rb +37 -0
  41. data/spec/directory/directory_spec.rb +13 -20
  42. data/spec/directory/git_directory_spec.rb +23 -22
  43. metadata +28 -14
@@ -2,17 +2,24 @@ module Heirloom
2
2
  module CLI
3
3
  class List
4
4
 
5
+ include Heirloom::CLI::Shared
6
+
5
7
  def initialize
6
8
  @opts = read_options
7
9
  @logger = HeirloomLogger.new :log_level => @opts[:level]
8
- exit 1 unless CLI::Shared.valid_options? :provided => @opts,
9
- :required => [:name],
10
- :logger => @logger
10
+ @config = load_config :logger => @logger,
11
+ :opts => @opts
12
+
13
+ exit 1 unless valid_options? :provided => @opts,
14
+ :required => [:name],
15
+ :logger => @logger
16
+
11
17
  @archive = Archive.new :name => @opts[:name],
12
- :logger => @logger
18
+ :config => @config
13
19
  end
14
20
 
15
21
  def list(count = @opts[:count])
22
+ @logger.debug "#{@archive.count} archives found."
16
23
  jj @archive.list(count)
17
24
  end
18
25
 
@@ -30,12 +37,14 @@ Usage:
30
37
  heirloom list -n NAME
31
38
 
32
39
  EOS
40
+ opt :count, "Number of versions to return.", :type => :integer,
41
+ :default => 10
33
42
  opt :help, "Display Help"
43
+ opt :key, "AWS Access Key ID", :type => :string
34
44
  opt :level, "Log level [debug|info|warn|error].", :type => :string,
35
45
  :default => 'info'
36
46
  opt :name, "Name of archive.", :type => :string
37
- opt :count, "Number of versions to return.", :type => :integer,
38
- :default => 10
47
+ opt :secret, "AWS Secret Access Key", :type => :string
39
48
  end
40
49
  end
41
50
 
@@ -2,7 +2,7 @@ module Heirloom
2
2
  module CLI
3
3
  module Shared
4
4
 
5
- def self.valid_options?(args)
5
+ def valid_options?(args)
6
6
  provided = args[:provided]
7
7
  required = args[:required]
8
8
  logger = args[:logger]
@@ -23,6 +23,15 @@ module Heirloom
23
23
  missing_opts.empty?
24
24
  end
25
25
 
26
+ def load_config(args)
27
+ opts = args[:opts]
28
+ logger = args[:logger]
29
+ config = Config.new :logger => logger
30
+ config.access_key = opts[:key] if opts[:key_given]
31
+ config.secret_key = opts[:secret] if opts[:secret_given]
32
+ config
33
+ end
34
+
26
35
  end
27
36
  end
28
37
  end
@@ -2,15 +2,21 @@ module Heirloom
2
2
  module CLI
3
3
  class Show
4
4
 
5
+ include Heirloom::CLI::Shared
6
+
5
7
  def initialize
6
8
  @opts = read_options
7
9
  @logger = HeirloomLogger.new :log_level => @opts[:level]
8
- exit 1 unless CLI::Shared.valid_options? :provided => @opts,
9
- :required => [:name],
10
- :logger => @logger
10
+ @config = load_config :logger => @logger,
11
+ :opts => @opts
12
+
13
+ exit 1 unless valid_options? :provided => @opts,
14
+ :required => [:name],
15
+ :logger => @logger
16
+
11
17
  id = @opts[:id] ? @opts[:id] : latest_id
12
18
  @archive = Archive.new :name => @opts[:name],
13
- :logger => @logger,
19
+ :config => @config,
14
20
  :id => id
15
21
  end
16
22
 
@@ -21,7 +27,8 @@ module Heirloom
21
27
  private
22
28
 
23
29
  def latest_id
24
- @archive = Archive.new :name => @opts[:name]
30
+ @archive = Archive.new :name => @opts[:name],
31
+ :config => @config
25
32
  @archive.list(1).first
26
33
  end
27
34
 
@@ -40,10 +47,12 @@ If -i is ommited, latest version is displayed.
40
47
 
41
48
  EOS
42
49
  opt :help, "Display Help"
50
+ opt :key, "AWS Access Key ID", :type => :string
43
51
  opt :level, "Log level [debug|info|warn|error].", :type => :string,
44
52
  :default => 'info'
45
53
  opt :name, "Name of archive.", :type => :string
46
54
  opt :id, "id of the archive to display.", :type => :string
55
+ opt :secret, "AWS Secret Access Key", :type => :string
47
56
  end
48
57
  end
49
58
 
@@ -2,17 +2,23 @@ module Heirloom
2
2
  module CLI
3
3
  class Update
4
4
 
5
+ include Heirloom::CLI::Shared
6
+
5
7
  def initialize
6
8
  @opts = read_options
7
9
  @logger = HeirloomLogger.new :log_level => @opts[:level]
8
- exit 1 unless CLI::Shared.valid_options? :provided => @opts,
9
- :required => [:name, :id,
10
- :attribute,
11
- :updated_value],
12
- :logger => @logger
10
+ @config = load_config :logger => @logger,
11
+ :opts => @opts
12
+
13
+ exit 1 unless valid_options? :provided => @opts,
14
+ :required => [:name, :id,
15
+ :attribute,
16
+ :updated_value],
17
+ :logger => @logger
18
+
13
19
  @archive = Archive.new :name => @opts[:name],
14
20
  :id => @opts[:id],
15
- :logger => @logger
21
+ :config => @config
16
22
  end
17
23
 
18
24
  def update
@@ -37,9 +43,11 @@ EOS
37
43
  opt :attribute, "Attribute to update.", :type => :string
38
44
  opt :help, "Display Help"
39
45
  opt :id, "ID of the archive to display.", :type => :string
46
+ opt :key, "AWS Access Key ID", :type => :string
40
47
  opt :level, "Log level [debug|info|warn|error].", :type => :string,
41
48
  :default => 'info'
42
49
  opt :name, "Name of archive.", :type => :string
50
+ opt :secret, "AWS Secret Access Key", :type => :string
43
51
  opt :updated_value, "Updated value of attribute.", :type => :string
44
52
  end
45
53
  end
data/lib/heirloom/cli.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'trollop'
2
2
 
3
+ require 'heirloom/cli/shared'
3
4
  require 'heirloom/cli/authorize'
4
5
  require 'heirloom/cli/build'
5
6
  require 'heirloom/cli/list'
@@ -8,8 +9,6 @@ require 'heirloom/cli/update'
8
9
  require 'heirloom/cli/download'
9
10
  require 'heirloom/cli/destroy'
10
11
 
11
- require 'heirloom/cli/shared'
12
-
13
12
  module Heirloom
14
13
  module CLI
15
14
  def self.start
@@ -4,41 +4,39 @@ module Heirloom
4
4
 
5
5
  class Directory
6
6
 
7
- attr_accessor :config, :exclude, :local_build, :path, :logger
7
+ attr_reader :local_build
8
8
 
9
9
  def initialize(args)
10
- self.config = args[:config]
11
- self.exclude = args[:exclude]
12
- self.path = args[:path]
13
- self.logger = config.logger
10
+ @config = args[:config]
11
+ @exclude = args[:exclude]
12
+ @path = args[:path]
13
+ @logger = @config.logger
14
14
  end
15
15
 
16
16
  def build_artifact_from_directory
17
17
  random_text = (0...8).map{65.+(Kernel.rand(25)).chr}.join
18
18
 
19
- unless local_build
20
- self.local_build = File.join(Dir.tmpdir, random_text + ".tar.gz")
21
- end
19
+ @local_build = File.join(Dir.tmpdir, random_text + ".tar.gz")
22
20
 
23
- logger.info "Building Heirloom '#{local_build}' from '#{path}'."
24
- logger.info "Excluding #{exclude.to_s}."
25
- logger.info "Adding #{files_to_pack.to_s}."
21
+ @logger.info "Building Heirloom '#{@local_build}' from '#{@path}'."
22
+ @logger.info "Excluding #{@exclude.to_s}."
23
+ @logger.info "Adding #{files_to_pack.to_s}."
26
24
 
27
- build_archive local_build, files_to_pack
25
+ build_archive
28
26
  end
29
27
 
30
28
  private
31
29
 
32
- def build_archive(local_build, files_to_pack)
33
- command = "tar czf #{local_build} #{files_to_pack.join(' ')}"
34
- logger.info "Archiving with: `#{command}`"
30
+ def build_archive
31
+ command = "tar czf #{@local_build} #{files_to_pack.join(' ')}"
32
+ @logger.info "Archiving with: `#{command}`"
35
33
  output = `#{command}`
36
- logger.debug "Exited with status: '#{$?.exitstatus}' ouput: '#{output}'"
34
+ @logger.debug "Exited with status: '#{$?.exitstatus}' ouput: '#{output}'"
37
35
  $?.success?
38
36
  end
39
-
37
+
40
38
  def files_to_pack
41
- Dir.entries(path) - ['.', '..'] - exclude
39
+ Dir.entries(@path) - ['.', '..'] - @exclude
42
40
  end
43
41
 
44
42
  end
@@ -12,7 +12,7 @@ module Heirloom
12
12
 
13
13
  def commit(sha = nil)
14
14
  repo = Repo.new @path
15
- if sha
15
+ if sha
16
16
  commit = repo.commits(sha)
17
17
  commit ? commit.first : false
18
18
  else
@@ -32,6 +32,7 @@ module Heirloom
32
32
  bucket = args[:bucket]
33
33
  id = args[:id]
34
34
  name = args[:name]
35
+ domain = "heirloom_#{name}"
35
36
  key_folder = name
36
37
  key_name = "#{id}.tar.gz"
37
38
 
@@ -39,13 +40,13 @@ module Heirloom
39
40
  http_endpoint = "http://#{endpoints[@region]}/#{bucket}/#{key_folder}/#{key_name}"
40
41
  https_endpoint = "https://#{endpoints[@region]}/#{bucket}/#{key_folder}/#{key_name}"
41
42
 
42
- sdb.put_attributes name, id, { "#{@region}-s3-url" => s3_endpoint }
43
+ sdb.put_attributes domain, id, { "#{@region}-s3-url" => s3_endpoint }
43
44
  @logger.info "Adding attribute #{s3_endpoint}."
44
45
 
45
- sdb.put_attributes name, id, { "#{@region}-http-url" => http_endpoint }
46
+ sdb.put_attributes domain, id, { "#{@region}-http-url" => http_endpoint }
46
47
  @logger.info "Adding attribute #{http_endpoint}."
47
48
 
48
- sdb.put_attributes name, id, { "#{@region}-https-url" => https_endpoint }
49
+ sdb.put_attributes domain, id, { "#{@region}-https-url" => https_endpoint }
49
50
  @logger.info "Adding attribute #{https_endpoint}."
50
51
  end
51
52
 
@@ -1,3 +1,3 @@
1
1
  module Heirloom
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -1,70 +1,68 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Heirloom do
3
+ describe Heirloom::Builder do
4
+ before do
5
+ @config_mock = double 'config'
6
+ @logger_stub = stub :debug => 'true', :info => 'true', :warn => 'true'
7
+ @config_mock.stub(:logger).and_return(@logger_stub)
8
+ @simpledb_mock = double 'simple db'
9
+ Heirloom::AWS::SimpleDB.should_receive(:new).with(:config => @config_mock).
10
+ and_return(@simpledb_mock)
11
+ @simpledb_mock.should_receive(:create_domain).with 'heirloom_tim'
12
+ @builder = Heirloom::Builder.new :config => @config_mock,
13
+ :name => 'tim',
14
+ :id => '123'
15
+ end
4
16
 
17
+ describe 'build' do
5
18
  before do
6
- @config_mock = double 'config'
7
- @logger_stub = stub :debug => 'true', :info => 'true', :warn => 'true'
8
- @simpledb_mock = double 'simple db'
9
- @config_mock.should_receive(:logger).and_return(@logger_stub)
10
- Heirloom::AWS::SimpleDB.should_receive(:new).with(:config => @config_mock).
11
- and_return(@simpledb_mock)
12
- @simpledb_mock.should_receive(:create_domain).with 'tim'
13
- @builder = Heirloom::Builder.new :config => @config_mock,
14
- :name => 'tim',
15
- :id => '123'
19
+ @author_stub = stub :name => 'weaver'
20
+ @directory_stub = stub :build_artifact_from_directory => '/tmp/build_dir',
21
+ :local_build => '/var/tmp/file.tar.gz'
22
+ @git_dir_mock = double "git directory mock"
16
23
  end
17
24
 
18
- it "should build an archive" do
19
- directory_stub = stub :build_artifact_from_directory => '/tmp/build_dir',
20
- :local_build => '/var/tmp/file.tar.gz'
21
- git_dir_mock = double "git directory mock"
22
- author_stub = stub :name => 'weaver'
23
- git_commit_stub = stub :id_abbrev => 'abc123',
24
- :message => 'yoyo',
25
- :author => author_stub
26
- Heirloom::Directory.should_receive(:new).with(:path => 'path_to_build',
27
- :exclude => ['.dir_to_exclude'],
28
- :config => @config_mock).
29
- and_return directory_stub
30
- @builder.should_receive(:create_artifact_record)
31
- Heirloom::GitDirectory.should_receive(:new).
32
- with(:path => 'path_to_build').
33
- and_return git_dir_mock
34
- git_dir_mock.should_receive(:commit).
35
- with('123').and_return git_commit_stub
36
- commit_attributes = { 'sha' => '123',
37
- 'abbreviated_sha' => 'abc123',
38
- 'message' => 'yoyo',
39
- 'author' => 'weaver' }
40
- @simpledb_mock.should_receive(:put_attributes).
41
- with('tim', '123', commit_attributes)
25
+ context 'when successful' do
26
+ before do
27
+ Heirloom::Directory.should_receive(:new).
28
+ with(:path => 'path_to_build',
29
+ :exclude => ['.dir_to_exclude'],
30
+ :config => @config_mock).
31
+ and_return @directory_stub
32
+ Heirloom::GitDirectory.should_receive(:new).
33
+ with(:path => 'path_to_build').
34
+ and_return @git_dir_mock
35
+ @builder.should_receive(:create_artifact_record)
36
+ end
42
37
 
43
- @builder.build(:exclude => ['.dir_to_exclude'],
44
- :directory => 'path_to_build',
45
- :git => 'true').should == '/var/tmp/file.tar.gz'
46
- end
38
+ it "should build an archive" do
39
+ git_commit_stub = stub :id_abbrev => 'abc123',
40
+ :message => 'yoyo',
41
+ :author => @author_stub
42
+ @git_dir_mock.should_receive(:commit).
43
+ with('123').and_return git_commit_stub
44
+ commit_attributes = { 'sha' => '123',
45
+ 'abbreviated_sha' => 'abc123',
46
+ 'message' => 'yoyo',
47
+ 'author' => 'weaver' }
48
+ @simpledb_mock.should_receive(:put_attributes).
49
+ with('heirloom_tim', '123', commit_attributes)
47
50
 
48
- it "should build an archive and log a warning if the git sha is not found" do
49
- directory_stub = stub :build_artifact_from_directory => '/tmp/build_dir',
50
- :local_build => '/var/tmp/file.tar.gz'
51
- git_dir_mock = double "git directory mock"
52
- Heirloom::Directory.should_receive(:new).with(:path => 'path_to_build',
53
- :exclude => ['.dir_to_exclude'],
54
- :config => @config_mock).
55
- and_return directory_stub
56
- @builder.should_receive(:create_artifact_record)
57
- Heirloom::GitDirectory.should_receive(:new).
58
- with(:path => 'path_to_build').
59
- and_return git_dir_mock
60
- @logger_stub.should_receive(:warn).with "Could not find Git sha: 123."
61
- git_dir_mock.should_receive(:commit).
62
- with('123').and_return false
63
- @builder.build(:exclude => ['.dir_to_exclude'],
64
- :directory => 'path_to_build',
65
- :git => 'true').should == '/var/tmp/file.tar.gz'
66
- end
51
+ @builder.build(:exclude => ['.dir_to_exclude'],
52
+ :directory => 'path_to_build',
53
+ :git => 'true').should == '/var/tmp/file.tar.gz'
54
+ end
55
+
56
+ it "should build an archive and log a warning if the git sha is not found" do
57
+ @logger_stub.should_receive(:warn).with "Could not find Git sha: 123."
58
+ @git_dir_mock.should_receive(:commit).
59
+ with('123').and_return false
60
+ @builder.build(:exclude => ['.dir_to_exclude'],
61
+ :directory => 'path_to_build',
62
+ :git => 'true').should == '/var/tmp/file.tar.gz'
63
+ end
67
64
 
65
+ end
68
66
 
69
67
  it "should return false if the build fails" do
70
68
  directory_stub = stub :build_artifact_from_directory => false
@@ -77,10 +75,14 @@ describe Heirloom do
77
75
  :git => 'true').should be_false
78
76
  end
79
77
 
78
+ end
79
+
80
+ describe 'cleanup' do
80
81
  it "should cleanup the local archive" do
81
82
  @builder.local_build = '/tmp/file'
82
83
  File.should_receive(:delete).with('/tmp/file')
83
84
  @builder.cleanup
84
85
  end
86
+ end
85
87
 
86
88
  end
@@ -7,13 +7,12 @@ describe Heirloom do
7
7
  @logger_mock = double 'logger'
8
8
  @config_mock.should_receive(:logger).and_return(@logger_mock)
9
9
  @destroyer = Heirloom::Destroyer.new :config => @config_mock,
10
- :name => 'tim',
11
- :id => '123'
10
+ :name => 'tim',
11
+ :id => '123'
12
12
  end
13
13
 
14
14
  it "should destroy the given archive" do
15
- @logger_mock.should_receive(:info).
16
- with "Destroying tim - 123"
15
+ @logger_mock.stub :info => true
17
16
  reader_mock = mock 'archive reader'
18
17
  @destroyer.should_receive(:reader).and_return reader_mock
19
18
  bucket_mock = mock 'bucket'
@@ -21,8 +20,6 @@ describe Heirloom do
21
20
  with(:region => 'us-west-1').
22
21
  and_return 'bucket-us-west-1'
23
22
 
24
- @logger_mock.should_receive(:info).
25
- with "Destroying 's3://bucket-us-west-1/tim/123.tar.gz'."
26
23
 
27
24
  s3_destroyer_mock = mock 's3 destroyer'
28
25
  Heirloom::Destroyer::S3.should_receive(:new).
@@ -34,10 +31,12 @@ describe Heirloom do
34
31
  :key_folder => 'tim',
35
32
  :bucket => 'bucket-us-west-1'
36
33
  sdb_mock = mock 'sdb'
37
- @destroyer.should_receive(:sdb).and_return sdb_mock
38
- sdb_mock.should_receive(:delete).with 'tim', '123'
39
- @logger_mock.should_receive(:info).
40
- with "Destroy complete."
34
+ @destroyer.stub :sdb => sdb_mock
35
+ sdb_mock.should_receive(:delete).with 'heirloom_tim', '123'
36
+ Kernel.should_receive(:sleep).with 3
37
+ sdb_mock.should_receive(:domain_empty?).with('heirloom_tim').
38
+ and_return true
39
+ sdb_mock.should_receive(:delete_domain).with('heirloom_tim')
41
40
  @destroyer.destroy :regions => ['us-west-1']
42
41
  end
43
42
 
@@ -7,8 +7,8 @@ describe Heirloom do
7
7
  @logger_mock = double 'logger'
8
8
  @config_mock.should_receive(:logger).and_return(@logger_mock)
9
9
  @downloader = Heirloom::Downloader.new :config => @config_mock,
10
- :name => 'tim',
11
- :id => '123'
10
+ :name => 'tim',
11
+ :id => '123'
12
12
  end
13
13
 
14
14
  it "should download an archive" do
@@ -12,7 +12,7 @@ describe Heirloom do
12
12
  sdb_mock = mock 'sdb'
13
13
  @lister.should_receive(:sdb).and_return sdb_mock
14
14
  sdb_mock.should_receive(:select).
15
- with("select * from test123 where built_at > '2000-01-01T00:00:00.000Z' \
15
+ with("select * from heirloom_test123 where built_at > '2000-01-01T00:00:00.000Z' \
16
16
  order by built_at desc limit 10").
17
17
  and_return( {'1' => 'one', '2' => 'two', '3' => 'three'} )
18
18
  @lister.list.should == ['1', '2', '3']