makit 0.0.98 → 0.0.111

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 (148) 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 +7 -11
  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 +48 -19
  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/command_runner.rb +187 -128
  28. data/lib/makit/commands/compatibility.rb +365 -0
  29. data/lib/makit/commands/factory.rb +359 -0
  30. data/lib/makit/commands/middleware/base.rb +73 -0
  31. data/lib/makit/commands/middleware/cache.rb +248 -0
  32. data/lib/makit/commands/middleware/command_logger.rb +323 -0
  33. data/lib/makit/commands/middleware/unified_logger.rb +243 -0
  34. data/lib/makit/commands/middleware/validator.rb +269 -0
  35. data/lib/makit/commands/request.rb +254 -0
  36. data/lib/makit/commands/result.rb +323 -0
  37. data/lib/makit/commands/runner.rb +317 -0
  38. data/lib/makit/commands/strategies/base.rb +160 -0
  39. data/lib/makit/commands/strategies/synchronous.rb +134 -0
  40. data/lib/makit/commands.rb +24 -3
  41. data/lib/makit/configuration/gitlab_helper.rb +60 -0
  42. data/lib/makit/configuration/project.rb +127 -0
  43. data/lib/makit/configuration/rakefile_helper.rb +43 -0
  44. data/lib/makit/configuration/step.rb +34 -0
  45. data/lib/makit/configuration.rb +14 -0
  46. data/lib/makit/content/default_gitignore.rb +4 -2
  47. data/lib/makit/content/default_rakefile.rb +4 -2
  48. data/lib/makit/content/gem_rakefile.rb +4 -2
  49. data/lib/makit/context.rb +1 -0
  50. data/lib/makit/data.rb +9 -10
  51. data/lib/makit/directories.rb +48 -52
  52. data/lib/makit/directory.rb +38 -52
  53. data/lib/makit/docs/files.rb +5 -10
  54. data/lib/makit/docs/rake.rb +16 -20
  55. data/lib/makit/dotnet/cli.rb +65 -0
  56. data/lib/makit/dotnet/project.rb +153 -0
  57. data/lib/makit/dotnet/solution.rb +38 -0
  58. data/lib/makit/dotnet/solution_classlib.rb +239 -0
  59. data/lib/makit/dotnet/solution_console.rb +264 -0
  60. data/lib/makit/dotnet/solution_maui.rb +354 -0
  61. data/lib/makit/dotnet/solution_wasm.rb +275 -0
  62. data/lib/makit/dotnet/solution_wpf.rb +304 -0
  63. data/lib/makit/dotnet.rb +54 -171
  64. data/lib/makit/email.rb +46 -17
  65. data/lib/makit/environment.rb +22 -19
  66. data/lib/makit/examples/runner.rb +370 -0
  67. data/lib/makit/exceptions.rb +45 -0
  68. data/lib/makit/fileinfo.rb +3 -5
  69. data/lib/makit/files.rb +12 -16
  70. data/lib/makit/gems.rb +40 -39
  71. data/lib/makit/git/cli.rb +54 -0
  72. data/lib/makit/git/repository.rb +90 -0
  73. data/lib/makit/git.rb +44 -91
  74. data/lib/makit/gitlab_runner.rb +0 -1
  75. data/lib/makit/humanize.rb +31 -23
  76. data/lib/makit/indexer.rb +15 -24
  77. data/lib/makit/logging/configuration.rb +305 -0
  78. data/lib/makit/logging/format_registry.rb +84 -0
  79. data/lib/makit/logging/formatters/base.rb +39 -0
  80. data/lib/makit/logging/formatters/console_formatter.rb +127 -0
  81. data/lib/makit/logging/formatters/json_formatter.rb +65 -0
  82. data/lib/makit/logging/formatters/plain_text_formatter.rb +71 -0
  83. data/lib/makit/logging/formatters/text_formatter.rb +64 -0
  84. data/lib/makit/logging/log_request.rb +115 -0
  85. data/lib/makit/logging/logger.rb +159 -0
  86. data/lib/makit/logging/sinks/base.rb +91 -0
  87. data/lib/makit/logging/sinks/console.rb +72 -0
  88. data/lib/makit/logging/sinks/file_sink.rb +92 -0
  89. data/lib/makit/logging/sinks/structured.rb +129 -0
  90. data/lib/makit/logging/sinks/unified_file_sink.rb +303 -0
  91. data/lib/makit/logging.rb +452 -37
  92. data/lib/makit/markdown.rb +18 -18
  93. data/lib/makit/mp/basic_object_mp.rb +5 -4
  94. data/lib/makit/mp/command_mp.rb +5 -5
  95. data/lib/makit/mp/command_request.mp.rb +3 -2
  96. data/lib/makit/mp/project_mp.rb +85 -96
  97. data/lib/makit/mp/string_mp.rb +245 -73
  98. data/lib/makit/nuget.rb +27 -25
  99. data/lib/makit/port.rb +25 -27
  100. data/lib/makit/process.rb +127 -29
  101. data/lib/makit/protoc.rb +27 -24
  102. data/lib/makit/rake/cli.rb +196 -0
  103. data/lib/makit/rake.rb +6 -6
  104. data/lib/makit/ruby/cli.rb +185 -0
  105. data/lib/makit/ruby.rb +25 -0
  106. data/lib/makit/secrets.rb +18 -18
  107. data/lib/makit/serializer.rb +29 -27
  108. data/lib/makit/services/builder.rb +186 -0
  109. data/lib/makit/services/error_handler.rb +226 -0
  110. data/lib/makit/services/repository_manager.rb +229 -0
  111. data/lib/makit/services/validator.rb +112 -0
  112. data/lib/makit/setup/classlib.rb +53 -0
  113. data/lib/makit/setup/gem.rb +250 -0
  114. data/lib/makit/setup/runner.rb +40 -0
  115. data/lib/makit/show.rb +16 -16
  116. data/lib/makit/storage.rb +32 -37
  117. data/lib/makit/symbols.rb +12 -0
  118. data/lib/makit/task_hooks.rb +125 -0
  119. data/lib/makit/task_info.rb +63 -21
  120. data/lib/makit/tasks/at_exit.rb +13 -0
  121. data/lib/makit/tasks/build.rb +18 -0
  122. data/lib/makit/tasks/clean.rb +11 -0
  123. data/lib/makit/tasks/hook_manager.rb +239 -0
  124. data/lib/makit/tasks/init.rb +47 -0
  125. data/lib/makit/tasks/integrate.rb +15 -0
  126. data/lib/makit/tasks/pull_incoming.rb +12 -0
  127. data/lib/makit/tasks/setup.rb +6 -0
  128. data/lib/makit/tasks/sync.rb +11 -0
  129. data/lib/makit/tasks/task_monkey_patch.rb +79 -0
  130. data/lib/makit/tasks.rb +5 -150
  131. data/lib/makit/test_cache.rb +239 -0
  132. data/lib/makit/v1/makit.v1_pb.rb +34 -35
  133. data/lib/makit/v1/makit.v1_services_pb.rb +2 -0
  134. data/lib/makit/version.rb +1 -60
  135. data/lib/makit/wix.rb +23 -23
  136. data/lib/makit/yaml.rb +18 -6
  137. data/lib/makit.rb +2 -261
  138. metadata +109 -145
  139. data/lib/makit/cli/clean.rb +0 -14
  140. data/lib/makit/cli/clone.rb +0 -59
  141. data/lib/makit/cli/init.rb +0 -38
  142. data/lib/makit/cli/make.rb +0 -54
  143. data/lib/makit/cli/new.rb +0 -37
  144. data/lib/makit/cli/nuget_cache.rb +0 -38
  145. data/lib/makit/cli/pull.rb +0 -31
  146. data/lib/makit/cli/setup.rb +0 -71
  147. data/lib/makit/cli/work.rb +0 -21
  148. data/lib/makit/content/default_gitignore.txt +0 -222
