heirloom 0.12.1 → 0.12.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +1 -0
  4. data/CHANGELOG.md +6 -0
  5. data/README.md +12 -6
  6. data/heirloom.gemspec +3 -5
  7. data/lib/heirloom/catalog/verify.rb +2 -2
  8. data/lib/heirloom/cli/authorize.rb +1 -2
  9. data/lib/heirloom/cli/catalog.rb +62 -19
  10. data/lib/heirloom/cli/cleanup.rb +1 -2
  11. data/lib/heirloom/cli/destroy.rb +1 -2
  12. data/lib/heirloom/cli/download.rb +2 -3
  13. data/lib/heirloom/cli/formatter/catalog.rb +25 -11
  14. data/lib/heirloom/cli/list.rb +1 -3
  15. data/lib/heirloom/cli/rotate.rb +1 -2
  16. data/lib/heirloom/cli/setup.rb +1 -2
  17. data/lib/heirloom/cli/shared.rb +3 -0
  18. data/lib/heirloom/cli/show.rb +1 -3
  19. data/lib/heirloom/cli/tag.rb +1 -2
  20. data/lib/heirloom/cli/teardown.rb +1 -2
  21. data/lib/heirloom/cli/upload.rb +1 -2
  22. data/lib/heirloom/version.rb +1 -1
  23. data/spec/acl/s3_spec.rb +11 -11
  24. data/spec/archive/authorizer_spec.rb +20 -20
  25. data/spec/archive/builder_spec.rb +13 -13
  26. data/spec/archive/checker_spec.rb +24 -24
  27. data/spec/archive/destroyer_spec.rb +20 -20
  28. data/spec/archive/downloader_spec.rb +30 -30
  29. data/spec/archive/lister_spec.rb +7 -7
  30. data/spec/archive/reader_spec.rb +65 -65
  31. data/spec/archive/setup_spec.rb +27 -27
  32. data/spec/archive/teardowner_spec.rb +19 -19
  33. data/spec/archive/updater_spec.rb +10 -10
  34. data/spec/archive/uploader_spec.rb +26 -26
  35. data/spec/archive/verifier_spec.rb +25 -25
  36. data/spec/archive/writer_spec.rb +11 -11
  37. data/spec/archive_spec.rb +91 -93
  38. data/spec/aws/s3_spec.rb +102 -102
  39. data/spec/aws/simpledb_spec.rb +33 -63
  40. data/spec/catalog/add_spec.rb +12 -12
  41. data/spec/catalog/delete_spec.rb +14 -14
  42. data/spec/catalog/list_spec.rb +8 -8
  43. data/spec/catalog/setup_spec.rb +11 -11
  44. data/spec/catalog/show_spec.rb +13 -13
  45. data/spec/catalog/verify_spec.rb +16 -16
  46. data/spec/catalog_spec.rb +36 -36
  47. data/spec/cipher/data_spec.rb +19 -19
  48. data/spec/cipher/file_spec.rb +11 -11
  49. data/spec/cli/authorize_spec.rb +16 -16
  50. data/spec/cli/catalog_spec.rb +18 -34
  51. data/spec/cli/destroy_spec.rb +13 -13
  52. data/spec/cli/download_spec.rb +31 -31
  53. data/spec/cli/formatter/catalog_spec.rb +19 -17
  54. data/spec/cli/list_spec.rb +14 -14
  55. data/spec/cli/rotate_spec.rb +9 -9
  56. data/spec/cli/setup_spec.rb +29 -29
  57. data/spec/cli/shared_spec.rb +119 -119
  58. data/spec/cli/show_spec.rb +20 -20
  59. data/spec/cli/tag_spec.rb +18 -18
  60. data/spec/cli/teardown_spec.rb +28 -28
  61. data/spec/cli/upload_spec.rb +38 -38
  62. data/spec/config_spec.rb +21 -21
  63. data/spec/destroyer/s3_spec.rb +6 -6
  64. data/spec/directory/directory_spec.rb +19 -19
  65. data/spec/downloader/s3_spec.rb +18 -18
  66. data/spec/logger_spec.rb +9 -9
  67. data/spec/spec_helper.rb +4 -80
  68. data/spec/uploader/s3_spec.rb +35 -35
  69. metadata +23 -56
  70. data/spec/integration/authorize_spec.rb +0 -79
  71. data/spec/integration/cleanup_spec.rb +0 -77
  72. data/watchr.rb +0 -101
