minfra-cli 1.12.1 → 1.13.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ca90567af36553b84c7a69020e85970c56591d65f7546d1c22c1969cc9bd58f3
4
- data.tar.gz: 451949094ac8fe4a3bc502b10ad1f8924f2cb5688da1297594061ab4c4e4780d
3
+ metadata.gz: 013e2aad3df9fffb13eaceeac4ccc3306ac4dfedb9ef7f0019251ee4238e9dbf
4
+ data.tar.gz: 266a3cbfbcbc27eda6411806a20c1f3d5547d4b02fda404531861eb538f1be2b
5
5
  SHA512:
6
- metadata.gz: 6007ef02b33c582bb9bd002cb4b22adda6dd4e5ec32cf7646beb9597ef03181b8944a463fe5db943c84d19c6ed50c8b324a5bb383cfa975b0f4301e1ffb214d5
7
- data.tar.gz: 1908c4e6f95565dc3ebdf2bf371808021166997691c0fcb3514a89b2d47cf379d551b1f5f1934032cfe08afcc180f6f4d75b39d694c584d036f46a5f86aa8f05
6
+ metadata.gz: ab2a2990bec284c339aaee8b49998cbf93c5cc53179a70ac6ddc6c6d557eb30b3b5b594877d744875bbeb200b90533630e61d60a84b016dab044e128b74aa6b0
7
+ data.tar.gz: b2e7767759e9c2eb7391974a46d1c1bec649f5247f580a7f7aef3b3bbc98e451d1ef882bdae0fc52fbfa12ad2d572a3d8daefb0a7a05f774909bf1aab1e2f129
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ # 1.13.0
2
+ * secrets can be rendered with apply (currently hardcoded)
3
+ * moved most output to debug level
1
4
  # 1.12.1
2
5
  * replaced all relevant system calls with new runners (fixed apply and
3
6
  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.0'.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
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.0
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-10 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