data/lib/makit/nuget.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "tmpdir"
2
4
  # This module provides classes for the Makit gem.
3
5
  module Makit
@@ -17,56 +19,56 @@ module Makit
17
19
 
18
20
  def self.cache(package, version)
19
21
  # if the package is already cached, there is nothing to do
20
- if (!Dir.exist?(get_cache_dir(package, version)))
21
- Dir.mktmpdir do |dir|
22
- # Use the temp directory here
23
- Dir.chdir(dir) do
24
- system("dotnet new classlib -n ClassLib")
25
- Dir.chdir("ClassLib") do
22
+ return if Dir.exist?(get_cache_dir(package, version))
26
23
 
27
- # display a list of directories in the current directory
28
- puts Dir.entries(Dir.pwd)
29
- # display a list of files in the current directory
30
- puts Dir.entries(Dir.pwd)
31
- puts "dotnet add ClassLib.csproj package #{package} --version #{version}"
32
- system("dotnet add ClassLib.csproj package #{package} --version #{version}")
33
- end
24
+ Dir.mktmpdir do |dir|
25
+ # Use the temp directory here
26
+ Dir.chdir(dir) do
27
+ system("dotnet new classlib -n ClassLib")
28
+ Dir.chdir("ClassLib") do
29
+ # display a list of directories in the current directory
30
+ puts Dir.entries(Dir.pwd)
31
+ # display a list of files in the current directory
32
+ puts Dir.entries(Dir.pwd)
33
+ puts "dotnet add ClassLib.csproj package #{package} --version #{version}"
34
+ system("dotnet add ClassLib.csproj package #{package} --version #{version}")
34
35
  end
