tfctl 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d6f58a8ef8569aaec8cc41ad269adf690caca7d13472a26ed65ed846c835273c
4
- data.tar.gz: '013649daccb576adbe4c0c95c8fe64347b641dcb07ad2f0d3e5ca1420188489c'
3
+ metadata.gz: b7a1d287bce54f0203c80b4814f67ddb3d5f38319796a185a69ccf1fe1b65f02
4
+ data.tar.gz: 924e81046fde7a921f66959893429c10fbcffd8a3f32e1b6257cde2935c1b5d1
5
5
  SHA512:
6
- metadata.gz: 2a65943659c0dabe88c40d76d46a99ed23f1ef335486c719729ca599e10e60b2abc0bc81577f2490ca7bbbe64e479ab641b0197a1160b7a1e061f274f224419b
7
- data.tar.gz: 8c0cebbab4bc2738357979d1fa013bbf485ea398a3c5ecfdbb4ab9bf670060660a890b900cfca8425764c1387d4ffe5c0d0c50d3a59a10f16ba4f20f3687a303
6
+ metadata.gz: 044ad7209c428aa8c1f7eaf11258089ed6ce304a2943b79739ba1b8337fbd6487f4cda758c73acfc9de35f17fc272ef98d74fe64c274ea4d5e0112bc1749329b
7
+ data.tar.gz: 22a221bb105a66c5b9512a604886eb458ff1ec2876ee8d3599f7c6c0cc5e6abb5fafd0d47aa2cd61fbc979b0ba5ca33a8f18a47a5afacfd27515ea5e333f0868
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  AllCops:
3
- TargetRubyVersion: 2.3
3
+ TargetRubyVersion: 2.5
4
4
  DisplayCopNames: true
5
5
 
6
6
  Layout/IndentationWidth:
@@ -45,7 +45,7 @@ Metrics/BlockLength:
45
45
  Metrics/MethodLength:
46
46
  Enabled: false
47
47
 
48
- Metrics/LineLength:
48
+ Layout/LineLength:
49
49
  Max: 140
50
50
 
51
51
  Metrics/AbcSize:
@@ -77,3 +77,7 @@ Style/TrailingCommaInHashLiteral:
77
77
 
78
78
  Style/RedundantReturn:
79
79
  Enabled: false
80
+
81
+ # don't break older Rubies just because of style
82
+ Style/RedundantBegin:
83
+ Enabled: false
@@ -1,6 +1,7 @@
1
1
  rvm:
2
- - 2.3
2
+ - 2.5
3
3
  - 2.6
4
+ - 2.7
4
5
  os: linux
5
6
  language: ruby
6
7
  script: make test
@@ -1,5 +1,13 @@
1
1
  = Changelog
2
2
 
3
+ == Upcoming
4
+
5
+ == 1.1.1
6
+
7
+ * fix: handle empty response from Organizations API containing children (thanks @grothja)
8
+ * chore: stopped testing on EOL Rubies 2.3 and 2.4 (but should still currently work)
9
+ * chore: dependencies minimum version bump
10
+
3
11
  == 1.1.0
4
12
 
5
13
  * feat: look for configuration in `tfctl.yaml` by default.
@@ -28,15 +28,16 @@ toc::[]
28
28
 
29
29
  == Overview
30
30
 
31
- Tfctl is a small Terraform wrapper for working with multi-account AWS
31
+ `tfctl` is a small Terraform wrapper for working with multi-account AWS
32
32
  infrastructures where new accounts may be created dynamically and on-demand.
33
33
 
34
- It discovers accounts by reading the AWS Organizations API and can assign
34
+ It discovers accounts by reading the AWS Organizations API, and can assign
35
35
  Terraform resources to multiple accounts based on the organization hierarchy.
36
36
  Resources can be assigned globally, based on organization unit or to individual
37
- accounts. It supports nested OU hierarchies and helps keep your Terraform DRY.
37
+ accounts. It supports hierarchies of nested Organizational Units (OUs),
38
+ and helps keep your Terraform DRY.
38
39
 
