service_skeleton 2.0.0 → 2.0.1

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: e244f5193b33614d8466ccb26d2d2d10f8d8d7917c94af1d8a2ddbd492c96cab
4
- data.tar.gz: 1a80f5e1ed63a03bc4eb9920bc83a4f175fcd383f7aab1c5e732da2e764416ed
3
+ metadata.gz: 49be65e767a3910dc054f9409a24ab558181c008549582d139f46db04f4a83b1
4
+ data.tar.gz: 68fd00df7f28da4ae55e3fe19f4935c109646b2873b3ea1f28b6f0d7d7af6942
5
5
  SHA512:
6
- metadata.gz: 7f06bfeab8ad7401e2cdfde6ca9b2d89bf2946a65cc319b2861608a3b23a71cab91b9c438f7d212ed8326413a939dbc885d9bbd59871a78172c33e51c8b467a6
7
- data.tar.gz: 3b3f6caf8be8d1cb07505b1a84f8212621faddf890c89f21988bc611d5e795e023eacb99ea31ab64de0afbf8c919fcfb1da64269494d3e3a9891ba8aa54b6039
6
+ metadata.gz: 8c26d8944cbdb9ff40eba5fd7fb4b1f8098f0bbfcb7946712b969a897c7b9fdeb7612e44be5d03603d7e7c11f67ec6389db200e92fef2b323d2f49631e14b994
7
+ data.tar.gz: f41813b872ad1308b47c1444ec9e6441ea17a8f7dc68a5e865e7d08b08784cfb35d573e38de4799dfa43ab542e09d58f8bb3127e95b7c9dc08123e0497ea7179
@@ -1,52 +1,50 @@
1
- name: Service Skeleton Tests
1
+ name: CI
2
2
 
3
3
  on:
4
4
  pull_request:
5
5
  push:
6
6
  branches:
7
7
  - master
8
- tags:
9
- - v*
8
+ - main
10
9
 
11
10
  jobs:
12
11
  build:
13
12
  runs-on: ubuntu-latest
14
- name: Ruby ${{ matrix.ruby }}
13
+
15
14
  strategy:
16
15
  matrix:
17
- ruby: ["2.5", "2.6", "2.7"]
16
+ ruby:
17
+ - 2.5
18
+ - 2.6
19
+ - 2.7
20
+ - 3.0
21
+
18
22
  steps:
19
23
  - uses: actions/checkout@v2
20
- with:
21
- fetch-depth: 0 # Fetch all history. Needed for `git describe`
22
- - uses: actions/setup-ruby@v1
24
+
25
+ - name: Setup ruby
26
+ uses: ruby/setup-ruby@v1
23
27
  with:
24
28
  ruby-version: ${{ matrix.ruby }}
25
- - name: Bundler cache
26
- uses: actions/cache@v2
27
- with:
28
- path: vendor/bundle
29
- key: ${{ runner.os }}-${{ matrix.ruby }}-gems-${{ hashFiles('**/Gemfile.lock') }}
30
- restore-keys: |
31
- ${{ runner.os }}-${{ matrix.ruby }}-gems-
32
- - name: Setup gems
33
- run: |
34
- gem install bundler
35
- bundle config path vendor/bundle
36
- bundle install --jobs 4
37
- - name: Rubocop
29
+ bundler-cache: true
30
+
31
+ - name: Lint
38
32
  run: bundle exec rubocop
33
+
39
34
  - name: Tests
40
- run: bundle exec rspec
41
- - name: Ultravisor Tests
42
- run: bundle exec rspec ultravisor/spec
35
+ run: bundle exec rake test
36
+
43
37
  publish:
44
- if: contains(github.ref, 'refs/tags/v')
38
+ if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master')
45
39
  needs: build
46
40
  runs-on: ubuntu-latest
41
+
47
42
  steps:
48
43
  - uses: actions/checkout@v2
44
+
49
45
  - name: Release Gem
50
- uses: discourse/publish-rubygems-action@v1
46
+ uses: discourse/publish-rubygems-action@v2-beta
51
47
  env:
52
- RUBYGEMS_API_KEY: ${{secrets.RUBYGEMS_API_KEY}}
48
+ RUBYGEMS_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
49
+ GIT_EMAIL: team@discourse.org
50
+ GIT_NAME: discoursebot
data/.gitignore CHANGED
@@ -1,9 +1,2 @@
1
1
  Gemfile.lock
