pantheios-ruby 0.19.2 → 0.22.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +31 -0
  3. data/README.md +5 -0
  4. data/examples/coloured_console_log_service.rb +37 -0
  5. data/examples/multiple_modules.md +204 -0
  6. data/examples/multiple_modules.rb +132 -0
  7. data/examples/simple_logging.md +65 -0
  8. data/examples/simple_logging.rb +37 -0
  9. data/lib/pantheios.rb +3 -2
  10. data/lib/pantheios/api.rb +23 -6
  11. data/lib/pantheios/application_layer.rb +2 -1
  12. data/lib/pantheios/application_layer/param_name_list.rb +9 -0
  13. data/lib/pantheios/application_layer/stock_severity_levels.rb +99 -31
  14. data/lib/pantheios/core.rb +56 -25
  15. data/lib/pantheios/front_ends/threshold_front_end.rb +148 -0
  16. data/lib/pantheios/globals.rb +20 -9
  17. data/lib/pantheios/services/coloured_console_log_service.rb +204 -0
  18. data/lib/pantheios/services/common/console.rb +92 -0
  19. data/lib/pantheios/services/multiplexing_log_service.rb +42 -3
  20. data/lib/pantheios/services/null_log_service.rb +3 -2
  21. data/lib/pantheios/services/simple_console_log_service.rb +10 -8
  22. data/lib/pantheios/services/simple_file_log_service.rb +3 -4
  23. data/lib/pantheios/services/standard_log_service_adapter.rb +3 -2
  24. data/lib/pantheios/util/process_util.rb +3 -3
  25. data/lib/pantheios/util/reflection_util.rb +3 -0
  26. data/lib/pantheios/util/thread_util.rb +2 -0
  27. data/lib/pantheios/util/version_util.rb +1 -0
  28. data/lib/pantheios/version.rb +4 -3
  29. data/test/unit/application_layer/tc_stock_severity_levels.rb +67 -0
  30. data/test/unit/front_ends/tc_threshold_front_end.rb +102 -0
  31. data/test/unit/front_ends/ts_all.rb +12 -0
  32. data/test/unit/services/tc_multiplexing_log_service.rb +4 -4
  33. data/test/unit/services/tc_simple_console_log_service.rb +3 -3
  34. metadata +27 -21
@@ -6,12 +6,13 @@
6
6
  # ::Pantheios::Services::MultiplexingLogService class
7
7
  #
8
8
  # Created: 14th June 2015
9
- # Updated: 8th February 2018
9
+ # Updated: 4th June 2020
10
10
  #
11
11
  # Home: http://github.com/synesissoftware/Pantheios-Ruby
12
12
  #
13
13
  # Author: Matthew Wilson
14
14
  #
15
+ # Copyright (c) 2019-2020, Matthew Wilson and Synesis Information Systems
15
16
  # Copyright (c) 2015-2018, Matthew Wilson and Synesis Software
16
17
  # All rights reserved.
17
18
  #
@@ -56,10 +57,11 @@ module Services
56
57
  #
57
58
  # NOTE: The *LogService* protocol is implemented by a class that provides
58
59
  # the instance methods +severity_logged?(severity : Object) : boolean+ and
59
- # +log(severity : Object, t : Time, prefix : String, msg : String)+
60
+ # +log(severity : Object, t : Time, prefix : String|Array, msg : String)+
60
61
  class MultiplexingLogService
61
62
 
62
- module MultiplexingLogService_Internals_
63
+ # @!visibility private
64
+ module MultiplexingLogService_Internals_ # :nodoc: all
63
65
 
64
66
  class ServiceManagementInfo
65
67
 
@@ -167,6 +169,43 @@ class MultiplexingLogService
167
169
  end
168
170
  public
169
171
 
