makit 0.0.99 → 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.
- checksums.yaml +4 -4
- data/README.md +41 -0
- data/exe/makit +5 -0
- data/lib/makit/apache.rb +7 -11
- data/lib/makit/cli/build_commands.rb +500 -0
- data/lib/makit/cli/generators/base_generator.rb +74 -0
- data/lib/makit/cli/generators/dotnet_generator.rb +50 -0
- data/lib/makit/cli/generators/generator_factory.rb +49 -0
- data/lib/makit/cli/generators/node_generator.rb +50 -0
- data/lib/makit/cli/generators/ruby_generator.rb +77 -0
- data/lib/makit/cli/generators/rust_generator.rb +50 -0
- data/lib/makit/cli/generators/templates/dotnet_templates.rb +167 -0
- data/lib/makit/cli/generators/templates/node_templates.rb +161 -0
- data/lib/makit/cli/generators/templates/ruby/gemfile.rb +26 -0
- data/lib/makit/cli/generators/templates/ruby/gemspec.rb +40 -0
- data/lib/makit/cli/generators/templates/ruby/main_lib.rb +33 -0
- data/lib/makit/cli/generators/templates/ruby/rakefile.rb +35 -0
- data/lib/makit/cli/generators/templates/ruby/readme.rb +63 -0
- data/lib/makit/cli/generators/templates/ruby/test.rb +39 -0
- data/lib/makit/cli/generators/templates/ruby/test_helper.rb +29 -0
- data/lib/makit/cli/generators/templates/ruby/version.rb +29 -0
- data/lib/makit/cli/generators/templates/rust_templates.rb +128 -0
- data/lib/makit/cli/main.rb +48 -19
- data/lib/makit/cli/project_commands.rb +868 -0
- data/lib/makit/cli/repository_commands.rb +661 -0
- data/lib/makit/cli/utility_commands.rb +521 -0
- data/lib/makit/command_runner.rb +187 -128
- data/lib/makit/commands/compatibility.rb +365 -0
- data/lib/makit/commands/factory.rb +359 -0
- data/lib/makit/commands/middleware/base.rb +73 -0
- data/lib/makit/commands/middleware/cache.rb +248 -0
- data/lib/makit/commands/middleware/command_logger.rb +323 -0
- data/lib/makit/commands/middleware/unified_logger.rb +243 -0
- data/lib/makit/commands/middleware/validator.rb +269 -0
- data/lib/makit/commands/request.rb +254 -0
- data/lib/makit/commands/result.rb +323 -0
- data/lib/makit/commands/runner.rb +317 -0
- data/lib/makit/commands/strategies/base.rb +160 -0
- data/lib/makit/commands/strategies/synchronous.rb +134 -0
- data/lib/makit/commands.rb +24 -3
- data/lib/makit/configuration/gitlab_helper.rb +60 -0
- data/lib/makit/configuration/project.rb +127 -0
- data/lib/makit/configuration/rakefile_helper.rb +43 -0
- data/lib/makit/configuration/step.rb +34 -0
- data/lib/makit/configuration.rb +14 -0
- data/lib/makit/content/default_gitignore.rb +4 -2
- data/lib/makit/content/default_rakefile.rb +4 -2
- data/lib/makit/content/gem_rakefile.rb +4 -2
- data/lib/makit/context.rb +1 -0
- data/lib/makit/data.rb +9 -10
- data/lib/makit/directories.rb +48 -52
- data/lib/makit/directory.rb +38 -52
- data/lib/makit/docs/files.rb +5 -10
- data/lib/makit/docs/rake.rb +16 -20
- data/lib/makit/dotnet/cli.rb +65 -0
- data/lib/makit/dotnet/project.rb +153 -0
- data/lib/makit/dotnet/solution.rb +38 -0
- data/lib/makit/dotnet/solution_classlib.rb +239 -0
- data/lib/makit/dotnet/solution_console.rb +264 -0
- data/lib/makit/dotnet/solution_maui.rb +354 -0
- data/lib/makit/dotnet/solution_wasm.rb +275 -0
- data/lib/makit/dotnet/solution_wpf.rb +304 -0
- data/lib/makit/dotnet.rb +54 -171
- data/lib/makit/email.rb +46 -17
- data/lib/makit/environment.rb +22 -19
- data/lib/makit/examples/runner.rb +370 -0
- data/lib/makit/exceptions.rb +45 -0
- data/lib/makit/fileinfo.rb +3 -5
- data/lib/makit/files.rb +12 -16
- data/lib/makit/gems.rb +40 -39
- data/lib/makit/git/cli.rb +54 -0
- data/lib/makit/git/repository.rb +90 -0
- data/lib/makit/git.rb +44 -91
- data/lib/makit/gitlab_runner.rb +0 -1
- data/lib/makit/humanize.rb +31 -23
- data/lib/makit/indexer.rb +15 -24
- data/lib/makit/logging/configuration.rb +305 -0
- data/lib/makit/logging/format_registry.rb +84 -0
- data/lib/makit/logging/formatters/base.rb +39 -0
- data/lib/makit/logging/formatters/console_formatter.rb +127 -0
- data/lib/makit/logging/formatters/json_formatter.rb +65 -0
- data/lib/makit/logging/formatters/plain_text_formatter.rb +71 -0
- data/lib/makit/logging/formatters/text_formatter.rb +64 -0
- data/lib/makit/logging/log_request.rb +115 -0
- data/lib/makit/logging/logger.rb +159 -0
- data/lib/makit/logging/sinks/base.rb +91 -0
- data/lib/makit/logging/sinks/console.rb +72 -0
- data/lib/makit/logging/sinks/file_sink.rb +92 -0
- data/lib/makit/logging/sinks/structured.rb +129 -0
- data/lib/makit/logging/sinks/unified_file_sink.rb +303 -0
- data/lib/makit/logging.rb +452 -37
- data/lib/makit/markdown.rb +18 -18
- data/lib/makit/mp/basic_object_mp.rb +5 -4
- data/lib/makit/mp/command_mp.rb +5 -5
- data/lib/makit/mp/command_request.mp.rb +3 -2
- data/lib/makit/mp/project_mp.rb +85 -96
- data/lib/makit/mp/string_mp.rb +245 -73
- data/lib/makit/nuget.rb +27 -25
- data/lib/makit/port.rb +25 -27
- data/lib/makit/process.rb +127 -29
- data/lib/makit/protoc.rb +27 -24
- data/lib/makit/rake/cli.rb +196 -0
- data/lib/makit/rake.rb +6 -6
- data/lib/makit/ruby/cli.rb +185 -0
- data/lib/makit/ruby.rb +25 -0
- data/lib/makit/secrets.rb +18 -18
- data/lib/makit/serializer.rb +29 -27
- data/lib/makit/services/builder.rb +186 -0
- data/lib/makit/services/error_handler.rb +226 -0
- data/lib/makit/services/repository_manager.rb +229 -0
- data/lib/makit/services/validator.rb +112 -0
- data/lib/makit/setup/classlib.rb +53 -0
- data/lib/makit/setup/gem.rb +250 -0
- data/lib/makit/setup/runner.rb +40 -0
- data/lib/makit/show.rb +16 -16
- data/lib/makit/storage.rb +32 -37
- data/lib/makit/symbols.rb +12 -0
- data/lib/makit/task_hooks.rb +125 -0
- data/lib/makit/task_info.rb +63 -21
- data/lib/makit/tasks/at_exit.rb +13 -0
- data/lib/makit/tasks/build.rb +18 -0
- data/lib/makit/tasks/clean.rb +11 -0
- data/lib/makit/tasks/hook_manager.rb +239 -0
- data/lib/makit/tasks/init.rb +47 -0
- data/lib/makit/tasks/integrate.rb +15 -0
- data/lib/makit/tasks/pull_incoming.rb +12 -0
- data/lib/makit/tasks/setup.rb +6 -0
- data/lib/makit/tasks/sync.rb +11 -0
- data/lib/makit/tasks/task_monkey_patch.rb +79 -0
- data/lib/makit/tasks.rb +5 -150
- data/lib/makit/test_cache.rb +239 -0
- data/lib/makit/v1/makit.v1_pb.rb +34 -35
- data/lib/makit/v1/makit.v1_services_pb.rb +2 -0
- data/lib/makit/version.rb +1 -57
- data/lib/makit/wix.rb +23 -23
- data/lib/makit/yaml.rb +18 -6
- data/lib/makit.rb +2 -261
- metadata +109 -145
- data/lib/makit/cli/clean.rb +0 -14
- data/lib/makit/cli/clone.rb +0 -59
- data/lib/makit/cli/init.rb +0 -38
- data/lib/makit/cli/make.rb +0 -54
- data/lib/makit/cli/new.rb +0 -37
- data/lib/makit/cli/nuget_cache.rb +0 -38
- data/lib/makit/cli/pull.rb +0 -31
- data/lib/makit/cli/setup.rb +0 -71
- data/lib/makit/cli/work.rb +0 -21
- data/lib/makit/content/default_gitignore.txt +0 -222
    
        data/lib/makit/tasks.rb
    CHANGED
    
    | @@ -1,150 +1,5 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 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"
         | 