35
- # The directory and its contents will be removed automatically after the block
36
36
  end
37
+ # The directory and its contents will be removed automatically after the block
37
38
  end
38
39
  end
39
40
 
40
41
  def self.clear_cache(package, version)
41
- if (Dir.exist?(get_cache_dir(package, version)))
42
- FileUtils.rm_rf(get_cache_dir(package, version))
43
- end
42
+ return unless Dir.exist?(get_cache_dir(package, version))
43
+
44
+ FileUtils.rm_rf(get_cache_dir(package, version))
44
45
  end
45
46
 
46
47
  # get the latest version of the package
47
48
  def self.get_latest_version(package)
48
49
  dir = File.join(Makit::Directories::NUGET_PACKAGE_CACHE, package)
49
- if (Dir.exist?(dir))
50
- versions = Dir.entries(dir).select { |entry| File.directory?(File.join(dir, entry)) && !(entry == "." || entry == "..") }
51
- highest_version = Makit::Version::get_highest_version(versions)
50
+ if Dir.exist?(dir)
51
+ versions = Dir.entries(dir).select do |entry|
52
+ File.directory?(File.join(dir, entry)) && ![".", ".."].include?(entry)
53
+ end
54
+ highest_version = Makit::Version.get_highest_version(versions)
52
55
  return highest_version
53
56
  end
54
57
  nil
55
58
  end
56
59
 
57
60
  # publish a package to a nuget directory feed
58
- def self.add_package(package, path)
61
+ def self.add_package(_package, path)
59
62
  system("dotnet nuget push #{path} --source #{path}")
60
63
  end
61
64
 
62
- def self.publish_to_directory(nuget_package_path,directory,package_name,version)
65
+ def self.publish_to_directory(nuget_package_path, directory, package_name, version)
63
66
  target_package_path = "#{directory}/#{package_name}/#{version}/#{package_name}.#{version}.nupkg".downcase
64
- if (File.exist?(target_package_path))
67
+ if File.exist?(target_package_path)
65
68
  puts " #{target_package_path} already exists".colorize(:grey)
66
- else
69
+ else
67
70
  "dotnet nuget push #{nuget_package_path} --source #{directory}".run
68
71
  end
69
72
  end
70
-
71
73
  end
72
74
  end
data/lib/makit/port.rb CHANGED
@@ -2,33 +2,31 @@
2
2
 
3
3
  # This module provides classes for the Makit gem.
4
4
  module Makit
5
- # This class provide methods for working with ports
6
- #
7
- class Port
8
- def self.is_port_available?(port)
9
- begin
10
- socket = Socket.new(:INET, :STREAM)
11
- socket.bind(Socket.sockaddr_in(port, ''))
12
- socket.close
13
- return true # Port is available for use
14
- rescue Errno::EADDRINUSE, Errno::EACCES
15
- return false # Port is not available for use
16
- end
17
- end
5
+ # This class provide methods for working with ports
6
+ #
7
+ class Port
8
+ def self.is_port_available?(port)
9
+ socket = Socket.new(:INET, :STREAM)
10
+ socket.bind(Socket.sockaddr_in(port, ""))
11
+ socket.close
12
+ true # Port is available for use
13
+ rescue Errno::EADDRINUSE, Errno::EACCES
14
+ false # Port is not available for use
15
+ end
18
16
 
19
- def self.get_available_port(start_port = 1024, end_port = 65535)
20
- (start_port..end_port).each do |port|
21
- return port if is_port_available?(port)
22
- end
23
- nil # No available port found in the range
24
- end
17
+ def self.get_available_port(start_port = 1024, end_port = 65_535)
18
+ (start_port..end_port).each do |port|
19
+ return port if is_port_available?(port)
20
+ end
21
+ nil # No available port found in the range
22
+ end
25
23
 
26
- def self.get_random_port
27
- rand(1024..65535)
28
- end
24
+ def self.get_random_port
25
+ rand(1024..65_535)
26
+ end
29
27
 
