health_bit 0.1.8 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1b89365fc234404da475087af408d01f927f8c58a0e41eadbe3d0f5bf172c551
4
- data.tar.gz: 17a35b4d08227b12eb7d787843d760b01bd2d9f53d36eecb6b00d3811b689a8a
3
+ metadata.gz: 7351c3a05b94e33b5349abd88cfd076680de3b01ab74e035f8d18f7c669222e4
4
+ data.tar.gz: be72a41bb73bbb372ce1b0416c9819dcdbe3f3ad05dee5dfdb9e25e9f16d258a
5
5
  SHA512:
6
- metadata.gz: 3e6441577cb24561a366b674978d501b86ae641ef40cdcccbea1054651a5aad1c3dd9d59a2f2b4cce34d3ce4f22fac8668265c87fbaa92771e9f61d1e522311f
7
- data.tar.gz: 9e86554bad55338dcd40a5ca192e0aee79753936ad52935649a46980f66aac092359642cc41f53eadb5a55d8b61f6e895c181ee6206a4490266f02a3055d7620
6
+ metadata.gz: e3604074bf177e2297062a284c38f100872de45815b3c6872c2b2f820150a8d1a89317ca7d58b312ca4edc95f8ce37db4934012b457e292bd2625b14b5c227a0
7
+ data.tar.gz: 308578eefc161b52aa99765842648e50a9748c96ae02ad86f9e93fd9d73723c95ee0a3fbbb94a824c58437645794d9e0f924104b0246ce47dc8c7aac0aee5051
@@ -0,0 +1,62 @@
1
+ name: CI
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ rspec:
7
+ runs-on: ubuntu-latest
8
+
9
+ strategy:
10
+ matrix:
11
+ ruby-version: [3.0, 2.7, 2.6]
12
+
13
+ steps:
14
+ - uses: actions/checkout@v2
15
+
16
+ - name: Set up Ruby ${{ matrix.ruby-version }}
17
+ uses: ruby/setup-ruby@v1
18
+ with:
19
+ ruby-version: ${{ matrix.ruby-version }}
20
+
21
+ - name: Cache gems
22
+ uses: actions/cache@v1
23
+ with:
24
+ path: vendor/bundle
25
+ key: ${{ runner.os }}-${{ matrix.ruby-version }}-bundler-${{ hashFiles('**/Gemfile.lock') }}
26
+ restore-keys: |
27
+ ${{ runner.os }}-${{ matrix.ruby-version }}-bundler-
28
+
29
+ - name: Install gems
30
+ run: |
31
+ bundle config path vendor/bundle
32
+ bundle install --jobs 4 --retry 3
33
+
34
+ - name: Run tests
35
+ run: bundle exec rspec
36
+
37
+ rubocop:
38
+ runs-on: ubuntu-latest
39
+
40
+ steps:
41
+ - uses: actions/checkout@v2
42
+
43
+ - name: Set up Ruby
44
+ uses: ruby/setup-ruby@v1
45
+ with:
46
+ ruby-version: 3.0
47
+
48
+ - name: Cache gems
49
+ uses: actions/cache@v1
50
+ with:
51
+ path: vendor/bundle
52
+ key: ${{ runner.os }}-bundler-${{ hashFiles('**/Gemfile.lock') }}
53
+ restore-keys: |
54
+ ${{ runner.os }}-bundler-
55
+
56
+ - name: Install gems
57
+ run: |
58
+ bundle config path vendor/bundle
59
+ bundle install --jobs 4 --retry 3
60
+
61
+ - name: Run Rubocop
62
+ run: bundle exec rubocop
data/.rubocop.yml CHANGED
@@ -8,11 +8,58 @@ AllCops:
8
8
  - 'bin/*'
9
9
  - 'spec/**/*'
10
10
  - 'vendor/**/*'
11
- TargetRubyVersion: 2.7.1
11
+ TargetRubyVersion: 3
12
12
 
13
13
  Bundler/OrderedGems:
14
14
  Enabled: false
15
15
 
16
+ Gemspec/RequiredRubyVersion:
17
+ Enabled: false
18
+
19
+ # ============================== Gemspec ======================
20
+ Gemspec/DeprecatedAttributeAssignment:
21
+ Enabled: true
22
+ Gemspec/RequireMFA: # new in 1.23
23
+ Enabled: true
24
+
25
+ # ============================== Performance ======================
26
+ Performance/AncestorsInclude:
27
+ Enabled: true
28
+ Performance/BigDecimalWithNumericArgument:
29
+ Enabled: true
30
+ Performance/RedundantSortBlock:
31
+ Enabled: true
32
+ Performance/RedundantStringChars:
33
+ Enabled: true
34
+ Performance/ReverseFirst:
35
+ Enabled: true
36
+ Performance/SortReverse:
37
+ Enabled: true
38
+ Performance/Squeeze:
39
+ Enabled: true
40
+ Performance/StringInclude:
41
+ Enabled: true
42
+ Performance/Sum:
43
+ Enabled: true
44
+ Performance/BlockGivenWithExplicitBlock:
45
+ Enabled: true
46
+ Performance/CollectionLiteralInLoop:
47
+ Enabled: true
48
+ Performance/ConstantRegexp:
49
+ Enabled: true
50
+ Performance/MethodObjectAsBlock:
51
+ Enabled: true
52
+ Performance/RedundantEqualityComparisonBlock:
53
+ Enabled: true
54
+ Performance/RedundantSplitRegexpArgument:
55
+ Enabled: true
56
+ Performance/MapCompact:
57
+ Enabled: true
58
+ Performance/ConcurrentMonotonicTime: # new in 1.12
59
+ Enabled: true
60
+ Performance/StringIdentifierArgument: # new in 1.13
61
+ Enabled: true
62
+
16
63
  # ============================== Documentation ======================
