makit 0.0.111 → 0.0.126

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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/lib/makit/cli/repository_commands.rb +1 -1
  3. data/lib/makit/commands/middleware/cache.rb +3 -3
  4. data/lib/makit/commands/middleware/command_logger.rb +33 -45
  5. data/lib/makit/commands/request.rb +63 -1
  6. data/lib/makit/commands/runner.rb +56 -5
  7. data/lib/makit/commands/strategies/base.rb +13 -2
  8. data/lib/makit/commands/strategies/synchronous.rb +11 -6
  9. data/lib/makit/commands.rb +8 -0
  10. data/lib/makit/configuration/gitlab_helper.rb +0 -2
  11. data/lib/makit/configuration/project.rb +48 -8
  12. data/lib/makit/configuration/step.rb +3 -3
  13. data/lib/makit/content/default_gitignore.txt +226 -0
  14. data/lib/makit/directories.rb +3 -4
  15. data/lib/makit/docs/files.rb +1 -1
  16. data/lib/makit/docs/rake.rb +1 -1
  17. data/lib/makit/dotnet/cli.rb +69 -65
  18. data/lib/makit/dotnet/project.rb +71 -7
  19. data/lib/makit/examples/runner.rb +2 -2
  20. data/lib/makit/logging/configuration.rb +9 -6
  21. data/lib/makit/logging/format_registry.rb +84 -84
  22. data/lib/makit/logging/formatters/console_formatter.rb +22 -9
  23. data/lib/makit/logging/log_request.rb +6 -2
  24. data/lib/makit/logging/logger.rb +45 -5
  25. data/lib/makit/logging/sinks/base.rb +91 -91
  26. data/lib/makit/logging/sinks/structured.rb +123 -129
  27. data/lib/makit/logging/sinks/unified_file_sink.rb +39 -46
  28. data/lib/makit/logging.rb +45 -1
  29. data/lib/makit/mp/project_mp.rb +6 -6
  30. data/lib/makit/mp/string_mp.rb +108 -265
  31. data/lib/makit/serializer.rb +14 -1
  32. data/lib/makit/services/builder.rb +5 -5
  33. data/lib/makit/services/repository_manager.rb +8 -6
  34. data/lib/makit/setup/classlib.rb +44 -7
  35. data/lib/makit/setup/gem.rb +268 -250
  36. data/lib/makit/setup/razorclasslib.rb +91 -0
  37. data/lib/makit/setup/runner.rb +36 -22
  38. data/lib/makit/setup.rb +5 -0
  39. data/lib/makit/symbols.rb +10 -1
  40. data/lib/makit/tasks/at_exit.rb +3 -1
  41. data/lib/makit/tasks/build.rb +16 -12
  42. data/lib/makit/tasks/clean.rb +2 -0
  43. data/lib/makit/tasks/configure.rb +10 -0
  44. data/lib/makit/tasks/format.rb +10 -0
  45. data/lib/makit/tasks/hook_manager.rb +160 -8
  46. data/lib/makit/tasks/init.rb +2 -0
  47. data/lib/makit/tasks/integrate.rb +17 -3
  48. data/lib/makit/tasks/pull_incoming.rb +6 -5
  49. data/lib/makit/tasks/setup.rb +10 -3
  50. data/lib/makit/tasks/sync.rb +13 -7
  51. data/lib/makit/tasks/tag.rb +16 -0
  52. data/lib/makit/tasks/task_monkey_patch.rb +58 -56
  53. data/lib/makit/tasks/test.rb +22 -0
  54. data/lib/makit/tasks/update.rb +18 -0
  55. data/lib/makit/tasks.rb +20 -5
  56. data/lib/makit/v1/makit.v1_pb.rb +1 -0
  57. data/lib/makit/version.rb +1 -1
  58. data/lib/makit/version_util.rb +21 -0
  59. data/lib/makit copy.rb +44 -0
  60. data/lib/makit.rb +31 -0
  61. metadata +118 -13
  62. data/lib/makit/command_runner.rb +0 -463
  63. data/lib/makit/commands/compatibility.rb +0 -365
  64. data/lib/makit/commands/middleware/unified_logger.rb +0 -243
  65. data/lib/makit/task_hooks.rb +0 -125
@@ -1,84 +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
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
@@ -1,6 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "colorize"
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
4
13
  require_relative "base"
5
14
 
6
15
  module Makit
@@ -55,14 +64,18 @@ module Makit
55
64
  symbol_color = get_level_color(log_request.level)
56
65
  message = log_request.message
57
66
 
