service_skeleton 0.0.0.1.ENOTAG → 0.0.0.2.g46c1e0e

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +0 -2
  3. data/.rubocop.yml +114 -9
  4. data/.travis.yml +11 -0
  5. data/README.md +153 -279
  6. data/lib/service_skeleton/background_worker.rb +80 -0
  7. data/lib/service_skeleton/config.rb +18 -78
  8. data/lib/service_skeleton/config_variable.rb +8 -29
  9. data/lib/service_skeleton/config_variables.rb +68 -54
  10. data/lib/service_skeleton/error.rb +3 -5
  11. data/lib/service_skeleton/filtering_logger.rb +0 -2
  12. data/lib/service_skeleton/logging_helpers.rb +3 -10
  13. data/lib/service_skeleton/metrics_methods.rb +13 -28
  14. data/lib/service_skeleton/signal_handler.rb +183 -0
  15. data/lib/service_skeleton.rb +145 -22
  16. data/service_skeleton.gemspec +9 -10
  17. metadata +19 -102
  18. data/.editorconfig +0 -7
  19. data/.git-blame-ignore-revs +0 -2
  20. data/.github/workflows/ci.yml +0 -50
  21. data/lib/service_skeleton/config_class.rb +0 -16
  22. data/lib/service_skeleton/config_variable/boolean.rb +0 -21
  23. data/lib/service_skeleton/config_variable/enum.rb +0 -27
  24. data/lib/service_skeleton/config_variable/float.rb +0 -25
  25. data/lib/service_skeleton/config_variable/integer.rb +0 -25
  26. data/lib/service_skeleton/config_variable/kv_list.rb +0 -26
  27. data/lib/service_skeleton/config_variable/path_list.rb +0 -13
  28. data/lib/service_skeleton/config_variable/string.rb +0 -18
  29. data/lib/service_skeleton/config_variable/url.rb +0 -36
  30. data/lib/service_skeleton/config_variable/yaml_file.rb +0 -42
  31. data/lib/service_skeleton/generator.rb +0 -165
  32. data/lib/service_skeleton/metric_method_name.rb +0 -9
  33. data/lib/service_skeleton/runner.rb +0 -46
  34. data/lib/service_skeleton/service_name.rb +0 -20
  35. data/lib/service_skeleton/signal_manager.rb +0 -202
  36. data/lib/service_skeleton/signals_methods.rb +0 -15
  37. data/lib/service_skeleton/ultravisor_children.rb +0 -20
  38. data/lib/service_skeleton/ultravisor_loggerstash.rb +0 -11
  39. data/ultravisor/.yardopts +0 -1
  40. data/ultravisor/Guardfile +0 -9
  41. data/ultravisor/README.md +0 -404
  42. data/ultravisor/lib/ultravisor/child/call.rb +0 -21
  43. data/ultravisor/lib/ultravisor/child/call_receiver.rb +0 -14
  44. data/ultravisor/lib/ultravisor/child/cast.rb +0 -16
  45. data/ultravisor/lib/ultravisor/child/cast_receiver.rb +0 -11
  46. data/ultravisor/lib/ultravisor/child/process_cast_call.rb +0 -39
  47. data/ultravisor/lib/ultravisor/child.rb +0 -481
  48. data/ultravisor/lib/ultravisor/error.rb +0 -25
  49. data/ultravisor/lib/ultravisor/logging_helpers.rb +0 -32
  50. data/ultravisor/lib/ultravisor.rb +0 -216
  51. data/ultravisor/spec/example_group_methods.rb +0 -19
  52. data/ultravisor/spec/example_methods.rb +0 -8
  53. data/ultravisor/spec/spec_helper.rb +0 -52
  54. data/ultravisor/spec/ultravisor/add_child_spec.rb +0 -79
  55. data/ultravisor/spec/ultravisor/child/call_spec.rb +0 -121
  56. data/ultravisor/spec/ultravisor/child/cast_spec.rb +0 -111
  57. data/ultravisor/spec/ultravisor/child/id_spec.rb +0 -21
  58. data/ultravisor/spec/ultravisor/child/new_spec.rb +0 -152
  59. data/ultravisor/spec/ultravisor/child/restart_delay_spec.rb +0 -40
  60. data/ultravisor/spec/ultravisor/child/restart_spec.rb +0 -70
  61. data/ultravisor/spec/ultravisor/child/run_spec.rb +0 -95
  62. data/ultravisor/spec/ultravisor/child/shutdown_spec.rb +0 -124
  63. data/ultravisor/spec/ultravisor/child/spawn_spec.rb +0 -107
  64. data/ultravisor/spec/ultravisor/child/unsafe_instance_spec.rb +0 -55
  65. data/ultravisor/spec/ultravisor/child/wait_spec.rb +0 -32
  66. data/ultravisor/spec/ultravisor/new_spec.rb +0 -71
  67. data/ultravisor/spec/ultravisor/remove_child_spec.rb +0 -49
  68. data/ultravisor/spec/ultravisor/run_spec.rb +0 -334
  69. data/ultravisor/spec/ultravisor/shutdown_spec.rb +0 -106
