aptible-cli 0.20.0 → 0.22.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.
@@ -0,0 +1,115 @@
1
+ require 'spec_helper'
2
+
3
+ describe Aptible::CLI::Agent do
4
+ let(:token) { 'some-token' }
5
+ let(:account) { Fabricate(:account, handle: 'test') }
6
+ let(:database) { Fabricate(:database, account: account, handle: 'some-db') }
7
+ let!(:policy) do
8
+ # created_at: 2016-06-14 13:24:11 +0000
9
+ Fabricate(:backup_retention_policy, account: account)
10
+ end
11
+
12
+ let(:default_handle) { 'some-db-at-2016-06-14-13-24-11' }
13
+
14
+ before do
15
+ allow(subject).to receive(:fetch_token).and_return(token)
16
+ allow(Aptible::Api::Account).to receive(:all) { [account] }
17
+ end
18
+
19
+ describe '#backup_retention_policy' do
20
+ it 'raises an error if the environment has no policy' do
21
+ allow(account).to receive(:backup_retention_policies).and_return([])
22
+ expect { subject.backup_retention_policy('test') }
23
+ .to raise_error(/does not have a custom backup retention policy/)
24
+ end
25
+
26
+ it "prints the enviroment's current policy" do
27
+ subject.backup_retention_policy('test')
28
+ out = captured_output_text
29
+ expect(out).to match(/daily: 30/i)
30
+ expect(out).to match(/monthly: 12/i)
31
+ expect(out).to match(/yearly: 6/i)
32
+ expect(out).to match(/make copy: true/i)
33
+ expect(out).to match(/keep final: true/i)
34
+ expect(out).to match(/environment: test/i)
35
+ end
36
+ end
37
+
38
+ describe '#backup_retention_policy:set' do
39
+ it 'requires all attributes if the environment has no policy' do
40
+ allow(account).to receive(:backup_retention_policies).and_return([])
41
+ opts = {
42
+ daily: 3,
43
+ monthly: 2,
44
+ yearly: 1,
45
+ make_copy: false,
46
+ keep_final: true
47
+ }
48
+
49
+ opts.each_key do |k|
50
+ missing_opts = opts.clone
51
+ missing_opts.delete(k)
52
+
53
+ subject.options = missing_opts
54
+ expect { subject.send('backup_retention_policy:set', 'test') }
55
+ .to raise_error(/please specify all attributes/i)
56
+ end
57
+
58
+ expect(account).to receive(:create_backup_retention_policy!)
59
+ .with(**opts).and_return(Fabricate(:backup_retention_policy))
60
+ subject.options = opts
61
+ subject.send('backup_retention_policy:set', 'test')
62
+ end
63
+
64
+ it 'merges provided options with the current policy' do
65
+ expected_opts = {
66
+ daily: 5,
67
+ monthly: policy.monthly,
68
+ yearly: policy.yearly,
69
+ make_copy: policy.make_copy,
70
+ keep_final: false
71
+ }
72
+
73
+ expect(account).to receive(:create_backup_retention_policy!)
74
+ .with(**expected_opts).and_return(Fabricate(:backup_retention_policy))
75
+ subject.options = { daily: 5, keep_final: false, force: true }
76
+ subject.send('backup_retention_policy:set', 'test')
77
+ end
78
+
79
+ it 'prompts the user if the new policy retains fewer backups' do
80
+ subject.options = { daily: 0 }
81
+
82
+ # Reject Prompt
83
+ expect(subject).to receive(:yes?).with(/do you want to proceed/i)
84
+
85
+ expect { subject.send('backup_retention_policy:set', 'test') }
86
+ .to raise_error(/aborting/i)
87
+
88
+ # Accept Prompt
89
+ expect(subject).to receive(:yes?).with(/do you want to proceed/i)
90
+ .and_return(true)
91
+
92
+ expect(account).to receive(:create_backup_retention_policy!)
93
+ .and_return(Fabricate(:backup_retention_policy))
94
+
95
+ subject.send('backup_retention_policy:set', 'test')
96
+ end
97
+
98
+ it '--force skips the confirmation promt' do
99
+ subject.options = { make_copy: false }
100
+
101
+ # Reject Prompt
102
+ expect(subject).to receive(:yes?).with(/do you want to proceed/i)
103
+
104
+ expect { subject.send('backup_retention_policy:set', 'test') }
105
+ .to raise_error(/aborting/i)
106
+
107
+ # --force
108
+ subject.options[:force] = true
109
+ expect(account).to receive(:create_backup_retention_policy!)
110
+ .and_return(Fabricate(:backup_retention_policy))
111
+
112
+ subject.send('backup_retention_policy:set', 'test')
113
+ end
114
+ end
115
+ end
@@ -116,6 +116,21 @@ describe Aptible::CLI::Agent do
116
116
  subject.send('backup:restore', 1)
