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
data/lib/makit/tasks.rb CHANGED
@@ -1,150 +1,15 @@
1
- # frozen_string_literal: true
2
- require "digest"
3
- require "rake/clean"
4
- #require "sqlite3"
5
-
6
- # This module provides classes for the Makit gem.
7
- module Makit
8
- # This class provide methods for managing persistent data for the makit gem
9
- class Tasks
10
- def self.run_default_commands(task_name)
11
- Makit::LOGGER.debug("Running default commands for task: #{task_name}")
12
- end
13
- end
14
- end
15
-
16
- desc "Remove any temporary products."
17
- task :clean do
18
- Makit::SHOW.task(:clean)
19
- Makit::RUNNER.run(Makit::RUNNER.parse_command_request("git clean -dXf"))
20
- end
21
-
22
- desc "Integrate changes into the git repository."
23
- task :integrate do
24
- Makit::TaskInfo.track(:integrate) do
25
- unstaged_files = Makit::Git.unstaged_files
26
- untracked_files = Makit::Git.untracked_files
27
- if unstaged_files.length > 0 || untracked_files.length > 0
28
- Makit::Git.integrate
29
- else
30
- puts " No unstaged or untracked files found".colorize(:grey)
31
- end
32
- end
33
- end
34
-
35
- #
36
- # Tag task
37
- #
38
- desc "tag the current version"
39
- task :tag do
40
- Makit::TaskInfo.track(:tag) do
41
- # check if the variable VERSION is defined
42
- if !defined?(VERSION)
43
- puts " VERSION is not defined".colorize(:red)
44
- return
45
- end
46
-
47
- Makit::Git.tag(VERSION)
48
- end
49
- end
50
-
51
- desc "Sync changes with the git repository."
52
- task :sync => [:integrate, :pull_incoming] do
53
- Makit::TaskInfo.track(:sync) do
54
- #Makit::SHOW.task(:sync)
55
- Makit::Git.sync
56
- end
57
- end
58
-
59
- task :pull do
60
- Makit::SHOW.task(:pull)
61
- Makit::Git.pull
62
- end
63
-
64
- desc "pull changes from the remote branch, preferring incoming changes for conflicts"
65
- task :pull_incoming do
66
- Makit::TaskInfo.track(:pull_incoming) do
67
- #Makit::SHOW.task(:pull_incoming)
68
- puts " git branch is ".colorize(:grey) + "#{Makit::Git.branch}".colorize(:green)
69
- "git pull origin #{Makit::Git.branch} -X theirs".try
70
- end
71
- end
72
-
73
- desc "Format source code."
74
- task :format do
75
- Makit::SHOW.task(:format)
76
- Makit::RUNNER.try("rufo .") if File.exist?("Gemfile") || File.exist?("Rakefile")
77
- end
78
-
79
- #
80
- # Update docs task
81
- #
82
- desc "update the docs for the project"
83
- task :update_docs do
84
- Makit::TaskInfo.track(:update_docs) do
85
- mod_time = Makit::GIT_FILE_INFOS.select {
86
- |file|
87
- file.name.include?("src/" || file.name.include?("test/") || file.name.include?("artifacts/"))
88
- }.first.mtime
89
- if (Makit::Git.untracked_files.length > 0 ||
90
- Makit::Git.unstaged_files.length > 0)
91
- File.delete("docs/Rake.md") if File.exist?("docs/Rake.md")
92
- File.delete("docs/Files.md") if File.exist?("docs/Files.md")
93
- end
94
-
95
- Makit::Docs::Rake.generate if File.exist?("docs/Rake.md")
96
- Makit::Docs::Files.generate if File.exist?("docs/Files.md")
97
- Makit::DotNet.generate_docs
98
- end
99
- end
100
-
101
- desc "Update dependencies."
102
- task :update do
103
- Makit::SHOW.task(:update)
104
- yesterday = Time.now - 24 * 60 * 60
105
- system("bundle update") if File.exist?("Gemfile")
106
- # glob all *.csproj files
107
- Dir.glob("**/*.csproj").each do |file|
108
- #"dotnet format #{file}".cache_try(yesterday)
109
- end
110
- end
111
-
112
- desc "Upgrade the nuget packages to the latest available version"
113
- task :update_nuget_packages do
114
- "dotnet tool install --global dotnet-outdated-tool".try
115
- "dotnet outdated --upgrade:Auto .".try
116
- end
117
-
118
- # Register the at_exit hook for cleanup
119
- at_exit do
120
- #puts "at_exit in tasks.rb...."
121
-
122
- puts " "
123
-
124
- if (Makit::Docs::Rake.get_top_task_name == "default")
125
- # let define some properties
126
- properties = {
127
- "version" => (defined?(VERSION) ? VERSION : ""),
128
- "branch" => Makit::Git.branch,
129
- "user" => ENV["USER"],
130
- "machine" => ENV["COMPUTERNAME"],
131
- "os" => ENV["OS"],
132
- "largest src" => (tracked = Makit::Git.get_file_infos).empty? ? "none" : tracked.max_by(&:size).name,
133
- "largest src size" => (tracked = Makit::Git.get_file_infos).empty? ? "0 bytes" : Makit::Humanize.get_humanized_size(tracked.max_by(&:size).size),
134
- "largest artifact" => (untracked = Makit::Git.get_untracked_file_infos).empty? ? "none" : untracked.max_by(&:size).name,
135
- "largest artifact size" => (untracked = Makit::Git.get_untracked_file_infos).empty? ? "0 bytes" : Makit::Humanize.get_humanized_size(untracked.max_by(&:size).size),
136
- "slowest task" => Makit::TaskInfo.slowest_task_name,
137
- }
138
-
139
- # display the properties as a table, right justify the key to 20 characters
140
- properties.each do |key, value|
141
- puts " #{key.ljust(25)} ".colorize(:grey) + "#{value}".colorize(:green)
142
- end
143
- puts " "
144
- end
145
-
146
- # display the duration
147
-
148
- duration = Time.now - Makit::STARTTIME
149
- puts " rake #{Makit::Docs::Rake.get_top_task_name}".colorize(:green) + " on branch ".colorize(:grey) + "#{Makit::Git.branch}".colorize(:green) + " completed in ".colorize(:grey) + Makit::Humanize.get_humanized_duration(duration).colorize(:green)
150
- end
1
+ # frozen_string_literal: true
2
+
3
+ # Load all task-related modules
4
+ require_relative "tasks/hook_manager"
5
+ require_relative "tasks/task_monkey_patch"
6
+
7
+ require_relative "tasks/clean"
8
+ require_relative "tasks/integrate"
9
+ require_relative "tasks/tag"
10
+ require_relative "tasks/pull_incoming"
11
+ #require_relative "tasks/publish"
12
+ #require_relative "tasks/install"
13
+ require_relative "tasks/sync"
14
+ #require_relative "tasks/configure"
15
+ require_relative "tasks/setup"
@@ -0,0 +1,239 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Makit
4
+ class TestCache
5
+ # Cache configuration
6
+ CACHE_BASE_DIR = File.join(Makit::Directories::PROJECT_ARTIFACTS, "test_cache").freeze
7
+ CACHE_METADATA_FILE = ".cache_metadata.json"
8
+ DEFAULT_TTL = 3600 # 1 hour cache by default
9
+
10
+ class << self
11
+ def setup
12
+ FileUtils.mkdir_p(CACHE_BASE_DIR)
13
+ end
14
+
15
+ # Main caching method - wraps expensive test operations
16
+ def with_cache(test_instance, cache_key, dependencies: [], ttl: DEFAULT_TTL, &block)
17
+ return yield unless should_cache?
18
+
19
+ cache_dir = cache_directory_for(test_instance, cache_key)
20
+ metadata = read_cache_metadata(cache_dir)
21
+
22
+ if cache_valid?(cache_dir, metadata, dependencies, ttl)
23
+ skip_with_cache_message(test_instance, cache_key, metadata)
24
+ return :cached
25
+ end
26
+
27
+ # Cache miss or invalid - run the expensive operation
28
+ cleanup_cache_directory(cache_dir)
29
+ FileUtils.mkdir_p(cache_dir)
30
+
31
+ # Execute the block in the cache directory context
32
+ result = Dir.chdir(cache_dir, &block)
33
+
34
+ # Write cache metadata
35
+ write_cache_metadata(cache_dir, dependencies)
36
+
37
+ result
38
+ end
39
+
40
+ # Directory-based caching - checks if directory exists and is valid
41
+ def cache_directory(test_instance, cache_key, dependencies: [], ttl: DEFAULT_TTL)
42
+ return nil unless should_cache?
43
+
44
+ cache_dir = cache_directory_for(test_instance, cache_key)
45
+ metadata = read_cache_metadata(cache_dir)
46
+
47
+ if cache_valid?(cache_dir, metadata, dependencies, ttl)
48
+ skip_with_cache_message(test_instance, cache_key, metadata)
49
+ return cache_dir
50
+ end
51
+
52
+ # Prepare fresh cache directory
53
+ cleanup_cache_directory(cache_dir)
54
+ FileUtils.mkdir_p(cache_dir)
55
+
56
+ cache_dir
57
+ end
58
+
59
+ # File-based caching - checks if specific files exist and are valid
60
+ def cache_files(test_instance, cache_key, expected_files, dependencies: [], ttl: DEFAULT_TTL)
61
+ return false unless should_cache?
62
+
63
+ cache_dir = cache_directory_for(test_instance, cache_key)
64
+ metadata = read_cache_metadata(cache_dir)
65
+
66
+ # Check if all expected files exist
67
+ files_exist = expected_files.all? do |file|
68
+ File.exist?(File.join(cache_dir, file))
69
+ end
70
+
71
+ if files_exist && cache_valid?(cache_dir, metadata, dependencies, ttl)
72
+ skip_with_cache_message(test_instance, cache_key, metadata)
73
+ return true
74
+ end
75
+
76
+ false
77
+ end
78
+
79
+ # Clear all test caches
80
+ def clear_all
81
+ FileUtils.rm_rf(CACHE_BASE_DIR)
82
+ puts "🗑️ Cleared all test caches".colorize(:grey)
83
+ end
84
+
85
+ # Clear caches for specific test class
86
+ def clear_for_class(test_class)
87
+ class_cache_dir = File.join(CACHE_BASE_DIR, class_cache_key(test_class))
88
+ FileUtils.rm_rf(class_cache_dir)
89
+ puts "🗑️ Cleared test caches for #{test_class}".colorize(:grey)
90
+ end
91
+
92
+ # Get cache statistics
93
+ def cache_stats
94
+ return { total_size: 0, cache_count: 0, cache_dirs: [] } unless Dir.exist?(CACHE_BASE_DIR)
95
+
96
+ cache_dirs = Dir.glob(File.join(CACHE_BASE_DIR, "**", "*")).select { |d| Dir.exist?(d) }
97
+ total_size = cache_dirs.sum { |dir| directory_size(dir) }
98
+
99
+ {
100
+ total_size: total_size,
101
+ cache_count: cache_dirs.length,
102
+ cache_dirs: cache_dirs.map { |d| d.sub("#{CACHE_BASE_DIR}/", "") },
103
+ }
104
+ end
105
+
106
+ private
107
+
108
+ def should_cache?
109
+ # Don't cache in CI environments by default (ensures clean runs)
110
+ return false if ENV["CI"] == "true"
111
+
112
+ # Don't cache if explicitly disabled
113
+ return false if ENV["MAKIT_DISABLE_TEST_CACHE"] == "true"
114
+
115
+ # Don't cache during test development/debugging
116
+ return false if ENV["MAKIT_TEST_DEBUG"] == "true"
117
+
118
+ # Don't cache in test environment unless explicitly testing the cache
119
+ return false if ENV["MAKIT_TESTING"] == "true" && ENV["MAKIT_TESTING_CACHE"] != "true"
120
+
121
+ true
122
+ end
123
+
124
+ def cache_directory_for(test_instance, cache_key)
125
+ test_class = test_instance.class.name.gsub("::", "/")
126
+ test_method = test_instance.name
127
+
128
+ File.join(CACHE_BASE_DIR, test_class, test_method, cache_key)
129
+ end
130
+
131
+ def class_cache_key(test_class)
132
+ test_class.name.gsub("::", "/")
133
+ end
134
+
135
+ def cache_valid?(cache_dir, metadata, dependencies, ttl)
136
+ return false unless Dir.exist?(cache_dir)
137
+ return false unless metadata
138
+
139
+ # Check TTL
140
+ cache_age = Time.now - Time.parse(metadata["created_at"])
141
+ return false if cache_age > ttl
142
+
143
+ # Check dependencies
144
+ return false unless dependencies_current?(metadata["dependencies"], dependencies)
145
+
146
+ # Check if cache directory has content
147
+ entries = Dir.entries(cache_dir) - [".", "..", CACHE_METADATA_FILE]
148
+ entries.any?
149
+ end
150
+
151
+ def dependencies_current?(cached_deps, current_deps)
152
+ return true if current_deps.empty?
153
+
154
+ current_deps.each do |dep_file|
155
+ next unless File.exist?(dep_file)
156
+
157
+ current_mtime = File.mtime(dep_file).to_i
158
+ cached_mtime = cached_deps&.dig(dep_file)
159
+
160
+ return false if cached_mtime.nil? || current_mtime > cached_mtime
161
+ end
162
+
163
+ true
164
+ end
165
+
166
+ def read_cache_metadata(cache_dir)
167
+ metadata_file = File.join(cache_dir, CACHE_METADATA_FILE)
168
+ return nil unless File.exist?(metadata_file)
169
+
170
+ JSON.parse(File.read(metadata_file))
171
+ rescue JSON::ParserError
172
+ nil
173
+ end
174
+
175
+ def write_cache_metadata(cache_dir, dependencies)
176
+ metadata = {
177
+ created_at: Time.now.iso8601,
178
+ dependencies: dependencies.each_with_object({}) do |dep_file, hash|
179
+ hash[dep_file] = File.exist?(dep_file) ? File.mtime(dep_file).to_i : nil
180
+ end,
181
+ }
182
+
183
+ metadata_file = File.join(cache_dir, CACHE_METADATA_FILE)
184
+ File.write(metadata_file, JSON.pretty_generate(metadata))
185
+ end
186
+
187
+ def skip_with_cache_message(test_instance, cache_key, metadata)
188
+ cache_age = Time.now - Time.parse(metadata["created_at"])
189
+ age_text = format_duration(cache_age)
190
+
191
+ test_instance.skip("💨 Using cached result for '#{cache_key}' (cached #{age_text} ago)")
192
+ end
193
+
194
+ def cleanup_cache_directory(cache_dir)
195
+ FileUtils.rm_rf(cache_dir)
196
+ end
197
+
198
+ def directory_size(dir_path)
199
+ Dir.glob(File.join(dir_path, "**", "*"))
200
+ .select { |f| File.file?(f) }
201
+ .sum { |f| File.size(f) }
202
+ end
203
+
204
+ def format_duration(seconds)
205
+ if seconds < 60
206
+ "#{seconds.round}s"
207
+ elsif seconds < 3600
208
+ minutes = (seconds / 60).round
209
+ "#{minutes}m"
210
+ else
211
+ hours = (seconds / 3600).round
212
+ "#{hours}h"
213
+ end
214
+ end
215
+ end
216
+ end
217
+
218
+ # Mixin module for test classes to provide caching helpers
219
+ module TestCacheHelpers
220
+ def cache_expensive_operation(cache_key, dependencies: [], ttl: Makit::TestCache::DEFAULT_TTL, &block)
221
+ Makit::TestCache.with_cache(self, cache_key,
222
+ dependencies: dependencies,
223
+ ttl: ttl,
224
+ &block)
225
+ end
226
+
227
+ def cached_directory(cache_key, dependencies: [], ttl: Makit::TestCache::DEFAULT_TTL)
228
+ Makit::TestCache.cache_directory(self, cache_key,
229
+ dependencies: dependencies,
230
+ ttl: ttl)
231
+ end
232
+
233
+ def cached_files_exist?(cache_key, expected_files, dependencies: [], ttl: Makit::TestCache::DEFAULT_TTL)
234
+ Makit::TestCache.cache_files(self, cache_key, expected_files,
235
+ dependencies: dependencies,
236
+ ttl: ttl)
237
+ end
238
+ end
239
+ end
data/lib/makit/tree.rb CHANGED
@@ -1,37 +1,37 @@
1
- # frozen_string_literal: true
2
-
3
- # This module provides classes for the Makit gem.
4
- module Makit
5
- class Tree
6
- def get_source_tree
7
- files = `git ls-files`.split("\n")
8
- tree = {}
9
-
10
- # Build a nested hash representing the file structure
11
- files.each do |file|
12
- parts = file.split("/")
13
- current = tree
14
-
15
- parts.each_with_index do |part, index|
16
- current[part] ||= (index == parts.length - 1 ? nil : {})
17
- current = current[part] unless current[part].nil?
18
- end
19
- end
20
-
21
- generate_tree_string(tree)
22
- end
23
-
24
- def generate_tree_string(tree, indent = "")
25
- result = ""
26
- tree.each do |key, value|
27
- if value.is_a?(Hash)
28
- result << "#{indent}#{key}/\n"
29
- result << generate_tree_string(value, "#{indent} ")
30
- else
31
- result << "#{indent}#{key}\n"
32
- end
33
- end
34
- result
35
- end
36
- end
37
- end
1
+ # frozen_string_literal: true
2
+
3
+ # This module provides classes for the Makit gem.
4
+ module Makit
5
+ class Tree
6
+ def get_source_tree
7
+ files = `git ls-files`.split("\n")
8
+ tree = {}
9
+
10
+ # Build a nested hash representing the file structure
11
+ files.each do |file|
12
+ parts = file.split("/")
13
+ current = tree
14
+
15
+ parts.each_with_index do |part, index|
16
+ current[part] ||= (index == parts.length - 1 ? nil : {})
17
+ current = current[part] unless current[part].nil?
18
+ end
19
+ end
20
+
21
+ generate_tree_string(tree)
22
+ end
23
+
24
+ def generate_tree_string(tree, indent = "")
25
+ result = ""
26
+ tree.each do |key, value|
27
+ if value.is_a?(Hash)
28
+ result << "#{indent}#{key}/\n"
29
+ result << generate_tree_string(value, "#{indent} ")
30
+ else
31
+ result << "#{indent}#{key}\n"
32
+ end
33
+ end
34
+ result
35
+ end
36
+ end
37
+ end
@@ -2,11 +2,10 @@
2
2
  # Generated by the protocol buffer compiler. DO NOT EDIT!