172
+ # Indicates whether any of the services require a prefix and, if so,
173
+ # what it may require
174
+ #
175
+ # === Return
176
+ # (+false+, +true+, +:parts+) An indicator what the most needy of the
177
+ # multiplexed services requires
178
+ def requires_prefix?
179
+
180
+ return @requires_prefix unless @requires_prefix.nil?
181
+
182
+ requires_prefix = false
183
+
184
+ @services.each do |svc|
185
+
186
+ if svc.respond_to? :requires_prefix?
187
+
188
+ case rp = svc.requires_prefix?
189
+ when nil, false
190
+
191
+ ;
192
+ when true
193
+
194
+ requires_prefix ||= true
195
+ when :parts
196
+
197
+ requires_prefix = rp
198
+ break
199
+ else
200
+
201
+ warn "unrecognised return from requires_prefix? for service #{svc}: #{rp} (#{rp.class})"
202
+ end
203
+ end
204
+ end
205
+
206
+ @requires_prefix = requires_prefix
207
+ end
208
+
170
209
  # Indicates whether the given severity is to be logged by any of the
171
210
  # multiplexed log services
172
211
  def severity_logged? severity
@@ -6,12 +6,13 @@
6
6
  # class
7
7
  #
8
8
  # Created: 14th June 2015
9
- # Updated: 8th February 2018
9
+ # Updated: 4th June 2020
10
10
  #
11
11
  # Home: http://github.com/synesissoftware/Pantheios-Ruby
12
12
  #
13
13
  # Author: Matthew Wilson
14
14
  #
15
+ # Copyright (c) 2019-2020, Matthew Wilson and Synesis Information Systems
15
16
  # Copyright (c) 2015-2018, Matthew Wilson and Synesis Software
16
17
  # All rights reserved.
17
18
  #
@@ -56,7 +57,7 @@ module Services
56
57
  #
57
58
  # NOTE: The *LogService* protocol is implemented by a class that provides
58
59
  # the instance methods +severity_logged?(severity : Object) : boolean+ and
59
- # +log(severity : Object, t : Time, prefix : String, msg : String)+
60
+ # +log(severity : Object, t : Time, prefix : String|Array, msg : String)+
60
61
  class NullLogService
61
62
 
62
63
  def severity_logged? severity
@@ -6,12 +6,13 @@
6
6
  # ::Pantheios::Services::SimpleConsoleLogService class
7
7
  #
8
8
  # Created: 14th June 2015
9
- # Updated: 6th January 2018
9
+ # Updated: 4th June 2020
10
10
  #
11
11
  # Home: http://github.com/synesissoftware/Pantheios-Ruby
12
12
  #
13
13
  # Author: Matthew Wilson
14
14
  #
15
+ # Copyright (c) 2019-2020, Matthew Wilson and Synesis Information Systems
15
16
  # Copyright (c) 2015-2018, Matthew Wilson and Synesis Software
16
17
  # All rights reserved.
17
18
  #
@@ -45,8 +46,6 @@
45
46
  # ######################################################################## #
46
47
 
47
48
 
48
- require 'pantheios/application_layer/stock_severity_levels'
49
-
50
49
  =begin
51
50
  =end
52
51
 
@@ -58,7 +57,7 @@ module Services
58
57
  #
59
58
  # NOTE: The *LogService* protocol is implemented by a class that provides
60
59
  # the instance methods +severity_logged?(severity : Object) : boolean+ and
61
- # +log(severity : Object, t : Time, prefix : String, msg : String)+
60
+ # +log(severity : Object, t : Time, prefix : String|Array, msg : String)+
62
61
  class SimpleConsoleLogService
63
62
 
64
63
  def severity_logged? severity
@@ -73,13 +72,16 @@ class SimpleConsoleLogService
73
72
  stm.puts "#{pref}#{msg}"
74
73
  end
75
74
 
75
+ # Overrideable method that determines which stream to write, based on a
76
+ # severity. This implementation always returns +$stderr+
77
+ #
78
+ # Overrides must return an object that supports the +puts(String)+
79
+ # method
76
80
  def infer_stream sev
77
81
 
78
- sev = ::Pantheios::ApplicationLayer::StockSeverityLevels::STOCK_SEVERITY_LEVEL_VALUES[sev] if ::Symbol === sev
79
-
80
- (sev.to_i < 6) ? $stderr : $stdout
82
+ $stderr
81
83
  end