39
- Tfctl was originally developed to integrate Terraform with
40
+ The Scale Factory originally created tfctl to integrate Terraform with
40
41
  https://aws.amazon.com/solutions/aws-landing-zone/[AWS Landing Zone] and
41
42
  https://aws.amazon.com/controltower/[Control Tower] but should work with most
42
43
  other ways of managing accounts in AWS Organizations.
@@ -57,7 +58,7 @@ other ways of managing accounts in AWS Organizations.
57
58
  == Requirements
58
59
 
59
60
  * Terraform >= 0.12
60
- * Ruby >= 2.3
61
+ * Ruby >= 2.4
61
62
  * Accounts managed in AWS Organizations (by Landing Zone, Control Tower, some
62
63
  other means)
63
64
 
@@ -65,17 +66,19 @@ other ways of managing accounts in AWS Organizations.
65
66
 
66
67
  To install the latest release from RubyGems run:
67
68
 
69
+ [source,shell]
68
70
  ----
69
71
  gem install tfctl
70
72
  ----
71
73
 
72
- Alternatively you can build and install from this repo with:
74
+ Alternatively, you can build and install from this repo with:
73
75
 
76
+ [source,shell]
74
77
  ----
75
78
  make install
76
79
  ----
77
80
 
78
- == Docs
81
+ == Documentation
79
82
 
80
83
  * https://github.com/scalefactory/tfctl/tree/master/docs/control_tower.adoc[Control Tower quick start guide]
81
84
  * https://github.com/scalefactory/tfctl/tree/master/docs/project_layout.adoc[Project layout]
@@ -85,11 +88,12 @@ make install
85
88
 
86
89
  == Running tfctl
87
90
 
88
- tfctl should be run from the root of the project directory. It will generate
89
- Terraform configuration in `.tfctl/`.
91
+ You should run `tfctl` from the root of your project directory. It will generate
92
+ Terraform configuration in `.tfctl/` (add this to your `.gitignore`).
90
93
 
91
94
  Anatomy of a tfctl command:
92
95
 
96
+ [source,shell]
93
97
  ----
94
98
  tfctl -c CONFIG_FILE TARGET_OPTIONS -- TERRAFORM_COMMAND
95
99
  ----
@@ -102,7 +106,7 @@ tfctl -c CONFIG_FILE TARGET_OPTIONS -- TERRAFORM_COMMAND
102
106
  options. See https://www.terraform.io/docs/commands/index.html[Terraform
103
107
  commands] for details.
104
108
 
105
- NOTE: You must have your AWS credentials configured before running tfctl or run
109
+ NOTE: You must have your AWS credentials configured before you run `tfctl`, or run
106
110
  it using an AWS credentials helper such as
107
111
  https://github.com/99designs/aws-vault[aws-vault].
108
112
 
@@ -110,18 +114,21 @@ https://github.com/99designs/aws-vault[aws-vault].
110
114
 
111
115
  Show help:
112
116
 
117
+ [source,shell]
113
118
  ----
114
119
  tfctl -h
115
120
  ----
116
121
 
117
122
  Show merged configuration:
118
123
 
124
+ [source,shell]
119
125
  ----
120
126
  tfctl -s
121
127
  ----
122
128
 
123
129
  List all discovered accounts:
124
130
 
131
+ [source,shell]
125
132
  ----
126
133
  tfctl --all -l
127
134
  ----
@@ -129,49 +136,56 @@ tfctl --all -l
129
136
  TIP: This can be narrowed down using targeting options and is a good way to
130
137
  test what accounts match.
131
138
 
132
- Run Terraform init across all accounts:
139
+ Run `terraform init` across all accounts:
133
140
 
141
+ [source,shell]
134
142
  ----
135
143
  tfctl --all -- init
136
144
  ----
137
145
 
138
- Run plan in `test` OU accounts:
146
+ Plan Terraform across all accounts in the `test` OU:
139
147
 
148
+ [source,shell]
140
149
  ----