3
3
  # source: lib/makit/v1/makit.v1.proto
4
4
 
5
- require 'google/protobuf'
6
-
7
- require 'google/protobuf/timestamp_pb'
8
- require 'google/protobuf/duration_pb'
5
+ require "google/protobuf"
9
6
 
7
+ require "google/protobuf/timestamp_pb"
8
+ require "google/protobuf/duration_pb"
10
9
 
11
10
  descriptor_data = "\n\x1blib/makit/v1/makit.v1.proto\x12\x08makit.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\"/\n\x0b\x45nvironment\x12\n\n\x02os\x18\x01 \x01(\t\x12\x14\n\x0c\x61rchitecture\x18\x02 \x01(\t\"\x92\x02\n\rDotNetProject\x12\x10\n\x08template\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06output\x18\x03 \x01(\t\x12\x10\n\x08packages\x18\x04 \x03(\t\x12\x12\n\nreferences\x18\x05 \x03(\t\x12\n\n\x02os\x18\x06 \x01(\t\x12\x10\n\x08\x63ommands\x18\x07 \x03(\t\x12-\n\nbuild_args\x18\x08 \x03(\x0b\x32\x19.makit.v1.DotNetBuildArgs\x12\x31\n\x0cpublish_args\x18\t \x03(\x0b\x32\x1b.makit.v1.DotNetPublishArgs\x12+\n\ttest_args\x18\n \x03(\x0b\x32\x18.makit.v1.DotNetTestArgs\"8\n\x0f\x44otNetBuildArgs\x12\x15\n\rconfiguration\x18\x01 \x01(\t\x12\x0e\n\x06output\x18\x02 \x01(\t\":\n\x11\x44otNetPublishArgs\x12\x15\n\rconfiguration\x18\x01 \x01(\t\x12\x0e\n\x06output\x18\x02 \x01(\t\"7\n\x0e\x44otNetTestArgs\x12\x15\n\rconfiguration\x18\x01 \x01(\t\x12\x0e\n\x06output\x18\x02 \x01(\t\"\xa8\x01\n\x07Project\x12\x16\n\x0egit_remote_url\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x11\n\tartifacts\x18\x03 \x03(\t\x12\x32\n\x10\x63ommand_requests\x18\x04 \x03(\x0b\x32\x18.makit.v1.CommandRequest\x12\x30\n\x0f\x64otnet_projects\x18\x05 \x03(\x0b\x32\x17.makit.v1.DotNetProject\"\xa5\x01\n\x0e\x43ommandRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\targuments\x18\x02 \x03(\t\x12+\n\x07timeout\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x11\n\tdirectory\x18\x04 \x01(\t\x12\x0c\n\x04task\x18\x05 \x01(\t\x12\r\n\x05input\x18\x06 \x01(\x0c\x12\x15\n\rexit_on_error\x18\x07 \x01(\x08\"\x91\x02\n\x07\x43ommand\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x11\n\targuments\x18\x03 \x03(\t\x12\x11\n\texit_code\x18\x04 \x01(\x05\x12\r\n\x05input\x18\x05 \x01(\x0c\x12\x0e\n\x06output\x18\x06 \x01(\x0c\x12\r\n\x05\x65rror\x18\x07 \x01(\x0c\x12.\n\nstarted_at\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12+\n\x08\x64uration\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0c\n\x04user\x18\n \x01(\t\x12\x0e\n\x06\x64\x65vice\x18\x0b \x01(\t\x12\n\n\x02os\x18\x0c \x01(\t\x12\x11\n\tdirectory\x18\r \x01(\t\"I\n\rConfiguration\x12\x0c\n\x04name\x18\x01 \x01(\t\x12*\n\x08\x63ommands\x18\x02 \x03(\x0b\x32\x18.makit.v1.CommandRequest\"3\n\rGitRepository\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x15\n\rrelative_path\x18\x02 \x01(\t\"h\n\x0bGitLogEntry\x12\x0e\n\x06\x63ommit\x18\x01 \x01(\t\x12\x0e\n\x06\x61uthor\x18\x02 \x01(\t\x12(\n\x04\x64\x61te\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07message\x18\x04 \x01(\t\"\xc8\x01\n\nMakeResult\x12\x12\n\nrepository\x18\x01 \x01(\t\x12\x0e\n\x06\x63ommit\x18\x02 \x01(\t\x12\x0e\n\x06\x62ranch\x18\x03 \x01(\t\x12\x0b\n\x03tag\x18\x04 \x01(\t\x12\x0e\n\x06\x64\x65vice\x18\x05 \x01(\t\x12\x1a\n\x12runtime_identifier\x18\x06 \x01(\t\x12#\n\x08\x63ommands\x18\x07 \x03(\x0b\x32\x11.makit.v1.Command\x12\x14\n\x0cinitial_size\x18\x08 \x01(\x05\x12\x12\n\nfinal_size\x18\t \x01(\x05\"?\n\rDotNetNewArgs\x12\x10\n\x08template\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06output\x18\x03 \x01(\t\"^\n\rManifestEntry\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x31\n\rlast_modified\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04size\x18\x03 \x01(\x03**\n\x08Language\x12\x08\n\x04RUBY\x10\x00\x12\n\n\x06\x43SHARP\x10\x01\x12\x08\n\x04RUST\x10\x02*,\n\x0bPackageType\x12\x07\n\x03GEM\x10\x00\x12\t\n\x05NUGET\x10\x01\x12\t\n\x05\x43RATE\x10\x03\x32H\n\x0e\x43ommandService\x12\x36\n\x07\x45xecute\x12\x18.makit.v1.CommandRequest\x1a\x11.makit.v1.Commandb\x06proto3"
