dockly 2.7.2 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe Dockly::Util::Git do
4
+ describe '#repo' do
5
+ it 'returns the repo for the current directory' do
6
+ expect(subject.repo.workdir).to eq(File.expand_path('.') + '/')
7
+ end
8
+ end
9
+
10
+ describe '#sha' do
11
+ it 'returns a shortened sha for the head object' do
12
+ expect(subject.sha).to eq(`git rev-parse --short HEAD`[0..6])
13
+ end
14
+ end
15
+
16
+ describe '#ls_files' do
17
+ it 'returns an Array of the files for the given OID' do
18
+ expect(subject.ls_files(subject.sha).map { |hash| hash[:name] }.sort)
19
+ .to eq(`git ls-files`.split("\n").sort)
20
+ end
21
+ end
22
+
23
+ describe '#archive' do
24
+ let(:io) { StringIO.new }
25
+ let(:prefix) { '/gem/dockly' }
26
+ let(:reader) { Gem::Package::TarReader.new(io.tap(&:rewind)) }
27
+
28
+ it 'archives the current directory into the given IO' do
29
+ subject.archive(subject.sha, prefix, io)
30
+ reader.each do |entry|
31
+ expect(entry.full_name).to start_with(prefix)
32
+ orig = entry.full_name.gsub(/\A#{prefix}\//, '')
33
+ expect(File.exist?(orig)).to be_true
34
+ expect(entry.read).to eq(File.read(orig)) if orig.end_with?('.rb')
35
+ end
36
+ end
37
+ end
38
+ end
@@ -5,10 +5,6 @@ require 'rspec'
5
5
  require 'dockly'
6
6
  require 'pry'
7
7
 
8
- Fog.mock!
9
-
10
- Dockly::AWS.aws_access_key_id = 'MOCK_KEY'
11
- Dockly::AWS.aws_secret_access_key = 'MOCK_SECRET'
12
8
  Dockly::Util::Logger.disable! unless ENV['ENABLE_LOGGER'] == 'true'
13
9
 
14
10
  RSpec.configure do |config|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dockly
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.2
4
+ version: 3.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-07-03 00:00:00.000000000 Z
12
+ date: 2015-07-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: clamp
@@ -76,13 +76,13 @@ dependencies:
76
76
  - !ruby/object:Gem::Version
77
77
  version: '0'
78
78
  - !ruby/object:Gem::Dependency
79
- name: fog
79
+ name: aws-sdk
80
80
  requirement: !ruby/object:Gem::Requirement
81
81
  none: false
82
82
  requirements:
83
83
  - - ~>
84
84
  - !ruby/object:Gem::Version
85
- version: '1.21'
85
+ version: '2.0'
86
86
  type: :runtime
87
87
  prerelease: false
88
88
  version_requirements: !ruby/object:Gem::Requirement
@@ -90,7 +90,7 @@ dependencies:
90
90
  requirements:
91
91
  - - ~>
92
92
  - !ruby/object:Gem::Version
93
- version: '1.21'
93
+ version: '2.0'
94
94
  - !ruby/object:Gem::Dependency
95
95
  name: foreman
96
96
  requirement: !ruby/object:Gem::Requirement
@@ -123,22 +123,6 @@ dependencies:
123
123
  - - ~>
124
124
  - !ruby/object:Gem::Version
125
125
  version: 1.2.0
126
- - !ruby/object:Gem::Dependency
127
- name: grit
128
- requirement: !ruby/object:Gem::Requirement
129
- none: false
130
- requirements:
131
- - - ! '>='
132
- - !ruby/object:Gem::Version
133
- version: '0'
134
- type: :runtime
135
- prerelease: false
136
- version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
- requirements:
139
- - - ! '>='
140
- - !ruby/object:Gem::Version
141
- version: '0'
142
126
  - !ruby/object:Gem::Dependency
143
127
  name: rugged
144
128
  requirement: !ruby/object:Gem::Requirement
@@ -274,8 +258,6 @@ files:
274
258
  - dockly.gemspec
275
259
  - img/dockly.png
276
260
  - lib/dockly.rb
277
- - lib/dockly/aws.rb
278
- - lib/dockly/aws/s3_writer.rb
279
261
  - lib/dockly/bash_builder.rb
280
262
  - lib/dockly/build_cache.rb
281
263
  - lib/dockly/build_cache/base.rb
@@ -289,6 +271,7 @@ files:
289
271
  - lib/dockly/history.rb
290
272
  - lib/dockly/rake_task.rb
291
273
  - lib/dockly/rpm.rb
274
+ - lib/dockly/s3_writer.rb
292
275
  - lib/dockly/tar_diff.rb
293
276
  - lib/dockly/util/git.rb
294
277
  - lib/dockly/util/tar.rb
@@ -305,8 +288,6 @@ files:
305
288
  - snippets/registry_import.erb
306
289
  - snippets/s3_diff_docker_import.erb
307
290
  - snippets/s3_docker_import.erb
308
- - spec/dockly/aws/s3_writer_spec.rb
309
- - spec/dockly/aws_spec.rb
310
291
  - spec/dockly/bash_builder_spec.rb
311
292
  - spec/dockly/build_cache/base_spec.rb
312
293
  - spec/dockly/build_cache/docker_spec.rb
@@ -318,7 +299,9 @@ files:
318
299
  - spec/dockly/foreman_spec.rb
319
300
  - spec/dockly/history_spec.rb
320
301
  - spec/dockly/rpm_spec.rb
302
+ - spec/dockly/s3_writer_spec.rb
321
303
  - spec/dockly/tar_diff_spec.rb
304
+ - spec/dockly/util/git_spec.rb
322
305
  - spec/dockly_spec.rb
323
306
  - spec/fixtures/Procfile
324
307
  - spec/fixtures/Rakefile
@@ -355,8 +338,6 @@ signing_key:
355
338
  specification_version: 3
356
339
  summary: Packaging made easy
357
340
  test_files:
358
- - spec/dockly/aws/s3_writer_spec.rb
359
- - spec/dockly/aws_spec.rb
360
341
  - spec/dockly/bash_builder_spec.rb
361
342
  - spec/dockly/build_cache/base_spec.rb
362
343
  - spec/dockly/build_cache/docker_spec.rb
@@ -368,7 +349,9 @@ test_files:
368
349
  - spec/dockly/foreman_spec.rb
369
350
  - spec/dockly/history_spec.rb
370
351
  - spec/dockly/rpm_spec.rb
352
+ - spec/dockly/s3_writer_spec.rb
371
353
  - spec/dockly/tar_diff_spec.rb
354
+ - spec/dockly/util/git_spec.rb
372
355
  - spec/dockly_spec.rb
373
356
  - spec/fixtures/Procfile
374
357
  - spec/fixtures/Rakefile
@@ -1,62 +0,0 @@
1
- require 'fog/aws'
2
-
3
- # This module holds the connections for all AWS services used by the gem.
4
- module Dockly::AWS
5
- extend self
6
-
7
- autoload :S3Writer, 'dockly/aws/s3_writer'
8
-
9
- def service(name, klass)
10
- define_method name do
11
- if val = instance_variable_get(:"@#{name}")
12
- val
13
- else
14
- instance = klass.new(creds)
15
- instance_variable_set(:"@#{name}", instance)
16
- end
17
- end
18
- services << name
19
- end
20
-
21
- def services
22
- @services ||= []
23
- end
24
-
25
- def env_attr(*names)
26
- names.each do |name|
27
- define_method name do
28
- instance_variable_get(:"@#{name}") || ENV[name.to_s.upcase]
29
- end
30
-
31
- define_method :"#{name}=" do |val|
32
- reset_cache!
33
- instance_variable_set(:"@#{name}", val)
34
- end
35
-
36
- env_attrs << name
37
- end
38
- end
39
-
40
- def env_attrs
41
- @env_attrs ||= []
42
- end
43
-
44
- def creds
45
- attrs = Hash[env_attrs.map { |attr| [attr, public_send(attr)] }].reject { |k, v| v.nil? }
46
- if attrs.empty?
47
- if ENV['FOG_CREDENTIAL']
48
- attrs = {} # let Fog use the env var
49
- else
50
- attrs = { :use_iam_profile => true }
51
- end
52
- end
53
- attrs
54
- end
55
-
56
- def reset_cache!
57
- services.each { |service| instance_variable_set(:"@#{service}", nil) }
58
- end
59
-
60
- service :s3, Fog::Storage::AWS
61
- env_attr :aws_access_key_id, :aws_secret_access_key
62
- end
@@ -1,59 +0,0 @@
1
- module Dockly
2
- module AWS
3
- class S3Writer
4
- include Dockly::Util::Logger::Mixin
5
-
6
- logger_prefix '[dockly s3writer]'
7
-
8
- attr_accessor :buffer
9
- attr_reader :connection, :s3_bucket, :s3_object, :upload_id
10
-
11
- def initialize(connection, s3_bucket, s3_object)
12
- @connection = connection
13
- @s3_bucket = s3_bucket
14
- @s3_object = s3_object
15
- @parts = []
16
- @closed = false
17
- @buffer = ""
18
-
19
- init_upload_res = connection.initiate_multipart_upload(s3_bucket, s3_object)
20
- @upload_id = init_upload_res.body['UploadId']
21
- end
22
-
23
- def upload_buffer
24
- res = connection.upload_part(s3_bucket, s3_object, upload_id, @parts.size + 1, buffer)
25
- @parts << res.headers["ETag"]
26
- debug "Writing a chunk"
27
- @buffer = ""
28
- end
29
-
30
- def write(chunk)
31
- self.buffer << chunk
32
-
33
- upload_buffer if buffer.bytesize > 5242880
34
-
35
- chunk.length
36
- end
37
-
38
- def close
39
- return if @closed
40
- upload_buffer unless buffer.empty?
41
-
42
- res = connection.complete_multipart_upload(s3_bucket, s3_object, upload_id, @parts)
43
- if res.body['Code'] || res.body['Message']
44
- raise "Failed to upload to S3: #{res.body['Code']}: #{res.body['Message']}"
45
- end
46
- @closed = true
47
- end
48
-
49
- def abort
50
- connection.abort_multipart_upload(s3_bucket, s3_object, upload_id)
51
- end
52
-
53
- def abort_unless_closed
54
- abort unless @closed
55
- @closed = true
56
- end
57
- end
58
- end
59
- end
@@ -1,154 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Dockly::AWS::S3Writer do
4
- let(:connection) { double(:connection) }
5
- let(:bucket) { 'test_bucket' }
6
- let(:object) { 'object_name.tar' }
7
- let(:initiate_response) { double(:initiate_response) }
8
- let(:upload_id) { 'test_id' }
9
-
10
- subject { described_class.new(connection, bucket, object) }
11
-
12
- before do
13
- connection.should_receive(:initiate_multipart_upload) { initiate_response }
14
- initiate_response.stub(:body) { { 'UploadId' => upload_id } }
15
- end
16
-
17
- describe ".new" do
18
-
19
- it "sets the connection, s3_bucket, s3_object, and upload_id" do
20
- expect(subject.connection).to eq(connection)
21
- expect(subject.s3_bucket).to eq(bucket)
22
- expect(subject.s3_object).to eq(object)
23
- expect(subject.upload_id).to eq(upload_id)
24
- end
25
- end
26
-
27
- describe "#upload_buffer" do
28
- let(:message) { "message" }
29
- let(:upload_response) { double(:upload_response) }
30
- let(:etag) { "test" }
31
-
32
- before do
33
- connection.should_receive(:upload_part).with(bucket, object, upload_id, 1, message) do
34
- upload_response
35
- end
36
- upload_response.stub(:headers) { { "ETag" => etag } }
37
- subject.instance_variable_set(:"@buffer", message)
38
- end
39
-
40
- it "connects to S3" do
41
- subject.upload_buffer
42
- expect(subject.instance_variable_get(:"@parts")).to include(etag)
43
- end
44
- end
45
-
46
- describe "#write" do
47
- let(:message) { "a" * chunk_length }
48
-
49
- context "with a buffer of less than 5 MB" do
50
- let(:chunk_length) { 100 }
51
-
52
- before do
53
- subject.should_not_receive(:upload_buffer)
54
- end
55
-
56
- it "adds it to the buffer and returns the chunk length" do
57
- expect(subject.write(message)).to eq(chunk_length)
58
- expect(subject.instance_variable_get(:"@buffer")).to eq(message)
59
- end
60
- end
61
-
62
- context "with a buffer of greater than 5 MB" do
63
- let(:chunk_length) { 1 + 5 * 1024 * 1024 }
64
-
65
- before do
66
- subject.should_receive(:upload_buffer)
67
- end
68
-
69
- it "adds it to the buffer, writes to S3 and returns the chunk length" do
70
- expect(subject.write(message)).to eq(chunk_length)
71
- end
72
- end
73
- end
74
-
75
- describe "#close" do
76
- let(:complete_response) { double(:complete_response) }
77
-
78
- before do
79
- connection.should_receive(:complete_multipart_upload).with(bucket, object, upload_id, []) do
80
- complete_response
81
- end
82
- end
83
-
84
- context "when it passes" do
85
- before do
86
- complete_response.stub(:body) { {} }
87
- end
88
-
89
- context "when the buffer is not empty" do
90
- before do
91
- subject.instance_variable_set(:"@buffer", "text")
92
- subject.should_receive(:upload_buffer)
93
- end
94
-
95
- it "uploads the rest of the buffer and closes the connection" do
96
- expect(subject.close).to be_true
97
- end
98
- end
99
-
100
- context "when the buffer is empty" do
101
- before do
102
- subject.should_not_receive(:upload_buffer)
103
- end
104
-
105
- it "closes the connection" do
106
- expect(subject.close).to be_true
107
- end
108
- end
109
- end
110
-
111
- context "when it fails" do
112
- before do
113
- complete_response.stub(:body) { { 'Code' => 20, 'Message' => 'Msggg' } }
114
- end
115
-
116
- it "raises an error" do
117
- expect { subject.close }.to raise_error("Failed to upload to S3: 20: Msggg")
118
- end
119
- end
120
- end
121
-
122
- describe "#abort" do
123
- before do
124
- connection.should_receive(:abort_multipart_upload).with(bucket, object, upload_id)
125
- end
126
-
127
- it "aborts the upload" do
128
- subject.abort
129
- end
130
- end
131
-
132
- describe "#abort_unless_closed" do
133
- context "when the upload is closed" do
134
- before do
135
- subject.should_not_receive(:abort)
136
- subject.instance_variable_set(:"@closed", true)
137
- end
138
-
139
- it "does not abort" do
140
- subject.abort_unless_closed
141
- end
142
- end
143
-
144
- context "when the upload is open" do
145
- before do
146
- subject.should_receive(:abort)
147
- end
148
-
149
- it "aborts the upload" do
150
- subject.abort_unless_closed
151
- end
152
- end
153
- end
154
- end
@@ -1,17 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Dockly::AWS do
4
- subject { Dockly::AWS }
5
-
6
- describe '#reset_cache!' do
7
- before do
8
- subject.instance_variable_set(:@s3, double)
9
- end
10
-
11
- it 'sets @s3 to nil' do
12
- expect { subject.reset_cache! }
13
- .to change { subject.instance_variable_get(:@s3) }
14
- .to(nil)
15
- end
16
- end
17
- end