service_skeleton 0.0.0.34.g4f6fdb0 → 0.0.0.41.g9507cda

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: 8e45890d70da0bc9118d5b96a8d697197cfd05fb6463ff3e84f048ceb4246b55
4
- data.tar.gz: bb5bafb7ce4cd3e68143fbb179fd630cec02e9c2b1587afa7a601513efb826a1
3
+ metadata.gz: e4ef4c44c6af279c8870e58b4bf078424a30c87b6d979d2513fe093c15926287
4
+ data.tar.gz: 5a9d7d4fc51bae03eac369f6f902dabcfea925d3fd175b69e7888d4368fe87f0
5
5
  SHA512:
6
- metadata.gz: 68f83da9df7a513d4664c94c01f6c48102012f6b8de6cf89641f48f617441e23d9ffdd408a879f9ca17a39e2debeed55750265b6ee03a16210e66a9d730adb5f
7
- data.tar.gz: 64ddeaacdb65c61af8c745a4b2acb30857c3481641530e1968d29cf6aea0b29a341ff16d00259d05b8529793012da3b0eda9abd2c82e9b5e3f1a45cfe51f589f
6
+ metadata.gz: 353f92e555ba95c3e5776a0acb10119500671182a0efc082ff0d9e91a247f14209ff23dbc0f64cec73df445daba2435acac7104f18bef0e6cccd01a48e6b4954
7
+ data.tar.gz: c0c3341e8ab56f4cfed5809a94b6a9b8295e30b59a04977e1b45a24c1d64b3a5ad8f14927e0453145a4bcf93d94579b08d1e432bee49d0e8ac5352f88da6f3f9
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "service_skeleton/config"
2
4
  require_relative "service_skeleton/config_variables"
3
5
  require_relative "service_skeleton/logging_helpers"
@@ -184,22 +186,22 @@ class ServiceSkeleton
184
186
  end
185
187
 
186
188
  @registered_variables = [
187
- ServiceSkeleton::ConfigVariable.new(:SERVICE_SKELETON_LOG_LEVEL) { "INFO" },
188
- ServiceSkeleton::ConfigVariable.new(:SERVICE_SKELETON_LOGSTASH_SERVER) { "" },
189
- ServiceSkeleton::ConfigVariable.new(:SERVICE_SKELETON_LOG_ENABLE_TIMESTAMPS) { false },
190
- ServiceSkeleton::ConfigVariable.new(:SERVICE_SKELETON_LOG_FILE) { nil },
191
- ServiceSkeleton::ConfigVariable.new(:SERVICE_SKELETON_LOG_MAX_FILE_SIZE) { 1048576 },
192
- ServiceSkeleton::ConfigVariable.new(:SERVICE_SKELETON_LOG_MAX_FILES) { 3 },
193
- ServiceSkeleton::ConfigVariable.new(:SERVICE_SKELETON_METRICS_PORT) { nil },
189
+ { name: :SERVICE_SKELETON_LOG_LEVEL, class: ConfigVariable::String, opts: { default: "INFO" } },
190
+ { name: :SERVICE_SKELETON_LOG_ENABLE_TIMESTAMPS, class: ConfigVariable::Boolean, opts: { default: false } },
191
+ { name: :SERVICE_SKELETON_LOG_FILE, class: ConfigVariable::String, opts: { default: nil } },
192
+ { name: :SERVICE_SKELETON_LOG_MAX_FILE_SIZE, class: ConfigVariable::Integer, opts: { default: 1048576, range: 0..Float::INFINITY } },
193
+ { name: :SERVICE_SKELETON_LOG_MAX_FILES, class: ConfigVariable::Integer, opts: { default: 3, range: 0..Float::INFINITY } },
194
+ { name: :SERVICE_SKELETON_LOGSTASH_SERVER, class: ConfigVariable::String, opts: { default: nil } },
195
+ { name: :SERVICE_SKELETON_METRICS_PORT, class: ConfigVariable::Integer, opts: { default: nil, range: 1..65535 } },
194
196
  ]