117
117
  end
118
118
 
119
+ it 'accept scaling options' do
120
+ expect(backup).to receive(:create_operation!) do |options|
121
+ expect(options[:instance_profile]).to eq('m5')
122
+ expect(options[:provisioned_iops]).to eq(4000)
123
+ op
124
+ end
125
+
126
+ expect(subject).to receive(:attach_to_operation_logs).with(op) do
127
+ Fabricate(:database, account: account, handle: default_handle)
128
+ end
129
+
130
+ subject.options = { container_profile: 'm5', iops: 4000 }
131
+ subject.send('backup:restore', 1)
132
+ end
133
+
119
134
  it 'accepts an destination environment' do
120
135
  expect(backup).to receive(:create_operation!) do |options|
121
136
  expect(options[:handle]).to be_present
@@ -70,6 +70,20 @@ describe Aptible::CLI::Agent do
70
70
  subject.send('db:create', 'foo')
71
71
  end
72
72
 
73
+ it 'creates a new DB with container profile and iops' do
74
+ expect_provision_database(
75
+ { handle: 'foo', type: 'postgresql' },
76
+ { instance_profile: 'm5', provisioned_iops: 4000 }
77
+ )
78
+
79
+ subject.options = {
80
+ type: 'postgresql',
81
+ container_profile: 'm5',
82
+ iops: 4000
83
+ }
84
+ subject.send('db:create', 'foo')
85
+ end
86
+
73
87
  it 'deprovisions the database if the operation cannot be created' do
74
88
  db = Fabricate(:database)
75
89
 
@@ -160,6 +160,27 @@ describe Aptible::CLI::Agent do
160
160
  expect { subject.deploy }
161
161
  .to raise_error(/either from git.*docker/im)
162
162
  end
163
+
164
+ it 'allows providing scaling options' do
165
+ stub_options(
166
+ container_profile: 'm5',
167
+ container_size: 1024,
168
+ container_count: 2
169
+ )
170
+
171
+ expect(app).to receive(:create_operation!)
172
+ .with(
173
+ type: 'deploy',
174
+ container_size: 1024,
175
+ instance_profile: 'm5',
176
+ container_count: 2
177
+ )
178
+ .and_return(operation)
179
+ expect(subject).to receive(:attach_to_operation_logs)
180
+ .with(operation)
181
+
182
+ subject.deploy
183
+ end
163
184
  end
164
185
  end
165
186
  end
@@ -452,6 +452,30 @@ describe Aptible::CLI::Agent do
452
452
  end
453
453
  end
454
454
 
455
+ describe 'endpoints:grpc:create' do
456
+ m = 'endpoints:grpc:create'
457
+ include_examples 'shared create app vhost examples', m
458
+ include_examples 'shared create tls vhost examples', m
459
+
460
+ it 'creates a gRPC Endpoint' do
461
+ expect_create_vhost(
462
+ service,
463
+ type: 'grpc',
464
+ platform: 'elb',
465
+ internal: false,
466
+ default: false,
467
+ ip_whitelist: []
468
+ )
469
+ subject.send(m, 'web')
470
+ end
471
+
472
+ it 'creates an Endpoint with a container Port' do
473
+ expect_create_vhost(service, container_port: 10)
474
+ stub_options(port: 10)
475
+ subject.send(m, 'web')
476
+ end
477
+ end
478
+
455
479
  shared_examples 'shared modify app vhost examples' do |m|
