aptible-cli 0.20.0 → 0.22.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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