minfra-cli 1.12.1 → 1.13.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: ca90567af36553b84c7a69020e85970c56591d65f7546d1c22c1969cc9bd58f3
4
- data.tar.gz: 451949094ac8fe4a3bc502b10ad1f8924f2cb5688da1297594061ab4c4e4780d
3
+ metadata.gz: 13ee4d15bbbb5847263526a32b76a010546c2f4ef34699c4dee6411f593ec6ac
4
+ data.tar.gz: 9396bde3f3ce5d96a2a38299a4dd74c6284bf040da3f69bf565663ceb77f9715
5
5
  SHA512:
6
- metadata.gz: 6007ef02b33c582bb9bd002cb4b22adda6dd4e5ec32cf7646beb9597ef03181b8944a463fe5db943c84d19c6ed50c8b324a5bb383cfa975b0f4301e1ffb214d5
7
- data.tar.gz: 1908c4e6f95565dc3ebdf2bf371808021166997691c0fcb3514a89b2d47cf379d551b1f5f1934032cfe08afcc180f6f4d75b39d694c584d036f46a5f86aa8f05
6
+ metadata.gz: e3b2eabee4c39d00457e708ddcaddd843305a85cb57bc2e6371354c477e7ea2ceaa2c34ecd2609a452a76f244bfddeaa93fc8f72ff2118618af488728f727c22
7
+ data.tar.gz: 9e1094aadc780ddd94de465b11ab988d3698937b455cae86a9dc42b4100984e2f358b29aac1f489524d6de297019ff44e14fc374a2ee4586276edbca414f3d25
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ # 1.13.1
2
+ * BUG: not every deployer contexts have cleanups
3
+ # 1.13.0
4
+ * secrets can be rendered with apply (currently hardcoded)
5
+ * moved most output to debug level
1
6
  # 1.12.1
2
7
  * replaced all relevant system calls with new runners (fixed apply and
3
8
  generic_secrets)
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- minfra-cli (1.7.0)
5
- activesupport (~> 6.1)
4
+ minfra-cli (1.12.0)
5
+ activesupport (= 7.0.7.2)
6
6
  erubis (~> 2.7)
7
7
  hashie (~> 3.5)
8
8
  hiera (= 3.9.0)
@@ -15,16 +15,14 @@ PATH
15
15
  GEM
16
16
  remote: https://rubygems.org/
17
17
  specs:
18
- activesupport (6.1.7.2)
18
+ activesupport (7.0.7.2)
19
19
  concurrent-ruby (~> 1.0, >= 1.0.2)
20
20
  i18n (>= 1.6, < 2)
21
21
  minitest (>= 5.1)
22
22
  tzinfo (~> 2.0)
23
- zeitwerk (~> 2.3)
24
- concurrent-ruby (1.2.0)
23
+ concurrent-ruby (1.2.2)
25
24
  diff-lcs (1.5.0)
26
- domain_name (0.5.20190701)
27
- unf (>= 0.0.5, < 1.0.0)
25
+ domain_name (0.6.20231109)
28
26
  erubis (2.7.0)
29
27
  hashie (3.6.0)
30
28
  hiera (3.9.0)
@@ -37,42 +35,38 @@ GEM
37
35
  http-accept (1.7.0)
38
36
  http-cookie (1.0.5)
39
37
  domain_name (~> 0.5)
40
- i18n (1.12.0)
38
+ i18n (1.14.1)
41
39
  concurrent-ruby (~> 1.0)
42
- mime-types (3.4.1)
40
+ mime-types (3.5.1)
43
41
  mime-types-data (~> 3.2015)
44
- mime-types-data (3.2022.0105)
45
- minitest (5.17.0)
42
+ mime-types-data (3.2023.1205)
43
+ minitest (5.20.0)
46
44
  netrc (0.11.0)
47
- optimist (3.0.1)
45
+ optimist (3.1.0)
48
46
  rake (12.3.3)
49
47
  rest-client (2.1.0)
50
48
  http-accept (>= 1.7.0, < 2.0)
51
49
  http-cookie (>= 1.0.2, < 2.0)
52
50
  mime-types (>= 1.16, < 4.0)
53
51
  netrc (~> 0.8)
