centurion 1.1.0 → 1.1.1
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.
- data/lib/centurion/deploy.rb +10 -15
- data/lib/centurion/deploy_dsl.rb +1 -1
- data/lib/centurion/docker_via_api.rb +2 -2
- data/lib/centurion/version.rb +1 -1
- data/lib/tasks/deploy.rake +7 -8
- data/spec/deploy_dsl_spec.rb +6 -4
- data/spec/deploy_spec.rb +12 -23
- data/spec/docker_via_api_spec.rb +7 -0
- metadata +42 -24
- checksums.yaml +0 -7
data/lib/centurion/deploy.rb
CHANGED
@@ -5,14 +5,14 @@ module Centurion; end
|
|
5
5
|
module Centurion::Deploy
|
6
6
|
FAILED_CONTAINER_VALIDATION = 100
|
7
7
|
|
8
|
-
def stop_containers(target_server, port_bindings)
|
8
|
+
def stop_containers(target_server, port_bindings, timeout = 30)
|
9
9
|
public_port = public_port_for(port_bindings)
|
10
10
|
old_containers = target_server.find_containers_by_public_port(public_port)
|
11
11
|
info "Stopping container(s): #{old_containers.inspect}"
|
12
12
|
|
13
13
|
old_containers.each do |old_container|
|
14
14
|
info "Stopping old container #{old_container['Id'][0..7]} (#{old_container['Names'].join(',')})"
|
15
|
-
target_server.stop_container(old_container['Id'])
|
15
|
+
target_server.stop_container(old_container['Id'], timeout)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
@@ -67,7 +67,7 @@ module Centurion::Deploy
|
|
67
67
|
return false unless response
|
68
68
|
return true if response.status >= 200 && response.status < 300
|
69
69
|
|
70
|
-
warn "Got HTTP status: #{response.status}"
|
70
|
+
warn "Got HTTP status: #{response.status}"
|
71
71
|
false
|
72
72
|
end
|
73
73
|
|
@@ -119,39 +119,34 @@ module Centurion::Deploy
|
|
119
119
|
container_config
|
120
120
|
end
|
121
121
|
|
122
|
-
def start_new_container(target_server, image_id, port_bindings, volumes, env_vars=nil, command=nil
|
122
|
+
def start_new_container(target_server, image_id, port_bindings, volumes, env_vars=nil, command=nil)
|
123
123
|
container_config = container_config_for(target_server, image_id, port_bindings, env_vars, volumes, command)
|
124
|
-
start_container_with_config(target_server, volumes, port_bindings, container_config
|
124
|
+
start_container_with_config(target_server, volumes, port_bindings, container_config)
|
125
125
|
end
|
126
126
|
|
127
|
-
def launch_console(target_server, image_id, port_bindings, volumes, env_vars=nil
|
127
|
+
def launch_console(target_server, image_id, port_bindings, volumes, env_vars=nil)
|
128
128
|
container_config = container_config_for(target_server, image_id, port_bindings, env_vars, volumes, ['/bin/bash']).merge(
|
129
129
|
'AttachStdin' => true,
|
130
130
|
'Tty' => true,
|
131
131
|
'OpenStdin' => true,
|
132
132
|
)
|
133
133
|
|
134
|
-
container = start_container_with_config(target_server, volumes, port_bindings, container_config
|
134
|
+
container = start_container_with_config(target_server, volumes, port_bindings, container_config)
|
135
135
|
|
136
136
|
target_server.attach(container['Id'])
|
137
137
|
end
|
138
138
|
|
139
139
|
private
|
140
|
-
|
141
|
-
def start_container_with_config(target_server, volumes, port_bindings, container_config
|
140
|
+
|
141
|
+
def start_container_with_config(target_server, volumes, port_bindings, container_config)
|
142
142
|
info "Creating new container for #{container_config['Image'][0..7]}"
|
143
143
|
new_container = target_server.create_container(container_config)
|
144
144
|
|
145
145
|
host_config = {}
|
146
|
-
|
147
146
|
# Map some host volumes if needed
|
148
147
|
host_config['Binds'] = volumes if volumes && !volumes.empty?
|
149
|
-
|
150
148
|
# Bind the ports
|
151
|
-
host_config['PortBindings'] = port_bindings
|
152
|
-
|
153
|
-
# Assign cidfile
|
154
|
-
host_config['ContainerIDFile'] = cidfile if cidfile
|
149
|
+
host_config['PortBindings'] = port_bindings
|
155
150
|
|
156
151
|
info "Starting new container #{new_container['Id'][0..7]}"
|
157
152
|
target_server.start_container(new_container['Id'], host_config)
|
data/lib/centurion/deploy_dsl.rb
CHANGED
@@ -51,8 +51,8 @@ class Centurion::DockerViaApi
|
|
51
51
|
true
|
52
52
|
end
|
53
53
|
|
54
|
-
def stop_container(container_id)
|
55
|
-
path = "/v1.7/containers/#{container_id}/stop?t
|
54
|
+
def stop_container(container_id, timeout = 30)
|
55
|
+
path = "/v1.7/containers/#{container_id}/stop?t=#{timeout}"
|
56
56
|
response = Excon.post(
|
57
57
|
@base_uri + path,
|
58
58
|
)
|
data/lib/centurion/version.rb
CHANGED
data/lib/tasks/deploy.rake
CHANGED
@@ -37,7 +37,9 @@ namespace :deploy do
|
|
37
37
|
# - remote: list
|
38
38
|
# - remote: stop
|
39
39
|
task :stop do
|
40
|
-
on_each_docker_host
|
40
|
+
on_each_docker_host do |server|
|
41
|
+
stop_containers(server, fetch(:port_bindings), fetch(:stop_timeout, 30))
|
42
|
+
end
|
41
43
|
end
|
42
44
|
|
43
45
|
# start
|
@@ -51,8 +53,7 @@ namespace :deploy do
|
|
51
53
|
fetch(:image_id),
|
52
54
|
fetch(:port_bindings),
|
53
55
|
fetch(:binds),
|
54
|
-
fetch(:env_vars)
|
55
|
-
fetch(:cidfile, '/etc/cidfile')
|
56
|
+
fetch(:env_vars)
|
56
57
|
)
|
57
58
|
end
|
58
59
|
end
|
@@ -64,23 +65,21 @@ namespace :deploy do
|
|
64
65
|
fetch(:image_id),
|
65
66
|
fetch(:port_bindings),
|
66
67
|
fetch(:binds),
|
67
|
-
fetch(:env_vars)
|
68
|
-
fetch(:cidfile, '/etc/cidfile')
|
68
|
+
fetch(:env_vars)
|
69
69
|
)
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
73
|
task :rolling_deploy do
|
74
74
|
on_each_docker_host do |server|
|
75
|
-
stop_containers(server, fetch(:port_bindings))
|
75
|
+
stop_containers(server, fetch(:port_bindings), fetch(:stop_timeout, 30))
|
76
76
|
|
77
77
|
start_new_container(
|
78
78
|
server,
|
79
79
|
fetch(:image_id),
|
80
80
|
fetch(:port_bindings),
|
81
81
|
fetch(:binds),
|
82
|
-
fetch(:env_vars)
|
83
|
-
fetch(:cidfile, '/etc/cidfile')
|
82
|
+
fetch(:env_vars)
|
84
83
|
)
|
85
84
|
|
86
85
|
fetch(:port_bindings).each_pair do |container_port, host_ports|
|
data/spec/deploy_dsl_spec.rb
CHANGED
@@ -28,13 +28,15 @@ describe Centurion::DeployDSL do
|
|
28
28
|
expect(DeployDSLTest.fetch(:command)).to equal(command)
|
29
29
|
end
|
30
30
|
|
31
|
-
it 'adds new env_vars to the existing ones' do
|
31
|
+
it 'adds new env_vars to the existing ones, as strings' do
|
32
32
|
DeployDSLTest.set(:env_vars, { 'SHAKESPEARE' => 'Hamlet' })
|
33
|
-
DeployDSLTest.env_vars('DICKENS' => 'David Copperfield'
|
33
|
+
DeployDSLTest.env_vars('DICKENS' => 'David Copperfield',
|
34
|
+
:DICKENS_BIRTH_YEAR => 1812)
|
34
35
|
|
35
36
|
expect(DeployDSLTest.fetch(:env_vars)).to include(
|
36
|
-
'SHAKESPEARE'
|
37
|
-
'DICKENS'
|
37
|
+
'SHAKESPEARE' => 'Hamlet',
|
38
|
+
'DICKENS' => 'David Copperfield',
|
39
|
+
'DICKENS_BIRTH_YEAR' => '1812'
|
38
40
|
)
|
39
41
|
end
|
40
42
|
|
data/spec/deploy_spec.rb
CHANGED
@@ -9,8 +9,8 @@ describe Centurion::Deploy do
|
|
9
9
|
let(:port) { 8484 }
|
10
10
|
let(:container) { { 'Ports' => [{ 'PublicPort' => port }, 'Created' => Time.now.to_i ], 'Id' => '21adfd2ef2ef2349494a', 'Names' => [ 'name1' ] } }
|
11
11
|
let(:endpoint) { '/status/check' }
|
12
|
-
let(:test_deploy) do
|
13
|
-
Object.new.tap do |o|
|
12
|
+
let(:test_deploy) do
|
13
|
+
Object.new.tap do |o|
|
14
14
|
o.send(:extend, Centurion::Deploy)
|
15
15
|
o.send(:extend, Centurion::DeployDSL)
|
16
16
|
o.send(:extend, Centurion::Logging)
|
@@ -84,7 +84,7 @@ describe Centurion::Deploy do
|
|
84
84
|
test_deploy.stub(:warn)
|
85
85
|
expect(test_deploy).to receive(:exit)
|
86
86
|
expect(test_deploy).to receive(:sleep).with(0)
|
87
|
-
|
87
|
+
|
88
88
|
test_deploy.wait_for_http_status_ok(server, port, '/foo', 'image_id', 'chaucer', 0, 1)
|
89
89
|
expect(test_deploy).to have_received(:info).with(/Waiting for the port/)
|
90
90
|
end
|
@@ -95,7 +95,7 @@ describe Centurion::Deploy do
|
|
95
95
|
test_deploy.stub(:error)
|
96
96
|
test_deploy.stub(:warn)
|
97
97
|
expect(test_deploy).to receive(:exit)
|
98
|
-
|
98
|
+
|
99
99
|
test_deploy.wait_for_http_status_ok(server, port, '/foo', 'image_id', 'chaucer', 1, 0)
|
100
100
|
expect(test_deploy).to have_received(:info).with(/Waiting for the port/)
|
101
101
|
end
|
@@ -126,8 +126,8 @@ describe Centurion::Deploy do
|
|
126
126
|
|
127
127
|
expect(server).to receive(:find_containers_by_public_port).and_return(containers)
|
128
128
|
expect(test_deploy).to receive(:public_port_for).with(bindings).and_return('80')
|
129
|
-
expect(server).to receive(:stop_container).with(container['Id']).once
|
130
|
-
expect(server).to receive(:stop_container).with(second_container['Id']).once
|
129
|
+
expect(server).to receive(:stop_container).with(container['Id'], 30).once
|
130
|
+
expect(server).to receive(:stop_container).with(second_container['Id'], 30).once
|
131
131
|
|
132
132
|
test_deploy.stop_containers(server, bindings)
|
133
133
|
end
|
@@ -229,12 +229,11 @@ describe Centurion::Deploy do
|
|
229
229
|
expect(server).to receive(:start_container).with(
|
230
230
|
'abc123456',
|
231
231
|
{
|
232
|
-
'PortBindings' => bindings
|
233
|
-
'ContainerIDFile' => '/etc/cidfile'
|
232
|
+
'PortBindings' => bindings
|
234
233
|
}
|
235
234
|
).once
|
236
235
|
|
237
|
-
test_deploy.start_new_container(server, 'image_id', bindings, {}, nil, nil
|
236
|
+
test_deploy.start_new_container(server, 'image_id', bindings, {}, nil, nil)
|
238
237
|
end
|
239
238
|
end
|
240
239
|
|
@@ -252,16 +251,8 @@ describe Centurion::Deploy do
|
|
252
251
|
test_deploy.start_new_container(server, 'image_id', bindings, {}, nil)
|
253
252
|
end
|
254
253
|
|
255
|
-
it 'pass cidfile to start_container_with_config method' do
|
256
|
-
test_deploy.stub(:container_config_for)
|
257
|
-
|
258
|
-
expect(test_deploy).to receive(:start_container_with_config).with(server, anything(), bindings, nil, '/etc/cidfile').once
|
259
|
-
|
260
|
-
test_deploy.start_new_container(server, 'image_id', bindings, {}, nil, nil, '/etc/cidfile')
|
261
|
-
end
|
262
|
-
|
263
254
|
it 'starts the container' do
|
264
|
-
expect(test_deploy).to receive(:start_container_with_config).with(server, {}, anything(), anything()
|
255
|
+
expect(test_deploy).to receive(:start_container_with_config).with(server, {}, anything(), anything())
|
265
256
|
|
266
257
|
test_deploy.start_new_container(server, 'image_id', bindings, {})
|
267
258
|
end
|
@@ -291,20 +282,18 @@ describe Centurion::Deploy do
|
|
291
282
|
let(:volumes) { nil }
|
292
283
|
let(:env) { nil }
|
293
284
|
let(:command) { nil }
|
294
|
-
let(:cidfile) { nil }
|
295
285
|
|
296
286
|
it 'configures the container' do
|
297
287
|
expect(test_deploy).to receive(:container_config_for).with(server, 'image_id', bindings, env, volumes, command).once
|
298
288
|
test_deploy.stub(:start_container_with_config)
|
299
289
|
|
300
|
-
test_deploy.start_new_container(server, 'image_id', bindings, volumes, env, command
|
290
|
+
test_deploy.start_new_container(server, 'image_id', bindings, volumes, env, command)
|
301
291
|
end
|
302
292
|
|
303
293
|
it 'augments the container_config' do
|
304
294
|
expect(test_deploy).to receive(:start_container_with_config).with(server, volumes,
|
305
295
|
anything(),
|
306
|
-
hash_including('Cmd' => [ '/bin/bash' ], 'AttachStdin' => true , 'Tty' => true , 'OpenStdin' => true)
|
307
|
-
anything()
|
296
|
+
hash_including('Cmd' => [ '/bin/bash' ], 'AttachStdin' => true , 'Tty' => true , 'OpenStdin' => true)
|
308
297
|
).and_return({'Id' => 'shakespeare'})
|
309
298
|
|
310
299
|
test_deploy.launch_console(server, 'image_id', bindings, volumes, env)
|
@@ -312,7 +301,7 @@ describe Centurion::Deploy do
|
|
312
301
|
|
313
302
|
it 'starts the console' do
|
314
303
|
expect(test_deploy).to receive(:start_container_with_config).with(
|
315
|
-
server, nil, anything(), anything()
|
304
|
+
server, nil, anything(), anything()
|
316
305
|
).and_return({'Id' => 'shakespeare'})
|
317
306
|
|
318
307
|
test_deploy.launch_console(server, 'image_id', bindings, volumes, env)
|
data/spec/docker_via_api_spec.rb
CHANGED
@@ -61,6 +61,13 @@ describe Centurion::DockerViaApi do
|
|
61
61
|
end
|
62
62
|
|
63
63
|
it 'stops a container' do
|
64
|
+
expect(Excon).to receive(:post).
|
65
|
+
with(excon_uri + "v1.7" + "/containers/12345/stop?t=300").
|
66
|
+
and_return(double(status: 204))
|
67
|
+
api.stop_container('12345', 300)
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'stops a container with a custom timeout' do
|
64
71
|
expect(Excon).to receive(:post).
|
65
72
|
with(excon_uri + "v1.7" + "/containers/12345/stop?t=30").
|
66
73
|
and_return(double(status: 204))
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: centurion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Nic Benders
|
@@ -20,118 +21,134 @@ authors:
|
|
20
21
|
autorequire:
|
21
22
|
bindir: bin
|
22
23
|
cert_chain: []
|
23
|
-
date: 2014-
|
24
|
+
date: 2014-10-07 00:00:00.000000000 Z
|
24
25
|
dependencies:
|
25
26
|
- !ruby/object:Gem::Dependency
|
26
27
|
name: trollop
|
27
28
|
requirement: !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
28
30
|
requirements:
|
29
|
-
- -
|
31
|
+
- - ! '>='
|
30
32
|
- !ruby/object:Gem::Version
|
31
33
|
version: '0'
|
32
34
|
type: :runtime
|
33
35
|
prerelease: false
|
34
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
35
38
|
requirements:
|
36
|
-
- -
|
39
|
+
- - ! '>='
|
37
40
|
- !ruby/object:Gem::Version
|
38
41
|
version: '0'
|
39
42
|
- !ruby/object:Gem::Dependency
|
40
43
|
name: excon
|
41
44
|
requirement: !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
42
46
|
requirements:
|
43
|
-
- -
|
47
|
+
- - ~>
|
44
48
|
- !ruby/object:Gem::Version
|
45
49
|
version: '0.33'
|
46
50
|
type: :runtime
|
47
51
|
prerelease: false
|
48
52
|
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
49
54
|
requirements:
|
50
|
-
- -
|
55
|
+
- - ~>
|
51
56
|
- !ruby/object:Gem::Version
|
52
57
|
version: '0.33'
|
53
58
|
- !ruby/object:Gem::Dependency
|
54
59
|
name: logger-colors
|
55
60
|
requirement: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
56
62
|
requirements:
|
57
|
-
- -
|
63
|
+
- - ! '>='
|
58
64
|
- !ruby/object:Gem::Version
|
59
65
|
version: '0'
|
60
66
|
type: :runtime
|
61
67
|
prerelease: false
|
62
68
|
version_requirements: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
63
70
|
requirements:
|
64
|
-
- -
|
71
|
+
- - ! '>='
|
65
72
|
- !ruby/object:Gem::Version
|
66
73
|
version: '0'
|
67
74
|
- !ruby/object:Gem::Dependency
|
68
75
|
name: bundler
|
69
76
|
requirement: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
70
78
|
requirements:
|
71
|
-
- -
|
79
|
+
- - ! '>='
|
72
80
|
- !ruby/object:Gem::Version
|
73
81
|
version: '0'
|
74
82
|
type: :development
|
75
83
|
prerelease: false
|
76
84
|
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
77
86
|
requirements:
|
78
|
-
- -
|
87
|
+
- - ! '>='
|
79
88
|
- !ruby/object:Gem::Version
|
80
89
|
version: '0'
|
81
90
|
- !ruby/object:Gem::Dependency
|
82
91
|
name: rake
|
83
92
|
requirement: !ruby/object:Gem::Requirement
|
93
|
+
none: false
|
84
94
|
requirements:
|
85
|
-
- -
|
95
|
+
- - ! '>='
|
86
96
|
- !ruby/object:Gem::Version
|
87
97
|
version: '0'
|
88
98
|
type: :development
|
89
99
|
prerelease: false
|
90
100
|
version_requirements: !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
91
102
|
requirements:
|
92
|
-
- -
|
103
|
+
- - ! '>='
|
93
104
|
- !ruby/object:Gem::Version
|
94
105
|
version: '0'
|
95
106
|
- !ruby/object:Gem::Dependency
|
96
107
|
name: rspec
|
97
108
|
requirement: !ruby/object:Gem::Requirement
|
109
|
+
none: false
|
98
110
|
requirements:
|
99
|
-
- -
|
111
|
+
- - ~>
|
100
112
|
- !ruby/object:Gem::Version
|
101
113
|
version: 2.14.0
|
102
114
|
type: :development
|
103
115
|
prerelease: false
|
104
116
|
version_requirements: !ruby/object:Gem::Requirement
|
117
|
+
none: false
|
105
118
|
requirements:
|
106
|
-
- -
|
119
|
+
- - ~>
|
107
120
|
- !ruby/object:Gem::Version
|
108
121
|
version: 2.14.0
|
109
122
|
- !ruby/object:Gem::Dependency
|
110
123
|
name: pry
|
111
124
|
requirement: !ruby/object:Gem::Requirement
|
125
|
+
none: false
|
112
126
|
requirements:
|
113
|
-
- -
|
127
|
+
- - ! '>='
|
114
128
|
- !ruby/object:Gem::Version
|
115
129
|
version: '0'
|
116
130
|
type: :development
|
117
131
|
prerelease: false
|
118
132
|
version_requirements: !ruby/object:Gem::Requirement
|
133
|
+
none: false
|
119
134
|
requirements:
|
120
|
-
- -
|
135
|
+
- - ! '>='
|
121
136
|
- !ruby/object:Gem::Version
|
122
137
|
version: '0'
|
123
138
|
- !ruby/object:Gem::Dependency
|
124
139
|
name: simplecov
|
125
140
|
requirement: !ruby/object:Gem::Requirement
|
141
|
+
none: false
|
126
142
|
requirements:
|
127
|
-
- -
|
143
|
+
- - ! '>='
|
128
144
|
- !ruby/object:Gem::Version
|
129
145
|
version: '0'
|
130
146
|
type: :development
|
131
147
|
prerelease: false
|
132
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
none: false
|
133
150
|
requirements:
|
134
|
-
- -
|
151
|
+
- - ! '>='
|
135
152
|
- !ruby/object:Gem::Version
|
136
153
|
version: '0'
|
137
154
|
description:
|
@@ -155,7 +172,7 @@ executables:
|
|
155
172
|
extensions: []
|
156
173
|
extra_rdoc_files: []
|
157
174
|
files:
|
158
|
-
-
|
175
|
+
- .gitignore
|
159
176
|
- CONTRIBUTORS.md
|
160
177
|
- Gemfile
|
161
178
|
- LICENSE
|
@@ -192,26 +209,27 @@ files:
|
|
192
209
|
homepage: https://github.com/newrelic/centurion
|
193
210
|
licenses:
|
194
211
|
- MIT
|
195
|
-
metadata: {}
|
196
212
|
post_install_message:
|
197
213
|
rdoc_options: []
|
198
214
|
require_paths:
|
199
215
|
- lib
|
200
216
|
required_ruby_version: !ruby/object:Gem::Requirement
|
217
|
+
none: false
|
201
218
|
requirements:
|
202
|
-
- -
|
219
|
+
- - ! '>='
|
203
220
|
- !ruby/object:Gem::Version
|
204
221
|
version: 1.9.3
|
205
222
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
223
|
+
none: false
|
206
224
|
requirements:
|
207
|
-
- -
|
225
|
+
- - ! '>='
|
208
226
|
- !ruby/object:Gem::Version
|
209
227
|
version: '0'
|
210
228
|
requirements: []
|
211
229
|
rubyforge_project:
|
212
|
-
rubygems_version:
|
230
|
+
rubygems_version: 1.8.23
|
213
231
|
signing_key:
|
214
|
-
specification_version:
|
232
|
+
specification_version: 3
|
215
233
|
summary: A deployment tool for Docker. Takes containers from a Docker registry and
|
216
234
|
runs them on a fleet of hosts with the correct environment variables, host mappings,
|
217
235
|
and port mappings. Supports rolling deployments out of the box, and makes it easy
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 3eb7f396991461f2a7e0db2fe83ff6209313233e
|
4
|
-
data.tar.gz: ee9f4bc48a899190fa48439353f5803523bbe2ec
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: e0f35cd1e2626d5fd1c582ae2397c07b9daa7f53ace494094eea423f02865cba1d2852202e90cba8d7e82357002613db2ae48ee9e7280b11a6d53b329905b1f4
|
7
|
-
data.tar.gz: 01577cabe24211a9e65df8d0e4a140fd18042fab6742d5e65ed567becea161bc2582179b8c86df11055a69234b21f43e5b536c9f36a088bf79af0f139ad39905
|