| @@ -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/v1/makit.v1_pb.rb
    CHANGED
    
    | @@ -1,35 +1,34 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
            # Generated by the protocol buffer compiler.  DO NOT EDIT!
         | 
| 3 | 
            -
            # source: lib/makit/v1/makit.v1.proto
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            require  | 
| 6 | 
            -
             | 
| 7 | 
            -
            require  | 
| 8 | 
            -
            require  | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
            pool | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
            module  | 
| 17 | 
            -
             | 
| 18 | 
            -
                 | 
| 19 | 
            -
                 | 
| 20 | 
            -
                 | 
| 21 | 
            -
                 | 
| 22 | 
            -
                 | 
| 23 | 
            -
                 | 
| 24 | 
            -
                 | 
| 25 | 
            -
                 | 
| 26 | 
            -
                 | 
| 27 | 
            -
                 | 
| 28 | 
            -
                 | 
| 29 | 
            -
                 | 
| 30 | 
            -
                 | 
| 31 | 
            -
                 | 
| 32 | 
            -
                 | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
            end
         | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
            # Generated by the protocol buffer compiler.  DO NOT EDIT!
         | 
| 3 | 
            +
            # source: lib/makit/v1/makit.v1.proto
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            require "google/protobuf"
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            require "google/protobuf/timestamp_pb"
         | 