@@ -3,21 +3,21 @@ require 'spec_helper'
3
3
  describe Heirloom do
4
4
 
5
5
  before do
6
- @s3_mock = mock 's3 mock'
7
- Heirloom::AWS::S3.stub :new => @s3_mock
6
+ @s3_double = double 's3 mock'
7
+ Heirloom::AWS::S3.stub :new => @s3_double
8
8
 
9
- @config_mock = double 'config'
10
- @logger_mock = double 'logger'
11
- @config_mock.stub :logger => @logger_mock
12
- @s3 = Heirloom::Downloader::S3.new :config => @config_mock,
9
+ @config_double = double 'config'
10
+ @logger_double = double 'logger'
11
+ @config_double.stub :logger => @logger_double
12
+ @s3 = Heirloom::Downloader::S3.new :config => @config_double,
13
13
  :region => 'us-west-1'
14
14
  end
15
15
 
16
16
  context "when succesful" do
17
17
  it "should download the specified file from s3" do
18
- @s3_mock.should_receive(:get_object).
19
- with('bucket', 'key_name').
20
- and_return 'data'
18
+ @s3_double.should_receive(:get_object).
19
+ with('bucket', 'key_name').
20
+ and_return 'data'
21
21
  @s3.download_file(:key => 'key_name',
22
22
  :bucket => 'bucket').should == 'data'
23
23
  end
@@ -26,23 +26,23 @@ describe Heirloom do
26
26
  context "when unsuccesful" do
27
27
  before do
28
28
  body = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>7A737B6941146062</RequestId><HostId>8DlaCTOXO2aBxLnM2cZs+C8pQ2a5IDI/NQJRlPGRbPbBU2U1jH67i0zA376utqyR</HostId></Error>'
29
- @response_stub = stub 'response', :body => body
29
+ @response_double = double 'response', :body => body
30
30
  end
31
31
 
32
32
  it "should return an error if the bucket not found" do
33
- @logger_mock.should_receive(:error).with('Access Denied')
34
- @s3_mock.should_receive(:get_object).
35
- with('bucket', 'key_name').
36
- and_raise Excon::Errors::Forbidden.new 'msg', 'req', @response_stub
33
+ @logger_double.should_receive(:error).with('Access Denied')
34
+ @s3_double.should_receive(:get_object).
35
+ with('bucket', 'key_name').
36
+ and_raise Excon::Errors::Forbidden.new 'msg', 'req', @response_double
37
37
  @s3.download_file(:key => 'key_name',
38
38
  :bucket => 'bucket').should be_false
39
39
  end
40
40
 
41
41
  it "should return an error if the object not found / forbidden" do
42
- @logger_mock.should_receive(:error).with('Access Denied')
43
- @s3_mock.should_receive(:get_object).
44
- with('bucket', 'key_name').
45
- and_raise Excon::Errors::NotFound.new 'msg', 'req', @response_stub
42
+ @logger_double.should_receive(:error).with('Access Denied')
43
+ @s3_double.should_receive(:get_object).
44
+ with('bucket', 'key_name').
45
+ and_raise Excon::Errors::NotFound.new 'msg', 'req', @response_double
46
46
  @s3.download_file(:key => 'key_name',
47
47
  :bucket => 'bucket').should be_false
48
48
  end
@@ -3,19 +3,19 @@ require 'spec_helper'
3
3
  describe Heirloom do
4
4
 
5
5
  it "should create a new logger object from the hash passed as :logger" do
6
- logger_mock = mock 'logger'
7
- logger_mock.should_receive(:info).with 'a message'
8
- logger = Heirloom::HeirloomLogger.new :logger => logger_mock
6
+ logger_double = double 'logger'
7
+ logger_double.should_receive(:info).with 'a message'
8
+ logger = Heirloom::HeirloomLogger.new :logger => logger_double
9
9
  logger.info 'a message'