@@ -0,0 +1,183 @@
1
+ require_relative "./background_worker"
2
+ require_relative "./logging_helpers"
3
+
4
+ class ServiceSkeleton
5
+ # Manage signals in a sane and safe manner.
6
+ #
7
+ # Signal handling is a shit of a thing. The code that runs when a signal is
8
+ # triggered can't use mutexes (which are used in all sorts of places you
9
+ # might not expect, like Logger!) or anything else that might block. This
10
+ # greatly constrains what you can do inside a signal handler, so the standard
11
+ # approach is to stuff a character down a pipe, and then have the *real*
12
+ # signal handling run later.
13
+ #
14
+ # Also, there's always the (slim) possibility that something else might have
15
+ # hooked into a signal we want to receive. Because only a single signal
16
+ # handler can be active for a given signal at a time, we need to "chain" the
17
+ # existing handler, by calling the previous signal handler from our signal
18
+ # handler after we've done what we need to do. This class takes care of
19
+ # that, too, because it's a legend.
20
+ #
21
+ # So that's what this class does: it allows you to specify signals and
22
+ # associated blocks of code to run, it sets up signal handlers which send
23
+ # notifications to a background thread and chain correctly, and it manages
24
+ # the background thread to receive the notifications and execute the
25
+ # associated blocks of code outside of the context of the signal handler.
26
+ #
27
+ class SignalHandler
28
+ include ServiceSkeleton::LoggingHelpers
29
+ include ServiceSkeleton::BackgroundWorker
30
+
31
+ # Setup a signal handler instance.
32
+ #
33
+ # A single signal handler instance can handle up to 256 hooks, potentially
34
+ # hooking the same signal more than once. Use #hook_signal to register
35
+ # signal handling callbacks.
36
+ #
37
+ # @param logger [Logger] the logger to use for all the interesting information
38
+ # about what we're up to.
39
+ #
40
+ def initialize(logger:, service:, signal_counter:)
41
+ @logger, @service, @signal_counter = logger, service, signal_counter
42
+
43
+ @signal_registry = []
44
+
45
+ super
46
+ end
47
+
48
+ #:nocov:
49
+
50
+ # Register a callback to be executed on the receipt of a specified signal.
51
+ #
52
+ # @param sig [String, Symbol, Integer] the signal to hook into. Anything that
53
+ # `Signal.trap` will accept is OK by us, too.
54
+ #
55
+ # @param blk [Proc] the code to run when the signal is received.
56
+ #
57
+ # @return [void]
58
+ #
59
+ # @raise [RuntimeError] if you try to create more than 256 signal hooks.
60
+ #
61
+ # @raise [ArgumentError] if `sig` isn't recognised as a valid signal
62
+ # specifier by `Signal.trap`.
63
+ #
64
+ def hook_signal(sig, &blk)
65
+ @bg_worker_op_mutex.synchronize do
66
+ handler_num = @signal_registry.length
67
+
68
+ if handler_num > 255
69
+ raise RuntimeError,
70
+ "Signal hook limit reached. Slow down there, pardner"
71
+ end
72
+
73
+ sigspec = { signal: sig, callback: blk }
74
+
75
+ if @bg_worker_thread
76
+ install_handler(sigspec, handler_num)
77
+ else
78
+ # If the background thread isn't running yet, the signal handler will
79
+ # be installed when that is started.
80
+ end
81
+
82
+ @signal_registry << sigspec
83
+ end
84
+ end
85
+
86
+ def start
87
+ logger.info("SignalHandler#start") { "Starting signal handler with #{@signal_registry.length} hooks" }
88
+
89
+ @r, @w = IO.pipe
90
+
91
+ install_signal_handlers
92
+
93
+ loop do
94
+ begin
95
+ if ios = IO.select([@r])
96
+ if ios.first.include?(@r)
97
+ if ios.first.first.eof?
98
+ logger.info("SignalHandler#run") { "Signal pipe closed; shutting down" }
99
+ break
100
+ else
101
+ c = ios.first.first.read_nonblock(1)
102
+ handle_signal(c)
103
+ end
104
+ else
105
+ logger.error("SignalHandler#run") { "Mysterious return from select: #{ios.inspect}" }
106
+ end
107
+ end
108
+ rescue StandardError => ex
109
+ log_exception(ex) { "Exception in select loop" }
110
+ end
111
+ end
112
+ end
113
+
114
+ private
115
+
116
+ attr_reader :logger
117
+
118
+ # Given a character (presumably) received via the signal pipe, execute the
119
+ # associated handler.
120
+ #
121
+ # @param char [String] a single character, corresponding to an entry in the
122
+ # signal registry.
123
+ #
124
+ # @return [void]
125
+ #
126
+ def handle_signal(char)
127
+ handler = @signal_registry[char.ord]
128
+
129
+ if handler
130
+ logger.debug("SignalHandler#handle_signal") { "#{handler[:signal]} received" }
131
+ @signal_counter.increment(signal: handler[:signal].to_s)
132
+ begin
133
+ handler[:callback].call
134
+ rescue => ex
135
+ log_exception(ex) { "Exception in signal handler" }
136
+ end
137
+ else
138
+ logger.error("SignalHandler#handle_signal") { "Unrecognised signal character: #{char.inspect}" }
139
+ end
140
+ end
141
+
142
+ def install_signal_handlers
143
+ @signal_registry.each_with_index do |sigspec, i|
144
+ install_handler(sigspec, i)
145
+ end
146
+ end
147
+
148
+ def install_handler(sigspec, i)
149
+ chain = nil
150
+
151
+ p = ->(_) do
152
+ @w.write_nonblock(i.chr) rescue nil
153
+ chain.call if chain.respond_to?(:call)
154
+ end
155
+ chain = Signal.trap(sigspec[:signal], &p)
156
+
157
+ sigspec[:chain] = chain
158
+ sigspec[:handler] = p
159
+ end
160
+
161
+ def shutdown
162
+ uninstall_signal_handlers
163
+
164
+ @r.close
165
+ end
166
+
167
+ def uninstall_signal_handlers
168
+ @signal_registry.reverse.each do |sigspec|
169
+ tmp_sig = Signal.trap(sigspec[:signal], "IGNORE")
170
+ if tmp_sig == sigspec[:handler]
171
+ # The current handler is ours, so we can replace
172
+ # it with the chained handler
173
+ Signal.trap(sigspec[:signal], sigspec[:chain])
174
+ else
175
+ # The current handler *isn't* this one, so we better
176
+ # put it back, because whoever owns it might get
177
+ # angry.
178
+ Signal.trap(sigspec[:signal], tmp_sig)
179
+ end
180
+ end
181
+ end
182
+ end
183
+ end
@@ -1,13 +1,8 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "service_skeleton/config_class"
1
+ require_relative "service_skeleton/config"
4
2
  require_relative "service_skeleton/config_variables"