30
- def self.get_random_available_port
31
- get_available_port(get_random_port)
32
- end
33
- end # class Port
34
- end # module Makit
28
+ def self.get_random_available_port
29
+ get_available_port(get_random_port)
30
+ end
31
+ end
32
+ end
data/lib/makit/process.rb CHANGED
@@ -1,64 +1,162 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This module provides classes for the Makit gem.
2
4
  module Makit
5
+ # Cross-platform process management utilities
6
+ #
7
+ # This class provides methods for checking, listing, and terminating processes
8
+ # across different operating systems (Windows, Linux, macOS). It abstracts
9
+ # platform-specific commands into a unified interface.
3
10
  class Process
11
+ # Check if a process with the given name is currently running
12
+ #
13
+ # Uses platform-specific commands:
14
+ # - Windows: tasklist command
15
+ # - Unix: ps command with grep filtering
16
+ #
17
+ # @param name [String] Name of the process to check (without .exe extension)
18
+ # @return [Boolean] True if the process is running, false otherwise
4
19
  def self.is_running?(name)
20
+ return false if name.nil? || name.strip.empty?
21
+
5
22
  # provide a cross-platform way to check if a process is running
6
- if Makit::Environment.is_windows?
7
- # on windows, use the tasklist command
8
- results = `tasklist /FI "imagename eq #{name}.exe"`
9
- results.include?(name)
10
- else
11
- # on linux, use the ps command
12
- results = `ps aux | grep #{name} | grep -v grep`
13
- results.include?(name)
14
- end
23
+ results = if Makit::Environment.is_windows?
24
+ # on windows, use the tasklist command
25
+ `tasklist /FI "imagename eq #{name}.exe" 2>nul`
26
+ else
27
+ # on linux/mac, use the ps command
28
+ `ps aux | grep "#{name}" | grep -v grep 2>/dev/null`
29
+ end
30
+ results.include?(name)
15
31
  end
16
32
 
17
- # kill all processes that match a name
33
+ # Terminate all processes that match a given name
34
+ #
35
+ # Uses platform-specific termination commands:
36
+ # - Windows: taskkill command
37
+ # - Unix: kill command with SIGKILL (-9)
18
38
  #
19
- # for a use case, running on a macbook:
20
- # Makit::Process.kill("dotnet")
21
- # an error 'kill: illegal process id: dotnet' is reported
39
+ # @param name [String] Name of the process(es) to terminate
40
+ # @return [Array<String>] Array of killed process IDs (empty if none found/killed)
22
41
  def self.kill(name)
23
- # provide a cross-platform way to kill a process
42
+ return [] if name.nil? || name.strip.empty?
43
+
44
+ killed_pids = []
45
+
24
46
  if Makit::Environment.is_windows?
25
- `taskkill /IM #{name}.exe /F`
47
+ # Windows: Use tasklist to find PIDs first, then kill them
48
+ begin
49
+ # Find processes by name
50
+ tasklist_output = `tasklist /FI "imagename eq #{name}.exe" /FO CSV 2>nul`
51
+
52
+ # Parse CSV output to extract PIDs
53
+ lines = tasklist_output.split("\n")
54
+ if lines.length > 1 # Skip header line
55
+ lines[1..].each do |line|
56
+ parts = line.split(",")
57
+ next unless parts.length >= 2
58
+
59
+ pid = parts[1]&.gsub('"', "")&.strip
60
+ next unless pid && !pid.empty? && pid.match?(/^\d+$/)
61
+
62
+ begin
63
+ `taskkill /PID #{pid} /F 2>nul`
64
+ killed_pids << pid
65
+ rescue StandardError => e
66
+ # Log error but continue with other processes
67
+ puts "Failed to kill process #{pid}: #{e.message}"
68
+ end
69
+ end
70
+ end
71
+ rescue StandardError => e
72
+ # If tasklist fails, try direct taskkill by name
73
+ begin
74
+ `taskkill /IM "#{name}.exe" /F 2>nul`
75
+ # Since we can't get PIDs from direct kill, return empty array
76
+ # but don't raise error
77
+ rescue StandardError => e2
78
+ # Both methods failed, return empty array
79
+ puts "Failed to kill processes by name #{name}: #{e2.message}"
80
+ end
81
+ end
26
82
  else
