pfab 0.58.17 → 0.58.19
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 +4 -4
- data/.github/CODEOWNERS +2 -0
- data/.tool-versions +1 -1
- data/Gemfile +1 -1
- data/Gemfile.lock +4 -4
- data/README.markdown +1 -1
- data/Rakefile +1 -0
- data/lib/pfab/cli.rb +38 -1
- data/lib/pfab/templates/base.rb +34 -0
- data/lib/pfab/templates/cron.rb +3 -22
- data/lib/pfab/templates/daemon.rb +2 -17
- data/lib/pfab/templates/job.rb +2 -17
- data/lib/pfab/templates/web.rb +6 -25
- data/lib/pfab/version.rb +1 -1
- data/lib/pfab/yamls.rb +1 -0
- data/pfab.gemspec +16 -28
- metadata +9 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7691bb5b1e776fa0a627d0c0c310fd4487b00840d7696479b1cf73564e586fc
|
4
|
+
data.tar.gz: 1c9c35389d9d7afd8a8688bc01cdd50219aa6d525a0f311ac6201706a15dc9d9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b2987d1d0aa78f625c948bb39af2f6c675d0f2f609214ff57311021ad1364e55d79582b4e857189b5cf4fb14ec37b9cc4a43426eda8a8510692a37e527f5b6d
|
7
|
+
data.tar.gz: 6d9ab217334a5e06f1f2604d1b9dae6d4611707c14ae0b4d220fe7b1e0935ce0102d0c32731653e28707586f083da1a923f0d34482d66c34dd16672b33851ce9
|
data/.github/CODEOWNERS
ADDED
data/.tool-versions
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby 3.
|
1
|
+
ruby 3.3.9
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -29,8 +29,8 @@ GEM
|
|
29
29
|
builder (3.2.4)
|
30
30
|
byebug (11.1.3)
|
31
31
|
coderay (1.1.3)
|
32
|
-
commander (4.
|
33
|
-
highline (~>
|
32
|
+
commander (4.6.0)
|
33
|
+
highline (~> 2.0.0)
|
34
34
|
concurrent-ruby (1.2.3)
|
35
35
|
descendants_tracker (0.0.4)
|
36
36
|
thread_safe (~> 0.3, >= 0.3.1)
|
@@ -64,7 +64,7 @@ GEM
|
|
64
64
|
hashie (~> 3.5, >= 3.5.2)
|
65
65
|
oauth2 (~> 1.0)
|
66
66
|
hashie (3.6.0)
|
67
|
-
highline (
|
67
|
+
highline (2.0.3)
|
68
68
|
i18n (1.14.5)
|
69
69
|
concurrent-ruby (~> 1.0)
|
70
70
|
json (2.6.3)
|
@@ -121,7 +121,7 @@ PLATFORMS
|
|
121
121
|
DEPENDENCIES
|
122
122
|
activesupport
|
123
123
|
bundler (~> 2.3)
|
124
|
-
commander
|
124
|
+
commander (~> 4.6)
|
125
125
|
juwelier (~> 2.4.9)!
|
126
126
|
pry-byebug
|
127
127
|
rdoc (~> 6.1)
|
data/README.markdown
CHANGED
data/Rakefile
CHANGED
data/lib/pfab/cli.rb
CHANGED
@@ -39,6 +39,14 @@ module Pfab
|
|
39
39
|
global_option("-a", "--application_name APP_NAME", "run without prompting for app") do |app_name|
|
40
40
|
$app_name = app_name
|
41
41
|
end
|
42
|
+
$enable_docker_registry_cache = false
|
43
|
+
$disable_docker_registry_cache = false
|
44
|
+
global_option("--enable-docker-registry-cache", "enable docker registry caching with 'cache' label") do
|
45
|
+
$enable_docker_registry_cache = true
|
46
|
+
end
|
47
|
+
global_option("--disable-docker-registry-cache", "disable docker registry caching (overrides auto-detection)") do
|
48
|
+
$disable_docker_registry_cache = true
|
49
|
+
end
|
42
50
|
|
43
51
|
command :build do |c|
|
44
52
|
c.syntax = "pfab build"
|
@@ -339,7 +347,14 @@ module Pfab
|
|
339
347
|
end
|
340
348
|
end
|
341
349
|
|
342
|
-
|
350
|
+
cache_args = ""
|
351
|
+
if should_use_registry_cache?
|
352
|
+
cache_image_name = "#{container_repository}/#{image_name}:cache"
|
353
|
+
cache_args = "--cache-from type=registry,ref=#{cache_image_name} --cache-to type=registry,ref=#{cache_image_name},mode=max"
|
354
|
+
say "Using Docker registry cache: #{cache_image_name}"
|
355
|
+
end
|
356
|
+
|
357
|
+
build_cmd = "docker buildx build --tag #{image_name} --platform linux/amd64 #{build_args} #{cache_args} ."
|
343
358
|
puts build_cmd
|
344
359
|
result = system(build_cmd)
|
345
360
|
|
@@ -493,6 +508,28 @@ module Pfab
|
|
493
508
|
name = get_app_name(all: true)
|
494
509
|
(name == "all") ? deployables.keys : [name]
|
495
510
|
end
|
511
|
+
|
512
|
+
def should_use_registry_cache?
|
513
|
+
# Disable flag takes highest precedence
|
514
|
+
return false if $disable_docker_registry_cache
|
515
|
+
|
516
|
+
# Enable flag takes precedence over auto-detection
|
517
|
+
return true if $enable_docker_registry_cache
|
518
|
+
|
519
|
+
# Auto-detect CI environments where local Docker cache isn't available
|
520
|
+
ci_env_vars = [
|
521
|
+
'CI', # Generic CI indicator
|
522
|
+
'GITHUB_ACTIONS', # GitHub Actions
|
523
|
+
'GITLAB_CI', # GitLab CI
|
524
|
+
'CIRCLECI', # CircleCI
|
525
|
+
'TRAVIS', # Travis CI
|
526
|
+
'JENKINS_URL', # Jenkins
|
527
|
+
'BUILD_ID', # Various CI systems
|
528
|
+
'CONTINUOUS_INTEGRATION' # Generic CI
|
529
|
+
]
|
530
|
+
|
531
|
+
ci_env_vars.any? { |var| ENV[var] }
|
532
|
+
end
|
496
533
|
end
|
497
534
|
|
498
535
|
CommandResult = Struct.new(:stdout, :stderr, :exit_status_code, keyword_init: true) do
|
data/lib/pfab/templates/base.rb
CHANGED
@@ -163,6 +163,40 @@ module Pfab
|
|
163
163
|
|
164
164
|
return ports
|
165
165
|
end
|
166
|
+
|
167
|
+
def base_labels
|
168
|
+
{
|
169
|
+
application: @data['application'],
|
170
|
+
"deployed-name" => @data['deployed_name'],
|
171
|
+
}
|
172
|
+
end
|
173
|
+
|
174
|
+
def metadata_labels
|
175
|
+
base_labels.merge({
|
176
|
+
"application-type" => application_type,
|
177
|
+
"deploy-id" => deploy_id,
|
178
|
+
})
|
179
|
+
end
|
180
|
+
|
181
|
+
def datadog_labels
|
182
|
+
labels = {
|
183
|
+
"tags.datadoghq.com/env" => @data['env'],
|
184
|
+
"tags.datadoghq.com/service" => @data['deployed_name'],
|
185
|
+
"tags.datadoghq.com/version" => StyledYAML.double_quoted(@data['sha'])
|
186
|
+
}
|
187
|
+
labels["tags.datadoghq.com/family"] = @data['family'] if @data['family']
|
188
|
+
labels
|
189
|
+
end
|
190
|
+
|
191
|
+
def full_labels
|
192
|
+
metadata_labels.merge(datadog_labels)
|
193
|
+
end
|
194
|
+
|
195
|
+
def pod_labels
|
196
|
+
base_labels.merge({
|
197
|
+
"application-type" => application_type,
|
198
|
+
}).merge(datadog_labels)
|
199
|
+
end
|
166
200
|
end
|
167
201
|
end
|
168
202
|
end
|
data/lib/pfab/templates/cron.rb
CHANGED
@@ -16,15 +16,7 @@ module Pfab
|
|
16
16
|
metadata: {
|
17
17
|
name: "#{@data['deployed_name']}-#{@data['sha']}",
|
18
18
|
namespace: get_namespace,
|
19
|
-
labels:
|
20
|
-
application: @data['application'],
|
21
|
-
"deployed-name" => @data['deployed_name'],
|
22
|
-
"application-type" => application_type,
|
23
|
-
"deploy-id" => deploy_id,
|
24
|
-
"tags.datadoghq.com/env": @data['env'],
|
25
|
-
"tags.datadoghq.com/service": @data['deployed_name'],
|
26
|
-
"tags.datadoghq.com/version": StyledYAML.double_quoted(@data['sha'])
|
27
|
-
}
|
19
|
+
labels: full_labels
|
28
20
|
},
|
29
21
|
spec: {
|
30
22
|
schedule: get("schedule"),
|
@@ -35,23 +27,12 @@ module Pfab
|
|
35
27
|
metadata: {
|
36
28
|
name: "#{@data['deployed_name']}-#{@data['sha']}",
|
37
29
|
namespace: get_namespace,
|
38
|
-
labels:
|
39
|
-
application: @data['application'],
|
40
|
-
"deployed-name" => @data['deployed_name'],
|
41
|
-
"application-type" => "cron",
|
42
|
-
},
|
30
|
+
labels: metadata_labels,
|
43
31
|
},
|
44
32
|
spec: {
|
45
33
|
template: {
|
46
34
|
metadata: {
|
47
|
-
labels:
|
48
|
-
application: @data['application'],
|
49
|
-
"deployed-name" => @data['deployed_name'],
|
50
|
-
"application-type" => "cron",
|
51
|
-
"tags.datadoghq.com/env": @data['env'],
|
52
|
-
"tags.datadoghq.com/service": @data['deployed_name'],
|
53
|
-
"tags.datadoghq.com/version": StyledYAML.double_quoted(@data['sha'])
|
54
|
-
},
|
35
|
+
labels: pod_labels,
|
55
36
|
},
|
56
37
|
spec: {
|
57
38
|
serviceAccountName: get('serviceAccountName'),
|
@@ -16,15 +16,7 @@ module Pfab
|
|
16
16
|
metadata: {
|
17
17
|
name: @data['deployed_name'],
|
18
18
|
namespace: get_namespace,
|
19
|
-
labels:
|
20
|
-
application: @data['application'],
|
21
|
-
"deployed-name" => @data['deployed_name'],
|
22
|
-
"application-type" => application_type,
|
23
|
-
"deploy-id" => deploy_id,
|
24
|
-
"tags.datadoghq.com/env": @data['env'],
|
25
|
-
"tags.datadoghq.com/service": @data['deployed_name'],
|
26
|
-
"tags.datadoghq.com/version": StyledYAML.double_quoted(@data['sha'])
|
27
|
-
}
|
19
|
+
labels: full_labels
|
28
20
|
},
|
29
21
|
spec: {
|
30
22
|
replicas: get("replicas") || 1,
|
@@ -37,14 +29,7 @@ module Pfab
|
|
37
29
|
revisionHistoryLimit: 5,
|
38
30
|
template: {
|
39
31
|
metadata: {
|
40
|
-
labels:
|
41
|
-
application: @data['application'],
|
42
|
-
"deployed-name" => @data['deployed_name'],
|
43
|
-
"application-type" => "daemon",
|
44
|
-
"tags.datadoghq.com/env": @data['env'],
|
45
|
-
"tags.datadoghq.com/service": @data['deployed_name'],
|
46
|
-
"tags.datadoghq.com/version": StyledYAML.double_quoted(@data['sha'])
|
47
|
-
},
|
32
|
+
labels: pod_labels,
|
48
33
|
},
|
49
34
|
spec: {
|
50
35
|
serviceAccountName: get('serviceAccountName'),
|
data/lib/pfab/templates/job.rb
CHANGED
@@ -16,15 +16,7 @@ module Pfab
|
|
16
16
|
metadata: {
|
17
17
|
name: "job-#{@data['deployed_name']}-#{@data['sha']}",
|
18
18
|
namespace: get_namespace,
|
19
|
-
labels:
|
20
|
-
application: @data['application'],
|
21
|
-
"deployed-name" => @data['deployed_name'],
|
22
|
-
"application-type" => application_type,
|
23
|
-
"deploy-id" => deploy_id,
|
24
|
-
"tags.datadoghq.com/env": @data['env'],
|
25
|
-
"tags.datadoghq.com/service": @data['deployed_name'],
|
26
|
-
"tags.datadoghq.com/version": StyledYAML.double_quoted(@data['sha'])
|
27
|
-
}
|
19
|
+
labels: full_labels
|
28
20
|
},
|
29
21
|
spec: {
|
30
22
|
ttlSecondsAfterFinished: get('ttlSecondsAfterFinished'),
|
@@ -34,14 +26,7 @@ module Pfab
|
|
34
26
|
metadata: {
|
35
27
|
name: "#{@data['deployed_name']}-#{@data['sha']}",
|
36
28
|
namespace: get_namespace,
|
37
|
-
labels:
|
38
|
-
application: @data['application'],
|
39
|
-
"deployed-name" => @data['deployed_name'],
|
40
|
-
"application-type" => "job",
|
41
|
-
"tags.datadoghq.com/env": @data['env'],
|
42
|
-
"tags.datadoghq.com/service": @data['deployed_name'],
|
43
|
-
"tags.datadoghq.com/version": StyledYAML.double_quoted(@data['sha'])
|
44
|
-
},
|
29
|
+
labels: pod_labels,
|
45
30
|
},
|
46
31
|
spec: {
|
47
32
|
serviceAccountName: get('serviceAccountName'),
|
data/lib/pfab/templates/web.rb
CHANGED
@@ -39,10 +39,7 @@ module Pfab
|
|
39
39
|
metadata: {
|
40
40
|
name: @data['deployed_name'],
|
41
41
|
namespace: get_namespace,
|
42
|
-
labels:
|
43
|
-
application: @data['application'],
|
44
|
-
"deployed-name" => @data['deployed_name'],
|
45
|
-
},
|
42
|
+
labels: base_labels,
|
46
43
|
annotations: service_annotations,
|
47
44
|
},
|
48
45
|
spec: {
|
@@ -74,10 +71,7 @@ module Pfab
|
|
74
71
|
metadata: {
|
75
72
|
name: "ingress-#{@data['deployed_name']}",
|
76
73
|
namespace: get_namespace,
|
77
|
-
labels:
|
78
|
-
application: @data['application'],
|
79
|
-
"deployed-name" => @data['deployed_name'],
|
80
|
-
},
|
74
|
+
labels: base_labels,
|
81
75
|
annotations: ingress_annotations,
|
82
76
|
},
|
83
77
|
spec: {
|
@@ -265,16 +259,9 @@ module Pfab
|
|
265
259
|
metadata: {
|
266
260
|
name: @data['deployed_name'],
|
267
261
|
namespace: get_namespace,
|
268
|
-
labels: {
|
269
|
-
"application" => @data['application'],
|
270
|
-
"deployed-name" => @data['deployed_name'],
|
271
|
-
"application-type" => application_type,
|
272
|
-
"deploy-id" => deploy_id,
|
262
|
+
labels: full_labels.merge({
|
273
263
|
LABEL_DEPLOY_UNIQUE_ID => StyledYAML.double_quoted(deploy_unique_id),
|
274
|
-
|
275
|
-
"tags.datadoghq.com/service" => @data['deployed_name'],
|
276
|
-
"tags.datadoghq.com/version" => StyledYAML.double_quoted(@data['sha'])
|
277
|
-
}
|
264
|
+
})
|
278
265
|
},
|
279
266
|
spec: {
|
280
267
|
replicas: get("replicas") || 1,
|
@@ -288,15 +275,9 @@ module Pfab
|
|
288
275
|
progressDeadlineSeconds: get("progressDeadlineSeconds") || 600,
|
289
276
|
template: {
|
290
277
|
metadata: {
|
291
|
-
labels: {
|
292
|
-
application: @data['application'],
|
293
|
-
"deployed-name" => @data['deployed_name'],
|
294
|
-
"application-type" => "web",
|
278
|
+
labels: pod_labels.merge({
|
295
279
|
LABEL_DEPLOY_UNIQUE_ID => StyledYAML.double_quoted(deploy_unique_id),
|
296
|
-
|
297
|
-
"tags.datadoghq.com/service": @data['deployed_name'],
|
298
|
-
"tags.datadoghq.com/version": StyledYAML.double_quoted(@data['sha'])
|
299
|
-
},
|
280
|
+
}),
|
300
281
|
},
|
301
282
|
spec: {
|
302
283
|
serviceAccountName: get('serviceAccountName'),
|
data/lib/pfab/version.rb
CHANGED
data/lib/pfab/yamls.rb
CHANGED
@@ -13,6 +13,7 @@ module Pfab
|
|
13
13
|
'container_repository' => config["container.repository"],
|
14
14
|
'config' => config,
|
15
15
|
'application' => application_yaml["name"],
|
16
|
+
'family' => application_yaml["family"],
|
16
17
|
'application_yaml' => application_yaml,
|
17
18
|
'namespace' => namespace,
|
18
19
|
'application_yaml_hash' => application_yaml_hash
|
data/pfab.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: pfab 0.58.
|
5
|
+
# stub: pfab 0.58.19 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "pfab".freeze
|
9
|
-
s.version = "0.58.
|
9
|
+
s.version = "0.58.19".freeze
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib".freeze]
|
13
13
|
s.authors = ["Jeff Dwyer".freeze]
|
14
|
-
s.date = "2025-
|
14
|
+
s.date = "2025-08-19"
|
15
15
|
s.description = "k8s helper".freeze
|
16
16
|
s.email = "jdwyer@prefab.cloud".freeze
|
17
17
|
s.executables = ["pfab".freeze]
|
@@ -21,6 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
]
|
22
22
|
s.files = [
|
23
23
|
".document",
|
24
|
+
".github/CODEOWNERS",
|
24
25
|
".tool-versions",
|
25
26
|
"CODEOWNERS",
|
26
27
|
"Gemfile",
|
@@ -46,33 +47,20 @@ Gem::Specification.new do |s|
|
|
46
47
|
]
|
47
48
|
s.homepage = "http://github.com/prefab-cloud/pfab".freeze
|
48
49
|
s.licenses = ["MIT".freeze]
|
49
|
-
s.
|
50
|
+
s.required_ruby_version = Gem::Requirement.new(">= 3.1".freeze)
|
51
|
+
s.rubygems_version = "3.5.22".freeze
|
50
52
|
s.summary = "helper gem".freeze
|
51
53
|
|
52
|
-
|
53
|
-
s.specification_version = 4
|
54
|
-
end
|
54
|
+
s.specification_version = 4
|
55
55
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
s.add_development_dependency(%q<test-unit>.freeze, [">= 0"])
|
66
|
-
else
|
67
|
-
s.add_dependency(%q<commander>.freeze, [">= 0"])
|
68
|
-
s.add_dependency(%q<activesupport>.freeze, [">= 0"])
|
69
|
-
s.add_dependency(%q<pry-byebug>.freeze, [">= 0"])
|
70
|
-
s.add_dependency(%q<styled_yaml>.freeze, ["~> 0.0.1"])
|
71
|
-
s.add_dependency(%q<rdoc>.freeze, ["~> 6.1"])
|
72
|
-
s.add_dependency(%q<bundler>.freeze, ["~> 2.3"])
|
73
|
-
s.add_dependency(%q<juwelier>.freeze, ["~> 2.4.9"])
|
74
|
-
s.add_dependency(%q<simplecov>.freeze, [">= 0"])
|
75
|
-
s.add_dependency(%q<test-unit>.freeze, [">= 0"])
|
76
|
-
end
|
56
|
+
s.add_runtime_dependency(%q<commander>.freeze, [">= 0".freeze])
|
57
|
+
s.add_runtime_dependency(%q<activesupport>.freeze, [">= 0".freeze])
|
58
|
+
s.add_runtime_dependency(%q<pry-byebug>.freeze, [">= 0".freeze])
|
59
|
+
s.add_runtime_dependency(%q<styled_yaml>.freeze, ["~> 0.0.1".freeze])
|
60
|
+
s.add_development_dependency(%q<rdoc>.freeze, ["~> 6.1".freeze])
|
61
|
+
s.add_development_dependency(%q<bundler>.freeze, ["~> 2.3".freeze])
|
62
|
+
s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.4.9".freeze])
|
63
|
+
s.add_development_dependency(%q<simplecov>.freeze, [">= 0".freeze])
|
64
|
+
s.add_development_dependency(%q<test-unit>.freeze, [">= 0".freeze])
|
77
65
|
end
|
78
66
|
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pfab
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.58.
|
4
|
+
version: 0.58.19
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Dwyer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-
|
11
|
+
date: 2025-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: commander
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '4.6'
|
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: '
|
26
|
+
version: '4.6'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activesupport
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -146,6 +146,7 @@ extra_rdoc_files:
|
|
146
146
|
- README.markdown
|
147
147
|
files:
|
148
148
|
- ".document"
|
149
|
+
- ".github/CODEOWNERS"
|
149
150
|
- ".tool-versions"
|
150
151
|
- CODEOWNERS
|
151
152
|
- Gemfile
|
@@ -180,14 +181,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
180
181
|
requirements:
|
181
182
|
- - ">="
|
182
183
|
- !ruby/object:Gem::Version
|
183
|
-
version: '
|
184
|
+
version: '3.1'
|
184
185
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
185
186
|
requirements:
|
186
187
|
- - ">="
|
187
188
|
- !ruby/object:Gem::Version
|
188
189
|
version: '0'
|
189
190
|
requirements: []
|
190
|
-
rubygems_version: 3.
|
191
|
+
rubygems_version: 3.5.22
|
191
192
|
signing_key:
|
192
193
|
specification_version: 4
|
193
194
|
summary: helper gem
|