5
- require_relative "service_skeleton/generator"
6
3
  require_relative "service_skeleton/logging_helpers"
7
4
  require_relative "service_skeleton/metrics_methods"
8
- require_relative "service_skeleton/service_name"
9
- require_relative "service_skeleton/signals_methods"
10
- require_relative "service_skeleton/ultravisor_children"
5
+ require_relative "service_skeleton/signal_handler"
11
6
 
12
7
  require "frankenstein/ruby_gc_metrics"
13
8
  require "frankenstein/ruby_vm_metrics"
@@ -16,26 +11,154 @@ require "frankenstein/server"
16
11
  require "prometheus/client/registry"
17
12
  require "sigdump"
18
13
 
19
- module ServiceSkeleton
14
+ class ServiceSkeleton
15
+ extend ServiceSkeleton::ConfigVariables
16
+
20
17
  include ServiceSkeleton::LoggingHelpers
21
- extend ServiceSkeleton::Generator
22
18
 
23
- def self.included(mod)
24
- mod.extend ServiceSkeleton::ServiceName
25
- mod.extend ServiceSkeleton::ConfigVariables
26
- mod.extend ServiceSkeleton::ConfigClass
27
- mod.extend ServiceSkeleton::MetricsMethods
28
- mod.extend ServiceSkeleton::SignalsMethods
29
- mod.extend ServiceSkeleton::UltravisorChildren
19
+ def self.config_class(klass)
20
+ @config_class = klass
21
+ end
22
+
23
+ def self.service_name
24
+ self.to_s
25
+ .gsub("::", "_")
26
+ .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
27
+ .gsub(/([a-z\d])([A-Z])/, '\1_\2')
28
+ .downcase
30
29
  end