195
197
 
196
198
  def self.inherited(subclass)
197
199
  subclass.string(:"#{subclass.service_name.upcase}_LOG_LEVEL", default: "INFO")
198
- subclass.string(:"#{subclass.service_name.upcase}_LOGSTASH_SERVER", default: "")
199
200
  subclass.boolean(:"#{subclass.service_name.upcase}_LOG_ENABLE_TIMESTAMPS", default: false)
200
201
  subclass.string(:"#{subclass.service_name.upcase}_LOG_FILE", default: nil)
201
202
  subclass.integer(:"#{subclass.service_name.upcase}_LOG_MAX_FILE_SIZE", default: 1048576, range: 0..Float::INFINITY)
202
203
  subclass.integer(:"#{subclass.service_name.upcase}_LOG_MAX_FILES", default: 3, range: 1..Float::INFINITY)
204
+ subclass.string(:"#{subclass.service_name.upcase}_LOGSTASH_SERVER", default: "")
203
205
  subclass.integer(:"#{subclass.service_name.upcase}_METRICS_PORT", default: nil, range: 1..65535)
204
206
  end
205
207
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ServiceSkeleton
2
4
  module BackgroundWorker
3
5
  include ServiceSkeleton::LoggingHelpers
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "to_regexp"
2
4
 
3
5
  require_relative "./filtering_logger"
@@ -11,8 +13,14 @@ class ServiceSkeleton
11
13
  def initialize(env, svc)
12
14
  @svc = svc
13
15
 
14
- parse_registered_variables(env)
16
+ # Parsing registered variables will redact the environment, so we want
17
+ # to take a private unredacted copy before that happens
15
18
  @env = env.to_hash.dup.freeze
19
+
20
+ parse_registered_variables(env)
21
+
22
+ # Sadly, we can't setup the logger until we know *how* to setup the
23
+ # logger, which requires parsing config variables
16
24
  setup_logger
17
25
  end
18
26
 
@@ -23,26 +31,23 @@ class ServiceSkeleton
23
31
  private
24
32
 
25
33
  def parse_registered_variables(env)
26
- @svc.registered_variables.each do |var|
27
- val = var.value(env)
34
+ (@svc.registered_variables || []).map do |var|
35
+ var[:class].new(var[:name], env, **var[:opts])
36
+ end.each do |var|
37
+ val = var.value
38
+ method_name = var.method_name(@svc.service_name).to_sym
28
39
 
29
- define_singleton_method(var.method_name(@svc.service_name)) do
40
+ define_singleton_method(method_name) do
30
41
  val
31
42
  end
32
43
 
33
- define_singleton_method(var.method_name(@svc.service_name) + "=") do |v|
34
- val = v
44
+ define_singleton_method(:"#{method_name}=") do |new_value|
45
+ val = new_value
35
46
  end
36
-
37
- if var.sensitive?
38
- if env.object_id != ENV.object_id
39
- raise ServiceSkeleton::Error::CannotSanitizeEnvironmentError,
40
- "Attempted to sanitize sensitive variable #{var.name}, but was not passed the ENV object"
41
- end
42
-
43
- var.env_keys(env).each do |k|
44
- env[k] = "*SENSITIVE*"
45
- end
47
+ end.each do |var|
48
+ if var.redact!(env) && env.object_id != ENV.object_id
49
+ raise ServiceSkeleton::Error::CannotSanitizeEnvironmentError,
50
+ "Attempted to sanitize sensitive variable #{var.name}, but we're not operating on the process' environment"
46
51
  end
47
52
  end
48
53
  end
@@ -1,35 +1,39 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ServiceSkeleton
2
4
  class ConfigVariable
3
- attr_reader :name, :key_pattern
5
+ attr_reader :name, :value
4
6
 
5
- def initialize(name, **opts, &blk)
7
+ def initialize(name, env, **opts, &blk)
6
8
  @name = name
7
9
  @opts = opts