456
480
  it 'does not change anything if no options are passed' do
457
481
  v = Fabricate(:vhost, service: service)
@@ -579,6 +603,20 @@ describe Aptible::CLI::Agent do
579
603
  end
580
604
  end
581
605
 
606
+ describe 'endpoints:grpc:modify' do
607
+ m = 'endpoints:grpc:modify'
608
+ include_examples 'shared modify app vhost examples', m
609
+ include_examples 'shared modify tls vhost examples', m
610
+
611
+ it 'allows updating the Container Port' do
612
+ v = Fabricate(:vhost, service: service)
613
+ expect_modify_vhost(v, container_port: 10)
614
+
615
+ stub_options(port: 10)
616
+ subject.send(m, v.external_host)
617
+ end
618
+ end
619
+
582
620
  describe 'endpoints:list' do
583
621
  it 'lists Endpoints across services' do
584
622
  s1 = Fabricate(:service, app: app)
@@ -8,45 +8,78 @@ describe Aptible::CLI::Agent do
8
8
  allow(subject).to receive(:fetch_token) { token }
9
9
  allow(Aptible::Api::App).to receive(:all).with(token: token)
10
10
  .and_return([app])
11
- allow(subject).to receive(:options).and_return(app: app.handle)
12
11
  end
13
12
 
14
- it 'lists a CMD service' do
15
- Fabricate(:service, app: app, process_type: 'cmd', command: nil)
16
- subject.send('services')
13
+ describe '#services' do
14
+ before do
15
+ allow(subject).to receive(:options).and_return(app: app.handle)
16
+ end
17
17
 
18
- expect(captured_output_text.split("\n")).to include('Service: cmd')
19
- expect(captured_output_text.split("\n")).to include('Command: CMD')
20
- end
18
+ it 'lists a CMD service' do
19
+ Fabricate(:service, app: app, process_type: 'cmd', command: nil)
20
+ subject.send('services')
21
21
 
22
- it 'lists a service with command' do
23
- Fabricate(:service, app: app, process_type: 'cmd', command: 'foobar')
24
- subject.send('services')
22
+ expect(captured_output_text.split("\n")).to include('Service: cmd')
23
+ expect(captured_output_text.split("\n")).to include('Command: CMD')
24
+ end
25
25
 
26
- expect(captured_output_text.split("\n")).to include('Service: cmd')
27
- expect(captured_output_text.split("\n")).to include('Command: foobar')
28
- end
26
+ it 'lists a service with command' do
27
+ Fabricate(:service, app: app, process_type: 'cmd', command: 'foobar')
28
+ subject.send('services')
29
29
 
30
- it 'lists container size' do
31
- Fabricate(:service, app: app, container_memory_limit_mb: 1024)
32
- subject.send('services')
30
+ expect(captured_output_text.split("\n")).to include('Service: cmd')
31
+ expect(captured_output_text.split("\n")).to include('Command: foobar')
32
+ end
33
33
 
34
- expect(captured_output_text.split("\n")).to include('Container Size: 1024')
35
- end
34
+ it 'lists container size' do
35
+ Fabricate(:service, app: app, container_memory_limit_mb: 1024)
36
+ subject.send('services')
37
+
38
+ expect(captured_output_text.split("\n"))
39
+ .to include('Container Size: 1024')
40
+ end
36
41
 
37
- it 'lists container count' do
38
- Fabricate(:service, app: app, container_count: 3)
39
- subject.send('services')
42
+ it 'lists container count' do
43
+ Fabricate(:service, app: app, container_count: 3)
44
+ subject.send('services')
40
45
 
41
- expect(captured_output_text.split("\n")).to include('Container Count: 3')
46
+ expect(captured_output_text.split("\n")).to include('Container Count: 3')
47
+ end
48
+
49
+ it 'lists multiple services' do
50
+ Fabricate(:service, app: app, process_type: 'foo')
51
+ Fabricate(:service, app: app, process_type: 'bar')
52
+ subject.send('services')
53
+
54
+ expect(captured_output_text.split("\n")).to include('Service: foo')
55
+ expect(captured_output_text.split("\n")).to include('Service: bar')
56
+ end
42
57
  end