31
30
 
32
31
  attr_reader :config, :metrics, :logger
33
32
 
34
- def initialize(*_, metrics:, config:)
35
- @metrics = metrics
36
- @config = config
37
- @logger = @config.logger
33
+ def initialize(env)
34
+ @env = env
35
+ @config = (self.class.instance_variable_get(:@config_class) || ServiceSkeleton::Config).new(env, self)
36
+ @logger = @config.logger
37
+
38
+ setup_metrics
39
+ setup_signals
40
+ end
41
+
42
+ def start
43
+ begin
44
+ start_metrics_server
45
+ start_signal_handler
46
+ run
47
+ rescue ServiceSkeleton::Error::InheritanceContractError
48
+ # We want this one to be fatal
49
+ raise
50
+ rescue StandardError => ex
51
+ log_exception(ex)
52
+ end
53
+ end
54
+
55
+ def stop(force = false)
56
+ shutdown
57
+
58
+ if @metrics_server
59
+ @metrics_server.shutdown
60
+ @metrics_server = nil
61
+ end
62
+
63
+ @signal_handler.stop!
64
+ end
65
+
66
+ def service_name
67
+ self.class.service_name
68
+ end
69
+
70
+ def registered_variables
71
+ self.class.registered_variables
72
+ end
73
+
74
+ def hook_signal(spec, &blk)
75
+ @signal_handler.hook_signal(spec, &blk)
76
+ end
77
+
78
+ private
79
+
80
+ def run
81
+ raise ServiceSkeleton::Error::InheritanceContractError, "ServiceSkeleton#run method not overridden"
38
82
  end
39
- end
40
83
 