17
64
  Style/Documentation:
18
65
  Enabled: false
@@ -39,6 +86,10 @@ Naming/MethodParameterName:
39
86
  Enabled: false
40
87
  Naming/AccessorMethodName:
41
88
  Enabled: false
89
+ Naming/InclusiveLanguage:
90
+ Enabled: true
91
+ Naming/BlockForwarding: # new in 1.24
92
+ Enabled: true
42
93
 
43
94
  # ============================== Layout =============================
44
95
  Layout/HashAlignment:
@@ -73,6 +124,24 @@ Layout/SpaceAroundMethodCallOperator:
73
124
  Enabled: true
74
125
  Layout/LineLength:
75
126
  Max: 140
127
+ Layout/EmptyLinesAroundAttributeAccessor:
128
+ Enabled: true
129
+ Layout/BeginEndAlignment:
130
+ Enabled: true
131
+ Layout/SpaceBeforeBrackets:
132
+ Enabled: true
133
+ Layout/LineEndStringConcatenationIndentation:
134
+ Enabled: true
135
+ Layout/LineContinuationLeadingSpace: # new in 1.31
136
+ Enabled: true
137
+ Layout/LineContinuationSpacing: # new in 1.31
138
+ Enabled: true
139
+
140
+ # ============================== Security ==============================
141
+ Security/CompoundHash: # new in 1.28
142
+ Enabled: true
143
+ Security/IoMethods: # new in 1.22
144
+ Enabled: true
76
145
 
77
146
  # ============================== Style ==============================
78
147
  Style/RescueModifier:
@@ -127,7 +196,116 @@ Style/HashTransformKeys:
127
196
  Enabled: true
128
197
  Style/HashTransformValues:
129
198
  Enabled: true
130
-
199
+ Style/RedundantFetchBlock:
200
+ Enabled: true
201
+ Style/RedundantRegexpCharacterClass:
202
+ Enabled: true
203
+ Style/RedundantRegexpEscape:
204
+ Enabled: true
205
+ Style/SlicingWithRange:
206
+ Enabled: true
207
+ Style/AccessorGrouping:
208
+ Enabled: true
209
+ Style/ArrayCoercion:
210
+ Enabled: true
211
+ Style/BisectedAttrAccessor:
212
+ Enabled: true
213
+ Style/CaseLikeIf:
214
+ Enabled: true
215
+ Style/ExplicitBlockArgument:
216
+ Enabled: true
217
+ Style/GlobalStdStream:
218
+ Enabled: true
219
+ Style/HashAsLastArrayItem:
220
+ Enabled: true
221
+ Style/HashLikeCase:
222
+ Enabled: true
223
+ Style/OptionalBooleanParameter:
224
+ Enabled: true
225
+ Style/RedundantAssignment:
226
+ Enabled: true
227
+ Style/RedundantFileExtensionInRequire:
228
+ Enabled: true
229
+ Style/SingleArgumentDig:
230
+ Enabled: true
231
+ Style/StringConcatenation:
232
+ Enabled: true
233
+ Style/CombinableLoops:
234
+ Enabled: true
235
+ Style/KeywordParametersOrder:
236
+ Enabled: true
237
+ Style/RedundantSelfAssignment:
238
+ Enabled: true
239
+ Style/SoleNestedConditional:
240
+ Enabled: true
241
+ Style/ArgumentsForwarding:
242
+ Enabled: true
243
+ Style/CollectionCompact:
244
+ Enabled: true
245
+ Style/DocumentDynamicEvalDefinition:
246
+ Enabled: true
247
+ Style/EndlessMethod:
248
+ Enabled: true
249
+ Style/HashExcept:
250
+ Enabled: true
251
+ Style/IfWithBooleanLiteralBranches:
252
+ Enabled: true
253
+ Style/NegatedIfElseCondition:
254
+ Enabled: true
255
+ Style/NilLambda:
256
+ Enabled: true
257
+ Style/RedundantArgument:
258
+ Enabled: true
259
+ Style/SwapValues:
260
+ Enabled: true
261
+ Style/HashConversion:
262
+ Enabled: true
263
+ Style/StringChars:
264
+ Enabled: true
265
+ Style/InPatternThen:
266
+ Enabled: true
267
+ Style/MultilineInPatternThen:
268
+ Enabled: true
269
+ Style/QuotedSymbols:
270
+ Enabled: true
271
+ Style/EmptyHeredoc: # new in 1.32
272
+ Enabled: true
273
+ Style/EnvHome: # new in 1.29
274
+ Enabled: true
275
+ Style/FetchEnvVar: # new in 1.28
276
+ Enabled: true
277
+ Style/FileRead: # new in 1.24
278
+ Enabled: true
279
+ Style/FileWrite: # new in 1.24
280
+ Enabled: true
281
+ Style/MagicCommentFormat: # new in 1.35
282
+ Enabled: true
283
+ Style/MapCompactWithConditionalBlock: # new in 1.30
284
+ Enabled: true
285
+ Style/MapToHash: # new in 1.24
286
+ Enabled: true
287
+ Style/NestedFileDirname: # new in 1.26
288
+ Enabled: true
289
+ Style/NumberedParameters: # new in 1.22
290
+ Enabled: true
291
+ Style/NumberedParametersLimit: # new in 1.22
292
+ Enabled: true
293
+ Style/ObjectThen: # new in 1.28
294
+ Enabled: true
295
+ Style/OpenStructUse: # new in 1.23
296
+ Enabled: true
297
+ Style/OperatorMethodCall: # new in 1.37
298
+ Enabled: true
299
+ Style/RedundantEach: # new in 1.38
300
+ Enabled: true
301
+ Style/RedundantInitialize: # new in 1.27
302
+ Enabled: true
303
+ Style/RedundantSelfAssignmentBranch: # new in 1.19
304
+ Enabled: true
305
+ Style/RedundantStringEscape: # new in 1.37
306
+ Enabled: true
307
+ Style/SelectByRegexp: # new in 1.22
308
+ Enabled: true
131
309
  # ============================== Lint ==============================