10
10
  end
11
11
 
12
12
  it "should create a new logger object when one is not passed" do
13
- logger_mock = mock 'logger'
14
- Logger.should_receive(:new).with($stdout).and_return logger_mock
15
- logger_mock.should_receive(:info).with 'a message'
16
- logger_mock.should_receive(:datetime_format=).with '%Y-%m-%dT%H:%M:%S%z'
17
- logger_mock.should_receive(:formatter=)
18
- logger_mock.should_receive(:level=).with 1
13
+ logger_double = double 'logger'
14
+ Logger.should_receive(:new).with($stdout).and_return logger_double
15
+ logger_double.should_receive(:info).with 'a message'
16
+ logger_double.should_receive(:datetime_format=).with '%Y-%m-%dT%H:%M:%S%z'
17
+ logger_double.should_receive(:formatter=)
18
+ logger_double.should_receive(:level=).with 1
19
19
  logger = Heirloom::HeirloomLogger.new
20
20
  logger.info 'a message'
21
21
  end
@@ -7,25 +7,21 @@ end if ENV["COVERAGE"]
7
7
  require 'hashie'
8
8
  require 'rubygems'
9
9
  require 'bundler/setup'
10
- require 'vcr'
11
10
 
12
11
  require 'heirloom'
13
12
 
14
- HEIRLOOM_INT_BP = ENV['HEIRLOOM_INTEGRATION_BUCKET_PREFIX']
15
- RUN_INTEGRATION_TESTS = HEIRLOOM_INT_BP && !HEIRLOOM_INT_BP.empty?
16
-
17
13
  module SpecHelpers
18
14
 
19
15
  def set_env_var(name,value)
20
16
  ENV.stub(:fetch).with(name, nil).and_return(value)
21
17
  end
22
18
 
23
- def mock_log
24
- mock 'log', :debug => true, :info => true, :warn => true, :error => true, :level= => true
19
+ def double_log
20
+ double 'log', :debug => true, :info => true, :warn => true, :error => true, :level= => true
25
21
  end
26
22
 
27
- def mock_config(args = {})
28
- args[:logger] ||= mock_log
23
+ def double_config(args = {})
24
+ args[:logger] ||= double_log
29
25
  args[:access_key] ||= 'key'
30
26
  args[:secret_key] ||= 'secret'
31
27
  args[:metadata_region] ||= 'us-west-1'
@@ -37,79 +33,7 @@ module SpecHelpers
37
33
 
38
34
  end
39
35
 
40
- module IntegrationHelpers
41
- def integration_or_mock_config
42
- if RUN_INTEGRATION_TESTS && File.exists?("#{ENV['HOME']}/.heirloom.yml")
43
- begin
44
- Heirloom::Config.new(:environment => 'integration', :logger => mock_log)
45
- rescue SystemExit
46
- mock_config
47
- end
48
- else
49
- mock_config
50
- end
51
- end
52
-
53
- def wait_for_aws(num_seconds = 5)
54
- sleep num_seconds
55
- end
56
-
57
- def create_temp_heirloom_content
58
- tmp_dir = Dir.mktmpdir
59
- File.open(File.join(tmp_dir, 'index.html'), 'w') do |f|
60
- f.write 'Hello World!'
61
- end
62
- tmp_dir
63
- end
64
-
65
- def reset_env(opts = {})
66
- opts[:environment] = 'integration'
67
- opts[:log_level] = 'debug'
68
- opts[:metadata_region] = 'us-west-1'
69
-
70
- Trollop.stub :options => opts
71
- end
72
-
73
- def capture(*streams)
74
- streams.map! { |stream| stream.to_s }
75
- begin
76
- result = StringIO.new
77
- streams.each { |stream| eval "$#{stream} = result" }
78
- yield
79
- ensure
80
- streams.each { |stream| eval "$#{stream} = #{stream.upcase}" }
81
- end
82
- result.string
83
- end
84
-
85
- end
86
-
87
- VCR.configure do |config|
88
-
89
- config.allow_http_connections_when_no_cassette = true
90
- config.cassette_library_dir = 'spec/fixtures/cassettes'
91
- config.hook_into :excon
92
- config.configure_rspec_metadata!
93
-
94
- if RUN_INTEGRATION_TESTS
95
- heirloom_integration_config = Heirloom::Config.new(:environment => 'integration')
96
- config.filter_sensitive_data('<AWSACCESSKEYID>') do
97
- heirloom_integration_config.access_key
98
- end
99
- config.filter_sensitive_data('<AWSSECRETKEY>') do
100
- heirloom_integration_config.secret_key
101
- end
102
- end
103
-
104
- end
105
-
106
36
  RSpec.configure do |config|