| 8 | 
            +
            require "google/protobuf/duration_pb"
         | 
| 9 | 
            +
             | 
| 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"
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            pool = Google::Protobuf::DescriptorPool.generated_pool
         | 
| 13 | 
            +
            pool.add_serialized_file(descriptor_data)
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            module Makit
         | 
| 16 | 
            +
              module V1
         | 
| 17 | 
            +
                Environment = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("makit.v1.Environment").msgclass
         | 
| 18 | 
            +
                DotNetProject = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("makit.v1.DotNetProject").msgclass
         | 
| 19 | 
            +
                DotNetBuildArgs = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("makit.v1.DotNetBuildArgs").msgclass
         | 
| 20 | 
            +
                DotNetPublishArgs = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("makit.v1.DotNetPublishArgs").msgclass
         | 
| 21 | 
            +
                DotNetTestArgs = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("makit.v1.DotNetTestArgs").msgclass
         | 
| 22 | 
            +
                Project = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("makit.v1.Project").msgclass
         | 
| 23 | 
            +
                CommandRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("makit.v1.CommandRequest").msgclass
         | 
| 24 | 
            +
                Command = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("makit.v1.Command").msgclass
         | 
| 25 | 
            +
                Configuration = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("makit.v1.Configuration").msgclass
         | 
| 26 | 
            +
                GitRepository = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("makit.v1.GitRepository").msgclass
         | 
| 27 | 
            +
                GitLogEntry = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("makit.v1.GitLogEntry").msgclass
         | 