27
- # First find all PIDs matching the name
28
- pids = `pgrep -f #{name}`.split("\n")
29
- # Kill each process by its PID
30
- pids.each do |pid|
31
- `kill -9 #{pid}` unless pid.empty?
83
+ # Unix (Linux/Mac): Use pgrep to find PIDs, then kill them
84
+ begin
85
+ # Use pgrep to find PIDs, handle both Linux and Mac
86
+ pids = if Makit::Environment.is_mac?
87
+ # Mac: pgrep -f might not work the same way
88
+ `pgrep -x "#{name}" 2>/dev/null`.split("\n").reject(&:empty?)
89
+ else
90
+ # Linux: pgrep -f works well
91
+ `pgrep -f "#{name}" 2>/dev/null`.split("\n").reject(&:empty?)
92
+ end
93
+
94
+ pids.each do |pid|
95
+ next unless pid.match?(/^\d+$/)
96
+
97
+ begin
98
+ `kill -9 #{pid} 2>/dev/null`
99
+ killed_pids << pid
100
+ rescue StandardError => e
101
+ puts "Failed to kill process #{pid}: #{e.message}"
102
+ end
103
+ end
104
+ rescue StandardError => e
105
+ # If pgrep fails, return empty array but don't raise error
106
+ puts "Failed to find processes by name #{name}: #{e.message}"
32
107
  end
33
108
  end
109
+
110
+ killed_pids
34
111
  end
35
112
 
113
+ # List all running processes on the system
114
+ #
115
+ # Uses platform-specific commands to get a complete process listing:
116
+ # - Windows: tasklist command
117
+ # - Unix: ps aux command
118
+ #
119
+ # @return [String] Raw output from the system process listing command
36
120
  def self.list
37
121
  if Makit::Environment.is_windows?
38
- `tasklist`
122
+ `tasklist 2>nul`
39
123
  else
40
- `ps aux`
124
+ `ps aux 2>/dev/null`
41
125
  end
42
126
  end
43
127
 
128
+ # List all running processes for the current user
129
+ #
130
+ # Filters the process list to show only processes owned by the current user.
131
+ # Uses platform-specific filtering:
132
+ # - Windows: tasklist with USERNAME filter
133
+ # - Unix: ps aux with grep filtering
134
+ #
135
+ # @return [String] Raw output from the filtered process listing command
44
136
  def self.list_current_user
45
137
  if Makit::Environment.is_windows?
46
- `tasklist /FI "STATUS eq running and USERNAME eq #{Makit::Environment.current_user}"`
138
+ `tasklist /FI "STATUS eq running and USERNAME eq #{Makit::Environment.current_user}" 2>nul`
47
139
  else
48
- `ps aux | grep #{Makit::Environment.current_user} | grep -v grep`
140
+ `ps aux | grep "#{Makit::Environment.current_user}" | grep -v grep 2>/dev/null`
49
141
  end
50
142
  end
51
143
 
52
- # list all processes for the current user
53
- # name is a string to filter the processes by name
144
+ # List processes for the current user filtered by name
145
+ #
146
+ # Returns an array of process lines for consistency across platforms.
147
+ # Filters by both current user and process name.
148
+ #
149
+ # @param name [String] Process name to filter by
150
+ # @return [Array<String>] Array of process lines matching the criteria
54
151
  def self.list_current_user_processes(name)
55
152
  if Makit::Environment.is_windows?
56
- `tasklist /FI "STATUS eq running and USERNAME eq #{Makit::Environment.current_user}"`
57
153
  # filter the results to only include the current user
58
- results = `tasklist /FI "STATUS eq running and USERNAME eq #{Makit::Environment.current_user}"`
154
+ results = `tasklist /FI "STATUS eq running and USERNAME eq #{Makit::Environment.current_user}" 2>nul`
59
155
  results.split("\n").select { |line| line.include?(Makit::Environment.current_user) }
60
156
  else
61
- `ps aux | grep #{name} | grep -v grep`
157
+ # Unix (Linux/Mac): return as array for consistency
158
+ results = `ps aux | grep "#{name}" | grep -v grep 2>/dev/null`
159
+ results.split("\n").reject(&:empty?)
62
160
  end
63
161
  end
64
162
  end
data/lib/makit/protoc.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "pathname"
3
4
 
4
5
  # This module provides classes for the Makit gem.
@@ -7,23 +8,23 @@ module Makit
7
8
  #
8
9
  class Protoc
9
10
  def self.grpc_tools_path
10
- File.join(Makit::Directories::NUGET_PACKAGE_CACHE, "grpc.tools", Makit::Protoc::get_latest_grpc_tools_version)
11
+ File.join(Makit::Directories::NUGET_PACKAGE_CACHE, "grpc.tools", Makit::Protoc.get_latest_grpc_tools_version)
11
12
  end