82
- end
84
+ end # class SimpleConsoleLogService
83
85
 
84
86
  end # module Services
85
87
  end # module Pantheios
@@ -6,12 +6,13 @@
6
6
  # ::Pantheios::Services::SimpleFileLogService class
7
7
  #
8
8
  # Created: 17th June 2015
9
- # Updated: 4th February 2018
9
+ # Updated: 4th June 2020
10
10
  #
11
11
  # Home: http://github.com/synesissoftware/Pantheios-Ruby
12
12
  #
13
13
  # Author: Matthew Wilson
14
14
  #
15
+ # Copyright (c) 2019-2020, Matthew Wilson and Synesis Information Systems
15
16
  # Copyright (c) 2015-2018, Matthew Wilson and Synesis Software
16
17
  # All rights reserved.
17
18
  #
@@ -60,7 +61,7 @@ module Services
60
61
  #
61
62
  # NOTE: The *LogService* protocol is implemented by a class that provides
62
63
  # the instance methods +severity_logged?(severity : Object) : boolean+ and
63
- # +log(severity : Object, t : Time, prefix : String, msg : String)+
64
+ # +log(severity : Object, t : Time, prefix : String|Array, msg : String)+
64
65
  class SimpleFileLogService
65
66
 
66
67
  module SimpleFileLogService_Constants
@@ -94,8 +95,6 @@ class SimpleFileLogService
94
95
  # - +:roll_depth+:: [ ::Integer ] The depth of the size-based log
95
96
  # rolling. Overrides the second element in an array specified for
96
97
  # +:roll_size+
97
-
98
-
99
98
  def initialize log_file_or_path, **options
100
99
 
101
100
  roll_period = options[:roll_period]
@@ -6,12 +6,13 @@
6
6
  # ::Pantheios::Services::StandardLogServiceAdapter class
7
7
  #
8
8
  # Created: 18th June 2015
9
- # Updated: 23rd January 2018
9
+ # Updated: 4th June 2020
10
10
  #
11
11
  # Home: http://github.com/synesissoftware/Pantheios-Ruby
12
12
  #
13
13
  # Author: Matthew Wilson
14
14
  #
15
+ # Copyright (c) 2019-2020, Matthew Wilson and Synesis Information Systems
15
16
  # Copyright (c) 2015-2018, Matthew Wilson and Synesis Software
16
17
  # All rights reserved.
17
18
  #
@@ -64,7 +65,7 @@ module Services
64
65
  #
65
66
  # NOTE: The *LogService* protocol is implemented by a class that provides
66
67
  # the instance methods +severity_logged?(severity : Object) : boolean+ and
67
- # +log(severity : Object, t : Time, prefix : String, msg : String)+
68
+ # +log(severity : Object, t : Time, prefix : String|Array, msg : String)+
68
69
  class StandardLogServiceAdapter
69
70
 
70
71
  include ::Xqsr3::Quality::ParameterChecking
@@ -2,13 +2,13 @@
2
2
  module Pantheios
3
3
  module Util
4
4
 
5
+ # process utilities
5
6
  module ProcessUtil
6
7
 
7
8
  #
8
9
  # * *Options:*
9
- # - +:style+:: (:script, :script_basename, :script_dirname,
10
- # :script_realpath, :script_stem) directs the inference of the process
11
- # name. If none specified, :script_stem is assumed
10
+ # - +:style+:: (:script, :script_basename, :script_dirname, :script_realpath, :script_stem) directs
11
+ # the inference of the process name. If none specified, :script_stem is assumed
12
12
  def self.derive_process_name dollar0 = nil, **options
13
13
 
14
14
  dollar0 ||= $0
@@ -2,6 +2,7 @@
2
2
  module Pantheios
3
3
  module Util
4
4
 
5
+ # reflection utilities
5
6
  module ReflectionUtil
6
7
 
7
8
  module ReflectionUtil_Constants