58
- # Add context if present
59
- if !log_request.context.empty?
60
- context_str = log_request.context.map { |k, v| "#{k}=#{v}" }.join(" ")
61
- message += " #{context_str}".colorize(:light_black)
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
+ unless 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)
62
77
  end
63
78
 
64
- parts << "#{symbol} #{message}".colorize(symbol_color)
65
-
66
79
  parts.join(" ")
67
80
  end
68
81
 
@@ -108,9 +121,9 @@ module Makit
108
121
  when :debug
109
122
  "•"
110
123
  when :info
111
- " " #"→"
124
+ " " # "→"
112
125
  when :warn
113
- "!" #"⚠"
126
+ "!" # "⚠"
114
127
  when :error
115
128
  "✗"
116
129
  when :fatal
@@ -33,18 +33,22 @@ module Makit
33
33
 
34
34
  # @return [Time] when the log request was created
35
35
  attr_reader :timestamp
36
+ # @return [Symbol] the verbosity level (:quiet, :normal, :verbose, :debug)
37
+ attr_reader :verbosity
36
38
 
37
39
  # Initialize a new log request
38
40
  #
39
41
  # @param level [Symbol] the log level
40
42
  # @param message [String] the log message
41
43
  # @param context [Hash] additional context information
42
- def initialize(level, message, context = {})
44
+ # @param verbosity [Symbol] the verbosity level (:quiet, :normal, :verbose, :debug)
45
+ def initialize(level, message, context = {}, verbosity: :normal)
43
46
  @level = level
44
47
  @message = message
45
48
  @context = context.dup
46
49
  @metadata = {}
47
50
  @timestamp = Time.now
51
+ @verbosity = verbosity
48
52
  end
49
53
 
50
54
  # Add metadata to the log request
@@ -71,7 +75,7 @@ module Makit
71
75
  # Convert the log request to a JSON string
72
76
  #
73
77
  # @return [String] JSON representation of the log request
74
- def to_json
78
+ def to_json(*_args)
75
79
  require "json"
76
80
  JSON.generate(to_h)
77
81
  end
@@ -35,14 +35,18 @@ module Makit
35
35
  attr_reader :sinks
36
36
  # @return [Symbol] minimum log level for filtering
37
37
  attr_reader :level
38
+ # @return [Symbol] current verbosity level
39
+ attr_reader :verbosity
38
40
 
39
41
  # Initialize the logger with sinks and log level
40
42
  #
41
43
  # @param sinks [Array<Sinks::Base>] list of sinks to use
42
44
  # @param level [Symbol] minimum log level (:debug, :info, :warn, :error, :fatal, :success)
43
- def initialize(sinks: [], level: :info)
45
+ # @param verbosity [Symbol] verbosity level (:quiet, :normal, :verbose, :debug)
46
+ def initialize(sinks: [], level: :info, verbosity: :normal)
44
47
  @sinks = sinks
45
48
  @level = level
49
+ @verbosity = verbosity
46
50
  @logged_tasks = Set.new
47
51
  end
48
52
 
@@ -51,11 +55,13 @@ module Makit
51
55
  # @param level [Symbol] the log level (:debug, :info, :warn, :error, :fatal, :success)
52
56
  # @param message [String] the log message
53
57
  # @param context [Hash] additional context information
58
+ # @param verbosity [Symbol] verbosity level (:quiet, :normal, :verbose, :debug)
54
59
  # @return [void]
55
- def log(level, message, context = {})
60
+ def log(level, message, context = {}, verbosity: :normal)
56
61
  return unless should_log?(level)
62
+ return unless should_show_verbosity?(verbosity)
57
63
 
58
- log_request = LogRequest.new(level, message, context)
64
+ log_request = LogRequest.new(level, message, context, verbosity: verbosity)
59
65
  execute_sinks(log_request)
60
66
  end
61
67
 
@@ -113,10 +119,33 @@ module Makit
113
119
  log(:fatal, message, context)
114
120
  end
115
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
+
116
140
  def task_start(message, context = {})
117
141
  return if @logged_tasks.include?(message)
142
+
118
143
  @logged_tasks.add(message)
119
- log(:info, message, context)
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)
120
149
  end
121
150
 
122
151
  # Get logger configuration
@@ -137,10 +166,21 @@ module Makit
137
166
  # @param level [Symbol] the log level to check
138
167
  # @return [Boolean] true if the level should be logged
139
168
  def should_log?(level)
140
- levels = [:debug, :info, :warn, :error, :fatal, :success]
169
+ levels = %i[debug info warn error fatal success]
141
170
  levels.index(level) >= levels.index(@level)
142
171
  end
143
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
+
144
184
  # Execute the sink chain for a log request
145
185
  #
146
186
  # @param log_request [LogRequest] the log request to process
@@ -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