41
- require_relative "service_skeleton/runner"
84
+ def setup_metrics
85
+ @metrics = Prometheus::Client::Registry.new
86
+
87
+ Frankenstein::RubyGCMetrics.register(@metrics)
88
+ Frankenstein::RubyVMMetrics.register(@metrics)
89
+ Frankenstein::ProcessMetrics.register(@metrics)
90
+
91
+ @metrics.singleton_class.prepend(ServiceSkeleton::MetricsMethods)
92
+ @metrics.service = self
93
+
94
+ end
95
+
96
+ def start_metrics_server
97
+ if config.metrics_port
98
+ logger.info(self.class.to_s) { "Starting metrics server on port #{config.metrics_port}" }
99
+
100
+ @metrics_server = Frankenstein::Server.new(
101
+ port: config.metrics_port,
102
+ logger: logger,
103
+ metrics_prefix: :metrics_server,
104
+ registry: @metrics,
105
+ )
106
+ @metrics_server.run
107
+ end
108
+ end
109
+
110
+ def setup_signals
111
+ @signal_handler = ServiceSkeleton::SignalHandler.new(logger: logger, service: self, signal_counter: metrics.counter(:"#{service_name}_signals_handled_total", "How many of each type of signal have been handled"))
112
+
113
+ @signal_handler.hook_signal("USR1") do
114
+ logger.level -= 1 unless logger.level == Logger::DEBUG
115
+ logger.info($0) { "Received SIGUSR1; log level is now #{Logger::SEV_LABEL[logger.level]}." }
116
+ end
117
+
118
+ @signal_handler.hook_signal("USR2") do
119
+ logger.level += 1 unless logger.level == Logger::ERROR
120
+ logger.info($0) { "Received SIGUSR2; log level is now #{Logger::SEV_LABEL[logger.level]}." }
121
+ end
122
+
123
+ @signal_handler.hook_signal("HUP") do
124
+ logger.reopen
125
+ logger.info($0) { "Received SIGHUP; log file handle reopened" }
126
+ end
127
+
128
+ @signal_handler.hook_signal("QUIT") do
129
+ Sigdump.dump("+")
130
+ end
131
+
132
+ @signal_handler.hook_signal("INT") do
133
+ self.stop(!!@terminating)
134
+ @terminating = true
135
+ end
136
+
137
+ @signal_handler.hook_signal("TERM") do
138
+ self.stop(!!@terminating)
139
+ @terminating = true
140
+ end
141
+ end
142
+
143
+ def start_signal_handler
144
+ @signal_handler.start!
145
+ end
146
+
147
+ @registered_variables = [
148
+ ServiceSkeleton::ConfigVariable.new(:SERVICE_SKELETON_LOG_LEVEL) { "INFO" },
149
+ ServiceSkeleton::ConfigVariable.new(:SERVICE_SKELETON_LOG_ENABLE_TIMESTAMPS) { false },
150
+ ServiceSkeleton::ConfigVariable.new(:SERVICE_SKELETON_LOG_FILE) { nil },
151
+ ServiceSkeleton::ConfigVariable.new(:SERVICE_SKELETON_LOG_MAX_FILE_SIZE) { 1048576 },
152
+ ServiceSkeleton::ConfigVariable.new(:SERVICE_SKELETON_LOG_MAX_FILES) { 3 },
153
+ ServiceSkeleton::ConfigVariable.new(:SERVICE_SKELETON_METRICS_PORT) { nil },
154
+ ]
155
+
156
+ def self.inherited(subclass)
157
+ subclass.string(:"#{subclass.service_name.upcase}_LOG_LEVEL", default: "INFO")
158
+ subclass.boolean(:"#{subclass.service_name.upcase}_LOG_ENABLE_TIMESTAMPS", default: false)
159
+ subclass.string(:"#{subclass.service_name.upcase}_LOG_FILE", default: nil)
160
+ subclass.integer(:"#{subclass.service_name.upcase}_LOG_MAX_FILE_SIZE", default: 1048576, range: 0..Float::INFINITY)
161
+ subclass.integer(:"#{subclass.service_name.upcase}_LOG_MAX_FILES", default: 3, range: 1..Float::INFINITY)
162
+ subclass.integer(:"#{subclass.service_name.upcase}_METRICS_PORT", default: nil, range: 1..65535)
163
+ end
164
+ end
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  begin
4
2
  require 'git-version-bump'
5
3
  rescue LoadError
@@ -24,17 +22,19 @@ Gem::Specification.new do |s|
24
22
  common aspects of a system service.
25
23
  EOF
26
24
 
27
- s.authors = ["Matt Palmer", "Sam Saffron"]
28
- s.email = ["sam.saffron@discourse.org"]
25
+ s.authors = ["Matt Palmer"]
26
+ s.email = ["matt.palmer@discourse.org"]
29
27
  s.homepage = "https://github.com/discourse/service_skeleton"
30
28
 
31
29
  s.files = `git ls-files -z`.split("\0").reject { |f| f =~ /^(G|spec|Rakefile)/ }
32
30
 
33
- s.required_ruby_version = ">= 2.5.0"
31
+ s.required_ruby_version = ">= 2.3.0"
34
32
 
