makit 0.0.112 → 0.0.128

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.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +41 -41
  3. data/exe/makit +5 -5
  4. data/lib/makit/apache.rb +28 -28
  5. data/lib/makit/cli/build_commands.rb +500 -500
  6. data/lib/makit/cli/generators/base_generator.rb +74 -74
  7. data/lib/makit/cli/generators/dotnet_generator.rb +50 -50
  8. data/lib/makit/cli/generators/generator_factory.rb +49 -49
  9. data/lib/makit/cli/generators/node_generator.rb +50 -50
  10. data/lib/makit/cli/generators/ruby_generator.rb +77 -77
  11. data/lib/makit/cli/generators/rust_generator.rb +50 -50
  12. data/lib/makit/cli/generators/templates/dotnet_templates.rb +167 -167
  13. data/lib/makit/cli/generators/templates/node_templates.rb +161 -161
  14. data/lib/makit/cli/generators/templates/ruby/gemfile.rb +26 -26
  15. data/lib/makit/cli/generators/templates/ruby/gemspec.rb +40 -40
  16. data/lib/makit/cli/generators/templates/ruby/main_lib.rb +33 -33
  17. data/lib/makit/cli/generators/templates/ruby/rakefile.rb +35 -35
  18. data/lib/makit/cli/generators/templates/ruby/readme.rb +63 -63
  19. data/lib/makit/cli/generators/templates/ruby/test.rb +39 -39
  20. data/lib/makit/cli/generators/templates/ruby/test_helper.rb +29 -29
  21. data/lib/makit/cli/generators/templates/ruby/version.rb +29 -29
  22. data/lib/makit/cli/generators/templates/rust_templates.rb +128 -128
  23. data/lib/makit/cli/main.rb +62 -62
  24. data/lib/makit/cli/project_commands.rb +868 -868
  25. data/lib/makit/cli/repository_commands.rb +661 -661
  26. data/lib/makit/cli/utility_commands.rb +521 -521
  27. data/lib/makit/commands/factory.rb +359 -359
  28. data/lib/makit/commands/middleware/base.rb +73 -73
  29. data/lib/makit/commands/middleware/cache.rb +248 -248
  30. data/lib/makit/commands/middleware/command_logger.rb +311 -320
  31. data/lib/makit/commands/middleware/validator.rb +269 -269
  32. data/lib/makit/commands/request.rb +316 -254
  33. data/lib/makit/commands/result.rb +323 -323
  34. data/lib/makit/commands/runner.rb +368 -337
  35. data/lib/makit/commands/strategies/base.rb +171 -160
  36. data/lib/makit/commands/strategies/synchronous.rb +139 -134
  37. data/lib/makit/commands.rb +50 -51
  38. data/lib/makit/configuration/gitlab_helper.rb +58 -60
  39. data/lib/makit/configuration/project.rb +167 -127
  40. data/lib/makit/configuration/rakefile_helper.rb +43 -43
  41. data/lib/makit/configuration/step.rb +34 -34
  42. data/lib/makit/configuration.rb +14 -14
  43. data/lib/makit/content/default_gitignore.rb +7 -7
  44. data/lib/makit/content/default_gitignore.txt +226 -0
  45. data/lib/makit/content/default_rakefile.rb +13 -13
  46. data/lib/makit/content/gem_rakefile.rb +16 -16
  47. data/lib/makit/context.rb +1 -1
  48. data/lib/makit/data.rb +49 -49
  49. data/lib/makit/directories.rb +140 -141
  50. data/lib/makit/directory.rb +262 -262
  51. data/lib/makit/docs/files.rb +89 -89
  52. data/lib/makit/docs/rake.rb +102 -102
  53. data/lib/makit/dotnet/cli.rb +69 -65
  54. data/lib/makit/dotnet/project.rb +217 -153
  55. data/lib/makit/dotnet/solution.rb +38 -38
  56. data/lib/makit/dotnet/solution_classlib.rb +239 -239
  57. data/lib/makit/dotnet/solution_console.rb +264 -264
  58. data/lib/makit/dotnet/solution_maui.rb +354 -354
  59. data/lib/makit/dotnet/solution_wasm.rb +275 -275
  60. data/lib/makit/dotnet/solution_wpf.rb +304 -304
  61. data/lib/makit/dotnet.rb +102 -102
  62. data/lib/makit/email.rb +90 -90
  63. data/lib/makit/environment.rb +142 -142
  64. data/lib/makit/examples/runner.rb +370 -370
  65. data/lib/makit/exceptions.rb +45 -45
  66. data/lib/makit/fileinfo.rb +24 -24
  67. data/lib/makit/files.rb +43 -43
  68. data/lib/makit/gems.rb +40 -40
  69. data/lib/makit/git/cli.rb +54 -54
  70. data/lib/makit/git/repository.rb +90 -90
  71. data/lib/makit/git.rb +98 -98
  72. data/lib/makit/gitlab_runner.rb +59 -59
  73. data/lib/makit/humanize.rb +137 -137
  74. data/lib/makit/indexer.rb +47 -47
  75. data/lib/makit/logging/configuration.rb +308 -305
  76. data/lib/makit/logging/format_registry.rb +84 -84
  77. data/lib/makit/logging/formatters/base.rb +39 -39
  78. data/lib/makit/logging/formatters/console_formatter.rb +140 -140
  79. data/lib/makit/logging/formatters/json_formatter.rb +65 -65
  80. data/lib/makit/logging/formatters/plain_text_formatter.rb +71 -71
  81. data/lib/makit/logging/formatters/text_formatter.rb +64 -64
  82. data/lib/makit/logging/log_request.rb +119 -115
  83. data/lib/makit/logging/logger.rb +199 -163
  84. data/lib/makit/logging/sinks/base.rb +91 -91
  85. data/lib/makit/logging/sinks/console.rb +72 -72
  86. data/lib/makit/logging/sinks/file_sink.rb +92 -92
  87. data/lib/makit/logging/sinks/structured.rb +123 -129
  88. data/lib/makit/logging/sinks/unified_file_sink.rb +296 -303
  89. data/lib/makit/logging.rb +565 -530
  90. data/lib/makit/markdown.rb +75 -75
  91. data/lib/makit/mp/basic_object_mp.rb +17 -17
  92. data/lib/makit/mp/command_mp.rb +13 -13
  93. data/lib/makit/mp/command_request.mp.rb +17 -17
  94. data/lib/makit/mp/project_mp.rb +199 -199
  95. data/lib/makit/mp/string_mp.rb +191 -193
  96. data/lib/makit/nuget.rb +74 -74
  97. data/lib/makit/port.rb +32 -32
  98. data/lib/makit/process.rb +163 -163
  99. data/lib/makit/protoc.rb +107 -107
  100. data/lib/makit/rake/cli.rb +196 -196
  101. data/lib/makit/rake.rb +25 -25
  102. data/lib/makit/ruby/cli.rb +185 -185
  103. data/lib/makit/ruby.rb +25 -25
  104. data/lib/makit/secrets.rb +51 -51
  105. data/lib/makit/serializer.rb +130 -130
  106. data/lib/makit/services/builder.rb +186 -186
  107. data/lib/makit/services/error_handler.rb +226 -226
  108. data/lib/makit/services/repository_manager.rb +231 -229
  109. data/lib/makit/services/validator.rb +112 -112
  110. data/lib/makit/setup/classlib.rb +94 -53
  111. data/lib/makit/setup/gem.rb +268 -263
  112. data/lib/makit/setup/razorclasslib.rb +91 -0
  113. data/lib/makit/setup/runner.rb +54 -45
  114. data/lib/makit/setup.rb +5 -5
  115. data/lib/makit/show.rb +110 -110
  116. data/lib/makit/storage.rb +126 -126
  117. data/lib/makit/symbols.rb +170 -170
  118. data/lib/makit/task_info.rb +128 -128
  119. data/lib/makit/tasks/at_exit.rb +15 -13
  120. data/lib/makit/tasks/build.rb +22 -19
  121. data/lib/makit/tasks/clean.rb +13 -11
  122. data/lib/makit/tasks/configure.rb +10 -0
  123. data/lib/makit/tasks/format.rb +10 -0
  124. data/lib/makit/tasks/hook_manager.rb +391 -393
  125. data/lib/makit/tasks/init.rb +49 -47
  126. data/lib/makit/tasks/integrate.rb +29 -17
  127. data/lib/makit/tasks/pull_incoming.rb +13 -11
  128. data/lib/makit/tasks/setup.rb +13 -6
  129. data/lib/makit/tasks/sync.rb +17 -12
  130. data/lib/makit/tasks/tag.rb +16 -15
  131. data/lib/makit/tasks/task_monkey_patch.rb +81 -79
  132. data/lib/makit/tasks/test.rb +22 -0
  133. data/lib/makit/tasks/update.rb +18 -0
  134. data/lib/makit/tasks.rb +20 -15
  135. data/lib/makit/test_cache.rb +239 -239
  136. data/lib/makit/tree.rb +37 -37
  137. data/lib/makit/v1/makit.v1_pb.rb +35 -34
  138. data/lib/makit/v1/makit.v1_services_pb.rb +27 -27
  139. data/lib/makit/version.rb +5 -5
  140. data/lib/makit/version_util.rb +21 -21
  141. data/lib/makit/wix.rb +95 -95
  142. data/lib/makit/yaml.rb +29 -29
  143. data/lib/makit/zip.rb +17 -17
  144. data/lib/makit copy.rb +44 -44
  145. data/lib/makit.rb +39 -40
  146. metadata +69 -7
  147. data/lib/makit/commands/middleware/unified_logger.rb +0 -243