54
- rspec (3.11.0)
55
- rspec-core (~> 3.11.0)
56
- rspec-expectations (~> 3.11.0)
57
- rspec-mocks (~> 3.11.0)
58
- rspec-core (3.11.0)
59
- rspec-support (~> 3.11.0)
60
- rspec-expectations (3.11.1)
52
+ rspec (3.12.0)
53
+ rspec-core (~> 3.12.0)
54
+ rspec-expectations (~> 3.12.0)
55
+ rspec-mocks (~> 3.12.0)
56
+ rspec-core (3.12.2)
57
+ rspec-support (~> 3.12.0)
58
+ rspec-expectations (3.12.3)
61
59
  diff-lcs (>= 1.2.0, < 2.0)
62
- rspec-support (~> 3.11.0)
63
- rspec-mocks (3.11.1)
60
+ rspec-support (~> 3.12.0)
61
+ rspec-mocks (3.12.6)
64
62
  diff-lcs (>= 1.2.0, < 2.0)
65
- rspec-support (~> 3.11.0)
66
- rspec-support (3.11.1)
63
+ rspec-support (~> 3.12.0)
64
+ rspec-support (3.12.1)
67
65
  table_print (1.5.6)
68
- thor (1.2.1)
69
- timecop (0.9.5)
66
+ thor (1.3.0)
67
+ timecop (0.9.8)
70
68
  tzinfo (2.0.6)
71
69
  concurrent-ruby (~> 1.0)
72
- unf (0.1.4)
73
- unf_ext
74
- unf_ext (0.0.8.2)
75
- zeitwerk (2.6.6)
76
70
 
77
71
  PLATFORMS
78
72
  ruby
data/README.md CHANGED
@@ -7,7 +7,7 @@ Is a KIND (k8s in docker) based development environment.
7
7
 
8
8
  ## Expected hiera data
9
9
 
10
- * l("cluster").id: the k8s name of the cluster
10
+ * l("cluster.id"): the k8s name of the cluster
11
11
 
12
12
 
13
13
 
@@ -1,5 +1,5 @@
1
1
  module Minfra
2
2
  module Cli
3
- VERSION = '1.12.1'.freeze
3
+ VERSION = '1.13.1'.freeze
4
4
  end
5
5
  end
@@ -378,12 +378,39 @@ module Orchparty
378
378
  self
379
379
  end
380
380
 
381
- def secrets(name, &block)
381
+ # secrets can be aprt of the helm chart or we write them to
382
+ # a file and later apply it
383
+ # apiVersion: v1
384
+ # kind: Secret
385
+ # metadata:
386
+ # name: dotfile-secret
387
+ # data:
388
+ # key: base64_encoded_value
389
+
390
+ def secrets(name, deploy: :helm, &block)
391
+ case deploy
392
+ when :helm
382
393
  result = ServiceBuilder.build(name, "chart-secret", block)
383
394
  @application.services[name] = result
384
395
  @application._service_order << name
385
396
  @node._services << name
386
397
  self
398
+ when :apply
399
+ result = ServiceBuilder.build(name, "apply", block)
400
+ file = Tempfile.create(name)
401
+ result.tmp_file=file.path
402
+ file.puts "apiVersion: v1\nkind: Secret\nmetadata:\n name: #{name}\ntype: Opaque\ndata:"
403
+ result._.each do |key, value|
404
+ file.puts " #{key}: #{Base64.strict_encode64(value.respond_to?(:call) ? value.call : value)}"
405
+ end
406
+ file.close
407
+ @application.services[name] = result
408
+ @application._service_order << name
409
+ when :none
410
+
411
+ else
412
+ raise "unknown secret type: #{type}, known tpyes: [helm, apply]"
413
+ end
387
414
  end
388
415
 
389
416
  end
@@ -15,24 +15,24 @@ module Orchparty
15
15
  class Context
16
16
  include ::Minfra::Cli::Logging
17
17
 
18
- attr_accessor :cluster_name, :namespace, :dir_path, :app_config, :options
18
+ attr_accessor :cluster_name, :namespace, :dir_path, :app_config, :options, :service
19
19
 
20
- def initialize(cluster_name:, namespace:, file_path:, app_config:, app:, out_io: $stdout)
20
+ def initialize(cluster_name:, namespace:, file_path:, app_config:, app:, service:, out_io: $stdout)
21
21
  self.cluster_name = cluster_name