35
- s.add_runtime_dependency "frankenstein", "~> 2.0"
36
- s.add_runtime_dependency "loggerstash", ">= 0.0.9", "< 1"
37
- s.add_runtime_dependency "prometheus-client", "~> 2.0"
33
+ s.add_runtime_dependency "frankenstein", "~> 1.2"
34
+ # prometheus-client provides no guaranteed backwards compatibility,
35
+ # and in fact happily breaks things with no notice, so we're stuck
36
+ # with hard-coding a specific version to avoid unexpected disaster.
37
+ s.add_runtime_dependency "prometheus-client", "0.8.0"
38
38
  s.add_runtime_dependency "sigdump", "~> 0.2"
39
39
  s.add_runtime_dependency "to_regexp", "~> 0.2"
40
40
 
@@ -44,11 +44,10 @@ Gem::Specification.new do |s|
44
44
  s.add_development_dependency 'guard-rspec'
45
45
  s.add_development_dependency 'guard-rubocop'
46
46
  s.add_development_dependency 'rack-test'
47
- s.add_development_dependency 'rake'
47
+ s.add_development_dependency 'rake', "~> 12.0"
48
48
  s.add_development_dependency 'redcarpet'
49
49
  s.add_development_dependency 'rspec'
50
50
  s.add_development_dependency 'rubocop'
51
- s.add_development_dependency 'rubocop-discourse'
52
51
  s.add_development_dependency 'simplecov'
53
52
  s.add_development_dependency 'yard'
54
53
  end
metadata CHANGED
@@ -1,15 +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.1.ENOTAG
4
+ version: 0.0.0.2.g46c1e0e
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Palmer
8
- - Sam Saffron
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2021-02-01 00:00:00.000000000 Z
11
+ date: 2018-11-15 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: frankenstein
@@ -17,48 +16,28 @@ dependencies:
17
16
  requirements:
18
17
  - - "~>"
19
18
  - !ruby/object:Gem::Version
20
- version: '2.0'
19
+ version: '1.2'
21
20
  type: :runtime
22
21
  prerelease: false
23
22
  version_requirements: !ruby/object:Gem::Requirement
24
23
  requirements:
25
24
  - - "~>"
26
25
  - !ruby/object:Gem::Version
27
- version: '2.0'
28
- - !ruby/object:Gem::Dependency
29
- name: loggerstash
30
- requirement: !ruby/object:Gem::Requirement
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: 0.0.9
35
- - - "<"
36
- - !ruby/object:Gem::Version
37
- version: '1'
38
- type: :runtime
39
- prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- version: 0.0.9
45
- - - "<"
46
- - !ruby/object:Gem::Version
47
- version: '1'
26
+ version: '1.2'
48
27
  - !ruby/object:Gem::Dependency
49
28
  name: prometheus-client
50
29
  requirement: !ruby/object:Gem::Requirement
51
30
  requirements:
52
- - - "~>"
31
+ - - '='
53
32
  - !ruby/object:Gem::Version
54
- version: '2.0'
33
+ version: 0.8.0
55
34
  type: :runtime
56
35
  prerelease: false
57
36
  version_requirements: !ruby/object:Gem::Requirement
58
37
  requirements:
59
- - - "~>"
38
+ - - '='
60
39
  - !ruby/object:Gem::Version
61
- version: '2.0'
40
+ version: 0.8.0
62
41
  - !ruby/object:Gem::Dependency
63
42
  name: sigdump
64
43
  requirement: !ruby/object:Gem::Requirement
@@ -175,16 +154,16 @@ dependencies:
175
154
  name: rake
176
155
  requirement: !ruby/object:Gem::Requirement
177
156
  requirements:
178
- - - ">="
157
+ - - "~>"
179
158
  - !ruby/object:Gem::Version
180
- version: '0'
159
+ version: '12.0'
181
160
  type: :development
182
161
  prerelease: false
183
162
  version_requirements: !ruby/object:Gem::Requirement
184
163
  requirements:
185
- - - ">="
164
+ - - "~>"
186
165
  - !ruby/object:Gem::Version
187
- version: '0'
166
+ version: '12.0'
188
167
  - !ruby/object:Gem::Dependency
189
168
  name: redcarpet
190
169
  requirement: !ruby/object:Gem::Requirement
@@ -227,20 +206,6 @@ dependencies:
227
206
  - - ">="
228
207
  - !ruby/object:Gem::Version