12
13
 
13
14
  def self.grpc_csharp_plugin_path
14
- Makit::Protoc::find_plugin_path("grpc_csharp_plugin")
15
+ Makit::Protoc.find_plugin_path("grpc_csharp_plugin")
15
16
  end
17
+
16
18
  def self.setup
17
- if (!Dir.exist?(Makit::Directories::NUGET_PACKAGE_CACHE))
18
- puts " warning: Nuget package cache directory #{Makit::Directories::NUGET_PACKAGE_CACHE} not found".colorize(:red)
19
- puts " warning: Unable to proceed with protoc setup".colorize(:red)
20
- else
21
- Makit::NuGet::cache("Grpc.Tools", "2.66.0")
22
- raise "Nuget package path #{Makit::Directories::NUGET_PACKAGE_CACHE} not found" if !Dir.exist?(Makit::Directories::NUGET_PACKAGE_CACHE)
19
+ if Dir.exist?(Makit::Directories::NUGET_PACKAGE_CACHE)
20
+ Makit::NuGet.cache("Grpc.Tools", "2.66.0")
21
+ unless Dir.exist?(Makit::Directories::NUGET_PACKAGE_CACHE)
22
+ raise "Nuget package path #{Makit::Directories::NUGET_PACKAGE_CACHE} not found"
23
+ end
23
24
 
24
25
  # test if protoc is installed by running >protoc --version
25
26
  which_protoc = Makit::Environment.which("protoc")
26
- if (Makit::Environment.which("protoc").nil?)
27
+ if Makit::Environment.which("protoc").nil?
27
28
  puts " protoc not found, installing...".colorize(:red)
28
29
  "go version".run
29
30
  "go install google.golang.org/protobuf/cmd/protoc-gen-go@latest".run
@@ -32,35 +33,37 @@ module Makit
32
33
  else
33
34
  puts " protoc found at #{which_protoc}".colorize(:green)
34
35
  end
35
- raise "protoc not found" if !Makit::Environment.which("protoc")
36
+ raise "protoc not found" unless Makit::Environment.which("protoc")
36
37
 
37
- #"git clone https://github.com/googleapis/googleapis.git third_party".run unless File.directory?("third_party/google")
38
- puts " grpc_tools_path " + "#{Makit::Protoc::grpc_tools_path}".colorize(:green)
39
- puts " grpc_csharp_plugin_path " + "#{Makit::Protoc::grpc_csharp_plugin_path}".colorize(:green)
38
+ # "git clone https://github.com/googleapis/googleapis.git third_party".run unless File.directory?("third_party/google")
39
+ puts " grpc_tools_path #{Makit::Protoc.grpc_tools_path.to_s.colorize(:green)}"
40
+ puts " grpc_csharp_plugin_path #{Makit::Protoc.grpc_csharp_plugin_path.to_s.colorize(:green)}"
41
+ else
42
+ puts " warning: Nuget package cache directory #{Makit::Directories::NUGET_PACKAGE_CACHE} not found".colorize(:red)
43
+ puts " warning: Unable to proceed with protoc setup".colorize(:red)
40
44
  end
41
45
  end
42
46
 
43
47
  # get the latest version of the grpc.tools package
44
48
  def self.get_latest_grpc_tools_version
45
- Makit::NuGet::get_latest_version("Grpc.Tools")
49
+ Makit::NuGet.get_latest_version("Grpc.Tools")
46
50
  end
47
51
 
48
- #GRPC_CSHARP_PLUGIN_PATH = Makit::Protoc::find_plugin_path("grpc_csharp_plugin")
52
+ # GRPC_CSHARP_PLUGIN_PATH = Makit::Protoc::find_plugin_path("grpc_csharp_plugin")
49
53
  def self.find_plugin_path(plugin_name)
50
54
  # search for a file matching the pattern *grpc_csharp_plugin* in the grpc.tools directory
51
55
  # should match on Windows and Linux
52
- if (Makit::Environment.is_windows?)
53
- plugin_name = plugin_name + ".exe"
54
- end
56
+ plugin_name += ".exe" if Makit::Environment.is_windows?
55
57
 
56
58
  plugin_path = Dir.glob("#{Makit::Directories::GRPC_TOOLS_PATH}/**/#{plugin_name}").first
57
59
 
58
- raise "Plugin path #{plugin_path} not found" if !File.exist?(plugin_path)
60
+ raise "Plugin path #{plugin_path} not found" unless File.exist?(plugin_path)
61
+
59
62
  plugin_path