22
22
  self.namespace = namespace
23
23
  self.dir_path = file_path
24
24
  self.app_config = app_config
25
25
  @app = app
26
26
  @out_io = out_io
27
+ self.service = service # ugly naming, should be 'context'?
27
28
  self.options = options
28
29
  end
29
30
 
30
31
  def template(file_path, helm, flag: '-f ', fix_file_path: nil)
31
32
  return '' unless file_path
32
33
 
33
- puts "Rendering: #{file_path}"
34
- file_path = File.join(dir_path, file_path)
35
-
34
+ debug "Rendering: #{file_path}"
35
+ file_path = File.join(dir_path, file_path) unless file_path.start_with?('/')
36
36
  if file_path.end_with?('.erb')
37
37
  helm.application = OpenStruct.new(cluster_name: cluster_name, namespace: namespace)
38
38
  template = Erubis::Eruby.new(File.read(file_path))
@@ -46,124 +46,125 @@ module Orchparty
46
46
  "#{flag}#{fix_file_path || file_path}"
47
47
  end
48
48
 
49
- def print_install(helm)
49
+ def print_install
50
50
  @out_io.puts '---'
51
- @out_io.puts install_cmd(helm, value_path(helm)).cmd
52
- @out_io.puts upgrade_cmd(helm, value_path(helm)).cmd
51
+ @out_io.puts install_cmd(value_path).cmd
52
+ @out_io.puts upgrade_cmd(value_path).cmd
53
53
  @out_io.puts '---'
54
- @out_io.puts File.read(template(value_path(helm), helm, flag: '')) if value_path(helm)
54
+ @out_io.puts File.read(template(value_path, service, flag: '')) if value_path
55
+ cleanup if respond_to?(:cleanup)
55
56
  end
56
57
 
57
58
  # On 05.02.2021 we have decided that it would be best to print both commands.
58
59
  # This way it would be possible to debug both upgrade and install and also people would not see git diffs all the time.
59
- def print_upgrade(helm)
60
- print_install(helm)
60
+ def print_upgrade
61
+ print_install
61
62
  end
62
63
 
63
- def upgrade(helm)
64
- @out_io.puts upgrade_cmd(helm).run.stdout
64
+ def upgrade
65
+ @out_io.puts upgrade_cmd.run.stdout
66
+ cleanup if respond_to?(:cleanup)
65
67
  end
66
68
 
67
- def install(helm)
68
- @out_io.puts install_cmd(helm).run.stdout
69
+ def install
70
+ @out_io.puts install_cmd.run.stdout
71
+ cleanup if respond_to?(:cleanup)
69
72
  end
70
73
  end
71
74
 
72
75
  class Helm < Context
73
- def value_path(helm)
74
- helm[:values]
76
+ def value_path
77
+ service[:values]
75
78
  end
76
79
 
77
- def upgrade_cmd(helm, fix_file_path = nil)
78
- Minfra::Cli::HelmRunner.new("upgrade --namespace #{namespace} --kube-context #{cluster_name} --version #{helm.version} #{helm.name} #{helm.chart} #{template(
79
- value_path(helm), helm, fix_file_path: fix_file_path
80
+ def upgrade_cmd(fix_file_path = nil)
81
+ Minfra::Cli::HelmRunner.new("upgrade --namespace #{namespace} --kube-context #{cluster_name} --version #{service.version} #{service.name} #{service.chart} #{template(
82
+ value_path, service, fix_file_path: fix_file_path
80
83
  )}")
81
84
  end
82
85
 
83
- def install_cmd(helm, fix_file_path = nil)
84
- Minfra::Cli::HelmRunner.new("install --create-namespace --namespace #{namespace} --kube-context #{cluster_name} --version #{helm.version} #{helm.name} #{helm.chart} #{template(
85
- value_path(helm), helm, fix_file_path: fix_file_path
86
+ def install_cmd(fix_file_path = nil)
87
+ Minfra::Cli::HelmRunner.new("install --create-namespace --namespace #{namespace} --kube-context #{cluster_name} --version #{service.version} #{service.name} #{service.chart} #{template(
88
+ value_path, service, fix_file_path: fix_file_path
86
89
  )}")
