makit 0.0.99 → 0.0.112

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 (152) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +41 -0
  3. data/exe/makit +5 -0
  4. data/lib/makit/apache.rb +28 -32
  5. data/lib/makit/cli/build_commands.rb +500 -0
  6. data/lib/makit/cli/generators/base_generator.rb +74 -0
  7. data/lib/makit/cli/generators/dotnet_generator.rb +50 -0
  8. data/lib/makit/cli/generators/generator_factory.rb +49 -0
  9. data/lib/makit/cli/generators/node_generator.rb +50 -0
  10. data/lib/makit/cli/generators/ruby_generator.rb +77 -0
  11. data/lib/makit/cli/generators/rust_generator.rb +50 -0
  12. data/lib/makit/cli/generators/templates/dotnet_templates.rb +167 -0
  13. data/lib/makit/cli/generators/templates/node_templates.rb +161 -0
  14. data/lib/makit/cli/generators/templates/ruby/gemfile.rb +26 -0
  15. data/lib/makit/cli/generators/templates/ruby/gemspec.rb +40 -0
  16. data/lib/makit/cli/generators/templates/ruby/main_lib.rb +33 -0
  17. data/lib/makit/cli/generators/templates/ruby/rakefile.rb +35 -0
  18. data/lib/makit/cli/generators/templates/ruby/readme.rb +63 -0
  19. data/lib/makit/cli/generators/templates/ruby/test.rb +39 -0
  20. data/lib/makit/cli/generators/templates/ruby/test_helper.rb +29 -0
  21. data/lib/makit/cli/generators/templates/ruby/version.rb +29 -0
  22. data/lib/makit/cli/generators/templates/rust_templates.rb +128 -0
  23. data/lib/makit/cli/main.rb +62 -33
  24. data/lib/makit/cli/project_commands.rb +868 -0
  25. data/lib/makit/cli/repository_commands.rb +661 -0
  26. data/lib/makit/cli/utility_commands.rb +521 -0
  27. data/lib/makit/commands/factory.rb +359 -0
  28. data/lib/makit/commands/middleware/base.rb +73 -0
  29. data/lib/makit/commands/middleware/cache.rb +248 -0
  30. data/lib/makit/commands/middleware/command_logger.rb +320 -0
  31. data/lib/makit/commands/middleware/unified_logger.rb +243 -0
  32. data/lib/makit/commands/middleware/validator.rb +269 -0
  33. data/lib/makit/commands/request.rb +254 -0
  34. data/lib/makit/commands/result.rb +323 -0
  35. data/lib/makit/commands/runner.rb +337 -0
  36. data/lib/makit/commands/strategies/base.rb +160 -0
  37. data/lib/makit/commands/strategies/synchronous.rb +134 -0
  38. data/lib/makit/commands.rb +51 -21
  39. data/lib/makit/configuration/gitlab_helper.rb +60 -0
  40. data/lib/makit/configuration/project.rb +127 -0
  41. data/lib/makit/configuration/rakefile_helper.rb +43 -0
  42. data/lib/makit/configuration/step.rb +34 -0
  43. data/lib/makit/configuration.rb +14 -0
  44. data/lib/makit/content/default_gitignore.rb +7 -5
  45. data/lib/makit/content/default_rakefile.rb +13 -11
  46. data/lib/makit/content/gem_rakefile.rb +16 -14
  47. data/lib/makit/context.rb +1 -0
  48. data/lib/makit/data.rb +49 -50
  49. data/lib/makit/directories.rb +141 -145
  50. data/lib/makit/directory.rb +262 -276
  51. data/lib/makit/docs/files.rb +89 -94
  52. data/lib/makit/docs/rake.rb +102 -106
  53. data/lib/makit/dotnet/cli.rb +65 -0
  54. data/lib/makit/dotnet/project.rb +153 -0
  55. data/lib/makit/dotnet/solution.rb +38 -0
  56. data/lib/makit/dotnet/solution_classlib.rb +239 -0
  57. data/lib/makit/dotnet/solution_console.rb +264 -0
  58. data/lib/makit/dotnet/solution_maui.rb +354 -0
  59. data/lib/makit/dotnet/solution_wasm.rb +275 -0
  60. data/lib/makit/dotnet/solution_wpf.rb +304 -0
  61. data/lib/makit/dotnet.rb +102 -219
  62. data/lib/makit/email.rb +90 -61
  63. data/lib/makit/environment.rb +142 -139
  64. data/lib/makit/examples/runner.rb +370 -0
  65. data/lib/makit/exceptions.rb +45 -0
  66. data/lib/makit/fileinfo.rb +24 -26
  67. data/lib/makit/files.rb +43 -47
  68. data/lib/makit/gems.rb +29 -28
  69. data/lib/makit/git/cli.rb +54 -0
  70. data/lib/makit/git/repository.rb +90 -0
  71. data/lib/makit/git.rb +98 -145
  72. data/lib/makit/gitlab_runner.rb +59 -60
  73. data/lib/makit/humanize.rb +137 -129
  74. data/lib/makit/indexer.rb +47 -56
  75. data/lib/makit/logging/configuration.rb +305 -0
  76. data/lib/makit/logging/format_registry.rb +84 -0
  77. data/lib/makit/logging/formatters/base.rb +39 -0
  78. data/lib/makit/logging/formatters/console_formatter.rb +140 -0
  79. data/lib/makit/logging/formatters/json_formatter.rb +65 -0
  80. data/lib/makit/logging/formatters/plain_text_formatter.rb +71 -0
  81. data/lib/makit/logging/formatters/text_formatter.rb +64 -0
  82. data/lib/makit/logging/log_request.rb +115 -0
  83. data/lib/makit/logging/logger.rb +163 -0
  84. data/lib/makit/logging/sinks/base.rb +91 -0
  85. data/lib/makit/logging/sinks/console.rb +72 -0
  86. data/lib/makit/logging/sinks/file_sink.rb +92 -0
  87. data/lib/makit/logging/sinks/structured.rb +129 -0
  88. data/lib/makit/logging/sinks/unified_file_sink.rb +303 -0
  89. data/lib/makit/logging.rb +530 -106
  90. data/lib/makit/markdown.rb +75 -75
  91. data/lib/makit/mp/basic_object_mp.rb +17 -16
  92. data/lib/makit/mp/command_mp.rb +13 -13
  93. data/lib/makit/mp/command_request.mp.rb +17 -16
  94. data/lib/makit/mp/project_mp.rb +199 -210
  95. data/lib/makit/mp/string_mp.rb +193 -176
  96. data/lib/makit/nuget.rb +74 -72
  97. data/lib/makit/port.rb +32 -34
  98. data/lib/makit/process.rb +163 -65
  99. data/lib/makit/protoc.rb +107 -104
  100. data/lib/makit/rake/cli.rb +196 -0
  101. data/lib/makit/rake.rb +25 -25
  102. data/lib/makit/ruby/cli.rb +185 -0
  103. data/lib/makit/ruby.rb +25 -0
  104. data/lib/makit/secrets.rb +51 -51
  105. data/lib/makit/serializer.rb +130 -115
  106. data/lib/makit/services/builder.rb +186 -0
  107. data/lib/makit/services/error_handler.rb +226 -0
  108. data/lib/makit/services/repository_manager.rb +229 -0
  109. data/lib/makit/services/validator.rb +112 -0
  110. data/lib/makit/setup/classlib.rb +53 -0
  111. data/lib/makit/setup/gem.rb +263 -0
  112. data/lib/makit/setup/runner.rb +45 -0
  113. data/lib/makit/setup.rb +5 -0
  114. data/lib/makit/show.rb +110 -110
  115. data/lib/makit/storage.rb +126 -131
  116. data/lib/makit/symbols.rb +170 -149
  117. data/lib/makit/task_info.rb +128 -86
  118. data/lib/makit/tasks/at_exit.rb +13 -0
  119. data/lib/makit/tasks/build.rb +19 -0
  120. data/lib/makit/tasks/clean.rb +11 -0
  121. data/lib/makit/tasks/hook_manager.rb +393 -0
  122. data/lib/makit/tasks/init.rb +47 -0
  123. data/lib/makit/tasks/integrate.rb +17 -0
  124. data/lib/makit/tasks/pull_incoming.rb +11 -0
  125. data/lib/makit/tasks/setup.rb +6 -0
  126. data/lib/makit/tasks/sync.rb +12 -0
  127. data/lib/makit/tasks/tag.rb +15 -0
  128. data/lib/makit/tasks/task_monkey_patch.rb +79 -0
  129. data/lib/makit/tasks.rb +15 -150
  130. data/lib/makit/test_cache.rb +239 -0
  131. data/lib/makit/tree.rb +37 -37
  132. data/lib/makit/v1/makit.v1_pb.rb +3 -4
  133. data/lib/makit/v1/makit.v1_services_pb.rb +27 -25
  134. data/lib/makit/version.rb +5 -61
  135. data/lib/makit/version_util.rb +21 -0
  136. data/lib/makit/wix.rb +95 -95
  137. data/lib/makit/yaml.rb +29 -17
  138. data/lib/makit/zip.rb +17 -17
  139. data/lib/makit copy.rb +44 -0
  140. data/lib/makit.rb +40 -267
  141. metadata +117 -110
  142. data/lib/makit/cli/clean.rb +0 -14
  143. data/lib/makit/cli/clone.rb +0 -59
  144. data/lib/makit/cli/init.rb +0 -38
  145. data/lib/makit/cli/make.rb +0 -54
  146. data/lib/makit/cli/new.rb +0 -37
  147. data/lib/makit/cli/nuget_cache.rb +0 -38
  148. data/lib/makit/cli/pull.rb +0 -31
  149. data/lib/makit/cli/setup.rb +0 -71
  150. data/lib/makit/cli/work.rb +0 -21
  151. data/lib/makit/command_runner.rb +0 -404
  152. data/lib/makit/content/default_gitignore.txt +0 -222
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Makit
4
+ module Logging
5
+ # Registry for managing available log formatters
6
+ #
7
+ # Provides a centralized way to register, retrieve, and manage formatters
8
+ # by name. This allows for easy extension and configuration of formatters.
9
+ #
10
+ # @example Registering a custom formatter
11
+ # FormatRegistry.register(:audit, AuditFormatter)
12
+ # formatter = FormatRegistry.get(:audit).new
13
+ #
14
+ # @example Using built-in formatters
15
+ # formatter = FormatRegistry.get(:json).new
16
+ # formatter = FormatRegistry.get(:text).new(timestamp_format: "%H:%M:%S")
17
+ class FormatRegistry
18
+ @formatters = {}
19
+
20
+ class << self
21
+ # @return [Hash] registered formatters
22
+ attr_reader :formatters
23
+
24
+ # Register a formatter class with a name
25
+ #
26
+ # @param name [Symbol, String] the name to register the formatter under
27
+ # @param formatter_class [Class] the formatter class to register
28
+ # @return [void]
29
+ def register(name, formatter_class)
30
+ @formatters[name.to_sym] = formatter_class
31
+ end
32
+
33
+ # Get a formatter class by name
34
+ #
35
+ # @param name [Symbol, String] the name of the formatter
36
+ # @return [Class] the formatter class
37
+ # @raise [ArgumentError] if formatter is not found
38
+ def get(name)
39
+ @formatters[name.to_sym] || raise(ArgumentError, "Unknown formatter: #{name}")
40
+ end
41
+
42
+ # Get all available formatter names
43
+ #
44
+ # @return [Array<Symbol>] list of registered formatter names
45
+ def available_formats
46
+ @formatters.keys
47
+ end
48
+
49
+ # Check if a formatter is registered
50
+ #
51
+ # @param name [Symbol, String] the name to check
52
+ # @return [Boolean] true if formatter is registered
53
+ def registered?(name)
54
+ @formatters.key?(name.to_sym)
55
+ end
56
+
57
+ # Clear all registered formatters
58
+ #
59
+ # @return [void]
60
+ def clear
61
+ @formatters.clear
62
+ end
63
+
64
+ # Register built-in formatters
65
+ #
66
+ # @return [void]
67
+ def register_built_ins
68
+ require_relative "formatters/json_formatter"
69
+ require_relative "formatters/text_formatter"
70
+ require_relative "formatters/plain_text_formatter"
71
+ require_relative "formatters/console_formatter"
72
+
73
+ register(:json, Formatters::JsonFormatter)
74
+ register(:text, Formatters::TextFormatter)
75
+ register(:plain, Formatters::PlainTextFormatter)
76
+ register(:console, Formatters::ConsoleFormatter)
77
+ end
78
+ end
79
+
80
+ # Initialize registry with built-in formatters
81
+ register_built_ins
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Makit
4
+ module Logging
5
+ module Formatters
6
+ # Base class for all logging formatters
7
+ #
8
+ # Formatters handle the conversion of log requests into formatted strings
9
+ # that can be written to various outputs (console, files, etc.).
10
+ # This separates formatting concerns from output routing concerns.
11
+ #
12
+ # @example Creating a custom formatter
13
+ # class CustomFormatter < Base
14
+ # def format(log_request)
15
+ # "#{log_request.level.upcase}: #{log_request.message}"
16
+ # end
17
+ # end
18
+ class Base
19
+ # Format a log request into a string
20
+ #
21
+ # @param log_request [LogRequest] the log request to format
22
+ # @return [String] the formatted log entry
23
+ def format(log_request)
24
+ raise NotImplementedError, "Subclasses must implement #format"
25
+ end
26
+
27
+ # Get formatter configuration
28
+ #
29
+ # @return [Hash] formatter configuration
30
+ def config
31
+ {
32
+ name: self.class.name.split("::").last,
33
+ type: self.class.name,
34
+ }
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,140 @@
1
+ # frozen_string_literal: true
2
+
3
+ begin
4
+ require "colorize"
5
+ rescue LoadError
6
+ # colorize gem not available, define a no-op colorize method
7
+ class String
8
+ def colorize(*args)
9
+ self
10
+ end
11
+ end
12
+ end
13
+ require_relative "base"
14
+
15
+ module Makit
16
+ module Logging
17
+ module Formatters
18
+ # Console formatter for colored log output
19
+ #
20
+ # Formats log requests for console display with colors, symbols, and optional
21
+ # timestamps/levels. This is specifically designed for human-readable console output.
22
+ #
23
+ # @example
24
+ # formatter = ConsoleFormatter.new
25
+ # formatted = formatter.format(log_request)
26
+ # # => "→ Processing started" (with appropriate color)
27
+ class ConsoleFormatter < Base
28
+ # @return [Boolean] whether to show timestamps
29
+ attr_reader :show_timestamp
30
+ # @return [Boolean] whether to show log levels
31
+ attr_reader :show_level
32
+
33
+ # Initialize console formatter
34
+ #
35
+ # @param show_timestamp [Boolean] whether to show timestamps (default: false)
36
+ # @param show_level [Boolean] whether to show log levels (default: false)
37
+ def initialize(show_timestamp: false, show_level: false)
38
+ @show_timestamp = show_timestamp
39
+ @show_level = show_level
40
+ end
41
+
42
+ # Format log request for console display
43
+ #
44
+ # @param log_request [LogRequest] the log request to format
45
+ # @return [String] console formatted log entry with colors
46
+ def format(log_request)
47
+ parts = []
48
+
49
+ # Add timestamp if enabled
50
+ if @show_timestamp
51
+ timestamp = log_request.timestamp.strftime("%H:%M:%S")
52
+ parts << "[#{timestamp}]".colorize(:light_black)
53
+ end
54
+
55
+ # Add log level if enabled
56
+ if @show_level
57
+ level_str = log_request.level.to_s.upcase
58
+ level_color = get_level_color(log_request.level)
59
+ parts << level_str.colorize(level_color)
60
+ end
61
+
62
+ # Add symbol and message
63
+ symbol = get_level_symbol(log_request.level)
64
+ symbol_color = get_level_color(log_request.level)
65
+ message = log_request.message
66
+
67
+ # Special handling for task messages - no symbol, no context, just the message
68
+ if log_request.context[:task_message]
69
+ parts << message
70
+ else
71
+ # Add context if present (only for non-task messages)
72
+ if !log_request.context.empty?
73
+ context_str = log_request.context.map { |k, v| "#{k}=#{v}" }.join(" ")
74
+ message += " #{context_str}".colorize(:light_black)
75
+ end
76
+ parts << "#{symbol} #{message}".colorize(symbol_color)
77
+ end
78
+
79
+ parts.join(" ")
80
+ end
81
+
82
+ # Get formatter configuration
83
+ #
84
+ # @return [Hash] formatter configuration
85
+ def config
86
+ super.merge(
87
+ show_timestamp: @show_timestamp,
88
+ show_level: @show_level,
89
+ )
90
+ end
91
+
92
+ private
93
+
94
+ # Get the color for a log level
95
+ #
96
+ # @param level [Symbol] the log level
97
+ # @return [Symbol] the color for the level
98
+ def get_level_color(level)
99
+ case level
100
+ when :debug
101
+ :grey
102
+ when :info
103
+ :grey
104
+ when :warn
105
+ :light_yellow
106
+ when :error, :fatal
107
+ :light_red
108
+ when :success
109
+ :green
110
+ else
111
+ :white
112
+ end
113
+ end
114
+
115
+ # Get the symbol for a log level
116
+ #
117
+ # @param level [Symbol] the log level
118
+ # @return [String] the symbol for the level
119
+ def get_level_symbol(level)
120
+ case level
121
+ when :debug
122
+ "•"
123
+ when :info
124
+ " " #"→"
125
+ when :warn
126
+ "!" #"⚠"
127
+ when :error
128
+ "✗"
129
+ when :fatal
130
+ "💀"
131
+ when :success
132
+ "✓"
133
+ else
134
+ "•"
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require_relative "base"
5
+
6
+ module Makit
7
+ module Logging
8
+ module Formatters
9
+ # JSON formatter for structured logging
10
+ #
11
+ # Formats log requests as JSON objects with timestamp, level, message, and context.
12
+ # This is ideal for log aggregation systems and structured data analysis.
13
+ #
14
+ # @example
15
+ # formatter = JsonFormatter.new
16
+ # formatted = formatter.format(log_request)
17
+ # # => '{"timestamp":"2024-01-15T10:30:45Z","level":"INFO","message":"User logged in","context":{"user_id":123}}'
18
+ class JsonFormatter < Base
19
+ # @return [Hash] additional options for JSON formatting
20
+ attr_reader :options
21
+
22
+ # Initialize JSON formatter
23
+ #
24
+ # @param options [Hash] JSON generation options
25
+ def initialize(options: {})
26
+ @options = {
27
+ indent: nil,
28
+ space: nil,
29
+ space_before: nil,
30
+ object_nl: nil,
31
+ array_nl: nil,
32
+ allow_nan: false,
33
+ max_nesting: 100,
34
+ }.merge(options)
35
+ end
36
+
37
+ # Format log request as JSON
38
+ #
39
+ # @param log_request [LogRequest] the log request to format
40
+ # @return [String] JSON formatted log entry
41
+ def format(log_request)
42
+ log_data = {
43
+ timestamp: log_request.timestamp.iso8601,
44
+ level: log_request.level.to_s.upcase,
45
+ message: log_request.message,
46
+ }
47
+
48
+ # Add context if present
49
+ log_data[:context] = log_request.context unless log_request.context.empty?
50
+
51
+ JSON.generate(log_data, @options)
52
+ end
53
+
54
+ # Get formatter configuration
55
+ #
56
+ # @return [Hash] formatter configuration including JSON options
57
+ def config
58
+ super.merge(
59
+ json_options: @options,
60
+ )
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module Makit
6
+ module Logging
7
+ module Formatters
8
+ # Plain text formatter with just the message
9
+ #
10
+ # Formats log requests as plain text containing only the message content.
11
+ # This is useful for simple log files where only the message matters.
12
+ #
13
+ # @example
14
+ # formatter = PlainTextFormatter.new
15
+ # formatted = formatter.format(log_request)
16
+ # # => 'User logged in'
17
+ class PlainTextFormatter < Base
18
+ # @return [Boolean] whether to include context in output
19
+ attr_reader :include_context
20
+
21
+ # Initialize plain text formatter
22
+ #
23
+ # @param include_context [Boolean] whether to include context in output
24
+ def initialize(include_context: false)
25
+ @include_context = include_context
26
+ end
27
+
28
+ # Format log request as plain text
29
+ #
30
+ # @param log_request [LogRequest] the log request to format
31
+ # @return [String] plain text formatted log entry
32
+ def format(log_request)
33
+ message = log_request.message
34
+
35
+ # Add context if enabled and present
36
+ if @include_context && !log_request.context.empty?
37
+ # Create a more readable context representation
38
+ context_parts = log_request.context.map do |k, v|
39
+ # Format values nicely based on their type
40
+ formatted_value = case v
41
+ when String
42
+ v.include?(" ") ? "\"#{v}\"" : v
43
+ when Hash, Array
44
+ v.inspect
45
+ when Time
46
+ v.strftime("%Y-%m-%d %H:%M:%S")
47
+ else
48
+ v.to_s
49
+ end
50
+ "#{k}: #{formatted_value}"
51
+ end
52
+
53
+ context_str = context_parts.join(", ")
54
+ message += " (#{context_str})"
55
+ end
56
+
57
+ message
58
+ end
59
+
60
+ # Get formatter configuration
61
+ #
62
+ # @return [Hash] formatter configuration
63
+ def config
64
+ super.merge(
65
+ include_context: @include_context,
66
+ )
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module Makit
6
+ module Logging
7
+ module Formatters
8
+ # Text formatter with timestamp and log level
9
+ #
10
+ # Formats log requests as human-readable text with timestamp, log level,
11
+ # and message. This is the most common format for traditional log files.
12
+ #
13
+ # @example
14
+ # formatter = TextFormatter.new
15
+ # formatted = formatter.format(log_request)
16
+ # # => '[2024-01-15 10:30:45] INFO User logged in'
17
+ class TextFormatter < Base
18
+ # @return [String] timestamp format string
19
+ attr_reader :timestamp_format
20
+ # @return [Boolean] whether to include context in output
21
+ attr_reader :include_context
22
+
23
+ # Initialize text formatter
24
+ #
25
+ # @param timestamp_format [String] strftime format for timestamps
26
+ # @param include_context [Boolean] whether to include context in output
27
+ def initialize(timestamp_format: "%Y-%m-%d %H:%M:%S", include_context: false)
28
+ @timestamp_format = timestamp_format
29
+ @include_context = include_context
30
+ end
31
+
32
+ # Format log request as text
33
+ #
34
+ # @param log_request [LogRequest] the log request to format
35
+ # @return [String] text formatted log entry
36
+ def format(log_request)
37
+ timestamp = log_request.timestamp.strftime(@timestamp_format)
38
+ level = log_request.level.to_s.upcase
39
+ message = log_request.message
40
+
41
+ formatted = "[#{timestamp}] #{level} #{message}"
42
+
43
+ # Add context if enabled and present
44
+ if @include_context && !log_request.context.empty?
45
+ context_str = log_request.context.map { |k, v| "#{k}=#{v}" }.join(" ")
46
+ formatted += " #{context_str}"
47
+ end
48
+
49
+ formatted
50
+ end
51
+
52
+ # Get formatter configuration
53
+ #
54
+ # @return [Hash] formatter configuration
55
+ def config
56
+ super.merge(
57
+ timestamp_format: @timestamp_format,
58
+ include_context: @include_context,
59
+ )
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,115 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Makit
4
+ module Logging
5
+ # Represents a log request that flows through the logging middleware chain
6
+ #
7
+ # This class encapsulates all the information needed for a log entry,
8
+ # including the log level, message, context, and metadata. It provides
9
+ # a clean interface for middleware to process and modify log information.
10
+ #
11
+ # @example Basic usage
12
+ # request = LogRequest.new(:info, "Processing started")
13
+ # request.add_metadata(process_id: 12345)
14
+ # puts request.to_h
15
+ #
16
+ # @example With context
17
+ # request = LogRequest.new(:error, "Build failed", {
18
+ # repository: "user/repo",
19
+ # commit: "abc123"
20
+ # })
21
+ class LogRequest
22
+ # @return [Symbol] the log level (:debug, :info, :warn, :error, :fatal, :success)
23
+ attr_reader :level
24
+
25
+ # @return [String] the log message
26
+ attr_reader :message
27
+
28
+ # @return [Hash] additional context information
29
+ attr_reader :context
30
+
31
+ # @return [Hash] metadata about the log entry
32
+ attr_reader :metadata
33
+
34
+ # @return [Time] when the log request was created
35
+ attr_reader :timestamp
36
+
37
+ # Initialize a new log request
38
+ #
39
+ # @param level [Symbol] the log level
40
+ # @param message [String] the log message
41
+ # @param context [Hash] additional context information
42
+ def initialize(level, message, context = {})
43
+ @level = level
44
+ @message = message
45
+ @context = context.dup
46
+ @metadata = {}
47
+ @timestamp = Time.now
48
+ end
49
+
50
+ # Add metadata to the log request
51
+ #
52
+ # @param data [Hash] metadata to add
53
+ # @return [void]
54
+ def add_metadata(data)
55
+ @metadata.merge!(data)
56
+ end
57
+
58
+ # Convert the log request to a hash representation
59
+ #
60
+ # @return [Hash] hash representation of the log request
61
+ def to_h
62
+ {
63
+ level: @level,
64
+ message: @message,
65
+ context: @context,
66
+ metadata: @metadata,
67
+ timestamp: @timestamp.iso8601,
68
+ }
69
+ end
70
+
71
+ # Convert the log request to a JSON string
72
+ #
73
+ # @return [String] JSON representation of the log request
74
+ def to_json
75
+ require "json"
76
+ JSON.generate(to_h)
77
+ end
78
+
79
+ # Get a formatted string representation
80
+ #
81
+ # @return [String] formatted string representation
82
+ def to_s
83
+ "[#{@timestamp.strftime("%Y-%m-%d %H:%M:%S")}] #{@level.to_s.upcase}: #{@message}"
84
+ end
85
+
86
+ # Check if this is an error level log
87
+ #
88
+ # @return [Boolean] true if error level
89
+ def error?
90
+ @level == :error || @level == :fatal
91
+ end
92
+
93
+ # Check if this is a success level log
94
+ #
95
+ # @return [Boolean] true if success level
96
+ def success?
97
+ @level == :success
98
+ end
99
+
100
+ # Check if this is an info level log
101
+ #
102
+ # @return [Boolean] true if info level
103
+ def info?
104
+ @level == :info
105
+ end
106
+
107
+ # Check if this is a warning level log
108
+ #
109
+ # @return [Boolean] true if warn level
110
+ def warn?
111
+ @level == :warn
112
+ end
113
+ end
114
+ end
115
+ end