60
63
  end
61
64
 
62
65
  def self.get_proto_files_from_path(proto_source_dir)
63
- proto_files = Array.new()
66
+ proto_files = []
64
67
  Dir.chdir(proto_source_dir) do
65
68
  Dir.glob("**/*.proto").each do |proto|
66
69
  proto_files << proto
@@ -70,7 +73,7 @@ module Makit
70
73
  end
71
74
 
72
75
  def self.generate_source_file(proto_filename, language, csharp_output_dir)
73
- FileUtils.mkdir_p(csharp_output_dir) unless Dir.exist?(csharp_output_dir)
76
+ FileUtils.mkdir_p(csharp_output_dir)
74
77
  "protoc --#{language}_out=#{csharp_output_dir} #{proto_filename}".run
75
78
  end
76
79
 
@@ -78,7 +81,7 @@ module Makit
78
81
  def self.generate_source_files(proto_source_dir, language, output_dir)
79
82
  debug = false
80
83
  puts "Generating source files for #{language} in #{proto_source_dir} to #{output_dir}" if debug
81
- FileUtils.mkdir_p(output_dir) unless Dir.exist?(output_dir)
84
+ FileUtils.mkdir_p(output_dir)
82
85
 
83
86
  path_a = Pathname.new(proto_source_dir)
84
87
  path_b = Pathname.new(output_dir)
@@ -88,11 +91,11 @@ module Makit
88
91
  Dir.chdir(proto_source_dir) do
89
92
  Dir.glob("**/*.proto").each do |proto|
90
93
  puts "Generating #{proto}" if debug
91
- if (language == "csharp")
94
+ if language == "csharp"
92
95
  namespace_dir = File.dirname(proto)
93
96
  output_dir = "#{output_relative_path}/#{namespace_dir}"
94
97
  puts "Generating #{proto} in #{output_dir}" if debug
95
- FileUtils.mkdir_p("#{output_dir}") unless Dir.exist?("#{output_dir}")
98
+ FileUtils.mkdir_p(output_dir.to_s)
96
99
  "protoc --csharp_out=#{output_dir} #{proto}".run
97
100
  else
98
101
  "protoc --#{language}_out=#{output_relative_path} #{proto}".run