@@ -9,6 +10,8 @@ module ReflectionUtil
9
10
  ROOT_CLASSES = [ ::Object, ::BasicObject ]
10
11
  end
11
12
 
13
+ # Obtains a list of all classes pertaining to +o+, excepting root
14
+ # objects (+::Object+ and +::BaseObject+).
12
15
  def self.non_root_classes o
13
16
 
14
17
  return [] if o.nil?
@@ -2,6 +2,7 @@
2
2
  module Pantheios
3
3
  module Util
4
4
 
5
+ # threading utilities
5
6
  module ThreadUtil
6
7
 
7
8
  # Creates (if necessary) and sets the given thread's +thread_name+
@@ -22,6 +23,7 @@ module ThreadUtil
22
23
  t.thread_name = name
23
24
  end
24
25
 
26
+ # Obtains the name of the calling thread
25
27
  def self.get_thread_name t
26
28
 
27
29
  t ||= Thread.current
@@ -2,6 +2,7 @@
2
2
  module Pantheios
3
3
  module Util
4
4
 
5
+ # version utilities
5
6
  module VersionUtil
6
7
 
7
8
  # Compares two version designators and returns a spaceship comparison
@@ -5,13 +5,14 @@
5
5
  # Purpose: Version for Pantheios.Ruby library
6
6
  #
7
7
  # Created: 2nd April 2011
8
- # Updated: 8th February 2018
8
+ # Updated: 4th June 2020
9
9
  #
10
10
  # Home: http://github.com/synesissoftware/Pantheios-Ruby
11
11
  #
12
12
  # Author: Matthew Wilson
13
13
  #
14
- # Copyright (c) 2011-2018, Matthew Wilson and Synesis Software
14
+ # Copyright (c) 2019-2020, Matthew Wilson and Synesis Information Systems
15
+ # Copyright (c) 2011-2019, Matthew Wilson and Synesis Software
15
16
  # All rights reserved.
16
17
  #
17
18
  # Redistribution and use in source and binary forms, with or without
@@ -50,7 +51,7 @@
50
51
  module Pantheios
51
52
 
52
53
  # Current version of the Pantheios.Ruby library
53
- VERSION = '0.19.2'
54
+ VERSION = '0.22.0.1'
54
55
 
55
56
  private
56
57
  VERSION_PARTS_ = VERSION.split(/[.]/).collect { |n| n.to_i } # :nodoc:
@@ -26,12 +26,15 @@ class Test_StockSeverityLevels < Test::Unit::TestCase
26
26
  debug2
27
27
  debug3
28
28
  debug4
29
+ debug5
29
30
  trace
31
+ benchmark
30
32
  }.map { |s| s.to_sym }
31
33
 
32
34
  EXPECTED_LEVELS = %w{
33
35
 
34
36
  emergency
37
+ fail
35
38
  info
36
39
  warn
37
40
  }.map { |s| s.to_sym } + EXPECTED_LEVELS_PRIME
@@ -51,6 +54,7 @@ class Test_StockSeverityLevels < Test::Unit::TestCase
51
54
  if defined? StockSeverityLevels
52
55
 
53
56
  assert StockSeverityLevels.const_defined?(:STOCK_SEVERITY_LEVELS)
57
+ assert StockSeverityLevels.const_defined?(:STOCK_SEVERITY_LEVELS_PRIME)
54
58
  assert StockSeverityLevels.const_defined?(:STOCK_SEVERITY_LEVEL_VALUES)
55
59
  assert StockSeverityLevels.const_defined?(:STOCK_SEVERITY_LEVEL_STRINGS)
56
60
  end
@@ -58,18 +62,36 @@ class Test_StockSeverityLevels < Test::Unit::TestCase
58
62
 
59
63
  def test_StockSeverityLevels_expected_levels
60
64
 
65
+ # all the ones that we expect exist
66
+
61
67
  EXPECTED_LEVELS.each do |sev|
62
68
 
63
69
  assert(StockSeverityLevels::STOCK_SEVERITY_LEVELS.include?(sev), "did not find level #{::Symbol === sev ? ':' : ''}#{sev} in #{StockSeverityLevels}::STOCK_SEVERITY_LEVELS")