43
58
 
44
- it 'lists multiple services' do
45
- Fabricate(:service, app: app, process_type: 'foo')
46
- Fabricate(:service, app: app, process_type: 'bar')
47
- subject.send('services')
59
+ describe '#services:settings' do
60
+ let(:base_options) { { app: app.handle } }
61
+
62
+ it 'allows changing zero_downtime_deployment settings' do
63
+ stub_options(force_zero_downtime: true, simple_health_check: true)
64
+ service = Fabricate(:service, app: app, process_type: 'foo')
65
+
66
+ expect(service).to receive(:update!)
67
+ .with(force_zero_downtime: true, naive_health_check: true)
68
+
69
+ subject.send('services:settings', 'foo')
70
+ end
71
+
72
+ it 'allows changing only one of the options' do
73
+ stub_options(simple_health_check: true)
74
+ service = Fabricate(:service, app: app, process_type: 'foo')
75
+
76
+ expect(service).to receive(:update!).with(naive_health_check: true)
77
+
78
+ subject.send('services:settings', 'foo')
79
+ end
80
+ end
48
81
 
49
- expect(captured_output_text.split("\n")).to include('Service: foo')
50
- expect(captured_output_text.split("\n")).to include('Service: bar')
82
+ def stub_options(**opts)
83
+ allow(subject).to receive(:options).and_return(base_options.merge(opts))
51
84
  end
52
85
  end
@@ -28,5 +28,6 @@ Fabricator(:account, from: :stub_account) do
28
28
  certificates { [] }
29
29
  log_drains { [] }
30
30
  metric_drains { [] }
31
+ backup_retention_policies { [] }
31
32
  created_at { Time.now }
32
33
  end
@@ -0,0 +1,18 @@
1
+ class StubBackupRetentionPolicy < OpenStruct
2
+ def reload
3
+ self
4
+ end
5
+ end
6
+
7
+ Fabricator(:backup_retention_policy, from: :stub_backup_retention_policy) do
8
+ id { sequence(:backup_retention_policy_id) }
9
+ created_at { Time.now }
10
+ daily { 30 }
11
+ monthly { 12 }
12
+ yearly { 6 }
13
+ make_copy { true }
14
+ keep_final { true }
15
+ account
16
+
17
+ after_create { |policy| policy.account.backup_retention_policies << policy }
18
+ end
metadata CHANGED
@@ -1,57 +1,63 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aptible-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.20.0
4
+ version: 0.22.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Frank Macreery
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-04 00:00:00.000000000 Z
11
+ date: 2024-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: aptible-resource
14
+ name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.1'
19
+ version: '4.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '6.0'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
25
28
  - !ruby/object:Gem::Version
26
- version: '1.1'
29
+ version: '4.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '6.0'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: aptible-api
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - "~>"
32
38
  - !ruby/object:Gem::Version
33
- version: 1.5.3
39
+ version: 1.6.5
34
40
  type: :runtime
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
44
  - - "~>"
39
45
  - !ruby/object:Gem::Version
40
- version: 1.5.3
46
+ version: 1.6.5
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: aptible-auth
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
51
  - - "~>"
46
52
  - !ruby/object:Gem::Version
47
- version: 1.2.4
53
+ version: 1.2.5
48
54
  type: :runtime
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
58
  - - "~>"
53
59
  - !ruby/object:Gem::Version
54
- version: 1.2.4
60
+ version: 1.2.5
55
61
  - !ruby/object:Gem::Dependency
56
62
  name: aptible-billing
57
63
  requirement: !ruby/object:Gem::Requirement
@@ -67,35 +73,49 @@ dependencies:
67
73
  - !ruby/object:Gem::Version
68
74
  version: '1.0'
69
75
  - !ruby/object:Gem::Dependency
70
- name: thor
76
+ name: aptible-resource
71
77
  requirement: !ruby/object:Gem::Requirement
72
78
  requirements:
73
79
  - - "~>"
74
80
  - !ruby/object:Gem::Version
75
- version: 0.20.0
81
+ version: '1.1'
76
82
  type: :runtime
77
83
  prerelease: false
