heirloom 0.8.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,10 @@
1
+ ## 0.8.2:
2
+
3
+ * Updated docs based on feedback from mint.
4
+ * Added check for other account owning a given bucket.
5
+ * Fixed config to read CLI variables and override file config.
6
+ * When delete bucket raise not found, return true (eventually consistent)
7
+
1
8
  ## v0.8.1:
2
9
 
3
10
  * Moving verification on entry exists into catalog class
data/README.md CHANGED
@@ -7,13 +7,19 @@ The goal of Heirloom is to securely and easily transport data to cloud hosted ap
7
7
 
8
8
  Heirloom creates archives from directories. Their archives are versioned and hosted in geographic distributed locations. Heirloom tracks metadata about those archives, both about the archive locations, as well as arbitrary tags which can be set by an engineer or process. It supports encryption and authorization to allow for securely transporting sensitive data over cloud storage services.
9
9
 
10
+ Prerequisites
11
+ -------------
12
+
13
+ * Ruby version 1.9.2 or higher installed.
14
+ * AWS account access key and secret key.
15
+
10
16
  Installation
11
17
  ------------
12
18
 
13
19
  Install the gem
14
20
 
15
21
  ```
16
- gem install heirloom
22
+ gem install heirloom --no-ri --no-rdoc
17
23
  ```
18
24
 
19
25
  To get started copy the sample below into ~/.heirloom.yml and update the specified fields.
@@ -22,25 +28,20 @@ To get started copy the sample below into ~/.heirloom.yml and update the specifi
22
28
  aws:
23
29
  access_key: UPDATE_ME
24
30
  secret_key: UPDATE_ME
31
+ metadata_region: us-west-1
25
32
  ```
26
33
 
27
34
  Proxy Support
28
35
  -------------
29
36
 
30
- Heirloom uses the http_proxy & https_proxy variables.
37
+ Heirloom supports accessing AWS API endpoint throught a proxy. This can be set via the http_proxy and https_proxy variables.
31
38
 
32
39
  ```
33
40
  export http_proxy=http://1.2.3.4:80
34
41
  export http_proxys=http://1.2.3.4:80