8
10
  @blk = blk
9
- end
10
11
 
11
- def method_name(svc_name)
12
- name.to_s.gsub(/\A#{Regexp.quote(svc_name)}_/i, '').downcase
12
+ @value = pluck_value(env)
13
13
  end
14
14
 
15
- def sensitive?
16
- !!@opts[:sensitive]
15
+ def method_name(svc_name)
16
+ @name.to_s.gsub(/\A#{Regexp.quote(svc_name)}_/i, '').downcase
17
17
  end
18
18
 
19
- def value(env)
20
- if @opts[:key_pattern]
21
- matches = env.select { |k, _| @opts[:key_pattern] === k.to_s }
22
- @blk.call(matches)
23
- else
24
- @blk.call(env[@name.to_s])
19
+ def redact!(env)
20
+ if @opts[:sensitive]
21
+ env[@name.to_s] = "*SENSITIVE*" if env.has_key?(@name.to_s)
25
22
  end
26
23
  end
27
24
 
28
- def env_keys(env)
29
- if @opts[:key_pattern]
30
- env.keys.select { |k| @opts[:key_pattern] === k.to_s }
25
+ private
26
+
27
+ def maybe_default(env)
28
+ if env.has_key?(@name.to_s)
29
+ yield
31
30
  else
32
- env.keys.include?(@name.to_s) ? [@name.to_s] : []
31
+ if @opts.has_key?(:default)
32
+ @opts[:default]
33
+ else
34
+ raise ServiceSkeleton::Error::InvalidEnvironmentError,
35
+ "Value for required environment variable #{@name} not specified"
36
+ end
33
37
  end
34
38
  end
35
39
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "service_skeleton/config_variable"
4
+
5
+ class ServiceSkeleton::ConfigVariable::Boolean < ServiceSkeleton::ConfigVariable
6
+ private
7
+
8
+ def pluck_value(env)
9
+ maybe_default(env) do
10
+ case env[@name.to_s]
11
+ when /\A(no|n|off|0|false)\z/i
12
+ false
13
+ when /\A(yes|y|on|1|true)\z/i
14
+ true
15
+ else
16
+ raise ServiceSkeleton::Error::InvalidEnvironmentError,
17
+ "Value #{env[@name.to_s].inspect} for environment variable #{@name} is not a valid boolean value"
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "service_skeleton/config_variable"
4
+
5
+ class ServiceSkeleton::ConfigVariable::Enum < ServiceSkeleton::ConfigVariable
6
+ private
7
+
8
+ def pluck_value(env)
9
+ maybe_default(env) do
10
+ v = env[@name.to_s]
11
+
12
+ if @opts[:values].is_a?(Array)
13
+ unless @opts[:values].include?(v)
14
+ raise ServiceSkeleton::Error::InvalidEnvironmentError,
15
+ "Invalid value for #{@name}; must be one of #{@opts[:values].join(", ")}"
16
+ end
17
+ v
18
+ elsif @opts[:values].is_a?(Hash)
19
+ unless @opts[:values].keys.include?(v)
20
+ raise ServiceSkeleton::Error::InvalidEnvironmentError,
21
+ "Invalid value for #{@name}; must be one of #{@opts[:values].keys.join(", ")}"
22
+ end
23
+ @opts[:values][v]
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "service_skeleton/config_variable"
4
+
5
+ class ServiceSkeleton::ConfigVariable::Float < ServiceSkeleton::ConfigVariable
6
+ private
7
+
8
+ def pluck_value(env)
9
+ maybe_default(env) do
10
+ value = env[@name.to_s]
11
+
12
+ if value =~ /\A-?\d+.?\d*\z/
13
+ value.to_f.tap do |f|
14
+ unless @opts[:range].include?(f)
15
+ raise ServiceSkeleton::Error::InvalidEnvironmentError,
16
+ "Value #{f} for environment variable #{@name} is out of the valid range (must be between #{@opts[:range].first} and #{@opts[:range].last} inclusive)"
17
+ end
18
+ end
19
+ else
20
+ raise ServiceSkeleton::Error::InvalidEnvironmentError,
21
+ "Value #{value.inspect} for environment variable #{@name} is not a valid numeric value"
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "service_skeleton/config_variable"
4
+
5
+ class ServiceSkeleton::ConfigVariable::Integer < ServiceSkeleton::ConfigVariable
6
+ private
7
+
8
+ def pluck_value(env)
9
+ maybe_default(env) do
10
+ value = env[@name.to_s]
11
+
12
+ if value =~ /\A-?\d+\z/
13
+ value.to_i.tap do |i|
14
+ unless @opts[:range].include?(i)
15
+ raise ServiceSkeleton::Error::InvalidEnvironmentError,
16
+ "Value #{i} for environment variable #{@name} is out of the valid range (must be between #{@opts[:range].first} and #{@opts[:range].last} inclusive)"
17
+ end
18
+ end
19
+ else
20
+ raise ServiceSkeleton::Error::InvalidEnvironmentError,
21
+ "Value #{value.inspect} for environment variable #{@name} is not a valid integer value"
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "service_skeleton/config_variable"
4
+
5
+ class ServiceSkeleton::ConfigVariable::KVList < ServiceSkeleton::ConfigVariable
6
+ def redact!(env)
7
+ env.keys.each { |k| env[k] = "*SENSITIVE*" if k =~ @opts[:key_pattern] }
8
+ end
9
+
10
+ private
11
+
12
+ def pluck_value(env)
13
+ matches = env.select { |k, _| k.to_s =~ @opts[:key_pattern] }
14
+
15
+ if matches.empty?
16
+ if @opts.has_key?(:default)
17
+ @opts[:default]
18
+ else
19
+ raise ServiceSkeleton::Error::InvalidEnvironmentError,
20
+ "no keys for key-value list #{@name} specified"
21
+ end
22
+ else
23
+ matches.transform_keys { |k| @opts[:key_pattern].match(k.to_s)[1].to_sym }
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "service_skeleton/config_variable"
4
+
5
+ class ServiceSkeleton::ConfigVariable::PathList < ServiceSkeleton::ConfigVariable
6
+ private
7
+
8
+ def pluck_value(env)
9
+ maybe_default(env) do
10
+ env[@name.to_s].split(":")
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "service_skeleton/config_variable"
4
+
5
+ class ServiceSkeleton::ConfigVariable::String < ServiceSkeleton::ConfigVariable
6
+ private
7
+
8
+ def pluck_value(env)
9
+ maybe_default(env) do
10
+ env[@name.to_s]
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "service_skeleton/config_variable"
4
+
5
+ class ServiceSkeleton::ConfigVariable::URL < ServiceSkeleton::ConfigVariable
6
+ def redact!(env)
7
+ if env.has_key?(@name.to_s)
8
+ super
9
+ uri = URI(env[@name.to_s])
10
+ if uri.password
11
+ uri.password = "*REDACTED*"
12
+ env[@name.to_s] = uri.to_s
13
+ end
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def pluck_value(env)
20
+ maybe_default(env) do
21
+ begin
22
+ v = env[@name.to_s]
23
+ URI(v)
24
+ rescue URI::InvalidURIError
25
+ raise ServiceSkeleton::Error::InvalidEnvironmentError,
26
+ "Value for #{@name} (#{v}) does not appear to be a valid URL"
27
+ end
28
+
29
+ v
30
+ end
31
+ end
32
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "./error"
2
4
 
3
5
  require "service_skeleton/config_variable"
@@ -6,107 +8,67 @@ class ServiceSkeleton
6
8
  module ConfigVariables
7
9
  attr_reader :registered_variables
8
10
 
9
- UNDEFINED = Class.new
11
+ UNDEFINED = Module.new
10
12
  private_constant :UNDEFINED
11
13
 
12
- def register_variable(name, **opts, &callback)
14
+ def register_variable(name, klass, **opts)
13
15
  @registered_variables ||= []
14
16
 
15
- @registered_variables << ServiceSkeleton::ConfigVariable.new(name, **opts, &callback)
17
+ if opts[:default] == UNDEFINED
18
+ opts.delete(:default)
19
+ end
20
+
21
+ @registered_variables << {
22
+ name: name,
23
+ class: klass,
24
+ opts: opts,
25
+ }
16
26
  end
17
27
 
18
28
  def string(var_name, default: UNDEFINED, sensitive: false)
19
- register_variable(var_name, sensitive: sensitive) do |value|
20
- maybe_default(value, default, var_name) do
21
- value
22
- end
23
- end
29
+ register_variable(var_name, ConfigVariable::String, default: default, sensitive: sensitive)
24
30
  end
25
31
 
26
32
  def boolean(var_name, default: UNDEFINED, sensitive: false)
27
- register_variable(var_name, sensitive: sensitive) do |value|
28
- maybe_default(value, default, var_name) do
29
- case value
30
- when /\A(no|n|off|0|false)\z/i
31
- false
32
- when /\A(yes|y|on|1|true)\z/i
33
- true
34
- else
35
- raise ServiceSkeleton::Error::InvalidEnvironmentError,
36
- "Value #{value.inspect} for environment variable #{var_name} is not a valid boolean value"
37
- end
38
- end
39
- end
33
+ register_variable(var_name, ConfigVariable::Boolean, default: default, sensitive: sensitive)
40
34
  end
41
35
 
42
36
  def integer(var_name, default: UNDEFINED, sensitive: false, range: -Float::INFINITY..Float::INFINITY)
43
- register_variable(var_name, sensitive: sensitive) do |value|
44
- maybe_default(value, default, var_name) do
45
- if value =~ /\A-?\d+\z/
46
- value.to_i.tap do |i|
47
- unless range.include?(i)
48
- raise ServiceSkeleton::Error::InvalidEnvironmentError,
49
- "Value #{i} for environment variable #{var_name} is out of the valid range (must be between #{range.first} and #{range.last} inclusive)"
50
- end
51
- end
52
- else
53
- raise ServiceSkeleton::Error::InvalidEnvironmentError,
54
- "Value #{value.inspect} for environment variable #{var_name} is not a valid integer value"
55
- end
56
- end
57
- end
37
+ register_variable(var_name, ConfigVariable::Integer, default: default, sensitive: sensitive, range: range)
58
38
  end
59
39
 
60
40
  def float(var_name, default: UNDEFINED, sensitive: false, range: -Float::INFINITY..Float::INFINITY)
61
- register_variable(var_name, sensitive: sensitive) do |value|
62
- maybe_default(value, default, var_name) do
63
- if value =~ /\A-?\d+.?\d*\z/
64
- value.to_f.tap do |i|
65
- unless range.include?(i)
66
- raise ServiceSkeleton::Error::InvalidEnvironmentError,
67
- "Value #{i} for environment variable #{var_name} is out of the valid range (must be between #{range.first} and #{range.last} inclusive)"
68
- end
69
- end
70
- else
71
- raise ServiceSkeleton::Error::InvalidEnvironmentError,
72
- "Value #{value.inspect} for environment variable #{var_name} is not a valid numeric value"
73
- end
74
- end
75
- end
41
+ register_variable(var_name, ConfigVariable::Float, default: default, sensitive: sensitive, range: range)
76
42
  end
77
43
 
78
44
  def path_list(var_name, default: UNDEFINED, sensitive: false)
79
- register_variable(var_name, sensitive: sensitive) do |value|
80
- maybe_default(value, default, var_name) do
81
- value.split(":")
82
- end
83
- end
45
+ register_variable(var_name, ConfigVariable::PathList, default: default, sensitive: sensitive)
84
46
  end
85
47
 
86
- def kv_list(var_name, default: UNDEFINED, sensitive: false, key_pattern: nil)
87
- key_pattern ||= /\A#{var_name}_(.*)\z/
88
- register_variable(var_name, sensitive: sensitive, key_pattern: key_pattern) do |matches|
89
- maybe_default(matches, default, var_name) do
90
- matches.transform_keys do |k|
91
- key_pattern.match(k)[1].to_sym
92
- end
93
- end
94
- end
48
+ def kv_list(var_name, default: UNDEFINED, sensitive: false, key_pattern: /\A#{var_name}_(.*)\z/)
49
+ register_variable(var_name, ConfigVariable::KVList, default: default, sensitive: sensitive, key_pattern: key_pattern)
95
50
  end
96
51
 
97
- private
98
-
99
- def maybe_default(value, default, var_name)
100
- if value.nil? || value == {}
101
- if default == UNDEFINED
102
- raise ServiceSkeleton::Error::InvalidEnvironmentError,
103
- "Value for required environment variable #{var_name} not specified"
104
- else
105
- default
106
- end
107
- else
108
- yield
52
+ def enum(var_name, values:, default: UNDEFINED, sensitive: false)
53
+ unless values.is_a?(Hash) || values.is_a?(Array)
54
+ raise ArgumentError,
55
+ "values option to enum must be a hash or array"
109
56
  end
57
+
58
+ register_variable(var_name, ConfigVariable::Enum, default: default, sensitive: sensitive, values: values)
59
+ end
60
+
61
+ def url(var_name, default: UNDEFINED, sensitive: false)
62
+ register_variable(var_name, ConfigVariable::URL, default: default, sensitive: sensitive)
110
63
  end
111
64
  end
112
65
  end
66
+
67
+ require_relative "config_variable/string"
68
+ require_relative "config_variable/boolean"
69
+ require_relative "config_variable/integer"
70
+ require_relative "config_variable/float"
71
+ require_relative "config_variable/path_list"
72
+ require_relative "config_variable/kv_list"
73
+ require_relative "config_variable/enum"
74
+ require_relative "config_variable/url"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ServiceSkeleton
2
4
  class Error < StandardError
3
5
  class InvalidEnvironmentError < Error; end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'logger'
2
4
 
3
5
  module FilteringLogger
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ServiceSkeleton
2
4
  module LoggingHelpers
3
5
  private
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ServiceSkeleton
2
4
  module MetricsMethods
3
5
  def service=(svc)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "./background_worker"
2
4
  require_relative "./logging_helpers"
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  begin
2
4
  require 'git-version-bump'
3
5
  rescue LoadError
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: service_skeleton
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0.34.g4f6fdb0
4
+ version: 0.0.0.41.g9507cda
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Palmer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-17 00:00:00.000000000 Z
11
+ date: 2019-05-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: frankenstein
@@ -274,6 +274,14 @@ files:
274
274
  - lib/service_skeleton/background_worker.rb
275
275
  - lib/service_skeleton/config.rb
276
276
  - lib/service_skeleton/config_variable.rb
277
+ - lib/service_skeleton/config_variable/boolean.rb
278
+ - lib/service_skeleton/config_variable/enum.rb
279
+ - lib/service_skeleton/config_variable/float.rb
280
+ - lib/service_skeleton/config_variable/integer.rb
281
+ - lib/service_skeleton/config_variable/kv_list.rb
282
+ - lib/service_skeleton/config_variable/path_list.rb
283
+ - lib/service_skeleton/config_variable/string.rb
284
+ - lib/service_skeleton/config_variable/url.rb
277
285
  - lib/service_skeleton/config_variables.rb
278
286
  - lib/service_skeleton/error.rb
279
287
  - lib/service_skeleton/filtering_logger.rb
@@ -299,7 +307,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
299
307
  - !ruby/object:Gem::Version
300
308
  version: 1.3.1
301
309
  requirements: []
302
- rubygems_version: 3.0.1
310
+ rubyforge_project:
311
+ rubygems_version: 2.7.6
303
312
  signing_key:
304
313
  specification_version: 4
305
314
  summary: The bare bones of a service