141
150
  tfctl -o test -- plan
142
151
  ----
143
152
 
144
- Run plan in `live` accounts assuming that `live` is a child OU in multiple
153
+ Plan Terraform in `live` accounts, assuming that `live` is a child OU in multiple
145
154
  organization units:
146
155
 
156
+ [source,shell]
147
157
  ----
148
158
  tfctl -o '.*/live' -- plan
149
159
  ----
150
160
 
151
- Run plan in an individual account:
161
+ Run a plan for an individual account:
152
162
 
163
+ [source,shell]
153
164
  ----
154
165
  tfctl -a example-account - plan
155
166
  ----
156
167
 
157
- Run apply in all accounts:
168
+ Apply Terraform changes across all accounts:
158
169
 
170
+ [source,shell]
159
171
  ----
160
172
  tfctl --all -- apply
161
173
  ----
162
174
 
163
- Run destroy in `test` OU accounts:
175
+ Destroy Terraform-managed resources in all the `test` OU accounts:
164
176
 
177
+ [source,shell]
165
178
  ----
166
179
  tfctl -o test -- destroy -auto-approve
167
180
  ----
168
181
 
169
182
  Don't buffer the output:
170
183
 
184
+ [source,shell]
171
185
  ----
172
186
  tfctl -a example-account -u -- plan
173
187
  ----
174
188
 
175
189
  This will show output in real time. Usually output is buffered and displayed
176
- after Terraform command finishes to make it more readable when running across
177
- multiple accounts in parallel.
190
+ after the Terraform command finishes, to make it more readable when running
191
+ across multiple accounts in parallel.
@@ -24,8 +24,8 @@ toc::[]
24
24
 
25
25
  == Overview
26
26
 
27
- Tfctl retrieves initial account configuration from AWS Organizations and merges
28
- it with configuration specified in a yaml file (`tfctl.yaml` by default).
27
+ `tfctl` retrieves initial account configuration from AWS Organizations and merges
28
+ it with configuration specified in YAML format (`tfctl.yaml` by default).
29
29
 
30
30
  The configuration is merged in the following order:
31
31
 
@@ -83,14 +83,16 @@ above.
83
83
 
84
84
  == Handling secrets
85
85
 
86
- No secrets should be committed into Terraform or tfctl configuration. Use AWS
87
- Secrets Manager instead and retrieve in Terraform profiles using
86
+ CAUTION: Do not commit secrets into your Terraform or tfctl configuration.
87
+
88
+ Instead, use AWS Secrets Manager and retrieve secrets in Terraform profiles using
89
+ the
88
90
  https://www.terraform.io/docs/providers/aws/d/secretsmanager_secret.html[secrets
89
- manager data source]
91
+ manager data source].
90
92
 
91
93
  == Configuration Schema
92
94
 
93
- Config file is validated using https://json-schema.org/[JSON Schema].
95
+ The configuration file is validated using https://json-schema.org/[JSON Schema].
94
96
 
95
97
  The schema is defined in
96
98
  https://github.com/scalefactory/tfctl/blob/master/lib/tfctl/schema.rb[lib/tfctl/schema.rb]
@@ -31,7 +31,7 @@ toc::[]
31
31
  For state tracking we're going to create a dedicated `shared-services` account
32
32
  under a `mgmt` organization unit. We'll use S3 for state storage and DynamoDB
33
33
  for locking. `TerraformState` IAM role will be created for cross account
34
- access to state resources from the primary account.
34
+ access to state resources from the primary AWS account.
35
35
 
36
36
  In the primary account we'll create a `TfctlOrgAccess` role. It gives tfctl
37
37
  read only access to AWS Organizations which is used to discover accounts and
@@ -50,9 +50,10 @@ and provision a couple of accounts for testing.
50
50
 
51
51
  Before starting you'll need:
52
52
 