64
70
  end
71
+
72
+ # we expect all the ones that exist
73
+
74
+ StockSeverityLevels::STOCK_SEVERITY_LEVELS.each do |sev|
75
+
76
+ assert(EXPECTED_LEVELS.include?(sev), "found unexpected level #{::Symbol === sev ? ':' : ''}#{sev} in #{StockSeverityLevels}::STOCK_SEVERITY_LEVELS")
77
+ end
65
78
  end
66
79
 
67
80
  def test_StockSeverityLevels_expected_prime_levels
68
81
 
82
+ # all the ones that we expect exist
83
+
69
84
  EXPECTED_LEVELS_PRIME.each do |sev|
70
85
 
71
86
  assert(StockSeverityLevels::STOCK_SEVERITY_LEVELS_PRIME.include?(sev), "did not find level #{::Symbol === sev ? ':' : ''}#{sev} in #{StockSeverityLevels}::STOCK_SEVERITY_LEVELS")
72
87
  end
88
+
89
+ # we expect all the ones that exist
90
+
91
+ StockSeverityLevels::STOCK_SEVERITY_LEVELS_PRIME.each do |sev|
92
+
93
+ assert(EXPECTED_LEVELS_PRIME.include?(sev), "found unexpected level #{::Symbol === sev ? ':' : ''}#{sev} in #{StockSeverityLevels}::STOCK_SEVERITY_LEVELS")
94
+ end
73
95
  end
74
96
 
75
97
  def test_StockSeverityLevels_expected_prime_levels_have_distinct_values
@@ -99,5 +121,50 @@ class Test_StockSeverityLevels < Test::Unit::TestCase
99
121
  strings[string] = string
100
122
  end
101
123
  end
124
+
125
+ def test_StockSeverityLevels_aliases
126
+
127
+ aliases = StockSeverityLevels::STOCK_SEVERITY_LEVEL_ALIASES
128
+
129
+ assert_equal :violation, aliases[:violation]
130
+ assert_equal :violation, aliases[:emergency]
131
+
132
+ assert_equal :alert, aliases[:alert]
133
+
134
+ assert_equal :critical, aliases[:critical]
135
+
136
+ assert_equal :failure, aliases[:failure]
137
+ assert_equal :failure, aliases[:fail]
138
+ #assert_equal :failure, aliases[:error]
139
+
140
+ assert_equal :warning, aliases[:warning]
141
+ assert_equal :warning, aliases[:warn]
142
+
143
+ assert_equal :notice, aliases[:notice]
144
+
145
+ assert_equal :informational, aliases[:informational]
146
+ assert_equal :informational, aliases[:info]
147
+
148
+ %i{ debug0 debug1 debug2 debug3 debug4 debug5 }.each do |sev|
149
+
150
+ assert_equal sev, aliases[sev]
151
+ end
152
+
153
+ assert_equal :trace, aliases[:trace]
154
+
155
+ assert_equal :benchmark, aliases[:benchmark]
156
+ end
157
+
158
+ def test_StockSeverityLevels_recognised_values_are_nil
159
+
160
+ EXPECTED_LEVELS.each do |sev|
161
+
162
+ assert_not_nil StockSeverityLevels::STOCK_SEVERITY_LEVEL_VALUES[sev]
163
+ assert_nil StockSeverityLevels::STOCK_SEVERITY_LEVEL_VALUES[sev.to_s]
164
+ end
165
+
166
+ assert_nil StockSeverityLevels::STOCK_SEVERITY_LEVEL_VALUES[nil]
167
+ assert_nil StockSeverityLevels::STOCK_SEVERITY_LEVEL_VALUES['failure']
168
+ end
102
169
  end
