makit 0.0.144 → 0.0.145

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 (165) 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/auto.rb +48 -48
  6. data/lib/makit/cli/base.rb +17 -0
  7. data/lib/makit/cli/build_commands.rb +500 -500
  8. data/lib/makit/cli/generators/base_generator.rb +74 -74
  9. data/lib/makit/cli/generators/dotnet_generator.rb +50 -50
  10. data/lib/makit/cli/generators/generator_factory.rb +49 -49
  11. data/lib/makit/cli/generators/node_generator.rb +50 -50
  12. data/lib/makit/cli/generators/ruby_generator.rb +77 -77
  13. data/lib/makit/cli/generators/rust_generator.rb +50 -50
  14. data/lib/makit/cli/generators/templates/dotnet_templates.rb +167 -167
  15. data/lib/makit/cli/generators/templates/node_templates.rb +161 -161
  16. data/lib/makit/cli/generators/templates/ruby/gemfile.rb +26 -26
  17. data/lib/makit/cli/generators/templates/ruby/gemspec.rb +41 -40
  18. data/lib/makit/cli/generators/templates/ruby/main_lib.rb +33 -33
  19. data/lib/makit/cli/generators/templates/ruby/rakefile.rb +35 -35
  20. data/lib/makit/cli/generators/templates/ruby/readme.rb +63 -63
  21. data/lib/makit/cli/generators/templates/ruby/test.rb +39 -39
  22. data/lib/makit/cli/generators/templates/ruby/test_helper.rb +29 -29
  23. data/lib/makit/cli/generators/templates/ruby/version.rb +29 -29
  24. data/lib/makit/cli/generators/templates/rust_templates.rb +128 -128
  25. data/lib/makit/cli/main.rb +78 -69
  26. data/lib/makit/cli/pipeline_commands.rb +311 -0
  27. data/lib/makit/cli/project_commands.rb +868 -868
  28. data/lib/makit/cli/repository_commands.rb +661 -661
  29. data/lib/makit/cli/strategy_commands.rb +207 -212
  30. data/lib/makit/cli/utility_commands.rb +521 -521
  31. data/lib/makit/commands/factory.rb +359 -359
  32. data/lib/makit/commands/middleware/base.rb +73 -73
  33. data/lib/makit/commands/middleware/cache.rb +248 -248
  34. data/lib/makit/commands/middleware/command_logger.rb +312 -312
  35. data/lib/makit/commands/middleware/validator.rb +269 -269
  36. data/lib/makit/commands/request.rb +316 -316
  37. data/lib/makit/commands/result.rb +323 -323
  38. data/lib/makit/commands/runner.rb +386 -386
  39. data/lib/makit/commands/strategies/base.rb +171 -171
  40. data/lib/makit/commands/strategies/child_process.rb +162 -162
  41. data/lib/makit/commands/strategies/factory.rb +136 -136
  42. data/lib/makit/commands/strategies/synchronous.rb +139 -139
  43. data/lib/makit/commands.rb +50 -50
  44. data/lib/makit/configuration/dotnet_project.rb +48 -48
  45. data/lib/makit/configuration/gitlab_helper.rb +61 -58
  46. data/lib/makit/configuration/project.rb +446 -168
  47. data/lib/makit/configuration/rakefile_helper.rb +43 -43
  48. data/lib/makit/configuration/step.rb +34 -34
  49. data/lib/makit/configuration/timeout.rb +74 -74
  50. data/lib/makit/configuration.rb +21 -16
  51. data/lib/makit/content/default_gitignore.rb +7 -7
  52. data/lib/makit/content/default_gitignore.txt +225 -225
  53. data/lib/makit/content/default_rakefile.rb +13 -13
  54. data/lib/makit/content/gem_rakefile.rb +16 -16
  55. data/lib/makit/context.rb +1 -1
  56. data/lib/makit/data.rb +49 -49
  57. data/lib/makit/directories.rb +140 -140
  58. data/lib/makit/directory.rb +262 -262
  59. data/lib/makit/docs/files.rb +89 -89
  60. data/lib/makit/docs/rake.rb +102 -102
  61. data/lib/makit/dotnet/cli.rb +69 -69
  62. data/lib/makit/dotnet/project.rb +217 -217
  63. data/lib/makit/dotnet/solution.rb +38 -38
  64. data/lib/makit/dotnet/solution_classlib.rb +239 -239
  65. data/lib/makit/dotnet/solution_console.rb +264 -264
  66. data/lib/makit/dotnet/solution_maui.rb +354 -354
  67. data/lib/makit/dotnet/solution_wasm.rb +275 -275
  68. data/lib/makit/dotnet/solution_wpf.rb +304 -304
  69. data/lib/makit/dotnet.rb +102 -102
  70. data/lib/makit/email.rb +90 -90
  71. data/lib/makit/environment.rb +142 -142
  72. data/lib/makit/examples/runner.rb +370 -370
  73. data/lib/makit/exceptions.rb +45 -45
  74. data/lib/makit/fileinfo.rb +32 -24
  75. data/lib/makit/files.rb +43 -43
  76. data/lib/makit/gems.rb +40 -40
  77. data/lib/makit/git/cli.rb +54 -54
  78. data/lib/makit/git/repository.rb +266 -90
  79. data/lib/makit/git.rb +104 -98
  80. data/lib/makit/gitlab/pipeline.rb +857 -0
  81. data/lib/makit/gitlab/pipeline_service_impl.rb +1536 -0
  82. data/lib/makit/gitlab_runner.rb +59 -59
  83. data/lib/makit/humanize.rb +218 -137
  84. data/lib/makit/indexer.rb +47 -47
  85. data/lib/makit/io/filesystem.rb +111 -0
  86. data/lib/makit/io/filesystem_service_impl.rb +337 -0
  87. data/lib/makit/logging/configuration.rb +308 -308
  88. data/lib/makit/logging/format_registry.rb +84 -84
  89. data/lib/makit/logging/formatters/base.rb +39 -39
  90. data/lib/makit/logging/formatters/console_formatter.rb +140 -140
  91. data/lib/makit/logging/formatters/json_formatter.rb +65 -65
  92. data/lib/makit/logging/formatters/plain_text_formatter.rb +71 -71
  93. data/lib/makit/logging/formatters/text_formatter.rb +64 -64
  94. data/lib/makit/logging/log_request.rb +119 -119
  95. data/lib/makit/logging/logger.rb +199 -199
  96. data/lib/makit/logging/sinks/base.rb +91 -91
  97. data/lib/makit/logging/sinks/console.rb +72 -72
  98. data/lib/makit/logging/sinks/file_sink.rb +92 -92
  99. data/lib/makit/logging/sinks/structured.rb +123 -123
  100. data/lib/makit/logging/sinks/unified_file_sink.rb +296 -296
  101. data/lib/makit/logging.rb +565 -565
  102. data/lib/makit/markdown.rb +75 -75
  103. data/lib/makit/mp/basic_object_mp.rb +17 -17
  104. data/lib/makit/mp/command_mp.rb +13 -13
  105. data/lib/makit/mp/command_request.mp.rb +17 -17
  106. data/lib/makit/mp/project_mp.rb +199 -199
  107. data/lib/makit/mp/string_mp.rb +205 -199
  108. data/lib/makit/nuget.rb +74 -74
  109. data/lib/makit/podman/podman.rb +458 -0
  110. data/lib/makit/podman/podman_service_impl.rb +1081 -0
  111. data/lib/makit/port.rb +32 -32
  112. data/lib/makit/process.rb +377 -377
  113. data/lib/makit/protoc.rb +112 -107
  114. data/lib/makit/rake/cli.rb +196 -196
  115. data/lib/makit/rake/trace_controller.rb +174 -174
  116. data/lib/makit/rake.rb +81 -81
  117. data/lib/makit/ruby/cli.rb +185 -185
  118. data/lib/makit/ruby.rb +25 -25
  119. data/lib/makit/secrets.rb +51 -51
  120. data/lib/makit/serializer.rb +130 -130
  121. data/lib/makit/services/builder.rb +186 -186
  122. data/lib/makit/services/error_handler.rb +226 -226
  123. data/lib/makit/services/repository_manager.rb +367 -231
  124. data/lib/makit/services/validator.rb +112 -112
  125. data/lib/makit/setup/classlib.rb +101 -101
  126. data/lib/makit/setup/gem.rb +268 -268
  127. data/lib/makit/setup/pages.rb +11 -11
  128. data/lib/makit/setup/razorclasslib.rb +101 -101
  129. data/lib/makit/setup/runner.rb +54 -54
  130. data/lib/makit/setup.rb +5 -5
  131. data/lib/makit/show.rb +110 -110
  132. data/lib/makit/storage.rb +126 -126
  133. data/lib/makit/symbols.rb +175 -170
  134. data/lib/makit/task_info.rb +130 -130
  135. data/lib/makit/tasks/at_exit.rb +15 -15
  136. data/lib/makit/tasks/build.rb +22 -22
  137. data/lib/makit/tasks/clean.rb +13 -13
  138. data/lib/makit/tasks/configure.rb +10 -10
  139. data/lib/makit/tasks/format.rb +10 -10
  140. data/lib/makit/tasks/hook_manager.rb +443 -443
  141. data/lib/makit/tasks/init.rb +49 -49
  142. data/lib/makit/tasks/integrate.rb +29 -29
  143. data/lib/makit/tasks/pull_incoming.rb +13 -13
  144. data/lib/makit/tasks/setup.rb +16 -16
  145. data/lib/makit/tasks/sync.rb +17 -17
  146. data/lib/makit/tasks/tag.rb +16 -16
  147. data/lib/makit/tasks/task_monkey_patch.rb +81 -81
  148. data/lib/makit/tasks/test.rb +22 -22
  149. data/lib/makit/tasks/update.rb +18 -18
  150. data/lib/makit/tasks.rb +20 -20
  151. data/lib/makit/test_cache.rb +239 -239
  152. data/lib/makit/tree.rb +37 -37
  153. data/lib/makit/v1/configuration/project_service_impl.rb +371 -0
  154. data/lib/makit/v1/git/git_repository_service_impl.rb +295 -0
  155. data/lib/makit/v1/makit.v1_pb.rb +35 -35
  156. data/lib/makit/v1/makit.v1_services_pb.rb +27 -27
  157. data/lib/makit/v1/services/repository_manager_service_impl.rb +572 -0
  158. data/lib/makit/version.rb +100 -100
  159. data/lib/makit/version_util.rb +21 -21
  160. data/lib/makit/wix.rb +95 -95
  161. data/lib/makit/yaml.rb +29 -29
  162. data/lib/makit/zip.rb +17 -17
  163. data/lib/makit copy.rb +44 -44
  164. data/lib/makit.rb +111 -43
  165. metadata +61 -36