53
- * Control Tower set up in your primary account.
54
- * A user with `AdministratorAccess` privileges in primary account.
55
- * AWS CLI tools installed on your machine.
53
+ * An AWS account that is part of an Organization.
54
+ * Control Tower set up in your primary AWS account.
55
+ * A user with `AdministratorAccess` privileges in your primary AWS account.
56
+ * AWS CLI tools installed on your local machine.
56
57
  * Terraform 0.12 or higher.
57
58
 
58
59
  == Configure Control Tower
@@ -74,6 +75,7 @@ approximately 20 mins to provision one.
74
75
 
75
76
  == Install tfctl
76
77
 
78
+ [source,shell]
77
79
  ----
78
80
  git clone git@github.com:scalefactory/tfctl.git
79
81
  cd tfctl/ && sudo make install
@@ -85,17 +87,21 @@ It's assumed you have configured AWS CLI access to the primary account.
85
87
 
86
88
  We'll use CloudFormation templates in `examples/bootstrap/`.
87
89
 
88
- First export configuration using environment variables making sure to change to
89
- values to suit your set up:
90
+ First export configuration using environment variables, making sure to change to
91
+ values to suit your setup:
90
92
 
93
+ [source,shell]
91
94
  ----
92
- export PRIMARY_ACCOUNT_ID=11111111
93
- export SHARED_SERVICES_ACCOUNT_ID=22222222
95
+ # Change these to match your setup
96
+ export PRIMARY_ACCOUNT_ID=123456789012
97
+ export SHARED_SERVICES_ACCOUNT_ID=345678901234
94
98
  export STATE_BUCKET_NAME='example-terraform-state'
99
+ export AWS_REGION=eu-west-1
95
100
  ----
96
101
 
97
102
  Create the remote state resources stack set:
98
103
 
104
+ [source,shell]
99
105
  ----
100
106
  cd examples/bootstrap/
101
107
 
@@ -107,31 +113,34 @@ aws cloudformation create-stack-set \
107
113
  --execution-role-name AWSControlTowerExecution \
108
114
  --administration-role-arn arn:aws:iam::${PRIMARY_ACCOUNT_ID}:role/service-role/AWSControlTowerStackSetRole \
109
115
  --parameters ParameterKey=PrimaryAccountId,ParameterValue=${PRIMARY_ACCOUNT_ID} \
110
- ParameterKey=TerraformStateBucket,ParameterValue=${STATE_BUCKET_NAME}
116
+ ParameterKey=TerraformStateBucket,ParameterValue="${STATE_BUCKET_NAME}"
111
117
  ----
112
118
 
113
- Create a stack set instance in you shared services account:
119
+ Create a stack set instance in your shared services account:
114
120
 
121
+ [source,shell]
115
122
  ----
116
123
  aws cloudformation create-stack-instances \
117
124
  --stack-set-name TerraformState \
118
125
  --accounts ${SHARED_SERVICES_ACCOUNT_ID} \
119
- --regions eu-west-1
126
+ --regions ${AWS_REGION}
120
127
  ----
121
128
 
122
129
  Check status:
123
130
 
131
+ [source,shell]
124
132
  ----
125
133
  aws cloudformation describe-stack-instance \
126
134
  --stack-set-name TerraformState \
127
135
  --stack-instance-account ${SHARED_SERVICES_ACCOUNT_ID} \
128
- --stack-instance-region eu-west-1
136
+ --stack-instance-region ${AWS_REGION}
129
137
  ----
130
138
 
131
139
  NOTE: Initial status will be `OUTDATED`, it should change to `CURRENT` once deployed.
132
140
 
133
- Deploy `TfctlOrgAccess` IAM role stack:
141
+ Deploy the `TfctlOrgAccess` IAM role stack:
134
142
 
143
+ [source,shell]
135
144
  ----
136
145
  aws cloudformation create-stack \
137
146
  --stack-name TfctlOrgAccess \
@@ -142,6 +151,7 @@ aws cloudformation create-stack \
142
151
 
143
152
  Check status:
144
153
 
154
+ [source,shell]
145
155
  ----
146
156
  aws cloudformation describe-stacks --stack-name TfctlOrgAccess