2
- /pkg
3
- /doc
4
- /.yardoc
5
2
  /coverage
6
- /.bundle
7
- /tmp
8
-
9
- .rubocop-https---raw-githubusercontent-com-discourse-discourse-master--rubocop-yml
@@ -16,8 +16,8 @@ module ServiceSkeleton
16
16
  module Generator
17
17
  def generate(config:, metrics_registry:, service_metrics:, service_signal_handlers:)
18
18
  Ultravisor.new(logger: config.logger).tap do |ultravisor|
19
- initialize_metrics(ultravisor, config, metrics_registry, service_metrics)
20
19
  initialize_loggerstash(ultravisor, config, metrics_registry)
20
+ initialize_metrics(ultravisor, config, metrics_registry, service_metrics)
21
21
  initialize_signals(ultravisor, config, service_signal_handlers, metrics_registry)
22
22
  end
23
23
  end
@@ -4,8 +4,16 @@ module ServiceSkeleton
4
4
  module UltravisorLoggerstash
5
5
  def logstash_writer
6
6
  #:nocov:
7
- @ultravisor[:logstash_writer].unsafe_instance
7
+ @ultravisor[:logstash_writer].unsafe_instance(wait: false)
8
8
  #:nocov:
9
9
  end
10
+
11
+ # logstash_writer will be nil if the logstash_writer worker is not running
12
+ # Ultravisor's restart policy ensures this will never happen at runtime. But
13
+ # it does happen during startup and shutdown. In this case, we want to skip
14
+ # writing to logstash, not block forever. STDOUT logging will continue.
15
+ def loggerstash_log_message(*args)
16
+ super if !logstash_writer.nil?
17
+ end
10
18
  end
11
19
  end
@@ -3,7 +3,7 @@
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "service_skeleton"
5
5
 
6
- s.version = '2.0.0'
6
+ s.version = '2.0.1'
7
7
 
8
8
  s.platform = Gem::Platform::RUBY
9
9
 
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
30
30
  s.add_runtime_dependency "prometheus-client", "~> 2.0"
31
31
  s.add_runtime_dependency "sigdump", "~> 0.2"
32
32
  s.add_runtime_dependency "to_regexp", "~> 0.2"
33
+ s.add_runtime_dependency "webrick"
33
34
 
34
35
  s.add_development_dependency 'bundler'
35
36
  s.add_development_dependency 'guard-rspec'
@@ -38,8 +39,7 @@ Gem::Specification.new do |s|
38
39
  s.add_development_dependency 'rake'
39
40
  s.add_development_dependency 'redcarpet'
40
41
  s.add_development_dependency 'rspec'
41
- s.add_development_dependency 'rubocop'
42
- s.add_development_dependency 'rubocop-discourse'
42
+ s.add_development_dependency 'rubocop-discourse', '~> 2.4.1'
43
43
  s.add_development_dependency 'simplecov'
44
44
  s.add_development_dependency 'yard'
45
45
  end
@@ -185,13 +185,13 @@ class Ultravisor
185
185
  !!(@restart == :always || (@restart == :on_failure && termination_exception))
186
186
  end
187
187
 
188
- def unsafe_instance
188
+ def unsafe_instance(wait: true)
189
189
  unless @access == :unsafe
190
190
  raise Ultravisor::ThreadSafetyError,
191
191
  "#unsafe_instance called on a child not declared with access: :unsafe"
192
192
  end
193
193
 
194
- current_instance
194
+ current_instance(wait: wait)
195
195
  end
196
196
 
197
197
  def cast
@@ -381,6 +381,10 @@ class Ultravisor
381
381
  # urgh.
382
382
  if @klass.instance_method(:initialize).arity == 0
383
383
  @klass.new()
384
+ elsif @args.is_a?(Hash)
385
+ @klass.new(**@args)
386
+ elsif @args.last.is_a?(Hash)
387
+ @klass.new(*@args[0...-1], **@args.last)
384
388
  else
385
389
  @klass.new(*@args)
386
390
  end.tap do |i|
@@ -394,9 +398,9 @@ class Ultravisor
394
398
  end
395
399
  end
396
400
 
397
- def current_instance
401
+ def current_instance(wait: true)
398
402
  @spawn_m.synchronize do
399
- while @instance.nil?
403
+ while wait && @instance.nil?
400
404
  @spawn_cv.wait(@spawn_m)
401
405
  end
402
406
 