12
11
 
@@ -1,25 +1,27 @@
1
- # Generated by the protocol buffer compiler. DO NOT EDIT!
2
- # Source: lib/makit/v1/makit.v1.proto for package 'makit.v1'
3
-
4
- require "grpc"
5
- require_relative "makit.v1_pb"
6
-
7
- module Makit
8
- module V1
9
- module CommandService
10
- # Service to execute commands on devices.
11
- class Service
12
- include ::GRPC::GenericService
13
-
14
- self.marshal_class_method = :encode
15
- self.unmarshal_class_method = :decode
16
- self.service_name = "makit.v1.CommandService"
17
-
18
- # Execute a command on a device.
19
- rpc :Execute, ::Makit::V1::CommandRequest, ::Makit::V1::Command
20
- end
21
-
22
- Stub = Service.rpc_stub_class
23
- end
24
- end
25
- end
1
+ # frozen_string_literal: true
2
+
3
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
4
+ # Source: lib/makit/v1/makit.v1.proto for package 'makit.v1'
5
+
6
+ require "grpc"
7
+ require_relative "makit.v1_pb"
8
+
9
+ module Makit
10
+ module V1
11
+ module CommandService
12
+ # Service to execute commands on devices.
13
+ class Service
14
+ include ::GRPC::GenericService
15
+
16
+ self.marshal_class_method = :encode
17
+ self.unmarshal_class_method = :decode
18
+ self.service_name = "makit.v1.CommandService"
19
+
20
+ # Execute a command on a device.
21
+ rpc :Execute, ::Makit::V1::CommandRequest, ::Makit::V1::Command
22
+ end
23
+
24
+ Stub = Service.rpc_stub_class
25
+ end
26
+ end
27
+ end
data/lib/makit/version.rb CHANGED
@@ -1,61 +1,5 @@
1
- # frozen_string_literal: true
2
-
3
- module Makit
4
- VERSION = "0.0.99"
5
-
6
- class Version
7
- # given an array of version strings, return the highest version
8
- def self.get_highest_version(versions)
9
- versions.sort { |a, b| Gem::Version.new(a) <=> Gem::Version.new(b) }.last
10
- end
11
-
12
- # example content from .gitlab-ci.yml
13
- #variables:
14
- # VERSION: "0.0.26" # Define the version here
15
-
16
- def self.get_version_from_file(path)
17
- if (!File.exist?(path))
18
- raise "file #{path}does not exist"
19
- end
20
-
21
- extension = File.extname(path)
22
- case extension
23
- when ".csproj"
24
- Makit::Version.detect_from_file(path, /<Version>([-\w\d.]+)</)
25
- when ".wxs"
26
- Makit::Version.detect_from_file(path, / Version="([\d\.]+)"/)
27
- when ".yml"
28
- Makit::Version.detect_from_file(path, /VERSION:\s*["']?([\d\.]+)["']?/)
29
- else
30
- raise "unrecognized file type"
31
- end
32
- end
33
-
34
- def self.detect_from_file(filename, regex)
35
- if File.exist?(filename)
36
- match = IO.read(filename).match(regex)
37
- match.captures[0] if !match.nil? && match.captures.length.positive?
38
- else
39
- raise "unable to find version in #{filename}"
40
- end
41
- end
42
-
43
- def self.set_version_in_file(filename, version)
44
- text = IO.read(filename)
45
- new_text = text
46
- new_text = text.gsub(/VERSION:\s?['|"]([.\d]+)['|"]/, "VERSION: \"#{version}\"") if filename.include?(".yml")
47
- new_text = text.gsub(/version\s?=\s?['|"]([.\d]+)['|"]/, "version='#{version}'") if filename.include?(".gemspec")
48
- new_text = text.gsub(/<Version>([-\w\d.]+)</, "<Version>#{version}<") if filename.include?(".csproj")
49
- new_text = text.gsub(/<version>([-\w\d.]+)</, "<version>#{version}<") if filename.include?(".nuspec")
50
- new_text = text.gsub(/ Version="([\d\.]+)"/, " Version=\"#{version}\"") if filename.include?(".wxs")
51
- new_text = text.gsub(/version\s+=\s+['"]([\w.]+)['"]/, "version=\"#{version}\"") if filename.include?(".toml")
52
- File.open(filename, "w") { |f| f.write(new_text) } if new_text != text
53
- end
54
-
55
- def self.set_version_in_files(glob_pattern, version)
56
- Dir.glob(glob_pattern).each do |filename|
57
- set_version_in_file(filename, version)
58
- end
59
- end
60
- end
61
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Makit
4
+ VERSION = "0.0.112"
5
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Makit
4
+ # Version utility class for handling version comparisons
5
+ class Version
6
+ # Get the highest version from a list of version strings
7
+ #
8
+ # @param versions [Array<String>] array of version strings
9
+ # @return [String, nil] highest version string or nil if empty
10
+ def self.get_highest_version(versions)
11
+ return nil if versions.nil? || versions.empty?
12
+
13
+ # Sort versions using Gem::Version for proper semantic versioning
14
+ sorted_versions = versions.sort_by { |v| Gem::Version.new(v) }
15
+ sorted_versions.last
16
+ rescue ArgumentError
17
+ # If any version is invalid, fall back to string sorting
18
+ versions.sort.last
19
+ end
20
+ end
21
+ end