| 28 | 
            +
                MakeResult = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("makit.v1.MakeResult").msgclass
         | 
| 29 | 
            +
                DotNetNewArgs = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("makit.v1.DotNetNewArgs").msgclass
         | 
| 30 | 
            +
                ManifestEntry = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("makit.v1.ManifestEntry").msgclass
         | 
| 31 | 
            +
                Language = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("makit.v1.Language").enummodule
         | 
| 32 | 
            +
                PackageType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("makit.v1.PackageType").enummodule
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
    
        data/lib/makit/version.rb
    CHANGED
    
    | @@ -1,61 +1,5 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 3 | 
             
            module Makit
         | 
| 4 | 
            -
              VERSION = "0.0. | 
| 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
         | 
| 4 | 
            +
              VERSION = "0.0.111"
         | 
| 61 5 | 
             
            end
         | 
    
        data/lib/makit/wix.rb
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require "securerandom"
         | 
| 2 4 |  | 
| 3 5 | 
             
            module Makit
         | 
| @@ -12,20 +14,18 @@ module Makit | |
| 12 14 | 
             
              #
         | 
| 13 15 | 
             
              class Wix
         | 
| 14 16 | 
             
                def self.setup
         | 
| 15 | 
            -
                  if  | 
| 17 | 
            +
                  if Makit::Environment.is_windows?
         | 
| 16 18 | 
             
                    # test if dotnet is installed
         | 
| 17 | 
            -
                    if  | 
| 18 | 
            -
                      puts "dotnet does not appear to be installed"
         | 
| 19 | 
            -
                    else
         | 
| 19 | 
            +
                    if Makit::DotNet.is_installed?
         | 
| 20 20 | 
             
                      # test if wix is already installed
         | 
| 21 | 
            -
                       | 
| 22 | 
            -
             | 
| 23 | 
            -
                      end
         | 
| 24 | 
            -
                      puts " Wix version " + "#{Wix::version}".colorize(:green)
         | 
| 21 | 
            +
                      "dotnet tool install --global wix".run unless `dotnet tool list --global`.include?("wix")
         | 
| 22 | 
            +
                      puts " Wix version #{Wix.version.to_s.colorize(:green)}"
         | 
| 25 23 | 
             
                      # display the link to https://wixtoolset.org/
         | 
| 26 24 | 
             
                      puts "  https://wixtoolset.org/".colorize(:green)
         | 
| 27 25 | 
             
                      # display the link to https://marketplace.visualstudio.com/items?itemName=FireGiant.FireGiantHeatWaveDev17
         | 
| 28 26 | 
             
                      puts "  https://marketplace.visualstudio.com/items?itemName=FireGiant.FireGiantHeatWaveDev17".colorize(:green)
         | 
| 27 | 
            +
                    else # !File.exist?(Makit::Environment.which("dotnet"))
         | 
| 28 | 
            +
                      puts "dotnet does not appear to be installed"
         | 
| 29 29 | 
             
                    end
         | 
| 30 30 | 
             
                  else
         | 
| 31 31 | 
             
                    puts "Wix is not supported on non-Windows platforms"
         | 
| @@ -41,33 +41,33 @@ module Makit | |
| 41 41 | 
             
                  FileUtils.mkdir_p(path) unless File.directory?(path)
         | 
| 42 42 | 
             
                  # create the #{name}.wixproj file
         | 
| 43 43 | 
             
                  File.open("#{path}/#{name}.wixproj", "w") do |f|
         | 
| 44 | 
            -
                    f.puts "<Project Sdk=\"WixToolset.Sdk/#{Wix | 
| 44 | 
            +
                    f.puts "<Project Sdk=\"WixToolset.Sdk/#{Wix.version}\">"
         | 
| 45 45 | 
             
                    f.puts "</Project>"
         | 
| 46 46 | 
             
                  end
         | 
| 47 47 | 
             
                  # create the Package.wxs file
         | 
| 48 48 | 
             
                  File.open("#{path}/Package.wxs", "w") do |f|
         | 
