construi 0.37.0 → 0.38.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.
@@ -11,17 +11,18 @@ release_commit=`git rev-parse HEAD`
11
11
 
12
12
  echo "Release commit ${release_commit}..."
13
13
 
14
+ bundle install --path vendor/bundle
15
+
14
16
  echo "Pushing to master..."
15
17
  git push -f origin `git rev-parse HEAD`:master
16
18
 
17
19
  echo "Push to master done."
18
20
 
19
21
  echo "Updating development version..."
20
- bundle install --path vendor/bundle
21
22
  bundle exec gem bump --version minor
22
23
 
23
24
  echo "Pushing to develop..."
24
- git push origin `get rev-parse HEAD`:develop
25
+ git push origin `git rev-parse HEAD`:develop
25
26
  echo "Push to develop done."
26
27
 
27
28
  echo "Release done."
@@ -14,7 +14,7 @@ module Construi
14
14
  end
15
15
 
16
16
  def delete
17
- @container.delete
17
+ @container.delete force: true, v: true
18
18
  end
19
19
 
20
20
  def attach_stdout
@@ -4,7 +4,7 @@ require 'colorize'
4
4
  require 'docker'
5
5
 
6
6
  module Construi
7
-
7
+ # A Docker Image
8
8
  class Image
9
9
  private_class_method :new
10
10
 
@@ -28,7 +28,7 @@ module Construi
28
28
  @image.info['RepoTags'] != '<none>:<none>'
29
29
  end
30
30
 
31
- def insert_local(file)
31
+ def insert_local(file, options = {})
32
32
  puts "\nCopying #{file.host} to #{file.container}...".green
33
33
 
34
34
  img = IntermediateImage.seed(self)
@@ -38,22 +38,25 @@ module Construi
38
38
  .insert_local 'localPath' => file.host, 'outputPath' => file.container
39
39
  end
40
40
 
41
- img.map { |i| i.chmod file.container, file.permissions } if file.permissions
41
+ img.map { |i| i.chmod file.container, file.permissions, options } if file.permissions
42
42
 
43
- img.run "ls -l #{file.container}"
43
+ img.run "ls -l #{file.container}", options
44
44
 
45
45
  img.image
46
46
  end
47
47
 
48
- def insert_locals(files)
49
- IntermediateImage.seed(self).reduce(files) { |i, f| i.insert_local f }.image
48
+ def insert_locals(files, options = {})
49
+ IntermediateImage
50
+ .seed(self)
51
+ .reduce(files) { |a, e| a.insert_local e, options }
52
+ .image
50
53
  end
51
54
 
52
- def chmod(file, permissions)
53
- chmod = "chmod -R #{permissions} #{file}"
55
+ def chmod(file, permissions, options = {})
56
+ chmod = "chmod -R #{permissions} #{file}"
54
57
 
55
- puts " > #{chmod}"
56
- run chmod
58
+ puts " > #{chmod}"
59
+ run chmod, options
57
60
  end
58
61
 
59
62
  def run(cmd, options = {})
@@ -61,16 +64,16 @@ module Construi
61
64
  end
62
65
 
63
66
  def ==(other)
64
- other.is_a? Image and id == other.id
67
+ other.is_a?(Image) && id == other.id
65
68
  end
66
69
 
67
70
  def self.from(config)
68
71
  image = create(config.image) unless config.image.nil?
69
72
  image = build(config.build) unless config.build.nil?
70
73
 
71
- raise Error, "Invalid image configuration: #{config}" unless image
74
+ fail Error, "Invalid image configuration: #{config}" unless image
72
75
 
73
- image.insert_locals config.files
76
+ image.insert_locals config.files, privileged: config.privileged?
74
77
  end
75
78
 
76
79
  def self.create(image)
@@ -82,7 +85,7 @@ module Construi
82
85
  id = status['id']
83
86
  progress = status['progressDetail']
84
87
 
85
- if progress.nil? or progress.empty?
88
+ if progress.nil? || progress.empty?
86
89
  print "#{id}: " unless id.nil?
87
90
  puts "#{status['status']}"
88
91
  end
@@ -92,7 +95,7 @@ module Construi
92
95
  def self.build(build)
93
96
  puts
94
97
  puts "Building image: '#{build}'...".green