@@ -1,163 +1,199 @@
1
- # frozen_string_literal: true
2
-
3
- require "set"
4
- require_relative "log_request"
5
- require_relative "sinks/base"
6
- require_relative "sinks/console"
7
- require_relative "sinks/file_sink"
8
- require_relative "sinks/structured"
9
-
10
- module Makit
11
- module Logging
12
- # Main logger class that orchestrates logging through sinks
13
- #
14
- # This class provides a clean interface for logging with support for
15
- # sink-based output processing. It follows the same pattern as the
16
- # Commands::Runner but for logging operations.
17
- #
18
- # @example Basic usage
19
- # logger = Logger.new
20
- # logger.info("Processing started")
21
- #
22
- # @example With custom sinks
23
- # logger = Logger.new(
24
- # sinks: [
25
- # Sinks::Console.new,
26
- # Sinks::File.new(log_file: "custom.log")
27
- # ]
28
- # )
29
- #
30
- # @example Using convenience methods
31
- # logger.success("Build completed")
32
- # logger.error("Build failed", { repository: "user/repo" })
33
- class Logger
34
- # @return [Array<Sinks::Base>] list of sinks to process log requests
35
- attr_reader :sinks
36
- # @return [Symbol] minimum log level for filtering
37
- attr_reader :level
38
-
39
- # Initialize the logger with sinks and log level
40
- #
41
- # @param sinks [Array<Sinks::Base>] list of sinks to use
42
- # @param level [Symbol] minimum log level (:debug, :info, :warn, :error, :fatal, :success)
43
- def initialize(sinks: [], level: :info)
44
- @sinks = sinks
45
- @level = level
46
- @logged_tasks = Set.new
47
- end
48
-
49
- # Log a message with the specified level
50
- #
51
- # @param level [Symbol] the log level (:debug, :info, :warn, :error, :fatal, :success)
52
- # @param message [String] the log message
53
- # @param context [Hash] additional context information
54
- # @return [void]
55
- def log(level, message, context = {})
56
- return unless should_log?(level)
57
-
58
- log_request = LogRequest.new(level, message, context)
59
- execute_sinks(log_request)
60
- end
61
-
62
- # Log an info message
63
- #
64
- # @param message [String] the log message
65
- # @param context [Hash] additional context information
66
- # @return [void]
67
- def info(message, context = {})
68
- log(:info, message, context)
69
- end
70
-
71
- # Log a success message
72
- #
73
- # @param message [String] the log message
74
- # @param context [Hash] additional context information
75
- # @return [void]
76
- def success(message, context = {})
77
- log(:success, message, context)
78
- end
79
-
80
- # Log an error message
81
- #
82
- # @param message [String] the log message
83
- # @param context [Hash] additional context information
84
- # @return [void]
85
- def error(message, context = {})
86
- log(:error, message, context)
87
- end
88
-
89
- # Log a warning message
90
- #
91
- # @param message [String] the log message
92
- # @param context [Hash] additional context information
93
- # @return [void]
94
- def warn(message, context = {})
95
- log(:warn, message, context)
96
- end
97
-
98
- # Log a debug message
99
- #
100
- # @param message [String] the log message
101
- # @param context [Hash] additional context information
102
- # @return [void]
103
- def debug(message, context = {})
104
- log(:debug, message, context)
105
- end
106
-
107
- # Log a fatal message
108
- #
109
- # @param message [String] the log message
110
- # @param context [Hash] additional context information
111
- # @return [void]
112
- def fatal(message, context = {})
113
- log(:fatal, message, context)
114
- end
115
-
116
- def task_start(message, context = {})
117
- return if @logged_tasks.include?(message)
118
- @logged_tasks.add(message)
119
- # Format task name with colon prefix and bold white styling
120
- formatted_message = ": #{message}".colorize(:white).bold
121
- # Add special context to identify task messages
122
- task_context = context.merge(task_message: true)
123
- log(:info, formatted_message, task_context)
124
- end
125
-
126
- # Get logger configuration
127
- #
128
- # @return [Hash] logger configuration
129
- def config
130
- {
131
- level: @level,
132
- sinks_count: @sinks.length,
133
- sinks: @sinks.map(&:config),
134
- }
135
- end
136
-
137
- private
138
-
139
- # Check if a log level should be processed
140
- #
141
- # @param level [Symbol] the log level to check
142
- # @return [Boolean] true if the level should be logged
143
- def should_log?(level)
144
- levels = [:debug, :info, :warn, :error, :fatal, :success]
145
- levels.index(level) >= levels.index(@level)
146
- end
147
-
148
- # Execute the sink chain for a log request
149
- #
150
- # @param log_request [LogRequest] the log request to process
151
- # @return [void]
152
- def execute_sinks(log_request)
153
- # Filter applicable sinks
154
- applicable_sinks = @sinks.select { |s| s.applicable?(log_request) }
155
-
156
- # Execute sink chain
157
- applicable_sinks.reduce(log_request) do |request, sink|
158
- sink.call(request)
159
- end
160
- end
161
- end
162
- end
163
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "set"
4
+ require_relative "log_request"
5
+ require_relative "sinks/base"
6
+ require_relative "sinks/console"
7
+ require_relative "sinks/file_sink"
8
+ require_relative "sinks/structured"
9
+
10
+ module Makit
11
+ module Logging
12
+ # Main logger class that orchestrates logging through sinks
13
+ #
14
+ # This class provides a clean interface for logging with support for
15
+ # sink-based output processing. It follows the same pattern as the
16
+ # Commands::Runner but for logging operations.
17
+ #
18
+ # @example Basic usage
19
+ # logger = Logger.new
20
+ # logger.info("Processing started")
21
+ #
22
+ # @example With custom sinks
23
+ # logger = Logger.new(
24
+ # sinks: [
25
+ # Sinks::Console.new,
26
+ # Sinks::File.new(log_file: "custom.log")
27
+ # ]
28
+ # )
29
+ #
30
+ # @example Using convenience methods
31
+ # logger.success("Build completed")
32
+ # logger.error("Build failed", { repository: "user/repo" })
33
+ class Logger
34
+ # @return [Array<Sinks::Base>] list of sinks to process log requests
35
+ attr_reader :sinks
36
+ # @return [Symbol] minimum log level for filtering
37
+ attr_reader :level
38
+ # @return [Symbol] current verbosity level
39
+ attr_reader :verbosity
40
+
41
+ # Initialize the logger with sinks and log level
42
+ #
43
+ # @param sinks [Array<Sinks::Base>] list of sinks to use
44
+ # @param level [Symbol] minimum log level (:debug, :info, :warn, :error, :fatal, :success)
45
+ # @param verbosity [Symbol] verbosity level (:quiet, :normal, :verbose, :debug)
46
+ def initialize(sinks: [], level: :info, verbosity: :normal)
47
+ @sinks = sinks
48
+ @level = level
49
+ @verbosity = verbosity
50
+ @logged_tasks = Set.new
51
+ end
52
+
53
+ # Log a message with the specified level
54
+ #
55
+ # @param level [Symbol] the log level (:debug, :info, :warn, :error, :fatal, :success)
56
+ # @param message [String] the log message
57
+ # @param context [Hash] additional context information
58
+ # @param verbosity [Symbol] verbosity level (:quiet, :normal, :verbose, :debug)
59
+ # @return [void]
60
+ def log(level, message, context = {}, verbosity: :normal)
61
+ return unless should_log?(level)
62
+ return unless should_show_verbosity?(verbosity)
63
+
64
+ log_request = LogRequest.new(level, message, context, verbosity: verbosity)
65
+ execute_sinks(log_request)
66
+ end
67
+
68
+ # Log an info message
69
+ #
70
+ # @param message [String] the log message
71
+ # @param context [Hash] additional context information
72
+ # @return [void]
73
+ def info(message, context = {})
74
+ log(:info, message, context)
75
+ end
76
+
77
+ # Log a success message
78
+ #
79
+ # @param message [String] the log message
80
+ # @param context [Hash] additional context information
81
+ # @return [void]
82
+ def success(message, context = {})
83
+ log(:success, message, context)
84
+ end
85
+
86
+ # Log an error message
87
+ #
88
+ # @param message [String] the log message
89
+ # @param context [Hash] additional context information
90
+ # @return [void]
91
+ def error(message, context = {})
92
+ log(:error, message, context)
93
+ end
94
+
95
+ # Log a warning message
96
+ #
97
+ # @param message [String] the log message
98
+ # @param context [Hash] additional context information
99
+ # @return [void]
100
+ def warn(message, context = {})
101
+ log(:warn, message, context)
102
+ end
103
+
104
+ # Log a debug message
105
+ #
106
+ # @param message [String] the log message
107
+ # @param context [Hash] additional context information
108
+ # @return [void]
109
+ def debug(message, context = {})
110
+ log(:debug, message, context)
111
+ end
112
+
113
+ # Log a fatal message
114
+ #
115
+ # @param message [String] the log message
116
+ # @param context [Hash] additional context information
117
+ # @return [void]
118
+ def fatal(message, context = {})
119
+ log(:fatal, message, context)
120
+ end
121
+
122
+ # Log a verbose message (only shown in verbose or debug mode)
123
+ #
124
+ # @param message [String] the log message
125
+ # @param context [Hash] additional context information
126
+ # @return [void]
127
+ def verbose(message, context = {})
128
+ log(:info, message, context, verbosity: :verbose)
129
+ end
130
+
131
+ # Log a quiet message (shown even in quiet mode)
132
+ #
133
+ # @param message [String] the log message
134
+ # @param context [Hash] additional context information
135
+ # @return [void]
136
+ def quiet(message, context = {})
137
+ log(:info, message, context, verbosity: :quiet)
138
+ end
139
+
140
+ def task_start(message, context = {})
141
+ return if @logged_tasks.include?(message)
142
+
143
+ @logged_tasks.add(message)
144
+ # Format task name with colon prefix and bold white styling
145
+ formatted_message = ": #{message}".colorize(:white).bold
146
+ # Add special context to identify task messages
147
+ task_context = context.merge(task_message: true)
148
+ log(:info, formatted_message, task_context)
149
+ end
150
+
151
+ # Get logger configuration
152
+ #
153
+ # @return [Hash] logger configuration
154
+ def config
155
+ {
156
+ level: @level,
157
+ sinks_count: @sinks.length,
158
+ sinks: @sinks.map(&:config),
159
+ }
160
+ end
161
+
162
+ private
163
+
164
+ # Check if a log level should be processed
165
+ #
166
+ # @param level [Symbol] the log level to check
167
+ # @return [Boolean] true if the level should be logged
168
+ def should_log?(level)
169
+ levels = %i[debug info warn error fatal success]
170
+ levels.index(level) >= levels.index(@level)
171
+ end
172
+
173
+ # Check if a verbosity level should be shown
174
+ #
175
+ # @param verbosity [Symbol] the verbosity level to check
176
+ # @return [Boolean] true if the verbosity should be shown
177
+ def should_show_verbosity?(verbosity)
178
+ verbosity_levels = %i[quiet normal verbose debug]
179
+ verbosity_index = verbosity_levels.index(verbosity) || 1 # default to normal
180
+ current_index = verbosity_levels.index(@verbosity) || 1
181
+ verbosity_index <= current_index
182
+ end
183
+
184
+ # Execute the sink chain for a log request
185
+ #
186
+ # @param log_request [LogRequest] the log request to process
187
+ # @return [void]
188
+ def execute_sinks(log_request)
189
+ # Filter applicable sinks
190
+ applicable_sinks = @sinks.select { |s| s.applicable?(log_request) }
191
+
192
+ # Execute sink chain
193
+ applicable_sinks.reduce(log_request) do |request, sink|
194
+ sink.call(request)
195
+ end
196
+ end
197
+ end
198
+ end
199
+ end
@@ -1,91 +1,91 @@
1
- # frozen_string_literal: true
2
-
3
- module Makit
4
- module Logging
5
- module Sinks
6
- # Base class for all logging sinks
7
- #
8
- # Sinks provide a way to output log requests to various destinations like
9
- # console, files, or external services. This follows the same pattern as
10
- # the commands middleware but focuses on output rather than transformation.
11
- #
12
- # @example Creating a custom logging sink
13
- # class CustomSink < Base
14
- # def call(log_request, &block)
15
- # # Output the log request
16
- # output_log(log_request)
17
- #
18
- # # Continue to next sink
19
- # block.call(log_request) if block_given?
20
- # end
21
- # end
22
- class Base
23
- # Execute sink logic
24
- #
25
- # This method must be implemented by subclasses to provide the actual
26
- # sink functionality. The pattern is to output the log request to the
27
- # destination, then call the block to continue the sink chain.
28
- #
29
- # @param log_request [LogRequest] the log request to process
30
- # @yield [LogRequest] yields the processed log request to the next sink
31
- # @yieldreturn [LogRequest] the processed log request
32
- # @return [LogRequest] the final processed log request
33
- # @raise [NotImplementedError] if not overridden by subclass
34
- def call(log_request, &block)
35
- raise NotImplementedError, "#{self.class.name} must implement #call"
36
- end
37
-
38
- # Check if this sink should be applied to the given log request
39
- #
40
- # Override this method to provide conditional sink application
41
- # based on log request properties like level, message, or context.
42
- #
43
- # @param log_request [LogRequest] the log request
44
- # @return [Boolean] true if sink should be applied
45
- def applicable?(log_request)
46
- true
47
- end
48
-
49
- # Get sink name for logging and debugging
50
- #
51
- # @return [String] sink name
52
- def name
53
- self.class.name.split("::").last
54
- end
55
-
56
- # Get sink configuration
57
- #
58
- # Override this method to provide sink-specific configuration.
59
- #
60
- # @return [Hash] sink configuration
61
- def config
62
- {}
63
- end
64
-
65
- private
66
-
67
- # Pre-process the log request before outputting
68
- #
69
- # Override this method to modify the log request before it is output
70
- # to the destination.
71
- #
72
- # @param log_request [LogRequest] the log request
73
- # @return [LogRequest] the modified log request
74
- def pre_process(log_request)
75
- log_request
76
- end
77
-
78
- # Post-process the log request after outputting
79
- #
80
- # Override this method to perform any final processing after the
81
- # log request has been output to the destination.
82
- #
83
- # @param log_request [LogRequest] the log request
84
- # @return [LogRequest] the final log request
85
- def post_process(log_request)
86
- log_request
87
- end
88
- end
89
- end
90
- end
91
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Makit
4
+ module Logging
5
+ module Sinks
6
+ # Base class for all logging sinks
7
+ #
8
+ # Sinks provide a way to output log requests to various destinations like
9
+ # console, files, or external services. This follows the same pattern as
10
+ # the commands middleware but focuses on output rather than transformation.
11
+ #
12
+ # @example Creating a custom logging sink
13
+ # class CustomSink < Base
14
+ # def call(log_request, &block)
15
+ # # Output the log request
16
+ # output_log(log_request)
17
+ #
18
+ # # Continue to next sink
19
+ # block.call(log_request) if block_given?
20
+ # end
21
+ # end
22
+ class Base
23
+ # Execute sink logic
24
+ #
25
+ # This method must be implemented by subclasses to provide the actual
26
+ # sink functionality. The pattern is to output the log request to the
27
+ # destination, then call the block to continue the sink chain.
28
+ #
29
+ # @param log_request [LogRequest] the log request to process
30
+ # @yield [LogRequest] yields the processed log request to the next sink
31
+ # @yieldreturn [LogRequest] the processed log request
32
+ # @return [LogRequest] the final processed log request
33
+ # @raise [NotImplementedError] if not overridden by subclass
34
+ def call(log_request, &block)
35
+ raise NotImplementedError, "#{self.class.name} must implement #call"
36
+ end
37
+
38
+ # Check if this sink should be applied to the given log request
39
+ #
40
+ # Override this method to provide conditional sink application
41
+ # based on log request properties like level, message, or context.
42
+ #
43
+ # @param log_request [LogRequest] the log request
44
+ # @return [Boolean] true if sink should be applied
45
+ def applicable?(_log_request)
46
+ true
47
+ end
48
+
49
+ # Get sink name for logging and debugging
50
+ #
51
+ # @return [String] sink name
52
+ def name
53
+ self.class.name.split("::").last
54
+ end
55
+
56
+ # Get sink configuration
57
+ #
58
+ # Override this method to provide sink-specific configuration.
59
+ #
60
+ # @return [Hash] sink configuration
61
+ def config
62
+ {}
63
+ end
64
+
65
+ private
66
+
67
+ # Pre-process the log request before outputting
68
+ #
69
+ # Override this method to modify the log request before it is output
70
+ # to the destination.
71
+ #
72
+ # @param log_request [LogRequest] the log request
73
+ # @return [LogRequest] the modified log request
74
+ def pre_process(log_request)
75
+ log_request
76
+ end
77
+
78
+ # Post-process the log request after outputting
79
+ #
80
+ # Override this method to perform any final processing after the
81
+ # log request has been output to the destination.
82
+ #
83
+ # @param log_request [LogRequest] the log request
84
+ # @return [LogRequest] the final log request
85
+ def post_process(log_request)
86
+ log_request
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end