229
208
  version: '0'
230
- - !ruby/object:Gem::Dependency
231
- name: rubocop-discourse
232
- requirement: !ruby/object:Gem::Requirement
233
- requirements:
234
- - - ">="
235
- - !ruby/object:Gem::Version
236
- version: '0'
237
- type: :development
238
- prerelease: false
239
- version_requirements: !ruby/object:Gem::Requirement
240
- requirements:
241
- - - ">="
242
- - !ruby/object:Gem::Version
243
- version: '0'
244
209
  - !ruby/object:Gem::Dependency
245
210
  name: simplecov
246
211
  requirement: !ruby/object:Gem::Requirement
@@ -277,79 +242,30 @@ description: |
277
242
  for your services, as well as a collection of helper classes to manage
278
243
  common aspects of a system service.
279
244
  email:
280
- - sam.saffron@discourse.org
245
+ - matt.palmer@discourse.org
281
246
  executables: []
282
247
  extensions: []
283
248
  extra_rdoc_files: []
284
249
  files:
285
- - ".editorconfig"
286
- - ".git-blame-ignore-revs"
287
- - ".github/workflows/ci.yml"
288
250
  - ".gitignore"
289
251
  - ".rubocop.yml"
252
+ - ".travis.yml"
290
253
  - ".yardopts"
291
254
  - CODE_OF_CONDUCT.md
292
255
  - CONTRIBUTING.md
293
256
  - LICENCE
294
257
  - README.md
295
258
  - lib/service_skeleton.rb
259
+ - lib/service_skeleton/background_worker.rb
296
260
  - lib/service_skeleton/config.rb
297
- - lib/service_skeleton/config_class.rb
298
261
  - lib/service_skeleton/config_variable.rb
299
- - lib/service_skeleton/config_variable/boolean.rb
300
- - lib/service_skeleton/config_variable/enum.rb
301
- - lib/service_skeleton/config_variable/float.rb
302
- - lib/service_skeleton/config_variable/integer.rb
303
- - lib/service_skeleton/config_variable/kv_list.rb
304
- - lib/service_skeleton/config_variable/path_list.rb
305
- - lib/service_skeleton/config_variable/string.rb
306
- - lib/service_skeleton/config_variable/url.rb
307
- - lib/service_skeleton/config_variable/yaml_file.rb
308
262
  - lib/service_skeleton/config_variables.rb
309
263
  - lib/service_skeleton/error.rb
310
264
  - lib/service_skeleton/filtering_logger.rb
311
- - lib/service_skeleton/generator.rb
312
265
  - lib/service_skeleton/logging_helpers.rb
313
- - lib/service_skeleton/metric_method_name.rb
314
266
  - lib/service_skeleton/metrics_methods.rb
315
- - lib/service_skeleton/runner.rb
316
- - lib/service_skeleton/service_name.rb
317
- - lib/service_skeleton/signal_manager.rb
318
- - lib/service_skeleton/signals_methods.rb
319
- - lib/service_skeleton/ultravisor_children.rb
320
- - lib/service_skeleton/ultravisor_loggerstash.rb
267
+ - lib/service_skeleton/signal_handler.rb
321
268
  - service_skeleton.gemspec