95
- wrap Docker::Image.build_from_dir(build, :rm => 0) { |s|
98
+ wrap Docker::Image.build_from_dir(build, rm: 0) { |s|
96
99
  puts JSON.parse(s)['stream']
97
100
  }
98
101
  end
@@ -105,6 +108,9 @@ module Construi
105
108
  end
106
109
  end
107
110
 
111
+ # An image that represents an intermediatae state of an image.
112
+ # Useful for performing operations where each opertion is performed on the
113
+ # result of the last.
108
114
  class IntermediateImage
109
115
  private_class_method :new
110
116
 
@@ -115,8 +121,8 @@ module Construi
115
121
  @first = true
116
122
  end
117
123
 
118
- def run(cmd, env = [])
119
- map { |i| i.run cmd, env: env }
124
+ def run(cmd, options = {})
125
+ map { |i| i.run cmd, options }
120
126
  end
121
127
 
122
128
  def map
@@ -1,3 +1,3 @@
1
1
  module Construi
2
- VERSION = "0.37.0"
2
+ VERSION = "0.38.0"
3
3
  end
@@ -5,11 +5,15 @@ require 'securerandom'
5
5
 
6
6
  RSpec.describe Construi::Image do
7
7
  let(:id) { SecureRandom.hex(16) }
8
- let(:docker_image) { instance_double(Docker::Image, :id => id).as_null_object }
8
+
9
+ let(:docker_image) do
10
+ instance_double(Docker::Image, id: id).as_null_object
11
+ end
12
+
9
13
  let!(:docker_image_class) { class_spy(Docker::Image).as_stubbed_const }
10
14
  let!(:container_class) { class_spy(Construi::Container).as_stubbed_const }
11
15
 
12
- let(:default_options) { { env: [] } }
16
+ let(:default_options) { {} }
13
17
 
14
18
  subject(:image) { Construi::Image.wrap(docker_image) }
15
19
 
@@ -24,7 +28,9 @@ RSpec.describe Construi::Image do
24
28
  end
25
29
 
26
30
  describe '#tagged?' do
27
- before { allow(docker_image).to receive(:info).and_return({ 'RepoTags' => tag }) }
31
+ before do
32
+ allow(docker_image).to receive(:info).and_return('RepoTags' => tag)
33
+ end
28
34
 
29
35
  subject { image.tagged? }
30
36
 
@@ -53,9 +59,15 @@ RSpec.describe Construi::Image do
53
59
  let(:host) { '/path/host' }
54
60
  let(:container) { '/path/on/container' }
55
61
  let(:permissions) { nil }
56
- let(:file) { Construi::Config::Files::File.new host, container, permissions }
57
62
 
58
- before { allow(docker_image).to receive(:info).and_return({ 'RepoTags' => '<none>:<none>' }) }
63
+ let(:file) do
64
+ Construi::Config::Files::File.new host, container, permissions
65
+ end
66
+
67
+ before do
68
+ allow(docker_image).to receive(:info).and_return('RepoTags' => '<none>:<none>')
69
+ end
70
+
59
71
  before { allow(docker_image).to receive(:insert_local).and_return(docker_image) }
60
72
  before { allow(container_class).to receive(:run).and_return image }
61
73
 
@@ -92,12 +104,17 @@ RSpec.describe Construi::Image do
92
104
  end
93
105
 
94
106
  describe '.from' do
95
- Config = Struct.new :image, :build, :files
107
+ let(:config) { instance_double(Construi::Config::Environment).as_null_object }
96
108
 
97
109
  let(:image) { nil }
98
110
  let(:build) { nil }
99
111
  let(:files) { [] }
100
- let(:config) { Config.new image, build, files }
112
+ let(:privileged?) { false }
113
+
114
+ before { allow(config).to receive(:image).and_return image }
115
+ before { allow(config).to receive(:build).and_return build }
116
+ before { allow(config).to receive(:files).and_return files }
117
+ before { allow(config).to receive(:privileged?).and_return privileged? }
101
118
 
102
119
  [:create, :build_from_dir].each do |m|
103
120
  before { allow(docker_image_class).to receive(m).and_return docker_image }
@@ -229,25 +246,22 @@ RSpec.describe Construi::IntermediateImage do
229
246
 
230
247
  describe '#run' do
231
248
  let(:cmd) { 'cmd1' }
232
- let(:env) { ['VAR1=VALUE1'] }
249
+ let(:options) { { env: ['VAR1=VALUE1']} }
233
250
 
234
251
  context "single run" do
235
- subject! { intermediate_image.run(cmd, env) }
252
+ subject! { intermediate_image.run(cmd, options) }
236
253
 
237
- it { expect(image).to have_received(:run).with(cmd, env: env) }
254
+ it { expect(image).to have_received(:run).with(cmd, options) }
238
255
  it { expect(image).to_not have_received(:delete) }
239
256
  it { expect(second_image).to_not have_received(:delete) }
240
257
  end
241
258
 
242
259
  context "double run" do
243
- subject! { intermediate_image.run(cmd, env).run(cmd, env) }
260
+ subject! { intermediate_image.run(cmd, options).run(cmd, options) }
244
261
 
245
- it { expect(second_image).to have_received(:run).with(cmd, env: env) }
262
+ it { expect(second_image).to have_received(:run).with(cmd, options) }
246
263
  it { expect(second_image).to have_received(:delete) }
247
264
  end
248
265
  end
249
-
250
-
251
-
252
266
  end
253
267
 
metadata CHANGED
@@ -1,18 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: construi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.37.0
4
+ version: 0.38.0
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Levi Stephen
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2015-07-03 00:00:00.000000000 Z
12
+ date: 2015-07-16 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: docker-api
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
19
  - - '='
18
20
  - !ruby/object:Gem::Version
@@ -20,6 +22,7 @@ dependencies:
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
27
  - - '='
25
28
  - !ruby/object:Gem::Version
@@ -27,6 +30,7 @@ dependencies:
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: colorize
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
35
  - - '='
32
36
  - !ruby/object:Gem::Version
@@ -34,6 +38,7 @@ dependencies:
34
38
  type: :runtime
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
43
  - - '='
39
44
  - !ruby/object:Gem::Version
@@ -41,155 +46,177 @@ dependencies:
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: bundler
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
- - - "~>"
51
+ - - ~>
46
52
  - !ruby/object:Gem::Version
47
53
  version: '1.9'
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
- - - "~>"
59
+ - - ~>
53
60
  - !ruby/object:Gem::Version
54
61
  version: '1.9'
55
62
  - !ruby/object:Gem::Dependency
56
63
  name: execjs
57
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
58
66
  requirements:
59
- - - "~>"
67
+ - - ~>
60
68
  - !ruby/object:Gem::Version
61
69
  version: '2.5'
62
70
  type: :development
63
71
  prerelease: false
64
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
65
74
  requirements:
66
- - - "~>"
75
+ - - ~>
67
76
  - !ruby/object:Gem::Version
68
77
  version: '2.5'
69
78
  - !ruby/object:Gem::Dependency
70
79
  name: gem-release
71
80
  requirement: !ruby/object:Gem::Requirement
81
+ none: false
72
82
  requirements:
73
- - - "~>"
83
+ - - ~>
74
84
  - !ruby/object:Gem::Version
75
85
  version: '0.7'
76
86
  type: :development
77
87
  prerelease: false
78
88
  version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
79
90
  requirements:
80
- - - "~>"
91
+ - - ~>
81
92
  - !ruby/object:Gem::Version
82
93
  version: '0.7'
83
94
  - !ruby/object:Gem::Dependency
84
95
  name: jekyll
85
96
  requirement: !ruby/object:Gem::Requirement
97
+ none: false
86
98
  requirements:
87
- - - "~>"
99
+ - - ~>
88
100
  - !ruby/object:Gem::Version
89
101
  version: '2.5'
90
102
  type: :development
91
103
  prerelease: false
92
104
  version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
93
106
  requirements:
94
- - - "~>"
107
+ - - ~>
95
108
  - !ruby/object:Gem::Version
96
109
  version: '2.5'
97
110
  - !ruby/object:Gem::Dependency
98
111
  name: rake
99
112
  requirement: !ruby/object:Gem::Requirement
113
+ none: false
100
114
  requirements:
101
- - - "~>"
115
+ - - ~>
102
116
  - !ruby/object:Gem::Version
103
117
  version: '10.4'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
107
122
  requirements:
108
- - - "~>"
123
+ - - ~>
109
124
  - !ruby/object:Gem::Version
110
125
  version: '10.4'
111
126
  - !ruby/object:Gem::Dependency
112
127
  name: redcarpet
113
128
  requirement: !ruby/object:Gem::Requirement
129
+ none: false
114
130
  requirements:
115
- - - "~>"
131
+ - - ~>
116
132
  - !ruby/object:Gem::Version
117
133
  version: '3.2'
118
134
  type: :development
119
135
  prerelease: false
120
136
  version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
121
138
  requirements:
122
- - - "~>"
139
+ - - ~>
123
140
  - !ruby/object:Gem::Version
124
141
  version: '3.2'
125
142
  - !ruby/object:Gem::Dependency
126
143
  name: rspec
127
144
  requirement: !ruby/object:Gem::Requirement
145
+ none: false
128
146
  requirements:
129
- - - "~>"
147
+ - - ~>
130
148
  - !ruby/object:Gem::Version
131
149
  version: '3.2'
132
150
  type: :development
133
151
  prerelease: false
134
152
  version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
135
154
  requirements:
136
- - - "~>"
155
+ - - ~>
137
156
  - !ruby/object:Gem::Version
138
157
  version: '3.2'
139
158
  - !ruby/object:Gem::Dependency
140
159
  name: rubocop
141
160
  requirement: !ruby/object:Gem::Requirement
161
+ none: false
142
162
  requirements:
143
- - - "~>"
163
+ - - ~>
144
164
  - !ruby/object:Gem::Version
145
165
  version: '0.31'
146
166
  type: :development
147
167
  prerelease: false
148
168
  version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
149
170
  requirements:
150
- - - "~>"
171
+ - - ~>
151
172
  - !ruby/object:Gem::Version
152
173
  version: '0.31'
153
174
  - !ruby/object:Gem::Dependency
154
175
  name: simplecov
155
176
  requirement: !ruby/object:Gem::Requirement
177
+ none: false
156
178
  requirements:
157
- - - "~>"
179
+ - - ~>
158
180
  - !ruby/object:Gem::Version
159
181
  version: '0.10'
160
182
  type: :development
161
183
  prerelease: false
162
184
  version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
163
186
  requirements:
164
- - - "~>"
187
+ - - ~>
165
188
  - !ruby/object:Gem::Version
166
189
  version: '0.10'
167
190
  - !ruby/object:Gem::Dependency
168
191
  name: therubyracer
169
192
  requirement: !ruby/object:Gem::Requirement
193
+ none: false
170
194
  requirements:
171
- - - "~>"
195
+ - - ~>
172
196
  - !ruby/object:Gem::Version
173
197
  version: '0.12'
174
198
  type: :development
175
199
  prerelease: false
176
200
  version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
177
202
  requirements:
178
- - - "~>"
203
+ - - ~>
179
204
  - !ruby/object:Gem::Version
180
205
  version: '0.12'
181
206
  - !ruby/object:Gem::Dependency
182
207
  name: yard
183
208
  requirement: !ruby/object:Gem::Requirement
209
+ none: false
184
210
  requirements:
185
- - - "~>"
211
+ - - ~>
186
212
  - !ruby/object:Gem::Version
187
213
  version: '0.8'
188
214
  type: :development
189
215
  prerelease: false
190
216
  version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
191
218
  requirements:
192
- - - "~>"
219
+ - - ~>
193
220
  - !ruby/object:Gem::Version
194
221
  version: '0.8'
195
222
  description: Build tool using Docker to specify build environment
@@ -200,8 +227,8 @@ executables:
200
227
  extensions: []
201
228
  extra_rdoc_files: []
202
229
  files:
203
- - ".gitignore"
204
- - ".rspec"
230
+ - .gitignore
231
+ - .rspec
205
232
  - Gemfile
206
233
  - LICENSE.txt
207
234
  - README.md
@@ -236,26 +263,30 @@ files:
236
263
  homepage: https://github.com/lstephen/construi
237
264
  licenses:
238
265
  - MIT
239
- metadata: {}
240
266
  post_install_message:
241
267
  rdoc_options: []
242
268
  require_paths:
243
269
  - lib
244
270
  required_ruby_version: !ruby/object:Gem::Requirement
271
+ none: false
245
272
  requirements:
246
- - - ">="
273
+ - - ! '>='
247
274
  - !ruby/object:Gem::Version
248
275
  version: '1.9'
249
276
  required_rubygems_version: !ruby/object:Gem::Requirement
277
+ none: false
250
278
  requirements:
251
- - - ">="
279
+ - - ! '>='
252
280
  - !ruby/object:Gem::Version
253
281
  version: '0'
282
+ segments:
283
+ - 0
284
+ hash: -3908895756660741766
254
285
  requirements: []
255
286
  rubyforge_project:
256
- rubygems_version: 2.2.2
287
+ rubygems_version: 1.8.23.2
257
288
  signing_key:
258
- specification_version: 4
289
+ specification_version: 3
259
290
  summary: Build tool using Docker to specify build environment
260
291
  test_files:
261
292
  - spec/lib/construi/config_spec.rb
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 94c464f6d921f079a8cb7c7c89ca5937ead50759
4
- data.tar.gz: e18328c8283dc1c6df7572c951fcd756f640a15d
5
- SHA512:
6
- metadata.gz: 4b773069990d7e2465736d372f91a6d363aa3bb93cea7a0381a2ac06f48f4ef074a1aaa0547f927f8ece9a1e9ae06958126a8a09856128d1ed22862f782de4a6
7
- data.tar.gz: 5a7e38bce29e2cd0abc02bee3c2695dbe029357b088431c64a0ab0599832c15f183c8285772fbbbf982e85f539de772c82d2fcce142828666c8c2730e7037f0e