87
90
  end
88
91
  end
89
92
 
90
93
  class Apply < Context
91
- def value_path(apply)
92
- apply[:name]
94
+ def value_path
95
+ service[:tmp_file] || service[:name]
93
96
  end
94
97
 
95
- def upgrade_cmd(apply, fix_file_path = nil)
96
- Minfra::Cli::KubeCtlRunner.new("apply --namespace #{namespace} --context #{cluster_name} #{template(
97
- value_path(apply), apply, fix_file_path: fix_file_path
98
- )}")
98
+ def upgrade_cmd(fix_file_path = nil)
99
+ Minfra::Cli::KubeCtlRunner.new("apply --namespace #{namespace} --context #{cluster_name} #{template(value_path,
100
+ service, fix_file_path: fix_file_path)}")
99
101
  end
100
102
 
101
- def install_cmd(apply, fix_file_path = nil)
102
- Minfra::Cli::KubeCtlRunner.new("apply --namespace #{namespace} --context #{cluster_name} #{template(
103
- value_path(apply), apply, fix_file_path: fix_file_path
104
- )}")
103
+ def install_cmd(fix_file_path = nil)
104
+ Minfra::Cli::KubeCtlRunner.new("apply --namespace #{namespace} --context #{cluster_name} #{template(value_path,
105
+ service, fix_file_path: fix_file_path)}")
105
106
  end
106
- end
107
107
 
108
- class SecretGeneric < Context
109
- def value_path(secret)
110
- secret[:from_file]
108
+ def cleanup
109
+ File.unlink(service[:tmp_file]) if service[:tmp_file]
111
110
  end
111
+ end
112
112
 
113
- def upgrade_cmd(secret, fix_file_path = nil)
114
- Minfra::Cli::KubeCtlRunner.new("--namespace #{namespace} --context #{cluster_name} create secret generic --dry-run -o yaml #{secret[:name]} #{template(
115
- value_path(secret), secret, flag: '--from-file=', fix_file_path: fix_file_path
116
- )} | #{apply_cmd(cluster_name).cmd}")
113
+ class SecretGeneric < Context
114
+ def value_path
115
+ service[:from_file]
117
116
  end
118
117
 
119
- def install_cmd(secret, fix_file_path = nil)
120
- Minfra::Cli::KubeCtlRunner.new("--namespace #{namespace} --context #{cluster_name} create secret generic --dry-run -o yaml #{secret[:name]} #{template(
121
- value_path(secret), secret, flag: '--from-file=', fix_file_path: fix_file_path
122
- )} | #{apply_cmd(cluster_name).cmd}")
118
+ def upgrade_cmd(fix_file_path = nil)
119
+ "kubectl --namespace #{namespace} --context #{cluster_name} create secret generic --dry-run -o yaml #{service[:name]} #{template(
120
+ value_path, service, flag: '--from-file=', fix_file_path: fix_file_path
121
+ )} | kubectl --context #{cluster_name} apply -f -"
123
122
  end
124
123
 
125
- def apply_cmd(cluster_name)
126
- Minfra::Cli::KubeCtlRunner.new("--context #{cluster_name} apply -f -")
124
+ def install_cmd(fix_file_path = nil)
125
+ "kubectl --namespace #{namespace} --context #{cluster_name} create secret generic --dry-run -o yaml #{service[:name]} #{template(
126
+ value_path, service, flag: '--from-file=', fix_file_path: fix_file_path
127
+ )} | kubectl --context #{cluster_name} apply -f -"
127
128
  end
128
129
  end
129
130
 
130
131
  class Label < Context
131
- def print_install(label)
132
+ def print_install
132
133
  @out_io.puts '---'
133
- @out_io.puts install_cmd(label)
134
+ @out_io.puts install_cmd
134
135
  end
135
136
 
136
- def print_upgrade(label)
137
+ def print_upgrade
137
138
  @out_io.puts '---'
138
- @out_io.puts upgrade_cmd(label)
139
+ @out_io.puts upgrade_cmd
139
140
  end
140
141
 