132
310
  Lint/DuplicateMethods:
133
311
  Enabled: false
@@ -137,3 +315,95 @@ Lint/RaiseException:
137
315
  Enabled: true
138
316
  Lint/StructNewOverride:
139
317
  Enabled: true
318
+ Lint/DeprecatedOpenSSLConstant:
319
+ Enabled: true
320
+ Lint/MixedRegexpCaptureTypes:
321
+ Enabled: true
322
+ Lint/BinaryOperatorWithIdenticalOperands:
323
+ Enabled: true
324
+ Lint/DuplicateElsifCondition:
325
+ Enabled: true
326
+ Lint/DuplicateRescueException:
327
+ Enabled: true
328
+ Lint/EmptyConditionalBody:
329
+ Enabled: true
330
+ Lint/FloatComparison:
331
+ Enabled: true
332
+ Lint/MissingSuper:
333
+ Enabled: false
334
+ Lint/OutOfRangeRegexpRef:
335
+ Enabled: true
336
+ Lint/SelfAssignment:
337
+ Enabled: true
338
+ Lint/TopLevelReturnWithArgument:
339
+ Enabled: true
340
+ Lint/UnreachableLoop:
341
+ Enabled: true
342
+ Lint/ConstantDefinitionInBlock:
343
+ Enabled: true
344
+ Lint/DuplicateRequire:
345
+ Enabled: true
346
+ Lint/EmptyFile:
347
+ Enabled: true
348
+ Lint/IdentityComparison:
349
+ Enabled: true
350
+ Lint/TrailingCommaInAttributeDeclaration:
351
+ Enabled: true
352
+ Lint/UselessMethodDefinition:
353
+ Enabled: true
354
+ Lint/UselessTimes:
355
+ Enabled: true
356
+ Lint/AmbiguousAssignment:
357
+ Enabled: true
358
+ Lint/DeprecatedConstants:
359
+ Enabled: true
360
+ Lint/DuplicateBranch:
361
+ Enabled: true
362
+ Lint/DuplicateRegexpCharacterClassElement:
363
+ Enabled: true
364
+ Lint/EmptyBlock:
365
+ Enabled: true
366
+ Lint/EmptyClass:
367
+ Enabled: true
368
+ Lint/LambdaWithoutLiteralBlock:
369
+ Enabled: true
370
+ Lint/NoReturnInBeginEndBlocks:
371
+ Enabled: true
372
+ Lint/NumberedParameterAssignment:
373
+ Enabled: true
374
+ Lint/OrAssignmentToConstant:
375
+ Enabled: true
376
+ Lint/RedundantDirGlobSort:
377
+ Enabled: true
378
+ Lint/SymbolConversion:
379
+ Enabled: true
380
+ Lint/ToEnumArguments:
381
+ Enabled: true
382
+ Lint/TripleQuotes:
383
+ Enabled: true
384
+ Lint/UnexpectedBlockArity:
385
+ Enabled: true
386
+ Lint/UnmodifiedReduceAccumulator:
387
+ Enabled: true
388
+ Lint/EmptyInPattern:
389
+ Enabled: true
390
+ Lint/AmbiguousOperatorPrecedence: # new in 1.21
391
+ Enabled: true
392
+ Lint/AmbiguousRange: # new in 1.19
393
+ Enabled: true
394
+ Lint/ConstantOverwrittenInRescue: # new in 1.31
395
+ Enabled: true
396
+ Lint/DuplicateMagicComment: # new in 1.37
397
+ Enabled: true
398
+ Lint/IncompatibleIoSelectWithFiberScheduler: # new in 1.21
399
+ Enabled: true
400
+ Lint/NonAtomicFileOperation: # new in 1.31
401
+ Enabled: true
402
+ Lint/RefinementImportMethods: # new in 1.27
403
+ Enabled: true
404
+ Lint/RequireRangeParentheses: # new in 1.32
405
+ Enabled: true
406
+ Lint/RequireRelativeSelfPath: # new in 1.22
407
+ Enabled: true
408
+ Lint/UselessRuby2Keywords: # new in 1.23
409
+ Enabled: true
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ ## 0.1.9
2
+ - [13](https://github.com/shlima/health_bit/pull/13) Pass env to check blocks or #call methods
3
+ - [11](https://github.com/shlima/health_bit/issues/11) Added custom formatter
data/Gemfile CHANGED
@@ -1,13 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  source 'https://rubygems.org'
4
- ruby '2.7.1'
5
4
 
6
5
  # Specify your gem's dependencies in health_bit.gemspec
7
6
  gemspec
8
7
 
9
8
  gem 'rake', '~> 13.0'
10
9
  gem 'rspec', '~> 3.0'
11
- gem 'pry'
12
- gem 'rubocop'
13
- gem 'rubocop-performance'
data/Gemfile.lock CHANGED
@@ -1,57 +1,64 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- health_bit (0.1.8)
4
+ health_bit (0.2.0)
5
5
  rack
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- ast (2.4.0)
11
- coderay (1.1.2)
12
- diff-lcs (1.3)
13
- jaro_winkler (1.5.4)
10
+ ast (2.4.2)
11
+ coderay (1.1.3)
12
+ diff-lcs (1.5.0)
13
+ json (2.6.2)
14
14
  method_source (1.0.0)
15
- parallel (1.19.1)
16
- parser (2.7.1.2)
17
- ast (~> 2.4.0)
18
- pry (0.13.1)
15
+ parallel (1.22.1)
16
+ parser (3.1.2.1)
17
+ ast (~> 2.4.1)
18
+ pry (0.14.1)
19
19
  coderay (~> 1.1)
20
20
  method_source (~> 1.0)
21
- rack (2.2.2)
22
- rainbow (3.0.0)
23
- rake (13.0.1)
24
- rexml (3.2.4)
25
- rspec (3.9.0)
26
- rspec-core (~> 3.9.0)
27
- rspec-expectations (~> 3.9.0)
28
- rspec-mocks (~> 3.9.0)
29
- rspec-core (3.9.2)
30
- rspec-support (~> 3.9.3)
31
- rspec-expectations (3.9.1)
21
+ rack (3.0.0)
22
+ rainbow (3.1.1)
23
+ rake (13.0.6)
24
+ regexp_parser (2.6.0)
25
+ rexml (3.2.5)
26
+ rspec (3.12.0)
27
+ rspec-core (~> 3.12.0)
28
+ rspec-expectations (~> 3.12.0)
29
+ rspec-mocks (~> 3.12.0)
30
+ rspec-core (3.12.0)
31
+ rspec-support (~> 3.12.0)
32
+ rspec-expectations (3.12.0)
32
33
  diff-lcs (>= 1.2.0, < 2.0)
33
- rspec-support (~> 3.9.0)
34
- rspec-mocks (3.9.1)
34
+ rspec-support (~> 3.12.0)
35
+ rspec-mocks (3.12.0)
35
36
  diff-lcs (>= 1.2.0, < 2.0)
36
- rspec-support (~> 3.9.0)
37
- rspec-support (3.9.3)
38
- rubocop (0.82.0)
39
- jaro_winkler (~> 1.5.1)
37
+ rspec-support (~> 3.12.0)
38
+ rspec-support (3.12.0)
39
+ rubocop (1.38.0)
40
+ json (~> 2.3)
40
41
  parallel (~> 1.10)
41
- parser (>= 2.7.0.1)
42
+ parser (>= 3.1.2.1)
42
43
  rainbow (>= 2.2.2, < 4.0)
43
- rexml
44
+ regexp_parser (>= 1.8, < 3.0)
45
+ rexml (>= 3.2.5, < 4.0)
46
+ rubocop-ast (>= 1.23.0, < 2.0)
44
47
  ruby-progressbar (~> 1.7)
45
- unicode-display_width (>= 1.4.0, < 2.0)
46
- rubocop-performance (1.5.2)
47
- rubocop (>= 0.71.0)
48
- ruby-progressbar (1.10.1)
49
- unicode-display_width (1.7.0)
48
+ unicode-display_width (>= 1.4.0, < 3.0)
49
+ rubocop-ast (1.23.0)
50
+ parser (>= 3.1.1.0)
51
+ rubocop-performance (1.15.0)
52
+ rubocop (>= 1.7.0, < 2.0)
53
+ rubocop-ast (>= 0.4.0)
54
+ ruby-progressbar (1.11.0)
55
+ unicode-display_width (2.3.0)
50
56
 
51
57
  PLATFORMS
52
58
  ruby
53
59
 
54
60
  DEPENDENCIES
61
+ bundler
55
62
  health_bit!
56
63
  pry
57
64
  rake (~> 13.0)
@@ -59,8 +66,5 @@ DEPENDENCIES
59
66
  rubocop
60
67
  rubocop-performance
61
68
 
62
- RUBY VERSION
63
- ruby 2.7.1p83
64
-
65
69
  BUNDLED WITH
66
- 2.1.4
70
+ 2.2.15
data/README.md CHANGED
@@ -1,11 +1,11 @@
1
- [![pipeline status](https://travis-ci.com/shlima/health_bit.svg?branch=master)](https://travis-ci.com/shlima/health_bit)
1
+ ![CI](https://github.com/shlima/health_bit/workflows/CI/badge.svg)
2
2
  [![gem version](https://badge.fury.io/rb/health_bit.svg)](https://rubygems.org/gems/health_bit)
3
3
 
4
4
  # HealthBit
5
5
 
6
6
  ![](./doc/logo.png?sanitize=true)
7
7
 
8
- This gem was inspired by the [health_check](https://github.com/ianheggie/health_check), but is simpler and more
8
+ This gem was inspired by the [health_check](https://github.com/ianheggie/health_check), but is simpler and more
9
9
  extensible and contains up to 95% less code.
10
10
 
11
11
  Key differences:
@@ -23,6 +23,7 @@ Key differences:
23
23
  * [Add a Route](#add-a-route)
24
24
  * [Password Protection](#password-protection)
25
25
  * [Multiple endpoints](#multiple-endpoints)
26
+ * [Custom formatter](#custom-formatter)
26
27
 
27
28
  ## Check Examples
28
29
 
@@ -36,7 +37,7 @@ Key differences:
36
37
  * [ClickHouse check](#clickhouse-check)
37
38
 
38
39
  ## Installation
39
-
40
+
40
41
  Add this line to your application's Gemfile:
41
42
 
42
43
  ```ruby
@@ -51,54 +52,58 @@ gem 'health_bit'
51
52
  HealthBit.configure do |c|
52
53
  # DEFAULT SETTINGS ARE SHOWN BELOW
53
54
  c.success_text = '%<count>d checks passed 🎉'
54
- c.headers = {
55
- 'Content-Type' => 'text/plain;charset=utf-8',
56
- 'Cache-Control' => 'private,max-age=0,must-revalidate,no-store'
55
+ c.headers = {
56
+ 'Content-Type' => 'text/plain;charset=utf-8',
57
+ 'Cache-Control' => 'private,max-age=0,must-revalidate,no-store'
57
58
  }
58
59
  c.success_code = 200
59
60
  c.fail_code = 500
60
61
  c.show_backtrace = false
62
+ c.formatter = HealthBit::Formatter.new
63
+ # DEFAULT SETTINGS ARE SHOWN ABOVE
61
64
 
62
65
  c.add('Check name') do
63
- # Body check, should returns `true`
66
+ # Body check, should returns `true`
64
67
  true
65
68
  end
66
69
  end
67
70
  ```
68
-
71
+
69
72
  ## Add Checks
70
73
 
71
- By default, the **gem does not contain any checks**, **you should add the
72
- necessary checks by yourself**. The check should return `false` or `nil`
73
- to be considered unsuccessful or throw an exception, any other
74
+ By default, the **gem does not contain any checks**, **you should add the
75
+ necessary checks by yourself**. The check should return `false` or `nil`
76
+ to be considered unsuccessful or throw an exception, any other
74
77
  values are considered satisfactory.
75
78
 
76
79
  Example checks:
77
80
 
78
81
  ```ruby
79
82
  ## Successful checks
80
- HealthBit.add('PostgreSQL') do
83
+ HealthBit.add('PostgreSQL') do |env|
81
84
  ApplicationRecord.connection.select_value('SELECT 1') == 1
82
85
  end
83
86
 
84
- HealthBit.add('Custom') do
87
+ HealthBit.add('Custom') do |env|
88
+ next(false) if 1 != 0
89
+
85
90
  true
86
91
  end
87
92
 
88
93
  ## Failed checks
89
- HealthBit.add('Database') do
94
+ HealthBit.add('Database') do |env|
90
95
  false
91
96
  end
92
97
 
93
- HealthBit.add('Docker service') do
98
+ HealthBit.add('Docker service') do |env|
94
99
  raise 'not responding'
95
100
  end
96
101
 
97
102
  # The Check can be added as an object responding to a call
98
103
  # (to be able to test your check)
99
- class Covid19Check
100
- def self.call
101
- false
104
+ class Covid19Check
105
+ def self.call(env)
106
+ false
102
107
  end
103
108
  end
104
109
 
@@ -107,7 +112,7 @@ HealthBit.add('COVID-19 Checker', Covid19Check)
107
112
 
108
113
  ## Add a Route
109
114
 
110
- Since the gem is a rack application, you must mount it to app's
115
+ Since the gem is a rack application, you must mount it to app's
111
116
  routes. Below is an example for the Rails.
112
117
 
113
118
  ```ruby
@@ -118,6 +123,20 @@ Rails.application.routes.draw do
118
123
  end
119
124
  ```
120
125
 
126
+ ```bash
127
+ curl --verbose http://localhost:3000/health
128
+
129
+ < HTTP/1.1 200 OK
130
+ < Content-Type: text/plain;charset=utf-8
131
+ < Cache-Control: private,max-age=0,must-revalidate,no-store
132
+ < X-Request-Id: 59a796b9-29f7-4302-b1ff-5d0b06dd6637
133
+ < X-Runtime: 0.006007
134
+ < Vary: Origin
135
+ < Transfer-Encoding: chunked
136
+
137
+ 4 checks passed 🎉
138
+ ```
139
+
121
140
  ## Password Protection
122
141
 
123
142
  Since the gem is a common rack application, you can add any rack
@@ -130,7 +149,7 @@ Rails.application.routes.draw do
130
149
  HealthBit.rack.use Rack::Auth::Basic do |username, password|
131
150
  ActiveSupport::SecurityUtils.secure_compare(Digest::SHA256.hexdigest(username), Digest::SHA256.hexdigest('user')) & ActiveSupport::SecurityUtils.secure_compare(Digest::SHA256.hexdigest(password), Digest::SHA256.hexdigest('password'))
132
151
  end
133
-
152
+
134
153
  mount HealthBit.rack => '/health'
135
154
  end
136
155
  ```
@@ -138,7 +157,7 @@ end
138
157
  ## Database check
139
158
 
140
159
  ```ruby
141
- HealthBit.add('Database') do
160
+ HealthBit.add('Database') do |env|
142
161
  ApplicationRecord.connection.select_value('SELECT 1') == 1
143
162
  end
144
163
  ```
@@ -146,7 +165,7 @@ end
146
165
  ## Redis check
147
166
 
148
167
  ```ruby
149
- HealthBit.add('Redis') do
168
+ HealthBit.add('Redis') do |env|
150
169
  Redis.current.ping == 'PONG'
151
170
  end
152
171
  ```
@@ -154,7 +173,7 @@ end
154
173
  ## Sidekiq check
155
174
 
156
175
  ```ruby
157
- HealthBit.add('Sidekiq') do
176
+ HealthBit.add('Sidekiq') do |env|
158
177
  Sidekiq.redis(&:ping) == 'PONG'
159
178
  end
160
179
  ```
@@ -162,15 +181,15 @@ end
162
181
  ## Rails cache check
163
182
 
164
183
  ```ruby
165
- HealthBit.add('Rails cache') do
166
- Rails.cache.read('1').nil?
184
+ HealthBit.add('Rails cache') do |env|
185
+ Rails.cache.write('__health_bit__', '1', expires_in: 1.second)
167
186
  end
168
187
  ```
169
188
 
170
189
  ## Elasticsearch check
171
190
 
172
191
  ```ruby
173
- HealthBit.add('Elasticsearch') do
192
+ HealthBit.add('Elasticsearch') do |env|
174
193
  Elasticsearch::Client.new.ping
175
194
  end
176
195
  ```
@@ -178,7 +197,7 @@ end
178
197
  ## RabbitMQ check
179
198
 
180
199
  ```ruby
181
- HealthBit.add('RabbitMQ') do
200
+ HealthBit.add('RabbitMQ') do |env|
182
201
  Bunny::Connection.connect(&:connection)
183
202
  end
184
203
  ```
@@ -186,7 +205,7 @@ end
186
205
  ## HTTP check
187
206
 
188
207
  ```ruby
189
- HealthBit.add('HTTP check') do
208
+ HealthBit.add('HTTP check') do |env|
190
209
  Net::HTTP.new('www.example.com', 80).request_get('/').kind_of?(Net::HTTPSuccess)
191
210
  end
192
211
  ```
@@ -194,15 +213,15 @@ end
194
213
  ## ClickHouse check
195
214
 
196
215
  ```ruby
197
- HealthBit.add('ClickHouse') do
216
+ HealthBit.add('ClickHouse') do |env|
198
217
  ClickHouse.connection.ping
199
218
  end
200
219
  ```
201
220
 
202
221
  ## Multiple endpoints
203
222
 
204
- Sometimes you have to add several health check endpoints. Let's say
205
- you have to check the docker container health and the health
223
+ Sometimes you have to add several health check endpoints. Let's say
224
+ you have to check the docker container health and the health
206
225
  of your application as a whole. Below is an example for the Rails.
207
226
 
208
227
  ```ruby
@@ -211,11 +230,11 @@ of your application as a whole. Below is an example for the Rails.
211
230
  DockerCheck = HealthBit.clone
212
231
  AppCheck = HealthBit.clone
213
232
 
214
- DockerCheck.add('Docker Health') do
233
+ DockerCheck.add('Docker Health') do |env|
215
234
  true
216
235
  end
217
236
 
218
- AppCheck.add('App Health') do
237
+ AppCheck.add('App Health') do |env|
219
238
  ApplicationRecord.connection.select_value("SELECT 't'::boolean")
220
239
  end
221
240
  ```
@@ -228,3 +247,32 @@ Rails.application.routes.draw do
228
247
  mount AppCheck.rack => '/app'
229
248
  end
230
249
  ```
250
+
251
+ ## Custom formatter
252
+
253
+ You can easily [configure](https://github.com/shlima/health_bit/blob/master/lib/health_bit/formatter.rb) custom format of response body, headers and
254
+ http statuses.
255
+
256
+ ```ruby
257
+ class JsonFormatter < HealthBit::Formatter
258
+ # @param error HealthBit::CheckError
259
+ # @param env Hash
260
+ # @param health_bit HealthBit
261
+ def format_failure(error, env, health_bit)
262
+ { 'status': 'error' }.to_json
263
+ end
264
+
265
+ # @param error HealthBit::CheckError
266
+ # @param env Hash
267
+ # @param health_bit HealthBit
268
+ def headers_failure(error, env, health_bit)
269
+ {
270
+ 'Content-Type' => 'application/json'
271
+ }
272
+ end
273
+ end
274
+
275
+ HealthBit.configure do |c|
276
+ c.formatter = JsonFormatter.new
277
+ end
278
+ ```
data/health_bit.gemspec CHANGED
@@ -13,7 +13,8 @@ Gem::Specification.new do |spec|
13
13
  spec.description = 'Tiny health check of Rack apps like Rails, Sinatra for use with uptime checking systems like Kubernetes, Docker or Uptimerobot'
14
14
  spec.homepage = 'https://github.com/shlima/health_bit'
15
15
  spec.license = 'MIT'
16
- spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
16
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.6.0')
17
+ spec.metadata['rubygems_mfa_required'] = 'true'
17
18
  spec.metadata['homepage_uri'] = spec.homepage
18
19
  spec.metadata['source_code_uri'] = spec.homepage
19
20
  spec.metadata['changelog_uri'] = 'https://github.com/shlima/health_bit/releases'
@@ -25,5 +26,11 @@ Gem::Specification.new do |spec|
25
26
  spec.require_paths = %w[lib]
26
27
 
27
28
  spec.add_dependency 'rack'
29
+ spec.add_development_dependency 'bundler'
30
+ spec.add_development_dependency 'pry'
31
+ spec.add_development_dependency 'rake'
32
+ spec.add_development_dependency 'rspec'
33
+ spec.add_development_dependency 'rubocop'
34
+ spec.add_development_dependency 'rubocop-performance'
28
35
  end
29
36
  # rubocop:enable Layout/LineLength
@@ -11,8 +11,11 @@ module HealthBit
11
11
 
12
12
  # @return [nil] if its ok
13
13
  # @return [CheckError] if not
14
- def call
15
- raise('The check has returned a negative value') unless handler.call
14
+ def call(env = {})
15
+ arity = handler.is_a?(Proc) ? handler.arity : handler.method(:call).arity
16
+ return if arity.abs == 1 ? handler.call(env) : handler.call
17
+
18
+ raise('The check has returned a negative value')
16
19
  rescue Exception => e # rubocop:disable Lint/RescueException
17
20
  CheckError.new(name, exception: e)
18
21
  end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rack'
4
+ require 'health_bit/version'
5
+
6
+ module HealthBit
7
+ # rubocop:disable Lint/UnusedMethodArgument
8
+ class Formatter
9
+ # @param error HealthBit::CheckError
10
+ # @param env Hash
11
+ # @param health_bit HealthBit
12
+ def format_success(error, env, health_bit)
13
+ health_bit.success_text
14
+ end
15
+
16
+ # @param error HealthBit::CheckError
17
+ # @param env Hash
18
+ # @param health_bit HealthBit
19
+ def format_failure(error, env, health_bit)
20
+ format = health_bit.show_backtrace ? CheckError::FORMAT_FULL : CheckError::FORMAT_SHORT
21
+ error.to_s(format)
22
+ end
23
+
24
+ # @param env Hash
25
+ # @param health_bit HealthBit
26
+ def headers_success(env, health_bit)
27
+ health_bit.headers
28
+ end
29
+
30
+ # @param error HealthBit::CheckError
31
+ # @param env Hash
32
+ # @param health_bit HealthBit
33
+ def headers_failure(error, env, health_bit)
34
+ health_bit.headers
35
+ end
36
+
37
+ # @param env Hash
38
+ # @param health_bit HealthBit
39
+ def code_success(env, health_bit)
40
+ health_bit.success_code
41
+ end
42
+
43
+ # @param error HealthBit::CheckError
44
+ # @param env Hash
45
+ # @param health_bit HealthBit
46
+ def code_failure(error, env, health_bit)
47
+ health_bit.fail_code
48
+ end
49
+ end
50
+ # rubocop:enable Lint/UnusedMethodArgument
51
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HealthBit
4
- VERSION = '0.1.8'
4
+ VERSION = '0.2.0'
5
5
  end
data/lib/health_bit.rb CHANGED
@@ -4,6 +4,10 @@ require 'rack'
4
4
  require 'health_bit/version'
5
5
 
6
6
  module HealthBit
7
+ autoload :Check, 'health_bit/check'
8
+ autoload :CheckError, 'health_bit/check_error'
9
+ autoload :Formatter, 'health_bit/formatter'
10
+
7
11
  DEFAULT_SUCCESS_TEXT = '%<count>d checks passed 🎉'
8
12
  DEFAULT_HEADERS = {
9
13
  'Content-Type' => 'text/plain;charset=utf-8',
@@ -11,13 +15,11 @@ module HealthBit
11
15
  }.freeze
12
16
  DEFAULT_SUCCESS_CODE = 200
13
17
  DEFAULT_FAIL_CODE = 500
14
-
15
- autoload :Check, 'health_bit/check'
16
- autoload :CheckError, 'health_bit/check_error'
18
+ DEFAULT_FORMATTER = Formatter.new
17
19
 
18
20
  extend self # rubocop:disable Style/ModuleFunction
19
21
 
20
- attr_writer :success_text, :success_code, :fail_code, :headers
22
+ attr_writer :success_text, :success_code, :fail_code, :headers, :formatter
21
23
  attr_accessor :show_backtrace
22
24
 
23
25
  def success_text
@@ -36,6 +38,11 @@ module HealthBit
36
38
  (@headers || DEFAULT_HEADERS).dup
37
39
  end
38
40
 
41
+ # @return [Formatter]
42
+ def formatter
43
+ @formatter || DEFAULT_FORMATTER
44
+ end
45
+
39
46
  def checks
40
47
  @checks ||= []
41
48
  end
@@ -60,25 +67,29 @@ module HealthBit
60
67
  end
61
68
 
62
69
  # @return [nil, CheckError]
63
- def check
70
+ def check(env)
64
71
  checks.each do |check|
65
- (exception = check.call).nil? ? next : (return exception)
72
+ (exception = check.call(env)).nil? ? next : (return exception)
66
73
  end
67
74
 
68
75
  nil
69
76
  end
70
77
 
71
78
  def rack(this = self)
72
- @rack ||= begin
73
- format = this.show_backtrace ? CheckError::FORMAT_FULL : CheckError::FORMAT_SHORT
74
-
75
- Rack::Builder.new do
76
- run ->(_env) do
77
- if (error = this.check)
78
- [this.fail_code, this.headers, [error.to_s(format)]]
79
- else
80
- [this.success_code, this.headers, [this.success_text]]
81
- end
79
+ @rack ||= Rack::Builder.new do
80
+ run ->(env) do
81
+ if (error = this.check(env))
82
+ [
83
+ this.formatter.code_failure(error, env, this),
84
+ this.formatter.headers_failure(error, env, this),
85
+ [this.formatter.format_failure(error, env, this)]
86
+ ]
87
+ else
88
+ [
89
+ this.formatter.code_success(env, this),
90
+ this.formatter.headers_success(env, this),
91
+ [this.formatter.format_success(error, env, this)]
92
+ ]
82
93
  end
83
94
  end
84
95
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: health_bit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aliaksandr Shylau
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-08 00:00:00.000000000 Z
11
+ date: 2022-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -24,6 +24,90 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-performance
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
27
111
  description: Tiny health check of Rack apps like Rails, Sinatra for use with uptime
28
112
  checking systems like Kubernetes, Docker or Uptimerobot
29
113
  email:
@@ -32,10 +116,11 @@ executables: []
32
116
  extensions: []
33
117
  extra_rdoc_files: []
34
118
  files:
119
+ - ".github/workflows/main.yml"
35
120
  - ".gitignore"
36
121
  - ".rspec"
37
122
  - ".rubocop.yml"
38
- - ".travis.yml"
123
+ - CHANGELOG.md
39
124
  - Gemfile
40
125
  - Gemfile.lock
41
126
  - LICENSE.txt
@@ -49,15 +134,17 @@ files:
49
134
  - lib/health_bit.rb
50
135
  - lib/health_bit/check.rb
51
136
  - lib/health_bit/check_error.rb
137
+ - lib/health_bit/formatter.rb
52
138
  - lib/health_bit/version.rb
53
139
  homepage: https://github.com/shlima/health_bit
54
140
  licenses:
55
141
  - MIT
56
142
  metadata:
143
+ rubygems_mfa_required: 'true'
57
144
  homepage_uri: https://github.com/shlima/health_bit
58
145
  source_code_uri: https://github.com/shlima/health_bit
59
146
  changelog_uri: https://github.com/shlima/health_bit/releases
60
- post_install_message:
147
+ post_install_message:
61
148
  rdoc_options: []
62
149
  require_paths:
63
150
  - lib
@@ -65,15 +152,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
65
152
  requirements:
66
153
  - - ">="
67
154
  - !ruby/object:Gem::Version
68
- version: 2.3.0
155
+ version: 2.6.0
69
156
  required_rubygems_version: !ruby/object:Gem::Requirement
70
157
  requirements:
71
158
  - - ">="
72
159
  - !ruby/object:Gem::Version
73
160
  version: '0'
74
161
  requirements: []
75
- rubygems_version: 3.1.2
76
- signing_key:
162
+ rubygems_version: 3.3.7
163
+ signing_key:
77
164
  specification_version: 4
78
165
  summary: Tiny health check of Rack apps like Rails, Sinatra
79
166
  test_files: []
data/.travis.yml DELETED
@@ -1,14 +0,0 @@
1
- language: ruby
2
-
3
- cache: bundler
4
-
5
- rvm:
6
- - 2.7.1
7
-
8
- before_install:
9
- - gem install bundler -v 2.1.4
10
- - bundle install
11
-
12
- script:
13
- - bundle exec rubocop
14
- - bundle exec rspec