35
42
  ```
36
43
 
37
- Platforms
38
- ---------
39
-
40
- Currently I support AWS S3 for object storage and AWS SimpleDB for metadata management. One day I'd like to expand to other providers.
41
-
42
-
43
44
  Documentation
44
45
  -------------
45
46
 
46
- For more information, please view the [Heirloom Wiki](https://github.com/live-community/heirloom/wiki).
47
+ For more information, please view the [Heirloom Wiki](https://github.com/intuit/heirloom/wiki).
@@ -10,6 +10,7 @@ require 'heirloom/archive/writer.rb'
10
10
  require 'heirloom/archive/authorizer.rb'
11
11
  require 'heirloom/archive/destroyer.rb'
12
12
  require 'heirloom/archive/verifier.rb'
13
+ require 'heirloom/archive/checker.rb'
13
14
 
14
15
  module Heirloom
15
16
 
@@ -0,0 +1,30 @@
1
+ module Heirloom
2
+
3
+ class Checker
4
+
5
+ def initialize(args)
6
+ @config = args[:config]
7
+ @logger = @config.logger
8
+ end
9
+
10
+ def bucket_name_available?(args)
11
+ bucket_prefix = args[:bucket_prefix]
12
+ regions = args[:regions]
13
+ result = true
14
+
15
+ regions.each do |region|
16
+ s3 = AWS::S3.new :config => @config,
17
+ :region => region
18
+ bucket = "#{bucket_prefix}-#{region}"
19
+
20
+ unless s3.bucket_name_available? bucket
21
+ @logger.warn "#{bucket} unavailable in #{region}."
22
+ result = false
23
+ end
24
+ end
25
+
26
+ result
27
+ end
28
+
29
+ end
30
+ end
@@ -7,6 +7,7 @@ module Heirloom
7
7
  def initialize(args)
8
8
  @config = args[:config]
9
9
  @region = args[:region]
10
+ @logger = @config.logger
10
11
 
11
12
  @s3 = Fog::Storage.new :provider => 'AWS',
12
13
  :aws_access_key_id => @config.access_key,
@@ -22,8 +23,46 @@ module Heirloom
22
23
  @s3.directories.get bucket
23
24
  end
24
25
 
26
+ def bucket_exists?(bucket)
27
+ get_bucket(bucket) != nil
28
+ rescue Excon::Errors::Forbidden
29
+ false
30
+ end
31
+
32
+ def bucket_exists_in_another_region?(bucket)
33
+ if bucket_exists? bucket
34
+ get_bucket(bucket).location != @region
35
+ else
36
+ false
37
+ end
38
+ rescue Excon::Errors::Forbidden
39
+ false
40
+ end
41
+
42
+ def bucket_owned_by_another_account?(bucket)
43
+ get_bucket bucket
44
+ false
45
+ rescue Excon::Errors::Forbidden
46
+ @logger.warn "#{bucket} owned by another account."
47
+ true
48
+ end
49
+
50
+ def bucket_name_available?(bucket)
51
+ @logger.info "Checking for #{bucket} availability in #{@region}."
52
+
53
+ if bucket_owned_by_another_account?(bucket) ||
54
+ bucket_exists_in_another_region?(bucket)
55
+ false
56
+ else
57
+ true
58
+ end
59
+ end
60
+
25
61
  def delete_bucket(bucket)
26
62
  @s3.delete_bucket bucket
63
+ rescue Excon::Errors::NotFound
64
+ @logger.info "#{bucket} already destroyed."
65
+ true
27
66
  end
28
67
 
29
68
  def get_object(bucket_name, object_name)
@@ -29,6 +29,9 @@ module Heirloom
29
29
  :config => @config
30
30
  ensure_metadata_in_upload_region :config => @config,
31
31
  :regions => @opts[:region]
32
+ ensure_buckets_available :config => @config,
33
+ :bucket_prefix => @opts[:bucket_prefix],
34
+ :regions => @opts[:region]
32
35
 
33
36
  @catalog.create_catalog_domain
34
37
 
@@ -170,6 +170,25 @@ module Heirloom
170
170
  end
171
171
  end
172
172
 
173
+ def ensure_buckets_available(args)
174
+ config = args[:config]
175
+ regions = args[:regions]
176
+ bucket_prefix = args[:bucket_prefix]
177
+ logger = config.logger
178
+
179
+ checker = Heirloom::Checker.new :config => config
180
+
181
+ available = checker.bucket_name_available? :bucket_prefix => bucket_prefix,
182
+ :regions => regions,
183
+ :config => config
184
+ if available
185
+ true
186
+ else
187
+ logger.error "Bucket prefix #{bucket_prefix} not available across regions #{regions.join}."
188
+ exit 1
189
+ end
190
+ end
191
+
173
192
  def latest_id(args)
174
193
  archive = Archive.new :name => args[:name],
175
194
  :config => args[:config]
@@ -3,26 +3,32 @@ module Heirloom
3
3
 
4
4
  attr_accessor :access_key, :secret_key, :metadata_region, :logger
5
5
 
6
- def initialize(args = {})
7
- @config = args.fetch :config, load_config_file
6
+ def initialize(args={})
7
+ @opts = args[:opts] ||= Hash.new
8
+ @config = load_config_file
8
9
  self.logger = args[:logger] ||= HeirloomLogger.new
9
10
  load_config
10
11
  end
11
12
 
12
13
  def load_config
13
- aws = @config['aws']
14
- self.access_key = aws['access_key']
15
- self.secret_key = aws['secret_key']
16
- self.metadata_region = aws['metadata_region']
14
+ self.access_key = @opts.fetch :aws_access_key,
15
+ @config['access_key']
16
+ self.secret_key = @opts.fetch :aws_secret_key,
17
+ @config['secret_key']
18
+ self.metadata_region = @opts.fetch :metadata_region,
19
+ @config['metadata_region']
17
20
  end
18
21
 
22
+ private
23
+
19
24
  def load_config_file
20
25
  config_file = "#{ENV['HOME']}/.heirloom.yml"
21
26
 
22
27
  if File.exists? config_file
23
- YAML::load File.open(config_file)
28
+ data = YAML::load File.open(config_file)
29
+ data['aws']
24
30
  else
25
- { 'aws' => Hash.new }
31
+ { }
26
32
  end
27
33
  end
28
34
 
@@ -1,3 +1,3 @@
1
1
  module Heirloom
2
- VERSION = "0.8.1"
2
+ VERSION = "0.8.2"
3
3
  end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe Heirloom do
4
+
5
+ before do
6
+ @config_mock = double 'config'
7
+ @logger_stub = stub 'logger', :debug => true,
8
+ :info => true,
9
+ :warn => true
10
+ @config_mock.stub :logger => @logger_stub
11
+ @checker = Heirloom::Checker.new :config => @config_mock
12
+ @regions = ['us-west-1', 'us-west-2']
13
+ end
14
+
15
+ it "should return true if all bucket names are available" do
16
+ s3_mock = mock 's3'
17
+ Heirloom::AWS::S3.should_receive(:new).
18
+ with(:config => @config_mock,
19
+ :region => 'us-west-1').
20
+ and_return s3_mock
21
+ Heirloom::AWS::S3.should_receive(:new).
22
+ with(:config => @config_mock,
23
+ :region => 'us-west-2').
24
+ and_return s3_mock
25
+ s3_mock.should_receive(:bucket_name_available?).
26
+ with('bp-us-west-1').
27
+ and_return true
28
+ s3_mock.should_receive(:bucket_name_available?).
29
+ with('bp-us-west-2').
30
+ and_return true
31
+ @checker.bucket_name_available?(:bucket_prefix => 'bp',
32
+ :regions => @regions).
33
+ should be_true
34
+ end
35
+
36
+ it "should return false if any buckets are unavailable" do
37
+ s3_mock = mock 's3'
38
+ Heirloom::AWS::S3.should_receive(:new).
39
+ with(:config => @config_mock,
40
+ :region => 'us-west-1').
41
+ and_return s3_mock
42
+ Heirloom::AWS::S3.should_receive(:new).
43
+ with(:config => @config_mock,
44
+ :region => 'us-west-2').
45
+ and_return s3_mock
46
+ s3_mock.should_receive(:bucket_name_available?).
47
+ with('bp-us-west-1').
48
+ and_return false
49
+ s3_mock.should_receive(:bucket_name_available?).
50
+ with('bp-us-west-2').
51
+ and_return true
52
+ @checker.bucket_name_available?(:bucket_prefix => 'bp',
53
+ :regions => @regions).
54
+ should be_false
55
+ end
56
+
57
+ end
@@ -22,6 +22,7 @@ describe Heirloom do
22
22
  :region => 'us-east-1').
23
23
  and_return @s3_mock
24
24
  end
25
+
25
26
  it "should return false if a bucket does not exist in a region" do
26
27
  @s3_mock.should_receive(:get_bucket).with('bucket123-us-west-1').
27
28
  and_return nil
@@ -2,15 +2,89 @@ require 'spec_helper'
2
2
 
3
3
  describe Heirloom do
4
4
  before do
5
+ @directories_mock = mock 'directories'
6
+ @bucket_mock = mock 'bucket'
7
+ @logger_stub = stub 'logger', :debug => true,
8
+ :info => true,
9
+ :warn => true
5
10
  @config_mock = mock 'config'
6
- @config_mock.should_receive(:access_key).and_return 'the-key'
7
- @config_mock.should_receive(:secret_key).and_return 'the-secret'
11
+ @config_mock.stub :access_key => 'the-key',
12
+ :secret_key => 'the-secret',
13
+ :logger => @logger_stub
8
14
  @fog_mock = mock 'fog'
15
+ @fog_mock.stub :directories => @directories_mock
9
16
  Fog::Storage.should_receive(:new).and_return @fog_mock
10
17
  @s3 = Heirloom::AWS::S3.new :config => @config_mock,
11
18
  :region => 'us-west-1'
19
+ end
20
+
21
+ context "bucket_exists?" do
22
+ it "should return true if the bucket exists" do
23
+ @directories_mock.should_receive(:get).
24
+ with('bucket').and_return @bucket_mock
25
+ @s3.bucket_exists?('bucket').should be_true
26
+ end
27
+
28
+ it "should return false if the bucket does not exist" do
29
+ @directories_mock.should_receive(:get).
30
+ with('bucket').and_return nil
31
+ @s3.bucket_exists?('bucket').should be_false
32
+ end
33
+
34
+ it "should return false if bucket owned by another account" do
35
+ @directories_mock.should_receive(:get).
36
+ with('bucket').
37
+ and_raise Excon::Errors::Forbidden.new('msg')
38
+ @s3.bucket_exists?('bucket').should be_false
39
+ end
40
+ end
41
+
42
+ context "bucket_exists_in_another_region?" do
43
+ it "should return true if the bucket exists in another region" do
44
+ @bucket_mock.stub :location => 'us-east-1'
45
+ @directories_mock.should_receive(:get).
46
+ with('bucket').at_least(:once).
47
+ and_return @bucket_mock
48
+ @s3.bucket_exists_in_another_region?('bucket').should be_true
49
+ end
50
+
51
+ it "should return false if the bucket exists in the curren region" do
52
+ @bucket_mock.stub :location => 'us-west-1'
53
+ @directories_mock.should_receive(:get).
54
+ with('bucket').at_least(:once).
55
+ and_return @bucket_mock
56
+ @s3.bucket_exists_in_another_region?('bucket').should be_false
57
+ end
58
+
59
+ it "should return false if bucket owned by another account" do
60
+ @directories_mock.should_receive(:get).
61
+ with('bucket').
62
+ and_raise Excon::Errors::Forbidden.new('msg')
63
+ @s3.bucket_exists_in_another_region?('bucket').should be_false
64
+ end
65
+ end
66
+
67
+ context "bucket_owned_by_another_account?" do
68
+ it "should return false if bucket owned by this account" do
69
+ @directories_mock.should_receive(:get).
70
+ with('bucket').
71
+ and_return @bucket_mock
72
+ @s3.bucket_owned_by_another_account?('bucket').should be_false
73
+ end
12
74
 
75
+ it "should return false if bucket does not exist" do
76
+ @directories_mock.should_receive(:get).
77
+ with('bucket').
78
+ and_return nil
79
+ @s3.bucket_owned_by_another_account?('bucket').should be_false
80
+ end
13
81
 
82
+ it "should return true if bucket is not owned by another account" do
83
+ @directories_mock.should_receive(:get).
84
+ with('bucket').
85
+ and_raise Excon::Errors::Forbidden.new('msg')
86
+ @s3.bucket_owned_by_another_account?('bucket').should be_true
87
+ end
14
88
  end
15
89
 
16
90
  it "should delete an object from s3" do
@@ -20,18 +94,56 @@ describe Heirloom do
20
94
  end
21
95
 
22
96
  it "should get a bucket from s3" do
23
- directories_mock = mock 'directories'
24
- @fog_mock.should_receive(:directories).
25
- and_return directories_mock
26
- directories_mock.should_receive(:get).with 'bucket'
97
+ @directories_mock.should_receive(:get).with 'bucket'
27
98
  @s3.get_bucket 'bucket'
28
99
  end
29
100
 
101
+ context "testing bucket availability" do
102
+
103
+ it "should return false if the bucket is forbidden" do
104
+ @directories_mock.should_receive(:get).
105
+ with('bucket').
106
+ and_raise Excon::Errors::Forbidden.new('msg')
107
+ @s3.bucket_name_available?('bucket').should be_false
108
+ end
109
+
110
+ it "should return false if bucket in different region" do
111
+ @directories_mock.should_receive(:get).
112
+ with('bucket').at_least(:once).
113
+ and_return @bucket_mock
114
+ @bucket_mock.stub :location => 'us-east-1'
115
+ @s3.bucket_name_available?('bucket').should be_false
116
+ end
117
+
118
+ it "should return true if the bucket is in this account / region" do
119
+ @directories_mock.should_receive(:get).
120
+ with('bucket').at_least(:once).
121
+ and_return @bucket_mock
122
+ @bucket_mock.stub :location => 'us-west-1'
123
+ @s3.bucket_name_available?('bucket').should be_true
124
+ end
125
+
126
+ it "should return true if the bucket is not found" do
127
+ @directories_mock.should_receive(:get).
128
+ with('bucket').at_least(:once).
129
+ and_return nil
130
+ @s3.bucket_name_available?('bucket').should be_true
131
+ end
132
+
133
+ end
134
+
30
135
  it "should delete a bucket from s3" do
31
136
  @fog_mock.should_receive(:delete_bucket).with 'bucket'
32
137
  @s3.delete_bucket 'bucket'
33
138
  end
34
139
 
140
+ it "should return true if Excon::Errors::NotFound raised when deleting bucket" do
141
+ @fog_mock.should_receive(:delete_bucket).
142
+ with('bucket').
143
+ and_raise Excon::Errors::NotFound.new 'Bucket does not exist.'
144
+ @s3.delete_bucket 'bucket'
145
+ end
146
+
35
147
  it "should get an object from s3" do
36
148
  body_mock = mock 'body'
37
149
  @fog_mock.should_receive(:get_object).
@@ -19,6 +19,7 @@ describe Heirloom do
19
19
  :metadata_region => 'us-west-1'
20
20
  @archive_mock = mock 'archive'
21
21
  @catalog_mock = mock 'catalog'
22
+ @checker_mock = mock 'checker'
22
23
  Trollop.stub(:options).and_return options
23
24
  Heirloom::HeirloomLogger.should_receive(:new).with(:log_level => 'info').
24
25
  and_return @logger_stub
@@ -34,10 +35,18 @@ describe Heirloom do
34
35
  with(:name => 'archive_name',
35
36
  :config => @config_mock).
36
37
  and_return @catalog_mock
38
+ Heirloom::Checker.should_receive(:new).
39
+ with(:config => @config_mock).
40
+ and_return @checker_mock
37
41
  @setup = Heirloom::CLI::Setup.new
38
42
  end
39
43
 
40
44
  it "should setup s3 buckets, catalog and simpledb domain" do
45
+ @checker_mock.should_receive(:bucket_name_available?).
46
+ with(:bucket_prefix => "bp",
47
+ :regions => @regions,
48
+ :config => @config_mock).
49
+ and_return true
41
50
  @catalog_mock.should_receive(:create_catalog_domain)
42
51
  @catalog_mock.stub :entry_exists_in_catalog? => false
43
52
  @catalog_mock.should_receive(:add_to_catalog).
@@ -318,4 +318,39 @@ describe Heirloom do
318
318
  end
319
319
 
320
320
  end
321
+
322
+ context "ensure buckets are available or owned by account" do
323
+ before do
324
+ @logger_stub = stub 'logger', :error => true
325
+ @config_stub = stub 'config', :logger => @logger_stub
326
+ @checker_mock = mock 'checker'
327
+ @args = { :config => @config_stub,
328
+ :bucket_prefix => 'intu-lc',
329
+ :regions => ['us-west-1', 'us-west-2'] }
330
+ @object = Object.new
331
+ @object.extend Heirloom::CLI::Shared
332
+ Heirloom::Checker.should_receive(:new).
333
+ with(:config => @config_stub).
334
+ and_return @checker_mock
335
+ end
336
+
337
+ it "should return true if buckets available in all regions" do
338
+ @checker_mock.should_receive(:bucket_name_available?).
339
+ with(:bucket_prefix => 'intu-lc',
340
+ :regions => ['us-west-1', 'us-west-2'],
341
+ :config => @config_stub).
342
+ and_return true
343
+ @object.ensure_buckets_available(@args).should be_true
344
+ end
345
+
346
+ it "should return raise and error if any bucket un-available in all regions" do
347
+ @checker_mock.should_receive(:bucket_name_available?).
348
+ with(:bucket_prefix => 'intu-lc',
349
+ :regions => ['us-west-1', 'us-west-2'],
350
+ :config => @config_stub).
351
+ and_return false
352
+ lambda { @object.ensure_buckets_available(@args) }.
353
+ should raise_error SystemExit
354
+ end
355
+ end
321
356
  end
@@ -3,38 +3,47 @@ require 'spec_helper'
3
3
  describe Heirloom do
4
4
 
5
5
  before do
6
- @config = { 'aws' =>
7
- { 'access_key ' => 'key',
8
- 'secret_key ' => 'secret',
9
- 'metadata_region' => 'us-west-2'
10
- }
11
- }
6
+ @config_file = { 'aws' =>
7
+ { 'access_key' => 'key',
8
+ 'secret_key' => 'secret',
9
+ 'metadata_region' => 'us-west-2'
10
+ }
11
+ }
12
+ @opts = { :aws_access_key => 'optkey',
13
+ :aws_secret_key => 'optsec',
14
+ :metadata_region => 'optmd' }
15
+
12
16
  end
13
17
 
14
18
  it "should create a new config object from the hash passed as config" do
15
- config = Heirloom::Config.new :config => @config,
19
+ File.stub :exists? => false
20
+ File.should_receive(:open).never
21
+ config = Heirloom::Config.new :opts => @opts,
16
22
  :logger => 'da-logger'
17
- config.access_key.should == @config['aws']['access_key']
18
- config.secret_key.should == @config['aws']['secret_key']
19
- config.metadata_region.should == @config['aws']['metadata_region']
23
+ config.access_key.should == @opts[:aws_access_key]
24
+ config.secret_key.should == @opts[:aws_secret_key]
25
+ config.metadata_region.should == @opts[:metadata_region]
20
26
  config.logger.should == 'da-logger'
21
27
  end
22
28
 
23
29
  it "should create a new config object and read from ~/.heirloom.yml" do
24
30
  File.stub :exists? => true
25
31
  File.should_receive(:open).with("#{ENV['HOME']}/.heirloom.yml").
26
- and_return(@config.to_yaml)
32
+ and_return(@config_file.to_yaml)
27
33
  config = Heirloom::Config.new
28
- config.access_key.should == @config['aws']['access_key']
29
- config.secret_key.should == @config['aws']['secret_key']
30
- config.metadata_region.should == @config['aws']['metadata_region']
34
+ config.access_key.should == @config_file['aws']['access_key']
35
+ config.secret_key.should == @config_file['aws']['secret_key']
36
+ config.metadata_region.should == @config_file['aws']['metadata_region']
31
37
  end
32
-
33
- it "should return nil if metadata_region not present in config" do
34
- @config['aws'] = {}
35
- config = Heirloom::Config.new :config => @config,
36
- :logger => 'da-logger'
37
- config.metadata_region.should == nil
38
+
39
+ it "should override config settings in file from opts" do
40
+ File.stub :exists? => true
41
+ File.should_receive(:open).with("#{ENV['HOME']}/.heirloom.yml").
42
+ and_return(@config_file.to_yaml)
43
+ config = Heirloom::Config.new :opts => @opts
44
+ config.access_key.should == @opts[:aws_access_key]
45
+ config.secret_key.should == @opts[:aws_secret_key]
46
+ config.metadata_region.should == @opts[:metadata_region]
38
47
  end
39
48
 
40
49
  it "should load a blank config if the file does not exist and no config passed" do
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.8.1
4
+ version: 0.8.2
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-11-09 00:00:00.000000000 Z
12
+ date: 2012-11-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70142193190000 !ruby/object:Gem::Requirement
16
+ requirement: &70116641456840 !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: *70142193190000
24
+ version_requirements: *70116641456840
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &70142193189180 !ruby/object:Gem::Requirement
27
+ requirement: &70116641456000 !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: *70142193189180
35
+ version_requirements: *70116641456000
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: fog
38
- requirement: &70142193188060 !ruby/object:Gem::Requirement
38
+ requirement: &70116641455120 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.5.0
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70142193188060
46
+ version_requirements: *70116641455120
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: grit
49
- requirement: &70142193187120 !ruby/object:Gem::Requirement
49
+ requirement: &70116641469900 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 2.5.0
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70142193187120
57
+ version_requirements: *70116641469900
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: trollop
60
- requirement: &70142193185780 !ruby/object:Gem::Requirement
60
+ requirement: &70116641467720 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - =
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '2.0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70142193185780
68
+ version_requirements: *70116641467720
69
69
  description: I help build and manage building tar.gz files and deploying them into
70
70
  the cloud
71
71
  email:
@@ -91,6 +91,7 @@ files:
91
91
  - lib/heirloom/archive.rb
92
92
  - lib/heirloom/archive/authorizer.rb
93
93
  - lib/heirloom/archive/builder.rb
94
+ - lib/heirloom/archive/checker.rb
94
95
  - lib/heirloom/archive/destroyer.rb
95
96
  - lib/heirloom/archive/downloader.rb
96
97
  - lib/heirloom/archive/lister.rb
@@ -144,6 +145,7 @@ files:
144
145
  - spec/acl/s3_spec.rb
145
146
  - spec/archive/authorizer_spec.rb
146
147
  - spec/archive/builder_spec.rb
148
+ - spec/archive/checker_spec.rb
147
149
  - spec/archive/destroyer_spec.rb
148
150
  - spec/archive/downloader_spec.rb
149
151
  - spec/archive/lister_spec.rb
@@ -200,7 +202,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
200
202
  version: '0'
201
203
  segments:
202
204
  - 0
203
- hash: -107270664148118049
205
+ hash: 3388616083800809289
204
206
  required_rubygems_version: !ruby/object:Gem::Requirement
205
207
  none: false
206
208
  requirements:
@@ -209,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
209
211
  version: '0'
210
212
  segments:
211
213
  - 0
212
- hash: -107270664148118049
214
+ hash: 3388616083800809289
213
215
  requirements: []
214
216
  rubyforge_project: heirloom
215
217
  rubygems_version: 1.8.16
@@ -220,6 +222,7 @@ test_files:
220
222
  - spec/acl/s3_spec.rb
221
223
  - spec/archive/authorizer_spec.rb
222
224
  - spec/archive/builder_spec.rb
225
+ - spec/archive/checker_spec.rb
223
226
  - spec/archive/destroyer_spec.rb
224
227
  - spec/archive/downloader_spec.rb
225
228
  - spec/archive/lister_spec.rb