103
170
 
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.join(File.dirname(__FILE__), '../../..', 'lib')
4
+
5
+ require 'pantheios/front_ends/threshold_front_end'
6
+
7
+ require 'test/unit'
8
+
9
+ class Test_FrontEnds_ThresholdFrontEnd < Test::Unit::TestCase
10
+
11
+ include ::Pantheios::FrontEnds
12
+
13
+ def test_SimpleConsoleLogService_type_exists
14
+
15
+ assert defined? ThresholdFrontEnd
16
+ end
17
+
18
+ def test_construct_with_invalid_parameters
19
+
20
+ assert_raise(::TypeError) { ThresholdFrontEnd.new('notice') }
21
+
22
+ assert_raise_with_message(::ArgumentError, /unknown threshold severity level.*something_else.*Symbol/) { ThresholdFrontEnd.new(:something_else) }
23
+
24
+ ThresholdFrontEnd.new(:notice)
25
+ ThresholdFrontEnd.new(:notice, value_lookup_map: Hash.new)
26
+ assert_raise_with_message(::TypeError, /:value_lookup_map must be.*Hash/) { ThresholdFrontEnd.new(:notice, value_lookup_map: Array.new) }
27
+ end
28
+
29
+ def test_default_construct
30
+
31
+ fe = ThresholdFrontEnd.new(:notice)
32
+
33
+ assert_equal :notice, fe.threshold
34
+
35
+ assert_true fe.severity_logged?(:violation)
36
+ assert_true fe.severity_logged?(:alert)
37
+ assert_true fe.severity_logged?(:critical)
38
+ assert_true fe.severity_logged?(:failure)
39
+ assert_true fe.severity_logged?(:warning)
40
+ assert_true fe.severity_logged?(:notice)
41
+ assert_false fe.severity_logged?(:informational)
42
+ assert_false fe.severity_logged?(:debug0)
43
+ assert_false fe.severity_logged?(:debug1)
44
+ assert_false fe.severity_logged?(:debug2)
45
+ assert_false fe.severity_logged?(:debug3)
46
+ assert_false fe.severity_logged?(:debug4)
47
+ assert_false fe.severity_logged?(:debug5)
48
+ assert_false fe.severity_logged?(:trace)
49
+ end
50
+
51
+ def test_default_construct_and_change_threshold
52
+
53
+ fe = ThresholdFrontEnd.new(:notice)
54
+
55
+ assert_equal :notice, fe.threshold
56
+
57
+ fe.threshold = :failure
58
+
59
+ assert_equal :failure, fe.threshold
60
+
61
+ assert_true fe.severity_logged?(:violation)
62
+ assert_true fe.severity_logged?(:alert)
63
+ assert_true fe.severity_logged?(:critical)
64
+ assert_true fe.severity_logged?(:failure)
65
+ assert_false fe.severity_logged?(:warning)
66
+ assert_false fe.severity_logged?(:notice)
67
+ assert_false fe.severity_logged?(:informational)
68
+ assert_false fe.severity_logged?(:debug0)
69
+ assert_false fe.severity_logged?(:debug1)
70
+ assert_false fe.severity_logged?(:debug2)
71
+ assert_false fe.severity_logged?(:debug3)
72
+ assert_false fe.severity_logged?(:debug4)
73
+ assert_false fe.severity_logged?(:debug5)
74
+ assert_false fe.severity_logged?(:trace)
75
+ end
76
+
77
+ def test_use_custom_thresholds
78
+
79
+ value_lookup_map = {
80
+
81
+ FATAL: 1,
82
+ ERROR: 2,
83
+ WARN: 3,
84
+ INFO: 4,
85
+ DEBUG: 5,
86
+ }
87
+
88
+ fe = ThresholdFrontEnd.new(:INFO, value_lookup_map: value_lookup_map)
89
+
90
+ assert_equal :INFO, fe.threshold
91
+
92
+ assert_true fe.severity_logged?(:FATAL)
93
+ assert_true fe.severity_logged?(:ERROR)
94
+ assert_true fe.severity_logged?(:WARN)
95
+ assert_true fe.severity_logged?(:INFO)
96
+ assert_false fe.severity_logged?(:DEBUG)
97
+ end
98
+ end
99
+
100
+ # ############################## end of file ############################# #
101
+
102
+