322
- - ultravisor/.yardopts
323
- - ultravisor/Guardfile
324
- - ultravisor/README.md
325
- - ultravisor/lib/ultravisor.rb
326
- - ultravisor/lib/ultravisor/child.rb
327
- - ultravisor/lib/ultravisor/child/call.rb
328
- - ultravisor/lib/ultravisor/child/call_receiver.rb
329
- - ultravisor/lib/ultravisor/child/cast.rb
330
- - ultravisor/lib/ultravisor/child/cast_receiver.rb
331
- - ultravisor/lib/ultravisor/child/process_cast_call.rb
332
- - ultravisor/lib/ultravisor/error.rb
333
- - ultravisor/lib/ultravisor/logging_helpers.rb
334
- - ultravisor/spec/example_group_methods.rb
335
- - ultravisor/spec/example_methods.rb
336
- - ultravisor/spec/spec_helper.rb
337
- - ultravisor/spec/ultravisor/add_child_spec.rb
338
- - ultravisor/spec/ultravisor/child/call_spec.rb
339
- - ultravisor/spec/ultravisor/child/cast_spec.rb
340
- - ultravisor/spec/ultravisor/child/id_spec.rb
341
- - ultravisor/spec/ultravisor/child/new_spec.rb
342
- - ultravisor/spec/ultravisor/child/restart_delay_spec.rb
343
- - ultravisor/spec/ultravisor/child/restart_spec.rb
344
- - ultravisor/spec/ultravisor/child/run_spec.rb
345
- - ultravisor/spec/ultravisor/child/shutdown_spec.rb
346
- - ultravisor/spec/ultravisor/child/spawn_spec.rb
347
- - ultravisor/spec/ultravisor/child/unsafe_instance_spec.rb
348
- - ultravisor/spec/ultravisor/child/wait_spec.rb
349
- - ultravisor/spec/ultravisor/new_spec.rb
350
- - ultravisor/spec/ultravisor/remove_child_spec.rb
351
- - ultravisor/spec/ultravisor/run_spec.rb
352
- - ultravisor/spec/ultravisor/shutdown_spec.rb
353
269
  homepage: https://github.com/discourse/service_skeleton
354
270
  licenses: []
355
271
  metadata: {}
@@ -361,14 +277,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
361
277
  requirements:
362
278
  - - ">="
363
279
  - !ruby/object:Gem::Version
364
- version: 2.5.0
280
+ version: 2.3.0
365
281
  required_rubygems_version: !ruby/object:Gem::Requirement
366
282
  requirements:
367
283
  - - ">"
368
284
  - !ruby/object:Gem::Version
369
285
  version: 1.3.1
370
286
  requirements: []
371
- rubygems_version: 3.0.3
287
+ rubyforge_project:
288
+ rubygems_version: 2.5.2.1
372
289
  signing_key:
373
290
  specification_version: 4
374
291
  summary: The bare bones of a service
data/.editorconfig DELETED
@@ -1,7 +0,0 @@
1
- [*.rb]
2
- indent_style = space
3
- indent_size = 2
4
- end_of_line = lf
5
- insert_final_newline = true
6
- charset = utf-8
7
- trim_trailing_whitespace = true
@@ -1,2 +0,0 @@
1
- # Reformatting ultravisor
2
- 5a89b13dce618cd2544c5518833c4f1587a38ee7
@@ -1,50 +0,0 @@
1
- name: Service Skeleton Tests
2
-
3
- on:
4
- pull_request:
5
- push:
6
- branches:
7
- - master
8
- tags:
9
- - v*
10
-
11
- jobs:
12
- build:
13
- runs-on: ubuntu-latest
14
- name: Ruby ${{ matrix.ruby }}
15
- strategy:
16
- matrix:
17
- ruby: ["2.5", "2.6", "2.7"]
18
- steps:
19
- - uses: actions/checkout@v2
20
- - uses: actions/setup-ruby@v1
21
- with:
22
- ruby-version: ${{ matrix.ruby }}
23
- - name: Bundler cache
24
- uses: actions/cache@v2
25
- with:
26
- path: vendor/bundle
27
- key: ${{ runner.os }}-${{ matrix.ruby }}-gems-${{ hashFiles('**/Gemfile.lock') }}
28
- restore-keys: |
29
- ${{ runner.os }}-${{ matrix.ruby }}-gems-
30
- - name: Setup gems
31
- run: |
32
- gem install bundler
33
- bundle config path vendor/bundle
34
- bundle install --jobs 4
35
- - name: Rubocop
36
- run: bundle exec rubocop
37
- - name: Tests
38
- run: bundle exec rspec
39
- - name: Ultravisor Tests
40
- run: bundle exec rspec ultravisor/spec
41
- publish:
42
- if: contains(github.ref, 'refs/tags/v')
43
- needs: build
44
- runs-on: ubuntu-latest
45
- steps:
46
- - uses: actions/checkout@v2
47
- - name: Release Gem
48
- uses: CvX/publish-rubygems-action@master
49
- env:
50
- RUBYGEMS_API_KEY: ${{secrets.RUBYGEMS_API_KEY}}