| 49 49 | 
             
                    f.puts "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">"
         | 
| 50 50 | 
             
                    f.puts "  <Package Name=\"#{name}\" Manufacturer=\"Acme\" Version=\"0.0.0.0\" UpgradeCode=\"#{SecureRandom.uuid}\">"
         | 
| 51 | 
            -
                    #f.puts "    <MajorUpgrade DowngradeErrorMessage=\"!(loc.DowngradeError)\" />"
         | 
| 51 | 
            +
                    # f.puts "    <MajorUpgrade DowngradeErrorMessage=\"!(loc.DowngradeError)\" />"
         | 
| 52 52 | 
             
                    f.puts "    <Files Include=\"#{files}\" />"
         | 
| 53 | 
            -
                    #f.puts "    <Feature Id=\"Main\">"
         | 
| 54 | 
            -
                    #f.puts "      <ComponentGroupRef Id=\"Components\" />"
         | 
| 55 | 
            -
                    #f.puts "    </Feature>"
         | 
| 53 | 
            +
                    # f.puts "    <Feature Id=\"Main\">"
         | 
| 54 | 
            +
                    # f.puts "      <ComponentGroupRef Id=\"Components\" />"
         | 
| 55 | 
            +
                    # f.puts "    </Feature>"
         | 
| 56 56 | 
             
                    f.puts "  </Package>"
         | 
| 57 57 | 
             
                    f.puts "</Wix>"
         | 
| 58 58 | 
             
                  end
         | 
| 59 59 | 
             
                end
         | 
| 60 | 
            -
              end | 
| 61 | 
            -
            end | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
            end
         | 
| 62 62 |  | 
| 63 63 | 
             
            # Package.wxs with File harvesting
         | 
| 64 | 
            -
             | 
| 64 | 
            +
            # <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
         | 
| 65 65 | 
             
            #    <Package Name="MyProduct" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="B0B15C00-1DC4-0374-A1D1-E902240936D5">
         | 
| 66 66 | 
             
            #        <Files Include="path\to\files\**" />
         | 
| 67 67 | 
             
            #    </Package>
         | 
| 68 | 
            -
             | 
| 68 | 
            +
            # </Wix>
         | 
| 69 69 |  | 
| 70 | 
            -
             | 
| 70 | 
            +
            # <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
         | 
| 71 71 | 
             
            #  <Package Name="Msi.Demo" Manufacturer="Acme" Version="1.0.0.0" UpgradeCode="a87571ec-8be3-447e-ae23-b3a94a85b727">
         | 
| 72 72 | 
             
            #    <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
         | 
| 73 73 |  | 
| @@ -75,13 +75,13 @@ end # module Makit | |
| 75 75 | 
             
            #      <ComponentGroupRef Id="Components" />
         | 
| 76 76 | 
             
            #    </Feature>
         | 
| 77 77 | 
             
            #  </Package>
         | 
| 78 | 
            -
             | 
| 78 | 
            +
            # </Wix>
         | 
| 79 79 |  | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 80 | 
            +
            # <Project Sdk="WixToolset.Sdk/5.0.1">
         | 
| 81 | 
            +
            # </Project>
         | 
| 82 82 |  | 
| 83 83 | 
             
            # Components.wxs
         | 
| 84 | 
            -
             | 
| 84 | 
            +
            # <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
         | 
| 85 85 | 
             
            #  <Fragment>
         | 
| 86 86 | 
             
            #    <ComponentGroup Id="Components" Directory="INSTALLFOLDER">
         | 
| 87 87 | 
             
            #		<Component Guid="b8085fb3-3718-46df-8bf6-ecf9f968dd3d">
         | 
| @@ -92,4 +92,4 @@ end # module Makit | |
| 92 92 | 
             
            #		</Component>
         | 
| 93 93 | 
             
            #    </ComponentGroup>
         | 
| 94 94 | 
             
            #  </Fragment>
         | 
| 95 | 
            -
             | 
| 95 | 
            +
            # </Wix>
         |