147
157
  ----
@@ -158,7 +168,7 @@ You need to modify the following parameters:
158
168
  * `tf_state_bucket` - set to `$STATE_BUCKET_NAME`
159
169
  * `tf_state_role_arn` - set shared services account ID
160
170
  * `tfctl_role_arn` - set primary account ID
161
- * `primary_account` - set the primary account name. You can find it in AWS Organizations.
171
+ * `primary_account` - set the primary account name. You can find it through AWS Organizations in the console.
162
172
 
163
173
  TIP: You should keep your project directory under version control.
164
174
 
@@ -169,43 +179,51 @@ and `mgmt` OUs.
169
179
 
170
180
  NOTE: Run tfctl commands from the root of you project directory.
171
181
 
172
- First dump the configuration to verify everything works:
182
+ First, dump the configuration to verify everything works:
173
183
 
184
+ [source,shell]
174
185
  ----
175
186
  tfctl -s
176
187
  ----
177
188
 
178
- This will not make any changes but will print out a yaml containing the final,
189
+ This will not make any changes but will print out YAML containing the final,
179
190
  merged configuration data. It should contain a list of discovered accounts and
180
191
  their configuration.
181
192
 
182
- Initialise terraform for all discovered accounts:
193
+ Initialise Terraform for all discovered accounts:
183
194
 
195
+ [source,shell]
184
196
  ----
185
197
  tfctl --all -- init
186
198
  ----
187
199
 
188
200
  Tfctl will run Terraform against all accounts in parallel.
189
201
 
190
- Run plan:
202
+ `plan` the Terraform:
191
203
 
204
+ [source,shell]
192
205
  ----
193
206
  tfctl --all -- plan
194
207
  ----
195
208
 
196
- and apply:
209
+ and `apply` it:
197
210
 
211
+ [source,shell]
198
212
  ----
199
213
  tfctl --all -- apply
200
214
  ----
201
215
 
202
- To destroy created resources run:
203
216
 
217
+ == Clean up
218
+
219
+ To destroy created resources, run:
220
+
221
+ [source,shell]
204
222
  ----
205
223
  tfctl --all -- destroy -auto-approve
206
224
  ----
207
225
 
208
- That's it! You can now execute terraform across your Control Tower estate.
226
+ That's it! You can now execute Terraform across your Control Tower estate.
209
227
 
210
228
  TIP: Your project directory should be under version control excluding the
211
229
  `.tfctl` directory which is automatically generated.
@@ -20,7 +20,7 @@ endif::[]
20
20
 
21
21
  = IAM roles
22
22
 
23
- Tfctl usually requires three IAM roles to be configured:
23
+ `tfctl` usually requires three IAM roles to be configured:
24
24
 
25
25
  * `TfctlRole` - read only access to AWS Organizations set up in the primary account.
26
26
  * `TerraformStateRole` - access to remote state resources (S3, DynamoDB) in the
@@ -28,7 +28,7 @@ Tfctl usually requires three IAM roles to be configured:
28
28
  * `TerraformExecutionRole` - configured in all spoke accounts and used for executing Terraform.
29
29
 
30
30
  The user executing tfctl needs permission to assume all three roles cross
31
- account. Tfctl will assume roles automatically for you.
31
+ account. Once these are configured, tfctl automatically assumes roles for you.
32
32
 
33
33
  It's possible to configure different Terraform execution roles in different
34
34
  spoke accounts based on OU or account names. This can be used to restrict
@@ -50,12 +50,12 @@ The configuration data is exposed to terraform via a profile `config` variable.
50
50
  It also defines Terraform and tfctl configuration such as state tracking and
51
51
  what IAM roles to use.
52
52
 
53
- By default tfctl will use `tfctl.yaml` in it's current working directory. You
53
+ By default, tfctl will use `tfctl.yaml` in its current working directory. You
54
54
  can specify a different file using `-c`. Multiple configurations are supported
55
55
  in the same project directory and generated data will be stored separately for
56
56
  each config file in `.tfctl/`.