141
- def upgrade_cmd(label)
142
- Minfra::Cli::KubeCtlRunner.new("--namespace #{namespace} --context #{cluster_name} label --overwrite #{label[:resource]} #{label[:name]} #{label['value']}")
142
+ def upgrade_cmd
143
+ "kubectl --namespace #{namespace} --context #{cluster_name} label --overwrite #{service[:resource]} #{service[:name]} #{service['value']}"
143
144
  end
144
145
 
145
- def install_cmd(label)
146
- Minfra::Cli::KubeCtlRunner.new("--namespace #{namespace} --context #{cluster_name} label --overwrite #{label[:resource]} #{label[:name]} #{label['value']}")
146
+ def install_cmd
147
+ "kubectl --namespace #{namespace} --context #{cluster_name} label --overwrite #{service[:resource]} #{service[:name]} #{service['value']}"
147
148
  end
148
149
  end
149
150
 
150
151
  class Wait < Context
151
- def print_install(wait)
152
+ def print_install
152
153
  @out_io.puts '---'
153
- @out_io.puts wait.cmd
154
+ @out_io.puts service.cmd
154
155
  end
155
156
 
156
- def print_upgrade(wait)
157
+ def print_upgrade
157
158
  @out_io.puts '---'
158
- @out_io.puts wait.cmd
159
+ @out_io.puts service.cmd
159
160
  end
160
161
 
161
- def upgrade(wait)
162
- eval(wait.cmd)
162
+ def upgrade
163
+ eval(service.cmd)
163
164
  end
164
165
 
165
- def install(wait)
166
- eval(wait.cmd)
166
+ def install
167
+ eval(service.cmd)
167
168
  end
168
169
  end
169
170
 
@@ -176,49 +177,48 @@ module Orchparty
176
177
  end
177
178
  end
178
179
 
179
- def print_install(chart)
180
- build_chart(chart) do |chart_path|
180
+ def print_install
181
+ build_chart do |chart_path|
181
182
  cmd = "helm template --namespace #{namespace} --debug --kube-context #{cluster_name} --output-dir #{chart_path.join(
182
183
  '..', 'helm_expanded'
183
- )} #{chart.name} #{chart_path}"
184
+ )} #{service.name} #{chart_path}"
184
185
  @out_io.puts `$cmd`
185
186
  if system("#{cmd} > /dev/null")
186
187
 
187
- info('helm template check: OK')
188
+ debug('Helm: template check: OK')
188
189
  else
189
- error('helm template check: FAIL')
190
+ error('Helm: template check: FAIL')
190
191
  end
191
192
  end
192
193
  end
193
194
 
194
- def print_upgrade(chart)
195
- print_install(chart)
195
+ def print_upgrade
196
+ print_install
196
197
  end
197
198
 
198
- def install(chart)
199
- info("Install: #{chart.name}")
200
- build_chart(chart) do |chart_path|
201
- res = Minfra::Cli::HelmRunner.new("install --create-namespace --namespace #{namespace} --kube-context #{cluster_name} #{chart.name} #{chart_path}").run
199
+ def install
200
+ debug("Install: #{service.name}")
201
+ build_chart do |chart_path|
202
+ res = Minfra::Cli::HelmRunner.new("install --create-namespace --namespace #{namespace} --kube-context #{cluster_name} #{service.name} #{chart_path}").run
202
203
  @out_io.puts res.stdout
203
204
  end
204
205
  end
205
206
 
206
- def upgrade(chart)
207
- info("Upgrade: #{chart}")
208
- build_chart(chart) do |chart_path|
209
- res = Minfra::Cli::HelmRunner.new("upgrade --namespace #{namespace} --kube-context #{cluster_name} #{chart.name} #{chart_path}").run
207
+ def upgrade
208
+ debug("Upgrade: #{service.name}: #{service._services.join(', ')}")
209
+ build_chart do |chart_path|
210
+ res = Minfra::Cli::HelmRunner.new("upgrade --namespace #{namespace} --kube-context #{cluster_name} #{service.name} #{chart_path}").run
210
211
  @out_io.puts res.stdout
211
212
  end
212
213
  end
213
214
 
214
215
  private
215
216
 
216
- def build_chart(chart)
217
+ def build_chart
217
218
  dir = @app.status_dir.join('helm') # duplication