78
84
  version_requirements: !ruby/object:Gem::Requirement
79
85
  requirements:
80
86
  - - "~>"
81
87
  - !ruby/object:Gem::Version
82
- version: 0.20.0
88
+ version: '1.1'
83
89
  - !ruby/object:Gem::Dependency
84
- name: git
90
+ name: aws-sdk
85
91
  requirement: !ruby/object:Gem::Requirement
86
92
  requirements:
87
- - - "<"
93
+ - - "~>"
88
94
  - !ruby/object:Gem::Version
89
- version: '1.10'
95
+ version: '2.0'
90
96
  type: :runtime
91
97
  prerelease: false
92
98
  version_requirements: !ruby/object:Gem::Requirement
93
99
  requirements:
94
- - - "<"
100
+ - - "~>"
95
101
  - !ruby/object:Gem::Version
96
- version: '1.10'
102
+ version: '2.0'
97
103
  - !ruby/object:Gem::Dependency
98
- name: term-ansicolor
104
+ name: bigdecimal
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: 1.3.5
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: 1.3.5
117
+ - !ruby/object:Gem::Dependency
118
+ name: cbor
99
119
  requirement: !ruby/object:Gem::Requirement
100
120
  requirements:
101
121
  - - ">="
@@ -123,67 +143,89 @@ dependencies:
123
143
  - !ruby/object:Gem::Version
124
144
  version: 0.10.6
125
145
  - !ruby/object:Gem::Dependency
126
- name: cbor
146
+ name: concurrent-ruby
127
147
  requirement: !ruby/object:Gem::Requirement
128
148
  requirements:
129
- - - ">="
149
+ - - "<"
130
150
  - !ruby/object:Gem::Version
131
- version: '0'
151
+ version: 1.1.10
132
152
  type: :runtime
133
153
  prerelease: false
134
154
  version_requirements: !ruby/object:Gem::Requirement
135
155
  requirements:
136
- - - ">="
156
+ - - "<"
137
157
  - !ruby/object:Gem::Version
138
- version: '0'
158
+ version: 1.1.10
139
159
  - !ruby/object:Gem::Dependency
140
- name: aws-sdk
160
+ name: jwt
141
161
  requirement: !ruby/object:Gem::Requirement
142
162
  requirements:
143
163
  - - "~>"
144
164
  - !ruby/object:Gem::Version
145
- version: '2.0'
165
+ version: 2.3.0
146
166
  type: :runtime
147
167
  prerelease: false
148
168
  version_requirements: !ruby/object:Gem::Requirement
149
169
  requirements:
150
170
  - - "~>"
151
171
  - !ruby/object:Gem::Version
152
- version: '2.0'
172
+ version: 2.3.0
153
173
  - !ruby/object:Gem::Dependency
154
- name: bigdecimal
174
+ name: git
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "<"
178
+ - !ruby/object:Gem::Version
179
+ version: '1.10'
180
+ type: :runtime
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "<"
185
+ - !ruby/object:Gem::Version
186
+ version: '1.10'
187
+ - !ruby/object:Gem::Dependency
188
+ name: rack
155
189
  requirement: !ruby/object:Gem::Requirement
156
190
  requirements:
157
191
  - - "~>"
158
192
  - !ruby/object:Gem::Version
159
- version: 1.3.5
193
+ version: '1.0'
160
194
  type: :runtime
161
195
  prerelease: false
162
196
  version_requirements: !ruby/object:Gem::Requirement
163
197
  requirements:
164
198
  - - "~>"
165
199
  - !ruby/object:Gem::Version
166
- version: 1.3.5
200
+ version: '1.0'
167
201
  - !ruby/object:Gem::Dependency
168
- name: activesupport
202
+ name: term-ansicolor
169
203
  requirement: !ruby/object:Gem::Requirement
170
204
  requirements:
171
- - - ">="
172
- - !ruby/object:Gem::Version
173
- version: '4.0'
174
- - - "<"
205
+ - - "~>"
175
206
  - !ruby/object:Gem::Version
176
- version: '6.0'
207
+ version: 1.8.0
177
208
  type: :runtime
178
209
  prerelease: false