@@ -49,4 +49,8 @@ RSpec.configure do |config|
49
49
  config.mock_with :rspec do |mocks|
50
50
  mocks.verify_partial_doubles = true
51
51
  end
52
+
53
+ config.after(:each) do
54
+ Thread.current.name = nil
55
+ end
52
56
  end
@@ -93,14 +93,123 @@ describe Ultravisor::Child do
93
93
  end
94
94
  end
95
95
 
96
- context "with a worker class that takes args" do
96
+ context "with a worker class that takes only non-keyword args" do
97
+ let(:args) { { id: :testy, klass: mock_class, args: ["foo", "bar"], method: :run } }
98
+ let(:mock_class) do
99
+ Class.new do
100
+ def initialize(foo, bar)
101
+ end
102
+
103
+ def run
104
+ end
105
+ end
106
+ end
107
+
108
+ it "creates the class instance with args" do
109
+ allow(mock_class).to receive(:new).and_call_original
110
+
111
+ child.spawn(term_queue).wait
112
+ expect(mock_class).to have_received(:new).with("foo", "bar")
113
+ end
114
+ end
115
+
116
+ context "with a worker class that takes non-keyword and optional args" do
97
117
  let(:args) { { id: :testy, klass: mock_class, args: ["foo", "bar", baz: "wombat"], method: :run } }
98
- let(:mock_class) { Class.new.tap { |k| k.class_eval { def initialize(*x); end; def run; end } } }
118
+ let(:mock_class) do
119
+ Class.new do
120
+ def initialize(foo, bar, baz = {})
121
+ end
122
+
123
+ def run
124
+ end
125
+ end
126
+ end
99
127
 
100
128
  it "creates the class instance with args" do
101
- expect(mock_class).to receive(:new).with("foo", "bar", baz: "wombat").and_call_original
129
+ allow(mock_class).to receive(:new).and_call_original
102
130
 
103
131
  child.spawn(term_queue).wait
132
+ expect(mock_class).to have_received(:new).with("foo", "bar", { baz: "wombat" })
133
+ end
134
+ end
135
+
136
+ context "with a worker class that takes mixed args" do
137
+ let(:args) { { id: :testy, klass: mock_class, args: ["foo", "bar", baz: "wombat"], method: :run } }
138
+ let(:mock_class) do
139
+ Class.new do
140
+ def initialize(foo, bar, baz:)
141
+ end
142
+
143
+ def run
144
+ end
145
+ end
146
+ end
147
+
148
+ it "creates the class instance with args" do
149
+ allow(mock_class).to receive(:new).and_call_original
150
+
151
+ child.spawn(term_queue).wait
152
+ expect(mock_class).to have_received(:new).with("foo", "bar", baz: "wombat")
153
+ end
154
+ end
155
+
156
+ context "with a worker class that takes keyword args" do
157
+ let(:args) { { id: :testy, klass: mock_class, args: [foo: "bar", baz: "wombat"], method: :run } }
158
+ let(:mock_class) do
159
+ Class.new do
160
+ def initialize(foo:, baz:)
161
+ end
162
+
163
+ def run
164
+ end
165
+ end
166
+ end
167
+
168
+ it "creates the class instance with args" do
169
+ allow(mock_class).to receive(:new).and_call_original
170
+
171
+ child.spawn(term_queue).wait
172
+ expect(mock_class).to have_received(:new).with(foo: "bar", baz: "wombat")
173
+ end
174
+ end
175
+
176
+ context "with a worker class that takes optional args" do
177
+ let(:args) { { id: :testy, klass: mock_class, args: [foo: "bar", baz: "wombat", fib: "wib", woop: "woob"], method: :run } }
178
+ let(:mock_class) do
179
+ Class.new do
180
+ def initialize(foo:, baz:, fib: "none", woop: nil)
181
+ end
182
+
183
+ def run
184
+ end
185
+ end
186
+ end
187
+
188
+ it "creates the class instance with args" do
189
+ allow(mock_class).to receive(:new).and_call_original
190
+ child.spawn(term_queue).wait
191
+
192
+ expect(mock_class).to have_received(:new).with(foo: "bar", baz: "wombat", fib: "wib", woop: "woob")
193
+ end
194
+ end
195
+
196
+ context "with a worker class that takes keyword args in form of a hash" do
197
+ let(:args) { { id: :testy, klass: mock_class, args: { foo: "bar", baz: "wombat" }, method: :run } }
198
+ let(:mock_class) do
199
+ Class.new do
200
+ def initialize(foo:, baz:)
201
+ end
202
+
203
+ def run
204
+ end
205
+ end
206
+ end
207
+
208
+ it "creates the class instance with args" do
209
+ allow(mock_class).to receive(:new).and_call_original
210
+ child.spawn(term_queue).wait
211
+
212
+ expect(mock_class).to have_received(:new).with(foo: "bar", baz: "wombat")
104
213
  end