57
57
 
58
- == profiles
58
+ == `profiles`
59
59
 
60
60
  Profiles are re-usable collections of resources which can be applied to
61
61
  accounts. They are implemented just like usual modules but provide an
@@ -64,6 +64,6 @@ other data sources). Profiles often compose multiple modules and provide
64
64
  configuration data to them. This approach makes it possible to re-use standard
65
65
  modules (e.g. Terraform module registry).
66
66
 
67
- == modules
67
+ == `modules`
68
68
 
69
69
  Standard Terraform modules.
@@ -71,23 +71,25 @@ module Tfctl
71
71
  @aws_org_client.list_children(
72
72
  child_type: 'ORGANIZATIONAL_UNIT',
73
73
  parent_id: parent_id,
74
- ).children.each do |child|
75
-
76
- begin
77
- ou = @aws_org_client.describe_organizational_unit(
78
- organizational_unit_id: child.id,
79
- ).organizational_unit
80
- rescue Aws::Organizations::Errors::TooManyRequestsException
81
- # FIXME: - use logger
82
- puts 'AWS Organizations: too many requests. Retrying in 5 secs.'
83
- sleep 5
84
- retries += 1
85
- retry if retries < 10
86
- end
74
+ ).each do |resp|
75
+ resp.children.each do |child|
76
+
77
+ begin
78
+ ou = @aws_org_client.describe_organizational_unit(
79
+ organizational_unit_id: child.id,
80
+ ).organizational_unit
81
+ rescue Aws::Organizations::Errors::TooManyRequestsException
82
+ # FIXME: - use logger
83
+ puts 'AWS Organizations: too many requests. Retrying in 5 secs.'
84
+ sleep 5
85
+ retries += 1
86
+ retry if retries < 10
87
+ end
87
88
 
88
- ou_name = parent_name == :root ? ou.name.to_sym : "#{parent_name}/#{ou.name}".to_sym
89
+ ou_name = parent_name == :root ? ou.name.to_sym : "#{parent_name}/#{ou.name}".to_sym
89
90
 
90
- output[ou_name] = ou.id
91
+ output[ou_name] = ou.id
92
+ end
91
93
  end
92
94
  output
93
95
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tfctl
4
- VERSION = '1.1.0'
4
+ VERSION = '1.1.1'
5
5
  end
@@ -25,12 +25,12 @@ Gem::Specification.new do |spec|
25
25
 
26
26
  # Think when adding new dependencies. Is it really necessary?
27
27
  # "The things you own end up owning you" etc.
28
- spec.add_dependency 'aws-sdk-organizations', '~> 1.13'
28
+ spec.add_dependency 'aws-sdk-organizations', '~> 1.40'
29
29
  spec.add_dependency 'json_schemer', '~> 0.2'
30
- spec.add_dependency 'parallel', '~> 1.17'
30
+ spec.add_dependency 'parallel', '~> 1.19'
31
31
  spec.add_dependency 'terminal-table', '~> 1.8'
32
32
 
33
33
  spec.add_development_dependency 'guard-rspec', '~> 4.7'
34
- spec.add_development_dependency 'rspec', '~> 3.8'
35
- spec.add_development_dependency 'rubocop', '~> 0.76'
34
+ spec.add_development_dependency 'rspec', '~> 3.9'
35
+ spec.add_development_dependency 'rubocop', '~> 0.84'
36
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tfctl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Wasilczuk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-15 00:00:00.000000000 Z
11
+ date: 2020-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-organizations
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.13'
19
+ version: '1.40'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.13'
26
+ version: '1.40'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: json_schemer
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.17'
47
+ version: '1.19'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.17'
54
+ version: '1.19'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: terminal-table
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -86,28 +86,28 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '3.8'
89
+ version: '3.9'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '3.8'
96
+ version: '3.9'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rubocop
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0.76'
103
+ version: '0.84'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0.76'
110
+ version: '0.84'
111
111
  description:
112
112
  email:
113
113
  - akw@scalefactory.com