107
37
  config.include SpecHelpers
108
- config.include IntegrationHelpers
109
-
110
- # https://www.relishapp.com/vcr/vcr/v/2-4-0/docs/test-frameworks/usage-with-rspec-metadata!
111
- config.treat_symbols_as_metadata_keys_with_true_values = true
112
-
113
- config.filter_run_excluding :integration => true unless ENV['HEIRLOOM_INTEGRATION_BUCKET_PREFIX']
114
38
  end
115
39
 
@@ -2,12 +2,12 @@ require 'spec_helper'
2
2
 
3
3
  describe Heirloom::Uploader::S3 do
4
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,
5
+ @logger_double = double 'logger double', :info => true,
6
+ :warn => true,
7
+ :debug => true
8
+ @config_double = double 'config double', :logger => @logger_double
9
+ @s3 = Heirloom::Uploader::S3.new :config => @config_double,
10
+ :logger => @logger_double,
11
11
  :region => 'us-west-1'
12
12
  end
13
13
 
@@ -19,46 +19,46 @@ describe Heirloom::Uploader::S3 do
19
19
  :key_folder => 'key_folder',
20
20
  :name => 'name',
21
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'
22
+ @s3_double = double 's3 mock'
23
+ @bucket_double = double 'bucket mock'
24
+ @files_double = double 'files mock'
25
+ @file_double = double 'file mock'
26
+ @body_double = double 'body mock'
27
27
  Heirloom::AWS::S3.should_receive(:new).