105
214
  end
106
215
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: service_skeleton
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Palmer
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-03-01 00:00:00.000000000 Z
12
+ date: 2021-03-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: frankenstein
@@ -82,13 +82,13 @@ dependencies:
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0.2'
84
84
  - !ruby/object:Gem::Dependency
85
- name: bundler
85
+ name: webrick
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
88
  - - ">="
89
89
  - !ruby/object:Gem::Version
90
90
  version: '0'
91
- type: :development
91
+ type: :runtime
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
@@ -96,7 +96,7 @@ dependencies:
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
98
  - !ruby/object:Gem::Dependency
99
- name: guard-rspec
99
+ name: bundler
100
100
  requirement: !ruby/object:Gem::Requirement
101
101
  requirements:
102
102
  - - ">="
@@ -110,7 +110,7 @@ dependencies:
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0'
112
112
  - !ruby/object:Gem::Dependency
113
- name: guard-rubocop
113
+ name: guard-rspec
114
114
  requirement: !ruby/object:Gem::Requirement
115
115
  requirements:
116
116
  - - ">="
@@ -124,7 +124,7 @@ dependencies:
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
126
  - !ruby/object:Gem::Dependency
127
- name: rack-test
127
+ name: guard-rubocop
128
128
  requirement: !ruby/object:Gem::Requirement
129
129
  requirements:
130
130
  - - ">="
@@ -138,7 +138,7 @@ dependencies:
138
138
  - !ruby/object:Gem::Version
139
139
  version: '0'
140
140
  - !ruby/object:Gem::Dependency
141
- name: rake
141
+ name: rack-test
142
142
  requirement: !ruby/object:Gem::Requirement
143
143
  requirements:
144
144
  - - ">="
@@ -152,7 +152,7 @@ dependencies:
152
152
  - !ruby/object:Gem::Version
153
153
  version: '0'
154
154
  - !ruby/object:Gem::Dependency
155
- name: redcarpet
155
+ name: rake
156
156
  requirement: !ruby/object:Gem::Requirement
157
157
  requirements:
158
158
  - - ">="
@@ -166,7 +166,7 @@ dependencies:
166
166
  - !ruby/object:Gem::Version
167
167
  version: '0'
168
168
  - !ruby/object:Gem::Dependency
169
- name: rspec
169
+ name: redcarpet
170
170
  requirement: !ruby/object:Gem::Requirement
171
171
  requirements:
172
172
  - - ">="
@@ -180,7 +180,7 @@ dependencies:
180
180
  - !ruby/object:Gem::Version
181
181
  version: '0'
182
182
  - !ruby/object:Gem::Dependency
183
- name: rubocop
183
+ name: rspec
184
184
  requirement: !ruby/object:Gem::Requirement
185
185
  requirements:
186
186
  - - ">="
@@ -197,16 +197,16 @@ dependencies:
197
197
  name: rubocop-discourse
198
198
  requirement: !ruby/object:Gem::Requirement
199
199
  requirements:
200
- - - ">="
200
+ - - "~>"
201
201
  - !ruby/object:Gem::Version
202
- version: '0'
202
+ version: 2.4.1
203
203
  type: :development
204
204
  prerelease: false
205
205
  version_requirements: !ruby/object:Gem::Requirement
206
206
  requirements:
207
- - - ">="
207
+ - - "~>"
208
208
  - !ruby/object:Gem::Version
209
- version: '0'
209
+ version: 2.4.1
210
210
  - !ruby/object:Gem::Dependency
211
211
  name: simplecov
212
212
  requirement: !ruby/object:Gem::Requirement
@@ -334,7 +334,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
334
334
  - !ruby/object:Gem::Version
335
335
  version: '0'
336
336
  requirements: []
337
- rubygems_version: 3.0.3
337
+ rubygems_version: 3.1.4
338
338
  signing_key:
339
339
  specification_version: 4
340
340
  summary: The bare bones of a service