@@ -1,59 +1,59 @@
1
- # frozen_string_literal: true
2
-
3
- require "yaml"
4
- require "fileutils"
5
-
6
- # This module provides classes for the Makit gem.
7
- module Makit
8
- # This class provide methods for working with Directories/
9
- #
10
- # Example:
11
- #
12
- # Makit::Directory.find_directory_with_pattern("/home/user", "*.rb")
13
- #
14
- class GitLabRunner
15
- # Parse the .gitlab-ci.yml file
16
- def parse_gitlab_ci_file(file_path)
17
- YAML.load_file(file_path)
18
- end
19
-
20
- # Extract the script for a specified job
21
- def extract_script(ci_config, job_name)
22
- job = ci_config[job_name]
23
- job ? job["script"] : nil
24
- end
25
-
26
- # Write the script to a temporary file
27
- def write_script_to_file(script, file_path)
28
- File.open(file_path, "w") do |file|
29
- script.each { |line| file.puts(line) }
30
- end
31
- end
32
-
33
- # Run the script in a Docker container
34
- def run_script_in_docker(image, script_file)
35
- system("docker run --rm -v #{Dir.pwd}:/workspace -w /workspace #{image} /bin/sh #{script_file}")
36
- end
37
-
38
- # Main function to execute the process
39
- def run_job(ci_file_path, job_name, docker_image)
40
- ci_config = parse_gitlab_ci_file(ci_file_path)
41
- script = extract_script(ci_config, job_name)
42
-
43
- unless script
44
- puts "Job '#{job_name}' not found in #{ci_file_path}"
45
- return
46
- end
47
-
48
- script_file = "temp_script.sh"
49
- write_script_to_file(script, script_file)
50
- FileUtils.chmod("+x", script_file)
51
-
52
- puts "Running script in Docker container..."
53
- run_script_in_docker(docker_image, script_file)
54
-
55
- # Clean up the temporary script file
56
- FileUtils.rm(script_file)
57
- end
58
- end
59
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "yaml"
4
+ require "fileutils"
5
+
6
+ # This module provides classes for the Makit gem.
7
+ module Makit
8
+ # This class provide methods for working with Directories/
9
+ #
10
+ # Example:
11
+ #
12
+ # Makit::Directory.find_directory_with_pattern("/home/user", "*.rb")
13
+ #
14
+ class GitLabRunner
15
+ # Parse the .gitlab-ci.yml file
16
+ def parse_gitlab_ci_file(file_path)
17
+ YAML.load_file(file_path)
18
+ end
19
+
20
+ # Extract the script for a specified job
21
+ def extract_script(ci_config, job_name)
22
+ job = ci_config[job_name]
23
+ job ? job["script"] : nil
24
+ end
25
+
26
+ # Write the script to a temporary file
27
+ def write_script_to_file(script, file_path)
28
+ File.open(file_path, "w") do |file|
29
+ script.each { |line| file.puts(line) }
30
+ end
31
+ end
32
+
33
+ # Run the script in a Docker container
34
+ def run_script_in_docker(image, script_file)
35
+ system("docker run --rm -v #{Dir.pwd}:/workspace -w /workspace #{image} /bin/sh #{script_file}")
36
+ end
37
+
38
+ # Main function to execute the process
39
+ def run_job(ci_file_path, job_name, docker_image)
40
+ ci_config = parse_gitlab_ci_file(ci_file_path)
41
+ script = extract_script(ci_config, job_name)
42
+
43
+ unless script
44
+ puts "Job '#{job_name}' not found in #{ci_file_path}"
45
+ return
46
+ end
47
+
48
+ script_file = "temp_script.sh"
49
+ write_script_to_file(script, script_file)
50
+ FileUtils.chmod("+x", script_file)
51
+
52
+ puts "Running script in Docker container..."
53
+ run_script_in_docker(docker_image, script_file)
54
+
55
+ # Clean up the temporary script file
56
+ FileUtils.rm(script_file)
57
+ end
58
+ end
59
+ end
@@ -1,137 +1,218 @@
1
- # frozen_string_literal: true
2
-
3
- # This module provides classes for the Makit gem.
4
- module Makit
5
- # Provides utilities for converting data into human-readable formats.
6
- #
7
- # This class handles formatting of file sizes, timestamps, durations,
8
- # and build result summaries for display to users.
9
- #
10
- # @example Basic usage
11
- # Makit::Humanize.get_humanized_size(1024) # => "1.00 KB"
12
- # Makit::Humanize.get_humanized_duration(3661) # => "1 hour, 1 minute, 1 second"
13
- #
14
- class Humanize
15
- def self.get_humanized_size(bytes, precision = 2)
16
- units = %w[B KB MB GB TB PB]
17
- return "0 B" if bytes.zero?
18
-
19
- exp = (Math.log(bytes) / Math.log(1024)).to_i
20
- exp = units.size - 1 if exp >= units.size
21
-
22
- size = bytes.to_f / (1024 ** exp)
23
- format("%.#{precision}f %s", size, units[exp])
24
- end
25
-
26
- def self.get_humanized_timestamp(timestamp)
27
- return timestamp.strftime("%Y-%m-%d %I:%M:%S %p") if timestamp.respond_to?(:strftime)
28
-
29
- timestamp.strftime("%Y-%m-%d %H:%M:%S")
30
- end
31
-
32
- def self.get_make_result_summary(make_result)
33
- summary = "Make Result\n"
34
- summary += " Repository: #{make_result.repository}\n"
35
- summary += " Commit: #{make_result.commit}\n"
36
- summary += " Branch: #{make_result.branch}\n"
37
- summary += " Tag: #{make_result.tag}\n"
38
- summary += " Device: #{make_result.device}\n"
39
- summary += " Runtime Identifier: #{make_result.runtime_identifier}\n"
40
- summary += " Initial Size: #{get_humanized_size(make_result.initial_size)}\n"
41
- summary += " Final Size: #{get_humanized_size(make_result.final_size)}\n"
42
- summary += " Delta Size: #{get_humanized_size(make_result.final_size - make_result.initial_size)}\n"
43
- summary += " Commands: (#{make_result.commands.length})\n"
44
- make_result.commands.each do |command|
45
- details = get_command_details(command)
46
- summary += "\n"
47
- summary += indent_string(details, 4)
48
- summary += "\n"
49
- end
50
-
51
- summary
52
- end
53
-
54
- def self.get_commands(commands)
55
- message = ""
56
- commands.each do |command|
57
- message += Makit::Humanize.get_command_details(command)
58
- end
59
- message
60
- end
61
-
62
- def self.get_command_summary(command)
63
- symbol = Makit::Symbols.warning
64
- symbol = Makit::Symbols.checkmark if !command.exit_code.nil? && command.exit_code.zero?
65
- symbol = Makit::Symbols.error if command.exit_code != 0
66
- "#{symbol} #{command.name} #{command.arguments.join(" ")}"
67
- end
68
-
69
- def self.get_command_details(command)
70
- summary = "#{get_command_summary(command)}\n"
71
- summary += " Name: #{command.name}\n"
72
- summary += " Arguments: #{command.arguments.join(" ")}\n"
73
- summary += " Directory: #{command.directory}\n"
74
- summary += " Exit Code: #{command.exit_code}\n"
75
- if command.output.length.positive?
76
- summary += " Output:\n"
77
- summary += indent_string(command.output, 4)
78
- summary += "\n"
79
- end
80
- if command.error.length.positive?
81
- summary += " Error:\n"
82
- summary += indent_string(command.error, 4)
83
- summary += "\n"
84
- end
85
- summary
86
- end
87
-
88
- def self.indent_string(string, spaces)
89
- string.split("\n").map { |line| (" " * spaces) + line }.join("\n")
90
- end
91
-
92
- def self.get_protobuf_timestamp(timestamp)
93
- Time.at(timestamp.seconds, timestamp.nanos / 1000.0).strftime("%Y-%m-%d %H:%M:%S")
94
- end
95
-
96
- def self.get_protobuf_duration(duration)
97
- total_seconds = duration.seconds + (duration.nanos / 1_000_000_000.0)
98
- hours = (total_seconds / 3600).to_i
99
- minutes = ((total_seconds % 3600) / 60).to_i
100
- seconds = (total_seconds % 60).round(2)
101
- "#{hours}h #{minutes}m #{seconds}s"
102
- end
103
-
104
- def self.get_humanized_duration(seconds_value)
105
- minutes = (seconds_value / 60).to_i
106
- seconds = (seconds_value % 60).to_i
107
- hours = (minutes / 60).to_i
108
- minutes %= 60
109
- days = (hours / 24).to_i
110
- hours %= 24
111
- milliseconds = (seconds_value % 1 * 1000).to_i
112
-
113
- parts = []
114
- parts << "#{days} days" if days.positive?
115
- parts << "#{hours} hours" if hours.positive?
116
- if minutes.positive?
117
- parts << if minutes == 1
118
- "1 minute"
119
- else
120
- "#{minutes} minutes"
121
- end
122
- end
123
- if seconds.positive?
124
- parts << if seconds == 1
125
- "1 second"
126
- else
127
- "#{seconds} seconds"
128
- end
129
- end
130
- # parts << "#{seconds} seconds" if seconds > 0
131
- parts << "#{milliseconds} milliseconds" if milliseconds.positive? && seconds < 1
132
-
133
- parts << "0 seconds" if parts.empty?
134
- parts.join(", ")
135
- end
136
- end
137
- end
1
+ # frozen_string_literal: true
2
+
3
+ # This module provides classes for the Makit gem.
4
+ module Makit
5
+ # Provides utilities for converting data into human-readable formats.
6
+ #
7
+ # This class handles formatting of file sizes, timestamps, durations,
8
+ # and build result summaries for display to users.
9
+ #
10
+ # @example Basic usage
11
+ # Makit::Humanize.get_humanized_size(1024) # => "1.00 KB"
12
+ # Makit::Humanize.get_humanized_duration(3661) # => "1 hour, 1 minute, 1 second"
13
+ #
14
+ class Humanize
15
+ def self.get_humanized_size(bytes, precision = 2)
16
+ units = %w[B KB MB GB TB PB]
17
+ return "0 B" if bytes.zero?
18
+
19
+ exp = (Math.log(bytes) / Math.log(1024)).to_i
20
+ exp = units.size - 1 if exp >= units.size
21
+
22
+ size = bytes.to_f / (1024 ** exp)
23
+ format("%.#{precision}f %s", size, units[exp])
24
+ end
25
+
26
+ def self.get_humanized_timestamp(timestamp)
27
+ return timestamp.strftime("%Y-%m-%d %I:%M:%S %p") if timestamp.respond_to?(:strftime)
28
+
29
+ timestamp.strftime("%Y-%m-%d %H:%M:%S")
30
+ end
31
+
32
+ def self.get_make_result_summary(make_result)
33
+ summary = "Make Result\n"
34
+ summary += " Repository: #{make_result.repository}\n"
35
+ summary += " Commit: #{make_result.commit}\n"
36
+ summary += " Branch: #{make_result.branch}\n"
37
+ summary += " Tag: #{make_result.tag}\n"
38
+ summary += " Device: #{make_result.device}\n"
39
+ summary += " Runtime Identifier: #{make_result.runtime_identifier}\n"
40
+ summary += " Initial Size: #{get_humanized_size(make_result.initial_size)}\n"
41
+ summary += " Final Size: #{get_humanized_size(make_result.final_size)}\n"
42
+ summary += " Delta Size: #{get_humanized_size(make_result.final_size - make_result.initial_size)}\n"
43
+ summary += " Commands: (#{make_result.commands.length})\n"
44
+ make_result.commands.each do |command|
45
+ details = get_command_details(command)
46
+ summary += "\n"
47
+ summary += indent_string(details, 4)
48
+ summary += "\n"
49
+ end
50
+
51
+ summary
52
+ end
53
+
54
+ def self.get_commands(commands)
55
+ message = ""
56
+ commands.each do |command|
57
+ message += Makit::Humanize.get_command_details(command)
58
+ end
59
+ message
60
+ end
61
+
62
+ def self.get_command_summary(command)
63
+ symbol = Makit::Symbols.warning
64
+ symbol = Makit::Symbols.checkmark if !command.exit_code.nil? && command.exit_code.zero?
65
+ symbol = Makit::Symbols.error if command.exit_code != 0
66
+ "#{symbol} #{command.name} #{command.arguments.join(" ")}"
67
+ end
68
+
69
+ def self.get_command_details(command)
70
+ summary = "#{get_command_summary(command)}\n"
71
+ summary += " Name: #{command.name}\n"
72
+ summary += " Arguments: #{command.arguments.join(" ")}\n"
73
+ summary += " Directory: #{command.directory}\n"
74
+ summary += " Exit Code: #{command.exit_code}\n"
75
+ if command.output.length.positive?
76
+ summary += " Output:\n"
77
+ summary += indent_string(command.output, 4)
78
+ summary += "\n"
79
+ end
80
+ if command.error.length.positive?
81
+ summary += " Error:\n"
82
+ summary += indent_string(command.error, 4)
83
+ summary += "\n"
84
+ end
85
+ summary
86
+ end
87
+
88
+ def self.indent_string(string, spaces)
89
+ string.split("\n").map { |line| (" " * spaces) + line }.join("\n")
90
+ end
91
+
92
+ def self.get_protobuf_timestamp(timestamp)
93
+ Time.at(timestamp.seconds, timestamp.nanos / 1000.0).strftime("%Y-%m-%d %H:%M:%S")
94
+ end
95
+
96
+ def self.get_protobuf_duration(duration)
97
+ total_seconds = duration.seconds + (duration.nanos / 1_000_000_000.0)
98
+ hours = (total_seconds / 3600).to_i
99
+ minutes = ((total_seconds % 3600) / 60).to_i
100
+ seconds = (total_seconds % 60).round(2)
101
+ "#{hours}h #{minutes}m #{seconds}s"
102
+ end
103
+
104
+ def self.get_humanized_duration(seconds_value)
105
+ minutes = (seconds_value / 60).to_i
106
+ seconds = (seconds_value % 60).to_i
107
+ hours = (minutes / 60).to_i
108
+ minutes %= 60
109
+ days = (hours / 24).to_i
110
+ hours %= 24
111
+ milliseconds = (seconds_value % 1 * 1000).to_i
112
+
113
+ parts = []
114
+ parts << "#{days} days" if days.positive?
115
+ parts << "#{hours} hours" if hours.positive?
116
+ if minutes.positive?
117
+ parts << if minutes == 1
118
+ "1 minute"
119
+ else
120
+ "#{minutes} minutes"
121
+ end
122
+ end
123
+ if seconds.positive?
124
+ parts << if seconds == 1
125
+ "1 second"
126
+ else
127
+ "#{seconds} seconds"
128
+ end
129
+ end
130
+ # parts << "#{seconds} seconds" if seconds > 0
131
+ parts << "#{milliseconds} milliseconds" if milliseconds.positive? && seconds < 1
132
+
133
+ parts << "0 seconds" if parts.empty?
134
+ parts.join(", ")
135
+ end
136
+
137
+ def self.get_pipeline_execution_summary(execution_result)
138
+ summary = "Pipeline Execution Summary\n"
139
+ summary += " Execution ID: #{execution_result.execution_id}\n"
140
+ summary += " Status: #{execution_result.status}\n"
141
+ summary += " Started: #{execution_result.started_at}\n"
142
+ summary += " Finished: #{execution_result.finished_at}\n" if execution_result.finished_at
143
+
144
+ if execution_result.respond_to?(:total_duration_seconds) && execution_result.total_duration_seconds
145
+ summary += " Duration: #{get_humanized_duration(execution_result.total_duration_seconds)}\n"
146
+ end
147
+
148
+ if execution_result.respond_to?(:podman_version) && execution_result.podman_version
149
+ summary += " Podman Version: #{execution_result.podman_version}\n"
150
+ end
151
+
152
+ if execution_result.respond_to?(:execution_host) && execution_result.execution_host
153
+ summary += " Host: #{execution_result.execution_host}\n"
154
+ end
155
+
156
+ summary += " Jobs: (#{execution_result.job_results.length})\n"
157
+ execution_result.job_results.each do |job_result|
158
+ summary += "\n"
159
+ summary += indent_string(get_job_execution_details(job_result), 4)
160
+ summary += "\n"
161
+ end
162
+
163
+ if execution_result.errors && execution_result.errors.any?
164
+ summary += "\n Errors:\n"
165
+ execution_result.errors.each do |error|
166
+ summary += " - #{error}\n"
167
+ end
168
+ end
169
+
170
+ if execution_result.warnings && execution_result.warnings.any?
171
+ summary += "\n Warnings:\n"
172
+ execution_result.warnings.each do |warning|
173
+ summary += " - #{warning}\n"
174
+ end
175
+ end
176
+
177
+ summary
178
+ end
179
+
180
+ def self.get_job_execution_details(job_result)
181
+ details = "Job: #{job_result.job_name}\n"
182
+ details += " Status: #{job_result.status}\n"
183
+ details += " Started: #{job_result.started_at}\n"
184
+ details += " Finished: #{job_result.finished_at}\n" if job_result.finished_at
185
+ details += " Exit Code: #{job_result.exit_code}\n" if job_result.exit_code
186
+
187
+ if job_result.errors && job_result.errors.any?
188
+ details += " Errors:\n"
189
+ job_result.errors.each do |error|
190
+ details += " - #{error}\n"
191
+ end
192
+ end
193
+
194
+ if job_result.logs && job_result.logs.any?
195
+ details += " Logs:\n"
196
+ job_result.logs.each do |log|
197
+ details += " #{log}\n"
198
+ end
199
+ end
200
+
201
+ if job_result.respond_to?(:stdout) && job_result.stdout && !job_result.stdout.empty?
202
+ details += " Stdout:\n"
203
+ job_result.stdout.split("\n").each do |line|
204
+ details += " #{line}\n"
205
+ end
206
+ end
207
+
208
+ if job_result.respond_to?(:stderr) && job_result.stderr && !job_result.stderr.empty?
209
+ details += " Stderr:\n"
210
+ job_result.stderr.split("\n").each do |line|
211
+ details += " #{line}\n"
212
+ end
213
+ end
214
+
215
+ details
216
+ end
217
+ end
218
+ end
data/lib/makit/indexer.rb CHANGED
@@ -1,47 +1,47 @@
1
- # frozen_string_literal: true
2
-
3
- # This module provides classes for the Makit gem.
4
- module Makit
5
- # This class provide methods for indexing objects.
6
- #
7
- class Indexer
8
- attr_accessor :keywords_index, :protoc_json_serializer # Hash of string key to string[] of keyword
9
-
10
- def initialize
11
- @keywords_index = {}
12
- @protoc_json_serializer = Makit::Serializer.new(Makit::Proto3Formats::JSON)
13
- end
14
-
15
- def index(key, item)
16
- # item must be serializable to json
17
- keywords = []
18
- hash = JSON.parse(item.to_json)
19
- hash.each_value do |value|
20
- value = value.to_s.downcase
21
- keywords << value if value.length >= 3 && !keywords.include?(value)
22
- end
23
- keywords.each do |keyword|
24
- @keywords_index[keyword] = [] unless @keywords_index.key?(keyword)
25
- @keywords_index[keyword] << key unless @keywords_index[keyword].include?(key)
26
- end
27
- end
28
-
29
- def search(query)
30
- keys = []
31
- # todo, remove terms less that length of 3
32
- terms = query.downcase.split.reject { |term| term.length < 3 }
33
- keywords_index.each do |key, value| # {|kvp|
34
- keys << key if get_match_count(terms, value) == terms.length
35
- end
36
- keys
37
- end
38
-
39
- def get_match_count(terms, keywords)
40
- match_count = 0
41
- terms.each do |term|
42
- match_count += 1 if keywords.include?(term)
43
- end
44
- match_count
45
- end
46
- end
47
- end
1
+ # frozen_string_literal: true
2
+
3
+ # This module provides classes for the Makit gem.
4
+ module Makit
5
+ # This class provide methods for indexing objects.
6
+ #
7
+ class Indexer
8
+ attr_accessor :keywords_index, :protoc_json_serializer # Hash of string key to string[] of keyword
9
+
10
+ def initialize
11
+ @keywords_index = {}
12
+ @protoc_json_serializer = Makit::Serializer.new(Makit::Proto3Formats::JSON)
13
+ end
14
+
15
+ def index(key, item)
16
+ # item must be serializable to json
17
+ keywords = []
18
+ hash = JSON.parse(item.to_json)
19
+ hash.each_value do |value|
20
+ value = value.to_s.downcase
21
+ keywords << value if value.length >= 3 && !keywords.include?(value)
22
+ end
23
+ keywords.each do |keyword|
24
+ @keywords_index[keyword] = [] unless @keywords_index.key?(keyword)
25
+ @keywords_index[keyword] << key unless @keywords_index[keyword].include?(key)
26
+ end
27
+ end
28
+
29
+ def search(query)
30
+ keys = []
31
+ # todo, remove terms less that length of 3
32
+ terms = query.downcase.split.reject { |term| term.length < 3 }
33
+ keywords_index.each do |key, value| # {|kvp|
34
+ keys << key if get_match_count(terms, value) == terms.length
35
+ end
36
+ keys
37
+ end
38
+
39
+ def get_match_count(terms, keywords)
40
+ match_count = 0
41
+ terms.each do |term|
42
+ match_count += 1 if keywords.include?(term)
43
+ end
44
+ match_count
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "filesystem_service_impl"
4
+
5
+ module Makit
6
+ module IO
7
+ class FileSystem
8
+ def initialize
9
+ @service = FileSystemServiceImpl.new
10
+ end
11
+
12
+ # Get a single file's content and/or metadata
13
+ def get_file(path, include_metadata: true, include_content: true)
14
+ request = {
15
+ path: path,
16
+ include_metadata: include_metadata,
17
+ include_content: include_content
18
+ }
19
+
20
+ result = @service.get_file(request)
21
+
22
+ if result.respond_to?(:file)
23
+ # gRPC mode
24
+ result.file
25
+ else
26
+ # Fallback mode
27
+ result[:file]
28
+ end
29
+ end
30
+
31
+ # Create or update a file
32
+ def save_file(path, binary_data: nil, text_lines: nil)
33
+ request = {
34
+ path: path,
35
+ binary_data: binary_data,
36
+ text_lines: text_lines
37
+ }
38
+
39
+ result = @service.save_file(request)
40
+
41
+ if result.respond_to?(:file)
42
+ # gRPC mode
43
+ result.file
44
+ else
45
+ # Fallback mode
46
+ result[:file]
47
+ end
48
+ end
49
+
50
+ # Delete a file by path
51
+ def delete_file(path)
52
+ request = { path: path }
53
+ @service.delete_file(request)
54
+ end
55
+
56
+ # List files in a directory according to query flags
57
+ def list_files(directory, recursive: false, pattern: nil, respect_gitignore: false, include_metadata: true, include_content: false)
58
+ request = {
59
+ directory: directory,
60
+ recursive: recursive,
61
+ pattern: pattern,
62
+ respect_gitignore: respect_gitignore,
63
+ include_metadata: include_metadata,
64
+ include_content: include_content
65
+ }
66
+
67
+ result = @service.list_files(request)
68
+
69
+ if result.respond_to?(:files)
70
+ # gRPC mode
71
+ result.files
72
+ else
73
+ # Fallback mode
74
+ result[:files]
75
+ end
76
+ end
77
+
78
+ # Create a directory
79
+ def create_directory(path)
80
+ request = { path: path }
81
+ @service.create_directory(request)
82
+ end
83
+
84
+ # Delete a directory
85
+ def delete_directory(path)
86
+ request = { path: path }
87
+ @service.delete_directory(request)
88
+ end
89
+
90
+ # Upload large files in chunks
91
+ def upload(chunks)
92
+ request = { chunks: chunks }
93
+ result = @service.upload(request)
94
+
95
+ if result.respond_to?(:file)
96
+ # gRPC mode
97
+ result.file
98
+ else
99
+ # Fallback mode
100
+ result[:file]
101
+ end
102
+ end
103
+
104
+ # Download a file in chunks
105
+ def download(path)
106
+ request = { path: path }
107
+ @service.download(request)
108
+ end
109
+ end
110
+ end
111
+ end