218
-
219
- params = chart._services.map { |s| app_config.services[s.to_sym] }.map { |s| [s.name, s] }.to_h
220
- run(templates_path: File.expand_path(chart.template, dir_path), params: params, output_chart_path: dir,
221
- chart: chart)
219
+ params = service._services.map { |s| app_config.services[s.to_sym] }.map { |s| [s.name, s] }.to_h
220
+ run(templates_path: File.expand_path(service.template, dir_path), params: params, output_chart_path: dir,
221
+ chart: service)
222
222
  yield dir
223
223
  end
224
224
 
@@ -253,7 +253,7 @@ module Orchparty
253
253
  params._used_vars = {} # here we'll collect all used vars
254
254
 
255
255
  Dir[File.join(templates_path, kind, '*.erb')].each do |template_path|
256
- info("Rendering Template: #{template_path}")
256
+ debug("Rendering Template: #{template_path}")
257
257
  template_name = File.basename(template_path, '.erb')
258
258
  output_path = File.join(output_chart_path, 'templates', "#{app_name}-#{template_name}")
259
259
 
@@ -318,7 +318,7 @@ class KubernetesApplication
318
318
  chart_name: namespace
319
319
  )
320
320
 
321
- info("generating base helm structure from: #{output_chart_path} from #{templates_path}")
321
+ debug("Minfra: generating base helm structure from: #{output_chart_path} from #{templates_path}")
322
322
  system("mkdir -p #{File.join(output_chart_path, 'templates')}")
323
323
 
324
324
  system("cp #{File.join(templates_path, 'values.yaml')} #{File.join(output_chart_path, 'values.yaml')}")
@@ -344,6 +344,8 @@ class KubernetesApplication
344
344
  current_service._services.each do |n|
345
345
  services.delete n.to_s
346
346
  end
347
+ # else
348
+ # puts "unkown service: #{name}: #{current_service._type}"
347
349
  end
348
350
  services
349
351
  end
@@ -351,18 +353,19 @@ class KubernetesApplication
351
353
  def each_service(method)
352
354
  prepare
353
355
  services = combine_charts(app_config)
356
+
354
357
  services.each do |name|
355
358
  service = app_config[:services][name]
356
- info "Service: #{name}(#{service._type}) #{method}"
359
+ debug("Generating Service: #{name}(#{service._type}) #{method}")
357
360
  deployable_class = "::Orchparty::Services::#{service._type.classify}".constantize
358
361
  deployable = deployable_class.new(cluster_name: cluster_name,
359
362
  namespace: namespace,
360
363
  file_path: file_path,
361
364
  app_config: app_config,
362
365
  out_io: @out_io,
363
- app: self)
364
-
365
- deployable.send(method, service)
366
+ app: self,
367
+ service: service)
368
+ deployable.send(method)
366
369
  end
367
370
  end
368
371
  end
data/minfra-cli.gemspec CHANGED
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_runtime_dependency "table_print", "1.5.6"
32
32
  spec.add_runtime_dependency "rest-client", "~>2.0"
33
33
  spec.add_runtime_dependency "hashie", "~>3.5"
34
- spec.add_runtime_dependency "activesupport", ">= 6.1"
34
+ spec.add_runtime_dependency "activesupport", "= 7.0.7.2"
35
35
  spec.add_runtime_dependency "erubis", "~> 2.7"
36
36
  spec.add_runtime_dependency "hiera", "3.9.0"
37
37
  spec.add_runtime_dependency "hiera-eyaml", "3.3.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minfra-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.12.1
4
+ version: 1.13.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Schrammel
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-09-06 00:00:00.000000000 Z
11
+ date: 2023-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -76,16 +76,16 @@ dependencies:
76
76
  name: activesupport
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - ">="
79
+ - - '='
80
80
  - !ruby/object:Gem::Version
81
- version: '6.1'
81
+ version: 7.0.7.2
82
82
  type: :runtime
83
83
  prerelease: false
84
84
  version_requirements: !ruby/object:Gem::Requirement
85
85
  requirements:
86
- - - ">="
86
+ - - '='
87
87
  - !ruby/object:Gem::Version
88
- version: '6.1'
88
+ version: 7.0.7.2
89
89
  - !ruby/object:Gem::Dependency
90
90
  name: erubis
91
91
  requirement: !ruby/object:Gem::Requirement