28
- with(:config => @config_stub,
28
+ with(:config => @config_double,
29
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)
30
+ and_return @s3_double
31
+ @s3_double.should_receive(:get_bucket).
32
+ with('bucket').
33
+ and_return @bucket_double
34
+ @bucket_double.should_receive(:files).and_return(@files_double)
35
+ File.should_receive(:open).with('file').and_return @body_double
36
+ @files_double.should_receive(:create).
37
+ with :key => "key_folder/key_name",
38
+ :body => @body_double,
39
+ :public => true
40
+ @body_double.should_receive(:close)
41
41
  @s3.upload_file @options
42
42
  end
43
43
 
44
44
  it "should add endpoint attributes for the file to simpledb" do
45
- simpledb_mock = mock 'simpledb mock'
45
+ simpledb_double = double 'simpledb mock'
46
46
  options = { :bucket => 'bucket',
47
47
  :id => 'id',
48
48
  :key_name => 'key_name',
49
49
  :name => 'name' }
50
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" } )
51
+ with(:config => @config_double).
52
+ and_return simpledb_double
53
+ simpledb_double.should_receive(:put_attributes).
54
+ with("heirloom_name", "id",
55
+ { "us-west-1-s3-url" => "s3://bucket/name/key_name" } )
56
+ simpledb_double.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_double.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
62
  @s3.add_endpoint_attributes options
63
63
  end
64
64
  end
metadata CHANGED
@@ -1,83 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heirloom
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.1
4
+ version: 0.12.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Weaver
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-04 00:00:00.000000000 Z
11
+ date: 2014-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 2.11.0
33
+ version: 2.14.1
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 2.11.0
40
+ version: 2.14.1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: simplecov
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: vcr
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - '='
60
- - !ruby/object:Gem::Version
61
- version: 2.4.0
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - '='
67
- - !ruby/object:Gem::Version
68
- version: 2.4.0
69
- - !ruby/object:Gem::Dependency
70
- name: watchr
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - '>='
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - '>='
52
+ - - ">="
81
53
  - !ruby/object:Gem::Version
82
54
  version: '0'
83
55
  - !ruby/object:Gem::Dependency
@@ -86,14 +58,14 @@ dependencies:
86
58
  requirements:
87
59
  - - '='
88
60
  - !ruby/object:Gem::Version
89
- version: 1.15.0
61
+ version: 1.21.0
90
62
  type: :runtime
91
63
  prerelease: false
92
64
  version_requirements: !ruby/object:Gem::Requirement
93
65
  requirements:
94
66
  - - '='
95
67
  - !ruby/object:Gem::Version
96
- version: 1.15.0
68
+ version: 1.21.0
97
69
  - !ruby/object:Gem::Dependency
98
70
  name: hashie
99
71
  requirement: !ruby/object:Gem::Requirement
@@ -126,16 +98,16 @@ dependencies:
126
98
  name: xml-simple
127
99
  requirement: !ruby/object:Gem::Requirement
128
100
  requirements:
129
- - - ~>
101
+ - - "~>"
130
102
  - !ruby/object:Gem::Version
131
- version: 1.1.2
103
+ version: 1.1.3
132
104
  type: :runtime
133
105
  prerelease: false
134
106
  version_requirements: !ruby/object:Gem::Requirement
135
107
  requirements:
136
- - - ~>
108
+ - - "~>"
137
109
  - !ruby/object:Gem::Version
138
- version: 1.1.2
110
+ version: 1.1.3
139
111
  description: I help build and manage building tar.gz files and deploying them into
140
112
  the cloud
141
113
  email:
@@ -145,10 +117,10 @@ executables:
145
117
  extensions: []
146
118
  extra_rdoc_files: []
147
119
  files:
148
- - .gitignore
149
- - .ruby-gemset
150
- - .ruby-version
151
- - .travis.yml
120
+ - ".gitignore"
121
+ - ".ruby-gemset"
122
+ - ".ruby-version"
123
+ - ".travis.yml"
152
124
  - CHANGELOG.md
153
125
  - Gemfile
154
126
  - LICENSE
@@ -271,14 +243,11 @@ files:
271
243
  - spec/fixtures/cassettes/Heirloom_AWS_SimpleDB/select/should_yield_when_requested.yml
272
244
  - spec/fixtures/create_test_data.sh
273
245
  - spec/heirloom_spec.rb
274
- - spec/integration/authorize_spec.rb
275
- - spec/integration/cleanup_spec.rb
276
246
  - spec/logger_spec.rb
277
247
  - spec/spec_helper.rb
278
248
  - spec/uploader/s3_spec.rb
279
249
  - spec/utils/email_spec.rb
280
250
  - spec/utils/file_spec.rb
281
- - watchr.rb
282
251
  homepage: ''
283
252
  licenses: []
284
253
  metadata: {}
@@ -288,17 +257,17 @@ require_paths:
288
257
  - lib
289
258
  required_ruby_version: !ruby/object:Gem::Requirement
290
259
  requirements:
291
- - - '>='
260
+ - - ">="
292
261
  - !ruby/object:Gem::Version
293
262
  version: '0'
294
263
  required_rubygems_version: !ruby/object:Gem::Requirement
295
264
  requirements:
296
- - - '>='
265
+ - - ">="
297
266
  - !ruby/object:Gem::Version
298
267
  version: '0'
299
268
  requirements: []
300
269
  rubyforge_project: heirloom
301
- rubygems_version: 2.0.6
270
+ rubygems_version: 2.2.0
302
271
  signing_key:
303
272
  specification_version: 4
304
273
  summary: I help with deploying code into the cloud
@@ -354,8 +323,6 @@ test_files:
354
323
  - spec/fixtures/cassettes/Heirloom_AWS_SimpleDB/select/should_yield_when_requested.yml
355
324
  - spec/fixtures/create_test_data.sh
356
325
  - spec/heirloom_spec.rb
357
- - spec/integration/authorize_spec.rb
358
- - spec/integration/cleanup_spec.rb
359
326
  - spec/logger_spec.rb
360
327
  - spec/spec_helper.rb
361
328
  - spec/uploader/s3_spec.rb