179
210
  version_requirements: !ruby/object:Gem::Requirement
180
211
  requirements:
181
- - - ">="
212
+ - - "~>"
182
213
  - !ruby/object:Gem::Version
183
- version: '4.0'
184
- - - "<"
214
+ version: 1.8.0
215
+ - !ruby/object:Gem::Dependency
216
+ name: thor
217
+ requirement: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
185
220
  - !ruby/object:Gem::Version
186
- version: '6.0'
221
+ version: 0.20.0
222
+ type: :runtime
223
+ prerelease: false
224
+ version_requirements: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - "~>"
227
+ - !ruby/object:Gem::Version
228
+ version: 0.20.0
187
229
  - !ruby/object:Gem::Dependency
188
230
  name: bundler
189
231
  requirement: !ruby/object:Gem::Requirement
@@ -292,9 +334,9 @@ extra_rdoc_files: []
292
334
  files:
293
335
  - ".dockerignore"
294
336
  - ".github/CODEOWNERS"
337
+ - ".github/workflows/test.yml"
295
338
  - ".gitignore"
296
339
  - ".rspec"
297
- - ".travis.yml"
298
340
  - Dockerfile
299
341
  - Gemfile
300
342
  - Gemfile.lock
@@ -379,6 +421,7 @@ files:
379
421
  - spec/aptible/cli/renderer/text_spec.rb
380
422
  - spec/aptible/cli/resource_formatter_spec.rb
381
423
  - spec/aptible/cli/subcommands/apps_spec.rb
424
+ - spec/aptible/cli/subcommands/backup_retention_policy_spec.rb
382
425
  - spec/aptible/cli/subcommands/backup_spec.rb
383
426
  - spec/aptible/cli/subcommands/config_spec.rb
384
427
  - spec/aptible/cli/subcommands/db_spec.rb
@@ -399,6 +442,7 @@ files:
399
442
  - spec/fabricators/account_fabricator.rb
400
443
  - spec/fabricators/app_fabricator.rb
401
444
  - spec/fabricators/backup_fabricator.rb
445
+ - spec/fabricators/backup_retention_policy_fabricator.rb
402
446
  - spec/fabricators/certificate_fabricator.rb
403
447
  - spec/fabricators/configuration_fabricator.rb
404
448
  - spec/fabricators/database_credential_fabricator.rb
@@ -427,7 +471,7 @@ homepage: https://github.com/aptible/aptible-cli
427
471
  licenses:
428
472
  - MIT
429
473
  metadata: {}
430
- post_install_message:
474
+ post_install_message:
431
475
  rdoc_options: []
432
476
  require_paths:
433
477
  - lib
@@ -442,8 +486,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
442
486
  - !ruby/object:Gem::Version
443
487
  version: '0'
444
488
  requirements: []
445
- rubygems_version: 3.0.3.1
446
- signing_key:
489
+ rubygems_version: 3.1.6
490
+ signing_key:
447
491
  specification_version: 4
448
492
  summary: Command-line interface for Aptible services
449
493
  test_files:
@@ -463,6 +507,7 @@ test_files:
463
507
  - spec/aptible/cli/renderer/text_spec.rb
464
508
  - spec/aptible/cli/resource_formatter_spec.rb
465
509
  - spec/aptible/cli/subcommands/apps_spec.rb
510
+ - spec/aptible/cli/subcommands/backup_retention_policy_spec.rb
466
511
  - spec/aptible/cli/subcommands/backup_spec.rb
467
512
  - spec/aptible/cli/subcommands/config_spec.rb
468
513
  - spec/aptible/cli/subcommands/db_spec.rb
@@ -483,6 +528,7 @@ test_files:
483
528
  - spec/fabricators/account_fabricator.rb
484
529
  - spec/fabricators/app_fabricator.rb
485
530
  - spec/fabricators/backup_fabricator.rb
531
+ - spec/fabricators/backup_retention_policy_fabricator.rb
486
532
  - spec/fabricators/certificate_fabricator.rb
487
533
  - spec/fabricators/configuration_fabricator.rb
488
534
  - spec/fabricators/database_credential_fabricator.rb