runger_config 4.0.0 → 5.1.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 +4 -4
- data/CHANGELOG.md +8 -0
- data/bin/release +27 -0
- data/lib/generators/runger/app_config/app_config_generator.rb +6 -10
- data/lib/generators/runger/config/config_generator.rb +44 -41
- data/lib/generators/runger/install/install_generator.rb +35 -37
- data/lib/runger/auto_cast.rb +3 -3
- data/lib/runger/config.rb +114 -94
- data/lib/runger/dynamic_config.rb +21 -23
- data/lib/runger/ejson_parser.rb +24 -24
- data/lib/runger/env.rb +50 -52
- data/lib/runger/ext/deep_dup.rb +33 -36
- data/lib/runger/ext/deep_freeze.rb +28 -32
- data/lib/runger/ext/flatten_names.rb +23 -27
- data/lib/runger/ext/hash.rb +26 -29
- data/lib/runger/ext/string_constantize.rb +12 -15
- data/lib/runger/loaders/base.rb +11 -15
- data/lib/runger/loaders/doppler.rb +38 -42
- data/lib/runger/loaders/ejson.rb +65 -63
- data/lib/runger/loaders/env.rb +6 -10
- data/lib/runger/loaders/yaml.rb +69 -66
- data/lib/runger/loaders.rb +69 -71
- data/lib/runger/option_parser_builder.rb +16 -18
- data/lib/runger/optparse_config.rb +11 -10
- data/lib/runger/rails/autoload.rb +24 -26
- data/lib/runger/rails/config.rb +13 -17
- data/lib/runger/rails/loaders/credentials.rb +53 -57
- data/lib/runger/rails/loaders/secrets.rb +21 -25
- data/lib/runger/rails/loaders/yaml.rb +1 -6
- data/lib/runger/rails/loaders.rb +3 -3
- data/lib/runger/rails/settings.rb +49 -49
- data/lib/runger/rails.rb +9 -11
- data/lib/runger/railtie.rb +3 -2
- data/lib/runger/rbs.rb +29 -29
- data/lib/runger/settings.rb +82 -84
- data/lib/runger/testing/helpers.rb +26 -28
- data/lib/runger/testing.rb +2 -2
- data/lib/runger/tracing.rb +143 -136
- data/lib/runger/type_casting.rb +16 -11
- data/lib/runger/utils/which.rb +10 -12
- data/lib/runger/version.rb +1 -1
- data/lib/runger.rb +1 -1
- data/lib/runger_config.rb +34 -27
- metadata +20 -19
data/lib/runger/tracing.rb
CHANGED
@@ -1,188 +1,195 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
using Runger::Ext::DeepDup
|
7
|
-
|
8
|
-
using(Module.new do
|
9
|
-
refine Thread::Backtrace::Location do
|
10
|
-
def path_lineno = "#{path}:#{lineno}"
|
11
|
-
end
|
12
|
-
end)
|
3
|
+
# Provides method to trace values association
|
4
|
+
module Runger::Tracing
|
5
|
+
using Runger::Ext::DeepDup
|
13
6
|
|
14
|
-
|
15
|
-
|
7
|
+
using(Module.new do
|
8
|
+
refine Thread::Backtrace::Location do
|
9
|
+
def path_lineno = "#{path}:#{lineno}"
|
10
|
+
end
|
11
|
+
end)
|
16
12
|
|
17
|
-
|
13
|
+
class Trace
|
14
|
+
UNDEF = Object.new
|
18
15
|
|
19
|
-
|
20
|
-
@type = type
|
21
|
-
@source = source
|
22
|
-
@value = (value == UNDEF) ? Hash.new { |h, k| h[k] = Trace.new(:trace) } : value
|
23
|
-
end
|
16
|
+
attr_reader :type, :value, :source
|
24
17
|
|
25
|
-
|
26
|
-
|
27
|
-
|
18
|
+
def initialize(type = :trace, value = UNDEF, **source)
|
19
|
+
@type = type
|
20
|
+
@source = source
|
21
|
+
@value = (value == UNDEF) ? Hash.new { |h, k| h[k] = Trace.new(:trace) } : value
|
22
|
+
end
|
23
|
+
|
24
|
+
def dig(...)
|
25
|
+
value.dig(...)
|
26
|
+
end
|
28
27
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
28
|
+
def record_value(val, *path, **options)
|
29
|
+
key = path.pop
|
30
|
+
trace =
|
31
|
+
if val.is_a?(Hash)
|
32
|
+
Trace.new.tap { _1.merge_values(val, **options) }
|
33
33
|
else
|
34
|
-
Trace.new(:value, val, **)
|
34
|
+
Trace.new(:value, val, **options)
|
35
35
|
end
|
36
36
|
|
37
|
-
|
38
|
-
|
37
|
+
target_trace = path.empty? ? self : value.dig(*path)
|
38
|
+
target_trace.record_key(key.to_s, trace)
|
39
39
|
|
40
|
-
|
41
|
-
|
40
|
+
val
|
41
|
+
end
|
42
42
|
|
43
|
-
|
44
|
-
|
43
|
+
def merge_values(hash, **options)
|
44
|
+
return hash unless hash
|
45
45
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
end
|
46
|
+
hash.each do |key, val|
|
47
|
+
if val.is_a?(Hash)
|
48
|
+
value[key.to_s].merge_values(val, **options)
|
49
|
+
else
|
50
|
+
value[key.to_s] = Trace.new(:value, val, **options)
|
52
51
|
end
|
53
|
-
|
54
|
-
hash
|
55
52
|
end
|
56
53
|
|
57
|
-
|
58
|
-
|
54
|
+
hash
|
55
|
+
end
|
59
56
|
|
60
|
-
|
61
|
-
|
57
|
+
def record_key(key, key_trace)
|
58
|
+
@value = Hash.new { |h, k| h[k] = Trace.new(:trace) } unless value.is_a?(::Hash)
|
62
59
|
|
63
|
-
|
64
|
-
|
65
|
-
raise ArgumentError, "You can only merge a :trace type, but trying :#{type}" unless another_trace.trace?
|
60
|
+
value[key] = key_trace
|
61
|
+
end
|
66
62
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
63
|
+
def merge!(another_trace)
|
64
|
+
unless trace?
|
65
|
+
raise(ArgumentError,
|
66
|
+
"You can only merge into a :trace type, and this is :#{type}")
|
67
|
+
end
|
68
|
+
unless another_trace.trace?
|
69
|
+
raise(ArgumentError,
|
70
|
+
"You can only merge a :trace type, but trying :#{type}")
|
74
71
|
end
|
75
72
|
|
76
|
-
|
77
|
-
|
78
|
-
|
73
|
+
another_trace.value.each do |key, sub_trace|
|
74
|
+
if sub_trace.trace?
|
75
|
+
value[key].merge!(sub_trace)
|
76
|
+
else
|
77
|
+
value[key] = sub_trace
|
78
|
+
end
|
79
79
|
end
|
80
|
+
end
|
80
81
|
|
81
|
-
|
82
|
+
def keep_if(...)
|
83
|
+
raise(ArgumentError, "You can only filter :trace type, and this is :#{type}") unless trace?
|
82
84
|
|
83
|
-
|
85
|
+
value.keep_if(...)
|
86
|
+
end
|
84
87
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
88
|
+
def clear = value.clear
|
89
|
+
|
90
|
+
def trace? = type == :trace
|
91
|
+
|
92
|
+
def to_h
|
93
|
+
if trace?
|
94
|
+
value.transform_values(&:to_h).tap { _1.default_proc = nil }
|
95
|
+
else
|
96
|
+
{ value:, source: }
|
91
97
|
end
|
98
|
+
end
|
92
99
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
end
|
100
|
+
def dup = self.class.new(type, value.dup, **source)
|
101
|
+
|
102
|
+
def pretty_print(q)
|
103
|
+
if trace?
|
104
|
+
q.nest(2) do
|
105
|
+
q.breakable('')
|
106
|
+
q.seplist(value, nil, :each) do |k, v|
|
107
|
+
q.group do
|
108
|
+
q.text k
|
109
|
+
q.text ' =>'
|
110
|
+
if v.trace?
|
111
|
+
q.text ' { '
|
112
|
+
q.pp(v)
|
113
|
+
q.breakable(' ')
|
114
|
+
q.text '}'
|
115
|
+
else
|
116
|
+
q.breakable(' ')
|
117
|
+
q.pp(v)
|
112
118
|
end
|
113
119
|
end
|
114
120
|
end
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
121
|
+
end
|
122
|
+
else
|
123
|
+
q.pp(value)
|
124
|
+
q.group(0, ' (', ')') do
|
125
|
+
q.seplist(source, lambda { q.breakable(' ') }, :each) do |k, v|
|
126
|
+
q.group do
|
127
|
+
q.text k.to_s
|
128
|
+
q.text '='
|
129
|
+
q.text v.to_s
|
124
130
|
end
|
125
131
|
end
|
126
132
|
end
|
127
133
|
end
|
128
134
|
end
|
135
|
+
end
|
129
136
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
yield
|
134
|
-
return
|
135
|
-
end
|
136
|
-
|
137
|
-
trace = Trace.new
|
138
|
-
trace_stack.push trace
|
137
|
+
class << self
|
138
|
+
def capture
|
139
|
+
unless ::Runger::Settings.tracing_enabled
|
139
140
|
yield
|
140
|
-
|
141
|
-
ensure
|
142
|
-
trace_stack.pop
|
141
|
+
return
|
143
142
|
end
|
144
143
|
|
145
|
-
|
146
|
-
|
147
|
-
|
144
|
+
trace = Trace.new
|
145
|
+
trace_stack.push(trace)
|
146
|
+
yield
|
147
|
+
trace_stack.last
|
148
|
+
ensure
|
149
|
+
trace_stack.pop
|
150
|
+
end
|
148
151
|
|
149
|
-
|
152
|
+
def trace_stack
|
153
|
+
(Thread.current[:__runger__trace_stack__] ||= [])
|
154
|
+
end
|
150
155
|
|
151
|
-
|
156
|
+
def current_trace = trace_stack.last
|
152
157
|
|
153
|
-
|
154
|
-
(Thread.current[:__runger__trace_source_stack__] ||= [])
|
155
|
-
end
|
158
|
+
alias tracing? current_trace
|
156
159
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
+
def source_stack
|
161
|
+
(Thread.current[:__runger__trace_source_stack__] ||= [])
|
162
|
+
end
|
160
163
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
164
|
+
def current_trace_source
|
165
|
+
source_stack.last || accessor_source(caller_locations(2, 1).first)
|
166
|
+
end
|
167
|
+
|
168
|
+
def with_trace_source(src)
|
169
|
+
source_stack << src
|
170
|
+
yield
|
171
|
+
ensure
|
172
|
+
source_stack.pop
|
173
|
+
end
|
167
174
|
|
168
|
-
|
175
|
+
private
|
169
176
|
|
170
|
-
|
171
|
-
|
172
|
-
end
|
177
|
+
def accessor_source(location)
|
178
|
+
{ type: :accessor, called_from: location.path_lineno }
|
173
179
|
end
|
180
|
+
end
|
174
181
|
|
175
|
-
|
182
|
+
module_function
|
176
183
|
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
val
|
184
|
+
def trace!(type, *path, **options)
|
185
|
+
return yield unless ::Runger::Tracing.tracing?
|
186
|
+
|
187
|
+
val = yield
|
188
|
+
if val.is_a?(Hash)
|
189
|
+
::Runger::Tracing.current_trace.merge_values(val, type:, **options)
|
190
|
+
elsif !path.empty?
|
191
|
+
::Runger::Tracing.current_trace.record_value(val, *path, type:, **options)
|
186
192
|
end
|
193
|
+
val
|
187
194
|
end
|
188
195
|
end
|
data/lib/runger/type_casting.rb
CHANGED
@@ -15,7 +15,8 @@ module Runger
|
|
15
15
|
|
16
16
|
def accept(name_or_object, &block)
|
17
17
|
if !block && !name_or_object.respond_to?(:call)
|
18
|
-
raise
|
18
|
+
raise(ArgumentError,
|
19
|
+
'Please, provide a type casting block or an object implementing #call(val) method')
|
19
20
|
end
|
20
21
|
|
21
22
|
registry[name_or_object] = block || name_or_object
|
@@ -26,9 +27,13 @@ module Runger
|
|
26
27
|
|
27
28
|
caster =
|
28
29
|
if type_id.is_a?(Symbol) || type_id.nil?
|
29
|
-
registry.fetch(type_id) { raise
|
30
|
+
registry.fetch(type_id) { raise(ArgumentError, "Unknown type: #{type_id}") }
|
30
31
|
else
|
31
|
-
|
32
|
+
unless type_id.respond_to?(:call)
|
33
|
+
raise(ArgumentError,
|
34
|
+
"Type must implement #call(val): #{type_id}")
|
35
|
+
end
|
36
|
+
|
32
37
|
type_id
|
33
38
|
end
|
34
39
|
|
@@ -58,7 +63,7 @@ module Runger
|
|
58
63
|
obj.accept(:float, &:to_f)
|
59
64
|
|
60
65
|
obj.accept(:date) do
|
61
|
-
require
|
66
|
+
require 'date' unless defined?(::Date)
|
62
67
|
|
63
68
|
next _1 if _1.is_a?(::Date)
|
64
69
|
|
@@ -68,7 +73,7 @@ module Runger
|
|
68
73
|
end
|
69
74
|
|
70
75
|
obj.accept(:datetime) do
|
71
|
-
require
|
76
|
+
require 'date' unless defined?(::Date)
|
72
77
|
|
73
78
|
next _1 if _1.is_a?(::DateTime)
|
74
79
|
|
@@ -78,7 +83,7 @@ module Runger
|
|
78
83
|
end
|
79
84
|
|
80
85
|
obj.accept(:uri) do
|
81
|
-
require
|
86
|
+
require 'uri' unless defined?(::URI)
|
82
87
|
|
83
88
|
next _1 if _1.is_a?(::URI)
|
84
89
|
|
@@ -90,8 +95,8 @@ module Runger
|
|
90
95
|
end
|
91
96
|
end
|
92
97
|
|
93
|
-
unless
|
94
|
-
require
|
98
|
+
unless ''.respond_to?(:safe_constantize)
|
99
|
+
require 'runger/ext/string_constantize'
|
95
100
|
using Runger::Ext::StringConstantize
|
96
101
|
end
|
97
102
|
|
@@ -115,16 +120,16 @@ module Runger
|
|
115
120
|
|
116
121
|
case caster_config
|
117
122
|
in Hash[array:, type:, **nil]
|
118
|
-
registry.deserialize(val, type, array:
|
123
|
+
registry.deserialize(val, type, array:)
|
119
124
|
in Hash[config: subconfig]
|
120
125
|
subconfig = subconfig.safe_constantize if subconfig.is_a?(::String)
|
121
|
-
raise
|
126
|
+
raise(ArgumentError, "Config is not found: #{subconfig}") unless subconfig
|
122
127
|
|
123
128
|
subconfig.new(val)
|
124
129
|
in Hash
|
125
130
|
return val unless val.is_a?(Hash)
|
126
131
|
|
127
|
-
caster_config.
|
132
|
+
caster_config.each_key do |k|
|
128
133
|
ks = k.to_s
|
129
134
|
next unless val.key?(ks)
|
130
135
|
|
data/lib/runger/utils/which.rb
CHANGED
@@ -1,18 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
module Runger
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
return exe if File.executable?(exe) && !File.directory?(exe)
|
13
|
-
end
|
3
|
+
module Runger::Utils
|
4
|
+
# Cross-platform solution
|
5
|
+
# taken from https://stackoverflow.com/a/5471032
|
6
|
+
def self.which(cmd)
|
7
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
8
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
9
|
+
exts.each do |ext|
|
10
|
+
exe = File.join(path, "#{cmd}#{ext}")
|
11
|
+
return exe if File.executable?(exe) && !File.directory?(exe)
|
14
12
|
end
|
15
|
-
nil
|
16
13
|
end
|
14
|
+
nil
|
17
15
|
end
|
18
16
|
end
|
data/lib/runger/version.rb
CHANGED
data/lib/runger.rb
CHANGED
data/lib/runger_config.rb
CHANGED
@@ -1,23 +1,30 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
|
17
|
-
require
|
18
|
-
require
|
19
|
-
|
20
|
-
require
|
3
|
+
require 'runger/version'
|
4
|
+
|
5
|
+
module Runger ; end
|
6
|
+
module Runger::Ext ; end
|
7
|
+
module Runger::Utils ; end
|
8
|
+
module Runger::Tracing ; end
|
9
|
+
module Runger::Loaders ; end
|
10
|
+
module Runger::Testing ; end
|
11
|
+
|
12
|
+
require 'runger/ext/deep_dup'
|
13
|
+
require 'runger/ext/deep_freeze'
|
14
|
+
require 'runger/ext/flatten_names'
|
15
|
+
require 'runger/ext/hash'
|
16
|
+
|
17
|
+
require 'runger/utils/deep_merge'
|
18
|
+
require 'runger/utils/which'
|
19
|
+
|
20
|
+
require 'runger/auto_cast'
|
21
|
+
require 'runger/config'
|
22
|
+
require 'runger/env'
|
23
|
+
require 'runger/loaders'
|
24
|
+
require 'runger/rbs'
|
25
|
+
require 'runger/settings'
|
26
|
+
require 'runger/tracing'
|
27
|
+
require 'runger/type_casting'
|
21
28
|
|
22
29
|
module Runger # :nodoc:
|
23
30
|
class << self
|
@@ -31,19 +38,19 @@ module Runger # :nodoc:
|
|
31
38
|
end
|
32
39
|
|
33
40
|
# Configure default loaders
|
34
|
-
loaders.append
|
35
|
-
loaders.append
|
36
|
-
loaders.append
|
41
|
+
loaders.append(:yml, Loaders::YAML)
|
42
|
+
loaders.append(:ejson, Loaders::EJSON) if Utils.which('ejson')
|
43
|
+
loaders.append(:env, Loaders::Env)
|
37
44
|
|
38
|
-
if ENV.key?(
|
39
|
-
loaders.append
|
45
|
+
if ENV.key?('DOPPLER_TOKEN') && ENV['RUNGER_CONFIG_DISABLE_DOPPLER'] != 'true'
|
46
|
+
loaders.append(:doppler, Loaders::Doppler)
|
40
47
|
end
|
41
48
|
end
|
42
49
|
|
43
|
-
if defined?(
|
44
|
-
require
|
50
|
+
if defined?(Rails::VERSION)
|
51
|
+
require 'runger/rails'
|
45
52
|
else
|
46
|
-
require
|
53
|
+
require 'runger/rails/autoload'
|
47
54
|
end
|
48
55
|
|
49
|
-
require
|
56
|
+
require 'runger/testing' if ENV['RACK_ENV'] == 'test' || ENV['RAILS_ENV'] == 'test'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: runger_config
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Runger
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-06-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 1.1.3
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: ejson
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.3.1
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.3.1
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rake
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,20 +94,6 @@ dependencies:
|
|
80
94
|
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '3.18'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: ejson
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: 1.3.1
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: 1.3.1
|
97
97
|
description: "\n Configuration DSL for Ruby libraries and applications.\n Allows
|
98
98
|
you to easily follow the twelve-factor application principles (https://12factor.net/config).\n
|
99
99
|
\ "
|
@@ -106,6 +106,7 @@ files:
|
|
106
106
|
- CHANGELOG.md
|
107
107
|
- LICENSE.txt
|
108
108
|
- README.md
|
109
|
+
- bin/release
|
109
110
|
- lib/generators/runger/app_config/USAGE
|
110
111
|
- lib/generators/runger/app_config/app_config_generator.rb
|
111
112
|
- lib/generators/runger/config/USAGE
|
@@ -160,7 +161,7 @@ licenses:
|
|
160
161
|
- MIT
|
161
162
|
metadata:
|
162
163
|
bug_tracker_uri: http://github.com/davidrunger/runger_config/issues
|
163
|
-
changelog_uri: https://github.com/davidrunger/runger_config/blob/
|
164
|
+
changelog_uri: https://github.com/davidrunger/runger_config/blob/main/CHANGELOG.md
|
164
165
|
documentation_uri: http://github.com/davidrunger/runger_config
|
165
166
|
funding_uri: https://github.com/sponsors/davidrunger
|
166
167
|
homepage_uri: http://github.com/davidrunger/runger_config
|
@@ -174,14 +175,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
174
175
|
requirements:
|
175
176
|
- - ">="
|
176
177
|
- !ruby/object:Gem::Version
|
177
|
-
version: 3.
|
178
|
+
version: 3.3.0
|
178
179
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
180
|
requirements:
|
180
181
|
- - ">="
|
181
182
|
- !ruby/object:Gem::Version
|
182
183
|
version: '0'
|
183
184
|
requirements: []
|
184
|
-
rubygems_version: 3.
|
185
|
+
rubygems_version: 3.5.11
|
185
186
|
signing_key:
|
186
187
|
specification_version: 4
|
187
188
|
summary: Configuration DSL for Ruby libraries and applications
|