@@ -0,0 +1,196 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "clamp"
4
+
5
+ module Makit
6
+ module Rake
7
+ # CLI command for managing rake-related functionality
8
+ # Command to run rake tasks
9
+ class RunCommand < Clamp::Command
10
+ self.description = "Run a rake task in a directory or repository"
11
+
12
+ parameter "TARGET", "Directory path or repository URL"
13
+ parameter "TASK", "Rake task to run"
14
+ option ["-v", "--verbose"], :flag, "Verbose output"
15
+ option ["-f", "--fail-fast"], :flag, "Stop on first failure"
16
+ option ["-j", "--jobs"], "JOBS", "Number of parallel jobs", default: "1"
17
+ option ["-t", "--trace"], :flag, "Show full backtrace on errors"
18
+
19
+ def execute
20
+ target_path = resolve_target(target)
21
+
22
+ signal_usage_error "Target directory does not exist: #{target_path}" unless Dir.exist?(target_path)
23
+
24
+ Dir.chdir(target_path) do
25
+ puts "Running rake task '#{task}' in #{target_path}".colorize(:blue)
26
+
27
+ # Build rake command with options
28
+ rake_cmd = build_rake_command
29
+
30
+ # Execute the command
31
+ result = system(rake_cmd)
32
+
33
+ if result
34
+ puts "Rake task '#{task}' completed successfully".colorize(:green)
35
+ else
36
+ puts "Rake task '#{task}' failed".colorize(:red)
37
+ exit(1)
38
+ end
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def resolve_target(target)
45
+ return handle_repository_target(target) if target.start_with?("http")
46
+
47
+ # It's a repository URL, clone or update it
48
+
49
+ # It's a local path
50
+ File.expand_path(target)
51
+ end
52
+
53
+ def handle_repository_target(url)
54
+ local_path = File.join(
55
+ Makit::Directories::HOME,
56
+ "code",
57
+ "work",
58
+ Makit::Directories.get_relative_directory(url)
59
+ )
60
+
61
+ if Dir.exist?(local_path)
62
+ puts "Updating existing repository: #{url}".colorize(:yellow)
63
+ Dir.chdir(local_path) do
64
+ "git pull".run
65
+ end
66
+ else
67
+ puts "Cloning repository: #{url}".colorize(:green)
68
+ `git clone #{url} #{local_path}`
69
+ end
70
+
71
+ local_path
72
+ end
73
+
74
+ def build_rake_command
75
+ cmd_parts = ["rake", task]
76
+
77
+ cmd_parts << "--verbose" if verbose?
78
+ cmd_parts << "--fail-fast" if fail_fast?
79
+ cmd_parts << "--jobs" << jobs if jobs != "1"
80
+ cmd_parts << "--trace" if trace?
81
+
82
+ cmd_parts.join(" ")
83
+ end
84
+ end
85
+
86
+ # Command to list available rake tasks
87
+ class ListCommand < Clamp::Command
88
+ self.description = "List available rake tasks in a directory or repository"
89
+
90
+ parameter "TARGET", "Directory path or repository URL"
91
+ option ["-a", "--all"], :flag, "Show all tasks including private ones"
92
+ option ["-p", "--pattern"], "PATTERN", "Filter tasks by pattern"
93
+
94
+ def execute
95
+ target_path = resolve_target(target)
96
+
97
+ signal_usage_error "Target directory does not exist: #{target_path}" unless Dir.exist?(target_path)
98
+
99
+ Dir.chdir(target_path) do
100
+ puts "Available rake tasks in #{target_path}:".colorize(:blue)
101
+
102
+ # Build rake command to list tasks
103
+ rake_cmd = "rake --tasks"
104
+ rake_cmd += " --all" if all?
105
+
106
+ # Execute and capture output
107
+ output = `#{rake_cmd} 2>/dev/null`
108
+
109
+ if output.empty?
110
+ puts "No rake tasks found or Rakefile not present".colorize(:yellow)
111
+ return
112
+ end
113
+
114
+ # Filter by pattern if specified
115
+ output = output.lines.select { |line| line.include?(pattern) }.join if pattern
116
+
117
+ puts output
118
+ end
119
+ end
120
+
121
+ private
122
+
123
+ def resolve_target(target)
124
+ return handle_repository_target(target) if target.start_with?("http")
125
+
126
+ # It's a repository URL, clone or update it
127
+
128
+ # It's a local path
129
+ File.expand_path(target)
130
+ end
131
+
132
+ def handle_repository_target(url)
133
+ local_path = File.join(
134
+ Makit::Directories::HOME,
135
+ "code",
136
+ "work",
137
+ Makit::Directories.get_relative_directory(url)
138
+ )
139
+
140
+ if Dir.exist?(local_path)
141
+ puts "Updating existing repository: #{url}".colorize(:yellow)
142
+ Dir.chdir(local_path) do
143
+ "git pull".run
144
+ end
145
+ else
146
+ puts "Cloning repository: #{url}".colorize(:green)
147
+ `git clone #{url} #{local_path}`
148
+ end
149
+
150
+ local_path
151
+ end
152
+ end
153
+
154
+ # Command to run rake tasks in repositories (legacy compatibility)
155
+ class RepositoryCommand < Clamp::Command
156
+ self.description = "Run a rake task in a repository (legacy command)"
157
+
158
+ parameter "URL", "Repository URL"
159
+ parameter "TASK", "Rake task to run"
160
+
161
+ def execute
162
+ puts "Running rake task '#{task}' in repository: #{url}".colorize(:blue)
163
+ Makit::Rake.rake_repository(url, task)
164
+ end
165
+ end
166
+
167
+ # CLI command for managing rake-related functionality
168
+ class CliCommand < Clamp::Command
169
+ self.description = <<~DESC
170
+ Rake management commands for Makit.
171
+
172
+ This command provides utilities for working with Rake tasks, including:
173
+ - Running rake tasks in repositories
174
+ - Managing rake task execution
175
+ - Repository-based rake operations
176
+
177
+ Common usage examples:
178
+ # Run a rake task in a repository
179
+ makit rake run https://github.com/user/repo test
180
+ #{" "}
181
+ # Run a rake task in a local directory
182
+ makit rake run ./my-project build
183
+ #{" "}
184
+ # List available rake tasks in a repository
185
+ makit rake list https://github.com/user/repo
186
+ #{" "}
187
+ # Run rake task with specific options
188
+ makit rake run ./my-project test --verbose
189
+ DESC
190
+
191
+ subcommand "run", "Run a rake task in a repository or directory", RunCommand
192
+ subcommand "list", "List available rake tasks", ListCommand
193
+ subcommand "repository", "Run rake task in a repository", RepositoryCommand
194
+ end
195
+ end
196
+ end