hospital 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/hospital/checkup.rb +39 -0
- data/lib/hospital/checkup_group.rb +53 -0
- data/lib/hospital/diagnosis.rb +31 -6
- data/lib/hospital/formatter.rb +14 -2
- data/lib/hospital/tasks/checkup.rake +1 -10
- data/lib/hospital/version.rb +1 -1
- data/lib/hospital.rb +33 -61
- metadata +33 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3dda421b0e01757d0328884312ef0eb7f3e0f56c93a50ae928b64d2621796578
|
|
4
|
+
data.tar.gz: f56bb16f35eef2b3211a47fefc2c514b17e0b894f9c6e483fcb0819e914d0b76
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 97048efd58fa3d4a758bffca77386b3dd5b94569b2eb953b5087410f5bee68b3fdef7b4cf70b5045e5e094e82e0833100825d88f363846c3b38229df39408fa0
|
|
7
|
+
data.tar.gz: 4ce02585d62f4fa93d2a2cb03a22abc1be5aa545cbd3157226afcb20dd4ac390a813ad136c98e3608f33dc564d17fcc15fab3266240196da21956c98ac740727
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hospital
|
|
4
|
+
class Checkup
|
|
5
|
+
attr_reader :code, :condition, :diagnosis, :group, :skipped, :klass, :precondition
|
|
6
|
+
|
|
7
|
+
def initialize klass, code, group: :general, title: nil, condition: -> { true }, precondition: false
|
|
8
|
+
@klass = klass
|
|
9
|
+
@code = code
|
|
10
|
+
@group = group
|
|
11
|
+
@condition = condition
|
|
12
|
+
@diagnosis = Hospital::Diagnosis.new([klass.to_s, title].compact.join(' - '))
|
|
13
|
+
@precondition = precondition
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def reset_diagnosis
|
|
17
|
+
diagnosis.reset
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def check verbose: false
|
|
21
|
+
diagnosis.reset
|
|
22
|
+
|
|
23
|
+
if condition.nil? || condition.call
|
|
24
|
+
@skipped = false
|
|
25
|
+
code.call(diagnosis)
|
|
26
|
+
diagnosis
|
|
27
|
+
else
|
|
28
|
+
@skipped = true
|
|
29
|
+
nil
|
|
30
|
+
end
|
|
31
|
+
rescue StandardError => e
|
|
32
|
+
diagnosis.add_error "Unrescued exception in #{klass}.checkup:\n#{e.full_message}.\nThis is a bug inside the checkup method that should be fixed!"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def success?
|
|
36
|
+
diagnosis.success?
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require_relative "formatter"
|
|
2
|
+
|
|
3
|
+
using Formatter
|
|
4
|
+
|
|
5
|
+
module Hospital
|
|
6
|
+
class CheckupGroup
|
|
7
|
+
attr_reader :name, :checkups, :precondition_checkups, :skipped
|
|
8
|
+
|
|
9
|
+
def initialize name
|
|
10
|
+
@name = name
|
|
11
|
+
@precondition_checkups = []
|
|
12
|
+
@checkups = []
|
|
13
|
+
@skipped = false
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def all_checkups
|
|
17
|
+
@precondition_checkups + @checkups
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def header
|
|
21
|
+
"\n### #{name.to_s.capitalize.gsub(/_/, ' ')} checks".h1
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def add_checkup checkup
|
|
25
|
+
if checkup.precondition
|
|
26
|
+
@precondition_checkups << checkup
|
|
27
|
+
else
|
|
28
|
+
@checkups << checkup
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def run_checkups verbose: false
|
|
33
|
+
run_precondition_checkups verbose: verbose
|
|
34
|
+
|
|
35
|
+
unless @skipped
|
|
36
|
+
run_dependent_checkups verbose: verbose
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def run_precondition_checkups verbose: false
|
|
41
|
+
@precondition_checkups.each do |checkup|
|
|
42
|
+
checkup.check verbose: verbose
|
|
43
|
+
@skipped = true unless checkup.success?
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def run_dependent_checkups verbose: false
|
|
48
|
+
@checkups.each do |checkup|
|
|
49
|
+
checkup.check verbose: verbose
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
data/lib/hospital/diagnosis.rb
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
require_relative "formatter"
|
|
2
|
+
|
|
3
|
+
using Formatter
|
|
4
|
+
|
|
5
|
+
class Hospital::Diagnosis
|
|
6
|
+
attr_reader :infos, :warnings, :skips, :errors, :name, :results
|
|
3
7
|
|
|
4
8
|
def initialize name
|
|
5
9
|
@name = name.to_s
|
|
@@ -9,6 +13,7 @@ class Hospital::Diagnosis
|
|
|
9
13
|
def reset
|
|
10
14
|
@infos = []
|
|
11
15
|
@warnings = []
|
|
16
|
+
@skips = []
|
|
12
17
|
@errors = []
|
|
13
18
|
@results = []
|
|
14
19
|
end
|
|
@@ -44,8 +49,8 @@ class Hospital::Diagnosis
|
|
|
44
49
|
"#{prefix} #{message.gsub(/\n\z/, '').gsub(/\n/, prefix ? "\n " : "\n")}"
|
|
45
50
|
end
|
|
46
51
|
|
|
47
|
-
def put
|
|
48
|
-
puts output
|
|
52
|
+
def put
|
|
53
|
+
puts output.indented
|
|
49
54
|
end
|
|
50
55
|
end
|
|
51
56
|
|
|
@@ -54,11 +59,15 @@ class Hospital::Diagnosis
|
|
|
54
59
|
end
|
|
55
60
|
|
|
56
61
|
class Warning < Result
|
|
57
|
-
def prefix; '🟠'
|
|
62
|
+
def prefix; '🟠' end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
class Skip < Result
|
|
66
|
+
def prefix; '🟠' end
|
|
58
67
|
end
|
|
59
68
|
|
|
60
69
|
class Error < Result
|
|
61
|
-
def prefix; '🔴'
|
|
70
|
+
def prefix; '🔴' end
|
|
62
71
|
end
|
|
63
72
|
|
|
64
73
|
def add_info message
|
|
@@ -73,6 +82,12 @@ class Hospital::Diagnosis
|
|
|
73
82
|
@results << warning
|
|
74
83
|
end
|
|
75
84
|
|
|
85
|
+
def add_skip message
|
|
86
|
+
skip = Skip.new message
|
|
87
|
+
@skips << skip
|
|
88
|
+
@results << skip
|
|
89
|
+
end
|
|
90
|
+
|
|
76
91
|
def add_error message
|
|
77
92
|
error = Error.new message
|
|
78
93
|
@errors << error
|
|
@@ -82,4 +97,14 @@ class Hospital::Diagnosis
|
|
|
82
97
|
def put_results
|
|
83
98
|
results.each &:put
|
|
84
99
|
end
|
|
100
|
+
|
|
101
|
+
def success?
|
|
102
|
+
errors.count == 0 && skips.count == 0
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def on_success_message message
|
|
106
|
+
if success?
|
|
107
|
+
add_info message
|
|
108
|
+
end
|
|
109
|
+
end
|
|
85
110
|
end
|
data/lib/hospital/formatter.rb
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
module Formatter
|
|
2
2
|
refine String do
|
|
3
|
+
def bold
|
|
4
|
+
"\e[1m#{self}\e[0m"
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def underline
|
|
8
|
+
"\e[4m#{self}\e[0m"
|
|
9
|
+
end
|
|
10
|
+
|
|
3
11
|
def h1
|
|
4
|
-
"\n
|
|
12
|
+
"\n#{self}".underline.bold
|
|
5
13
|
end
|
|
6
14
|
|
|
7
15
|
def h2
|
|
8
|
-
"\n
|
|
16
|
+
"\n#{self}".underline
|
|
9
17
|
end
|
|
10
18
|
|
|
11
19
|
def red
|
|
@@ -15,5 +23,9 @@ module Formatter
|
|
|
15
23
|
def yellow
|
|
16
24
|
"\e[33m#{self}\e[0m"
|
|
17
25
|
end
|
|
26
|
+
|
|
27
|
+
def indented
|
|
28
|
+
"#{self}"
|
|
29
|
+
end
|
|
18
30
|
end
|
|
19
31
|
end
|
|
@@ -4,15 +4,6 @@ require_relative '../../hospital'
|
|
|
4
4
|
|
|
5
5
|
desc 'Check system setup sanity.'
|
|
6
6
|
task :doctor, [:verbose] => :environment do |t, args|
|
|
7
|
-
# at_exit { Rake::Task['doctor:summary'].invoke if $!.nil? }
|
|
8
|
-
|
|
9
|
-
ActiveRecord::Base.connection_pool.disconnect!
|
|
10
|
-
ActiveSupport.on_load(:active_record) do
|
|
11
|
-
config = ActiveRecord::Base.configurations[Rails.env]
|
|
12
|
-
config['pool'] = 100
|
|
13
|
-
ActiveRecord::Base.establish_connection(config)
|
|
14
|
-
end
|
|
15
|
-
|
|
16
7
|
verbose = args[:verbose] == "true"
|
|
17
8
|
|
|
18
9
|
# silence warnings about double constant definitions
|
|
@@ -20,7 +11,7 @@ task :doctor, [:verbose] => :environment do |t, args|
|
|
|
20
11
|
p "eager load all classes" if verbose
|
|
21
12
|
Rails.application.eager_load!
|
|
22
13
|
end
|
|
23
|
-
|
|
14
|
+
|
|
24
15
|
p "start checkup" if verbose
|
|
25
16
|
Hospital.do_checkup_all verbose: verbose
|
|
26
17
|
end
|
data/lib/hospital/version.rb
CHANGED
data/lib/hospital.rb
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "byebug"
|
|
3
4
|
require_relative "hospital/version"
|
|
5
|
+
require_relative "hospital/checkup"
|
|
6
|
+
require_relative "hospital/checkup_group"
|
|
4
7
|
require_relative "hospital/diagnosis"
|
|
5
8
|
require_relative "hospital/formatter"
|
|
6
9
|
|
|
@@ -11,38 +14,7 @@ module Hospital
|
|
|
11
14
|
|
|
12
15
|
class Error < StandardError; end
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
attr_reader :code, :condition, :diagnosis, :group, :skipped, :klass
|
|
16
|
-
|
|
17
|
-
def initialize klass, code, group: :general, title: nil, condition: -> { true }
|
|
18
|
-
@klass = klass
|
|
19
|
-
@code = code
|
|
20
|
-
@group = group
|
|
21
|
-
@condition = condition
|
|
22
|
-
@diagnosis = Hospital::Diagnosis.new([klass.to_s, title].compact.join(' - '))
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def reset_diagnosis
|
|
26
|
-
diagnosis.reset
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def check verbose: false
|
|
30
|
-
diagnosis.reset
|
|
31
|
-
|
|
32
|
-
if condition.nil? || condition.call
|
|
33
|
-
@skipped = false
|
|
34
|
-
code.call(diagnosis)
|
|
35
|
-
diagnosis
|
|
36
|
-
else
|
|
37
|
-
@skipped = true
|
|
38
|
-
nil
|
|
39
|
-
end
|
|
40
|
-
rescue StandardError => e
|
|
41
|
-
diagnosis.add_error "Unrescued exception in #{klass}.checkup:\n#{e.inspect}.\nThis is a bug inside the checkup method that should be fixed!"
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
@@checkups = {}
|
|
17
|
+
@@groups = []
|
|
46
18
|
|
|
47
19
|
class << self
|
|
48
20
|
|
|
@@ -50,40 +22,24 @@ module Hospital
|
|
|
50
22
|
raise Hospital::Error.new("Cannot include Hospital, please extend instead.")
|
|
51
23
|
end
|
|
52
24
|
|
|
53
|
-
def extended(klass)
|
|
54
|
-
# only relevant if the class does not yet define a real checkup method
|
|
55
|
-
@@checkups[klass] = Checkup.new klass, -> (diagnosis) do
|
|
56
|
-
diagnosis.add_warning("#{klass}: No checks defined! Please call checkup with a lambda.")
|
|
57
|
-
end, group: :general
|
|
58
|
-
end
|
|
59
|
-
|
|
60
25
|
def do_checkup_all verbose: false
|
|
61
26
|
errcount = 0
|
|
62
27
|
warcount = 0
|
|
63
28
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
checkup.check(verbose: verbose)
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
threads.each &:join
|
|
29
|
+
@@groups.each do |group|
|
|
30
|
+
puts group.header
|
|
31
|
+
group.run_checkups verbose: verbose
|
|
72
32
|
|
|
73
|
-
|
|
74
|
-
puts group_header(group)
|
|
75
|
-
first = false
|
|
76
|
-
|
|
77
|
-
checkups.each do |klass, checkup|
|
|
33
|
+
group.all_checkups.each do |checkup|
|
|
78
34
|
if diagnosis = checkup.diagnosis
|
|
79
35
|
errcount += diagnosis.errors.count
|
|
80
36
|
warcount += diagnosis.warnings.count
|
|
81
37
|
|
|
82
38
|
if !checkup.skipped
|
|
83
|
-
puts "Checking #{diagnosis.name}:".h2
|
|
39
|
+
puts "Checking #{diagnosis.name}:".h2.indented
|
|
84
40
|
diagnosis.put_results
|
|
85
41
|
elsif verbose
|
|
86
|
-
puts "Skipped #{diagnosis.name}.".h2
|
|
42
|
+
puts "Skipped #{diagnosis.name}.".h2.indented
|
|
87
43
|
end
|
|
88
44
|
end
|
|
89
45
|
end
|
|
@@ -98,17 +54,33 @@ module Hospital
|
|
|
98
54
|
end
|
|
99
55
|
|
|
100
56
|
# used to call the checkup for a specific class directly (in specs)
|
|
101
|
-
def do_checkup(klass)
|
|
102
|
-
@@
|
|
57
|
+
def do_checkup(klass, verbose: false)
|
|
58
|
+
@@groups.map(&:all_checkups).flatten.select{|cu| cu.klass == klass }.map do |cu|
|
|
59
|
+
cu.check verbose: verbose
|
|
60
|
+
end
|
|
103
61
|
end
|
|
104
62
|
|
|
105
|
-
def
|
|
106
|
-
|
|
63
|
+
def find_or_create_checkup_group name
|
|
64
|
+
unless checkup_group = @@groups.detect{|g| g.name == name }
|
|
65
|
+
checkup_group = CheckupGroup.new name
|
|
66
|
+
@@groups << checkup_group
|
|
67
|
+
end
|
|
68
|
+
checkup_group
|
|
107
69
|
end
|
|
108
70
|
end
|
|
109
71
|
|
|
110
|
-
def checkup if: -> { true }, group: :general, title: nil, &code
|
|
111
|
-
|
|
72
|
+
def checkup if: -> { true }, group: :general, title: nil, precondition: false, &code
|
|
73
|
+
checkup_group = Hospital.find_or_create_checkup_group group
|
|
74
|
+
checkup = Checkup.new(
|
|
75
|
+
self,
|
|
76
|
+
code,
|
|
77
|
+
group: group,
|
|
78
|
+
title: title,
|
|
79
|
+
condition: binding.local_variable_get('if'),
|
|
80
|
+
precondition: precondition
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
# p "adding #{checkup.inspect} to #{group}"
|
|
84
|
+
checkup_group.add_checkup checkup
|
|
112
85
|
end
|
|
113
|
-
|
|
114
86
|
end
|
metadata
CHANGED
|
@@ -1,15 +1,43 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: hospital
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Alexander
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
12
|
-
dependencies:
|
|
11
|
+
date: 2024-01-28 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: byebug
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: require_all
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ">="
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ">="
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
13
41
|
description: Imagine a team of little doctors creating diagnoses and creating a useful
|
|
14
42
|
report.
|
|
15
43
|
email:
|
|
@@ -21,6 +49,8 @@ files:
|
|
|
21
49
|
- LICENSE.txt
|
|
22
50
|
- README.md
|
|
23
51
|
- lib/hospital.rb
|
|
52
|
+
- lib/hospital/checkup.rb
|
|
53
|
+
- lib/hospital/checkup_group.rb
|
|
24
54
|
- lib/hospital/diagnosis.rb
|
|
25
55
|
- lib/hospital/formatter.rb
|
|
26
56
|
- lib/hospital/tasks/checkup.rake
|