makit 0.0.0
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 +7 -0
 - data/.makit.project.json +4 -0
 - data/.makit.project.yml +2 -0
 - data/.rubocop.yml +22 -0
 - data/.ruby-version +1 -0
 - data/CHANGELOG.md +8 -0
 - data/CODE_OF_CONDUCT.md +84 -0
 - data/LICENSE +21 -0
 - data/README.md +119 -0
 - data/Rakefile +190 -0
 - data/docs/Commands.md +50 -0
 - data/docs_/Commands.md +166 -0
 - data/docs_/Minitest.Timeouts.md +332 -0
 - data/examples/protoc/Rakefile +31 -0
 - data/examples/rake_default/Rakefile +5 -0
 - data/examples/rubygem-foo/.gitkeep +0 -0
 - data/examples/rubygem-foo/Rakefile +3 -0
 - data/examples/run_mp/Rakefile +8 -0
 - data/exe/makit +5 -0
 - data/lib/makit/apache.rb +32 -0
 - data/lib/makit/cli/clean.rb +14 -0
 - data/lib/makit/cli/clone.rb +59 -0
 - data/lib/makit/cli/init.rb +38 -0
 - data/lib/makit/cli/main.rb +33 -0
 - data/lib/makit/cli/make.rb +54 -0
 - data/lib/makit/cli/new.rb +37 -0
 - data/lib/makit/cli/nuget_cache.rb +38 -0
 - data/lib/makit/cli/pull.rb +31 -0
 - data/lib/makit/cli/setup.rb +71 -0
 - data/lib/makit/cli/work.rb +21 -0
 - data/lib/makit/command_runner.rb +237 -0
 - data/lib/makit/commands.rb +21 -0
 - data/lib/makit/content/default_gitignore.rb +5 -0
 - data/lib/makit/content/default_gitignore.txt +222 -0
 - data/lib/makit/content/default_rakefile.rb +11 -0
 - data/lib/makit/content/gem_rakefile.rb +14 -0
 - data/lib/makit/content/ruby_gitlab-ci.yml +15 -0
 - data/lib/makit/data.rb +50 -0
 - data/lib/makit/directories.rb +140 -0
 - data/lib/makit/directory.rb +120 -0
 - data/lib/makit/dotnet.rb +16 -0
 - data/lib/makit/environment.rb +123 -0
 - data/lib/makit/files.rb +47 -0
 - data/lib/makit/git.rb +66 -0
 - data/lib/makit/gitlab_runner.rb +60 -0
 - data/lib/makit/humanize.rb +89 -0
 - data/lib/makit/logging.rb +96 -0
 - data/lib/makit/markdown.rb +75 -0
 - data/lib/makit/mp/basic_object_mp.rb +16 -0
 - data/lib/makit/mp/project_mp.rb +160 -0
 - data/lib/makit/mp/string_mp.rb +101 -0
 - data/lib/makit/nuget.rb +57 -0
 - data/lib/makit/protoc.rb +61 -0
 - data/lib/makit/serializer.rb +70 -0
 - data/lib/makit/storage.rb +131 -0
 - data/lib/makit/symbols.rb +149 -0
 - data/lib/makit/tasks.rb +63 -0
 - data/lib/makit/tree.rb +37 -0
 - data/lib/makit/v1/makit.v1.proto +103 -0
 - data/lib/makit/v1/makit.v1_pb.rb +30 -0
 - data/lib/makit/v1/makit.v1_services_pb.rb +26 -0
 - data/lib/makit/version.rb +12 -0
 - data/lib/makit/wix.rb +92 -0
 - data/lib/makit/zip.rb +17 -0
 - data/lib/makit.rb +243 -0
 - data/makit.generated.sln +30 -0
 - data/makit.sln +69 -0
 - data/pages/.gitignore +5 -0
 - data/pages/404.html +25 -0
 - data/pages/Gemfile +33 -0
 - data/pages/Gemfile.lock +88 -0
 - data/pages/_config.yml +55 -0
 - data/pages/_layouts/default.html +1 -0
 - data/pages/_posts/2024-10-05-welcome-to-jekyll.markdown +29 -0
 - data/pages/about.markdown +18 -0
 - data/pages/index.markdown +6 -0
 - data/sig/makit.rbs +4 -0
 - data/src/ClassLib/Class1.cs +6 -0
 - data/src/ClassLib/ClassLib.csproj +13 -0
 - metadata +251 -0
 
| 
         @@ -0,0 +1,160 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
            require "json"
         
     | 
| 
      
 3 
     | 
    
         
            +
            require "yaml"
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module Makit
         
     | 
| 
      
 6 
     | 
    
         
            +
              module V1
         
     | 
| 
      
 7 
     | 
    
         
            +
                class Project
         
     | 
| 
      
 8 
     | 
    
         
            +
                  def to_yaml
         
     | 
| 
      
 9 
     | 
    
         
            +
                    data = JSON.parse(self.to_pretty_json)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    data.to_yaml.sub(/^---\n/, '')
         
     | 
| 
      
 11 
     | 
    
         
            +
                  end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                  def self.create
         
     | 
| 
      
 14 
     | 
    
         
            +
                    project = nil
         
     | 
| 
      
 15 
     | 
    
         
            +
                    if (File.exist?(".makit.project.yml"))
         
     | 
| 
      
 16 
     | 
    
         
            +
                        yaml = File.read(".makit.project.yml")
         
     | 
| 
      
 17 
     | 
    
         
            +
                        # convert yaml to json
         
     | 
| 
      
 18 
     | 
    
         
            +
                        data = YAML.load(yaml)
         
     | 
| 
      
 19 
     | 
    
         
            +
                        json = JSON.pretty_generate(data)
         
     | 
| 
      
 20 
     | 
    
         
            +
                        project = Makit::V1::Project.decode_json(json)
         
     | 
| 
      
 21 
     | 
    
         
            +
                    
         
     | 
| 
      
 22 
     | 
    
         
            +
                    else
         
     | 
| 
      
 23 
     | 
    
         
            +
                      if (File.exist?(".makit.project.json"))
         
     | 
| 
      
 24 
     | 
    
         
            +
                            json = File.read("project.json")
         
     | 
| 
      
 25 
     | 
    
         
            +
                            project = Makit::V1::Project.decode_json(json)
         
     | 
| 
      
 26 
     | 
    
         
            +
                      else
         
     | 
| 
      
 27 
     | 
    
         
            +
                        project = Makit::V1::Project.new
         
     | 
| 
      
 28 
     | 
    
         
            +
                      end
         
     | 
| 
      
 29 
     | 
    
         
            +
                    end
         
     | 
| 
      
 30 
     | 
    
         
            +
                    project.set_default_values
         
     | 
| 
      
 31 
     | 
    
         
            +
                    project
         
     | 
| 
      
 32 
     | 
    
         
            +
                  end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                  def set_default_values
         
     | 
| 
      
 35 
     | 
    
         
            +
                    #self.language = "csharp"
         
     | 
| 
      
 36 
     | 
    
         
            +
                    #self.primary_artifact_type = "nuget"
         
     | 
| 
      
 37 
     | 
    
         
            +
                    if self.git_remote_url.nil? || self.git_remote_url.empty?
         
     | 
| 
      
 38 
     | 
    
         
            +
                        self.git_remote_url = `git remote get-url origin`.strip
         
     | 
| 
      
 39 
     | 
    
         
            +
                    end
         
     | 
| 
      
 40 
     | 
    
         
            +
                    if self.name.nil? || self.name.empty?
         
     | 
| 
      
 41 
     | 
    
         
            +
                        if(!self.git_remote_url.nil? && !self.git_remote_url.empty?)
         
     | 
| 
      
 42 
     | 
    
         
            +
                            self.name =get_name(File.basename(self.git_remote_url,".git"))# get_capitalized_name(File.basename(self.git_remote_url, ".git"))
         
     | 
| 
      
 43 
     | 
    
         
            +
                        else
         
     | 
| 
      
 44 
     | 
    
         
            +
                            self.name =get_name(File.basename(Dir.getwd))# get_capitalized_name(File.basename(Dir.getwd))
         
     | 
| 
      
 45 
     | 
    
         
            +
                        end
         
     | 
| 
      
 46 
     | 
    
         
            +
                    end
         
     | 
| 
      
 47 
     | 
    
         
            +
                    self
         
     | 
| 
      
 48 
     | 
    
         
            +
                  end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                  def get_name(name)
         
     | 
| 
      
 51 
     | 
    
         
            +
                    if !self.git_remote_url.nil? && !self.git_remote_url.empty?
         
     | 
| 
      
 52 
     | 
    
         
            +
                        is_dotnet = self.git_remote_url.include?("nuget")
         
     | 
| 
      
 53 
     | 
    
         
            +
                        if is_dotnet
         
     | 
| 
      
 54 
     | 
    
         
            +
                            get_capitalized_name(name)
         
     | 
| 
      
 55 
     | 
    
         
            +
                        end
         
     | 
| 
      
 56 
     | 
    
         
            +
                    end
         
     | 
| 
      
 57 
     | 
    
         
            +
                    name.downcase
         
     | 
| 
      
 58 
     | 
    
         
            +
                  end
         
     | 
| 
      
 59 
     | 
    
         
            +
                  def get_capitalized_name(name)
         
     | 
| 
      
 60 
     | 
    
         
            +
                    name.split(".").map(&:capitalize).join(".")
         
     | 
| 
      
 61 
     | 
    
         
            +
                  end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                  def save_as(filename)
         
     | 
| 
      
 64 
     | 
    
         
            +
                    extension = File.extname(filename)
         
     | 
| 
      
 65 
     | 
    
         
            +
                    case extension
         
     | 
| 
      
 66 
     | 
    
         
            +
                    when ".json"
         
     | 
| 
      
 67 
     | 
    
         
            +
                      File.write(filename, self.to_pretty_json)
         
     | 
| 
      
 68 
     | 
    
         
            +
                    when ".yml"
         
     | 
| 
      
 69 
     | 
    
         
            +
                      File.write(filename, self.to_yaml)
         
     | 
| 
      
 70 
     | 
    
         
            +
                    else
         
     | 
| 
      
 71 
     | 
    
         
            +
                      raise "unsupported file extension: #{extension}"
         
     | 
| 
      
 72 
     | 
    
         
            +
                    end
         
     | 
| 
      
 73 
     | 
    
         
            +
                  end
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
                  def with_dotnet_project(template,name,output)
         
     | 
| 
      
 76 
     | 
    
         
            +
                    if !self.dotnet_projects.any? { |project| project.output== output }
         
     | 
| 
      
 77 
     | 
    
         
            +
                      project = Makit::V1::DotNetProject.new
         
     | 
| 
      
 78 
     | 
    
         
            +
                        project.template = template
         
     | 
| 
      
 79 
     | 
    
         
            +
                        project.name = name
         
     | 
| 
      
 80 
     | 
    
         
            +
                        project.output = output
         
     | 
| 
      
 81 
     | 
    
         
            +
                        self.dotnet_projects << project
         
     | 
| 
      
 82 
     | 
    
         
            +
                    end
         
     | 
| 
      
 83 
     | 
    
         
            +
                  end
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
                  def setup_dotnet_projects
         
     | 
| 
      
 86 
     | 
    
         
            +
                    if self.dotnet_projects.any?
         
     | 
| 
      
 87 
     | 
    
         
            +
                        if(!File.exist?("#{self.name}.sln"))
         
     | 
| 
      
 88 
     | 
    
         
            +
                            puts "  Creating solution file: " + "#{self.name}.sln".colorize(:green)
         
     | 
| 
      
 89 
     | 
    
         
            +
                            "dotnet new sln -n #{self.name}".run unless File.exist?("#{self.name}.sln")
         
     | 
| 
      
 90 
     | 
    
         
            +
                        else
         
     | 
| 
      
 91 
     | 
    
         
            +
                            puts "  Solution file already exists: " + "#{self.name}.sln".colorize(:yellow)
         
     | 
| 
      
 92 
     | 
    
         
            +
                        end
         
     | 
| 
      
 93 
     | 
    
         
            +
                        self.dotnet_projects.each do |project|
         
     | 
| 
      
 94 
     | 
    
         
            +
                            if(!Dir.exist?("#{project.output}"))
         
     | 
| 
      
 95 
     | 
    
         
            +
                                puts "  Creating project file: " + "#{project.name}/#{project.name}.csproj".colorize(:green)
         
     | 
| 
      
 96 
     | 
    
         
            +
                                "dotnet new #{project.template} -n #{project.name} -o #{project.output}".run unless Dir.exist?("#{project.output}")
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
                                # add the .csproj file to the .sln
         
     | 
| 
      
 99 
     | 
    
         
            +
                                puts "  Adding project to solution: " + "#{project.output}/#{project.name}.csproj".colorize(:green)
         
     | 
| 
      
 100 
     | 
    
         
            +
                                "dotnet sln #{self.name}.sln add #{project.output}/#{project.name}.csproj".run
         
     | 
| 
      
 101 
     | 
    
         
            +
                            else
         
     | 
| 
      
 102 
     | 
    
         
            +
                                puts "  Project file already exists: " + "#{project.name}/#{project.name}.csproj".colorize(:yellow)
         
     | 
| 
      
 103 
     | 
    
         
            +
                            end
         
     | 
| 
      
 104 
     | 
    
         
            +
                        end
         
     | 
| 
      
 105 
     | 
    
         
            +
                    else
         
     | 
| 
      
 106 
     | 
    
         
            +
                        puts "  no dotnet projects found".colorize(:yellow)
         
     | 
| 
      
 107 
     | 
    
         
            +
                    end
         
     | 
| 
      
 108 
     | 
    
         
            +
                  end
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
      
 110 
     | 
    
         
            +
                  def build_dotnet_projects
         
     | 
| 
      
 111 
     | 
    
         
            +
                    self.dotnet_projects.each do |project|
         
     | 
| 
      
 112 
     | 
    
         
            +
                        "dotnet build #{project.output} --configuration Release".run
         
     | 
| 
      
 113 
     | 
    
         
            +
                    end
         
     | 
| 
      
 114 
     | 
    
         
            +
                  end
         
     | 
| 
      
 115 
     | 
    
         
            +
             
     | 
| 
      
 116 
     | 
    
         
            +
                  def test_dotnet_projects
         
     | 
| 
      
 117 
     | 
    
         
            +
                    self.dotnet_projects.each do |project|
         
     | 
| 
      
 118 
     | 
    
         
            +
                        "dotnet test #{project.output} --configuration Release".run
         
     | 
| 
      
 119 
     | 
    
         
            +
                    end
         
     | 
| 
      
 120 
     | 
    
         
            +
                  end
         
     | 
| 
      
 121 
     | 
    
         
            +
                end # class Project
         
     | 
| 
      
 122 
     | 
    
         
            +
              end # module V1
         
     | 
| 
      
 123 
     | 
    
         
            +
            end # module Makit
         
     | 
| 
      
 124 
     | 
    
         
            +
             
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
      
 126 
     | 
    
         
            +
            #task :setup do
         
     | 
| 
      
 127 
     | 
    
         
            +
            #    if(Makit::PROJECT.git_remote_url.include?("nuget") || 
         
     | 
| 
      
 128 
     | 
    
         
            +
            #       Makit::PROJECT.primary_artifact_type.include?("nuget"))
         
     | 
| 
      
 129 
     | 
    
         
            +
              
         
     | 
| 
      
 130 
     | 
    
         
            +
            #      if(!File.exist?("#{Makit::PROJECT.name}.sln"))
         
     | 
| 
      
 131 
     | 
    
         
            +
            #        puts "  Creating solution file: " + "#{Makit::PROJECT.name}.sln".colorize(:green)
         
     | 
| 
      
 132 
     | 
    
         
            +
            #        "dotnet new sln -n #{Makit::PROJECT.name}".run unless File.exist?("#{Makit::PROJECT.name}.sln")
         
     | 
| 
      
 133 
     | 
    
         
            +
            #      end
         
     | 
| 
      
 134 
     | 
    
         
            +
            #    end
         
     | 
| 
      
 135 
     | 
    
         
            +
              
         
     | 
| 
      
 136 
     | 
    
         
            +
            #    Makit::PROJECT.dotnet_projects.each do |project|  
         
     | 
| 
      
 137 
     | 
    
         
            +
            #      if(!Dir.exist?("#{project.output}"))
         
     | 
| 
      
 138 
     | 
    
         
            +
            #        puts "  Creating project file: " + "#{project.name}/#{project.name}.csproj".colorize(:green)
         
     | 
| 
      
 139 
     | 
    
         
            +
            #        "dotnet new #{project.template} -n #{project.name} -o #{project.output}".run unless Dir.exist?("#{project.output}")
         
     | 
| 
      
 140 
     | 
    
         
            +
            #      end
         
     | 
| 
      
 141 
     | 
    
         
            +
            #    end
         
     | 
| 
      
 142 
     | 
    
         
            +
              
         
     | 
| 
      
 143 
     | 
    
         
            +
                # add all .csproj file to the .sln
         
     | 
| 
      
 144 
     | 
    
         
            +
            #    Dir.glob("**/*.csproj").each do |file|
         
     | 
| 
      
 145 
     | 
    
         
            +
            #      "dotnet sln #{Makit::PROJECT.name}.sln add #{file}".run
         
     | 
| 
      
 146 
     | 
    
         
            +
            #    end
         
     | 
| 
      
 147 
     | 
    
         
            +
                #template = "nunit"
         
     | 
| 
      
 148 
     | 
    
         
            +
                  #"dotnet new #{template} -n #{Makit::PROJECT.name}.Tests -o src/#{Makit::PROJECT.name}".run unless Dir.exist?("#{Makit::PROJECT.name}.Tests")
         
     | 
| 
      
 149 
     | 
    
         
            +
              
         
     | 
| 
      
 150 
     | 
    
         
            +
                #if(Makit::PROJECt.primary_artifact_type.include?("nuget"))
         
     | 
| 
      
 151 
     | 
    
         
            +
                #  puts
         
     | 
| 
      
 152 
     | 
    
         
            +
                #end
         
     | 
| 
      
 153 
     | 
    
         
            +
            #  end
         
     | 
| 
      
 154 
     | 
    
         
            +
             
     | 
| 
      
 155 
     | 
    
         
            +
             
     | 
| 
      
 156 
     | 
    
         
            +
            #"dotnet build src/Facilities.Models/Facilities.Models.csproj --configuration Release".run
         
     | 
| 
      
 157 
     | 
    
         
            +
            #    "dotnet build test/Facilities.Models.Tests/Facilities.Models.Tests.csproj --configuration Release".run
         
     | 
| 
      
 158 
     | 
    
         
            +
            #    "dotnet build examples/Facilities.Models.Wasm.Demo/Facilities.Models.Wasm.Demo.csproj --configuration Release".run
         
     | 
| 
      
 159 
     | 
    
         
            +
             
     | 
| 
      
 160 
     | 
    
         
            +
            #"dotnet test test/Facilities.Models.Tests/Facilities.Models.Tests.csproj --configuration Release".run
         
     | 
| 
         @@ -0,0 +1,101 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
            require "json"
         
     | 
| 
      
 3 
     | 
    
         
            +
            # monkey patch String class with a run method
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            class String
         
     | 
| 
      
 6 
     | 
    
         
            +
              def run(args = nil)
         
     | 
| 
      
 7 
     | 
    
         
            +
                if args.nil?
         
     | 
| 
      
 8 
     | 
    
         
            +
                  command = self
         
     | 
| 
      
 9 
     | 
    
         
            +
                  Makit::RUNNER.run(Makit::RUNNER::parse_command_request(command))
         
     | 
| 
      
 10 
     | 
    
         
            +
                else
         
     | 
| 
      
 11 
     | 
    
         
            +
                  command = self
         
     | 
| 
      
 12 
     | 
    
         
            +
                  request = Makit::RUNNER.parse_args(command)
         
     | 
| 
      
 13 
     | 
    
         
            +
                  if args.is_a?(Hash)
         
     | 
| 
      
 14 
     | 
    
         
            +
                    args.each do |key, value|
         
     | 
| 
      
 15 
     | 
    
         
            +
                      request.send("#{key}=", value)
         
     | 
| 
      
 16 
     | 
    
         
            +
                    end
         
     | 
| 
      
 17 
     | 
    
         
            +
                  end
         
     | 
| 
      
 18 
     | 
    
         
            +
                  Makit::RUNNER.run(request)
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
              end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              def try(args = nil)
         
     | 
| 
      
 23 
     | 
    
         
            +
                if args.nil?
         
     | 
| 
      
 24 
     | 
    
         
            +
                  command = self
         
     | 
| 
      
 25 
     | 
    
         
            +
                  Makit::RUNNER.try(command)
         
     | 
| 
      
 26 
     | 
    
         
            +
                else
         
     | 
| 
      
 27 
     | 
    
         
            +
                  command = self
         
     | 
| 
      
 28 
     | 
    
         
            +
                  request = Makit::RUNNER.parse_args(command)
         
     | 
| 
      
 29 
     | 
    
         
            +
                  if args.is_a?(Hash)
         
     | 
| 
      
 30 
     | 
    
         
            +
                    args.each do |key, value|
         
     | 
| 
      
 31 
     | 
    
         
            +
                      request.send("#{key}=", value)
         
     | 
| 
      
 32 
     | 
    
         
            +
                    end
         
     | 
| 
      
 33 
     | 
    
         
            +
                  end
         
     | 
| 
      
 34 
     | 
    
         
            +
                  Makit::RUNNER.try(request)
         
     | 
| 
      
 35 
     | 
    
         
            +
                end
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
              # Read a value from a JSON file
         
     | 
| 
      
 39 
     | 
    
         
            +
              # key is a string with the key to read, e.g. "AzureAd.Authority"
         
     | 
| 
      
 40 
     | 
    
         
            +
              def get_json_value(key)
         
     | 
| 
      
 41 
     | 
    
         
            +
                json = File.read(self)
         
     | 
| 
      
 42 
     | 
    
         
            +
                data = JSON.parse(json)
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                # key delimiter is '.' so we can access nested keys
         
     | 
| 
      
 45 
     | 
    
         
            +
                key.split(".").each do |k|
         
     | 
| 
      
 46 
     | 
    
         
            +
                  data = data[k]
         
     | 
| 
      
 47 
     | 
    
         
            +
                end
         
     | 
| 
      
 48 
     | 
    
         
            +
                data
         
     | 
| 
      
 49 
     | 
    
         
            +
              end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
              alias_method :retrieve, :get_json_value
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
              # Set a value in a JSON file
         
     | 
| 
      
 54 
     | 
    
         
            +
              # key is a string with the key to set, e.g. "AzureAd.Authority"
         
     | 
| 
      
 55 
     | 
    
         
            +
              def set_json_value(key, value)
         
     | 
| 
      
 56 
     | 
    
         
            +
                file = File.read(self)
         
     | 
| 
      
 57 
     | 
    
         
            +
                data = JSON.parse(file)
         
     | 
| 
      
 58 
     | 
    
         
            +
                keys = key.split(".")
         
     | 
| 
      
 59 
     | 
    
         
            +
                current = data
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                # Traverse and create any missing keys
         
     | 
| 
      
 62 
     | 
    
         
            +
                keys[0..-2].each do |k|
         
     | 
| 
      
 63 
     | 
    
         
            +
                  current[k] ||= {}  # Create a new hash if the key doesn't exist
         
     | 
| 
      
 64 
     | 
    
         
            +
                  current = current[k]
         
     | 
| 
      
 65 
     | 
    
         
            +
                end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                # Set the value for the final key
         
     | 
| 
      
 68 
     | 
    
         
            +
                current[keys[-1]] = value
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                # Write the JSON back to the file
         
     | 
| 
      
 71 
     | 
    
         
            +
                File.write(self, JSON.pretty_generate(data))
         
     | 
| 
      
 72 
     | 
    
         
            +
              end
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
              # Alias for set_json_value
         
     | 
| 
      
 75 
     | 
    
         
            +
              alias_method :assign, :set_json_value
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
              def to_lines(max_length=80,indent_length=5)
         
     | 
| 
      
 78 
     | 
    
         
            +
                if(self.length <= max_length)
         
     | 
| 
      
 79 
     | 
    
         
            +
                  return self
         
     | 
| 
      
 80 
     | 
    
         
            +
                else
         
     | 
| 
      
 81 
     | 
    
         
            +
                  indent = " " * indent_length
         
     | 
| 
      
 82 
     | 
    
         
            +
                  words = self.split(" ")
         
     | 
| 
      
 83 
     | 
    
         
            +
                  lines = []
         
     | 
| 
      
 84 
     | 
    
         
            +
                  line = ""
         
     | 
| 
      
 85 
     | 
    
         
            +
                  words.each do |word|
         
     | 
| 
      
 86 
     | 
    
         
            +
                    if((line + word).length > max_length)
         
     | 
| 
      
 87 
     | 
    
         
            +
                      lines << line
         
     | 
| 
      
 88 
     | 
    
         
            +
                      line = indent + word
         
     | 
| 
      
 89 
     | 
    
         
            +
                    else
         
     | 
| 
      
 90 
     | 
    
         
            +
                      if(line.length == 0)
         
     | 
| 
      
 91 
     | 
    
         
            +
                        line = word
         
     | 
| 
      
 92 
     | 
    
         
            +
                      else
         
     | 
| 
      
 93 
     | 
    
         
            +
                      line += " " + word
         
     | 
| 
      
 94 
     | 
    
         
            +
                      end
         
     | 
| 
      
 95 
     | 
    
         
            +
                    end
         
     | 
| 
      
 96 
     | 
    
         
            +
                  end
         
     | 
| 
      
 97 
     | 
    
         
            +
                  lines << line
         
     | 
| 
      
 98 
     | 
    
         
            +
                  return lines.join("\n")
         
     | 
| 
      
 99 
     | 
    
         
            +
                end
         
     | 
| 
      
 100 
     | 
    
         
            +
              end
         
     | 
| 
      
 101 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/makit/nuget.rb
    ADDED
    
    | 
         @@ -0,0 +1,57 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "tmpdir"
         
     | 
| 
      
 2 
     | 
    
         
            +
            # This module provides classes for the Makit gem.
         
     | 
| 
      
 3 
     | 
    
         
            +
            module Makit
         
     | 
| 
      
 4 
     | 
    
         
            +
              # This class provide methods for working with the  Nuget package cache
         
     | 
| 
      
 5 
     | 
    
         
            +
              #
         
     | 
| 
      
 6 
     | 
    
         
            +
              # Example:
         
     | 
| 
      
 7 
     | 
    
         
            +
              #
         
     | 
| 
      
 8 
     | 
    
         
            +
              #   Makit::Directory.cache("Google.Protobuf", "3.27.2")
         
     | 
| 
      
 9 
     | 
    
         
            +
              #
         
     | 
| 
      
 10 
     | 
    
         
            +
              # dotnet nuget locals all --list
         
     | 
| 
      
 11 
     | 
    
         
            +
              # dotnet nuget locals all --clear
         
     | 
| 
      
 12 
     | 
    
         
            +
              #
         
     | 
| 
      
 13 
     | 
    
         
            +
              class NuGet
         
     | 
| 
      
 14 
     | 
    
         
            +
                def self.get_cache_dir(package, version)
         
     | 
| 
      
 15 
     | 
    
         
            +
                  File.join(Makit::Directories::NUGET_PACKAGE_CACHE, package, version)
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                def self.cache(package, version)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  # if the package is already cached, there is nothing to do
         
     | 
| 
      
 20 
     | 
    
         
            +
                  if (!Dir.exist?(get_cache_dir(package, version)))
         
     | 
| 
      
 21 
     | 
    
         
            +
                    Dir.mktmpdir do |dir|
         
     | 
| 
      
 22 
     | 
    
         
            +
                      # Use the temp directory here
         
     | 
| 
      
 23 
     | 
    
         
            +
                      Dir.chdir(dir) do
         
     | 
| 
      
 24 
     | 
    
         
            +
                        system("dotnet new classlib -n ClassLib")
         
     | 
| 
      
 25 
     | 
    
         
            +
                        Dir.chdir("ClassLib") do
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                          # display a list of directories in the current directory
         
     | 
| 
      
 28 
     | 
    
         
            +
                          puts Dir.entries(Dir.pwd)
         
     | 
| 
      
 29 
     | 
    
         
            +
                          # display a list of files in the current directory
         
     | 
| 
      
 30 
     | 
    
         
            +
                          puts Dir.entries(Dir.pwd)
         
     | 
| 
      
 31 
     | 
    
         
            +
                          puts "dotnet add ClassLib.csproj package #{package} --version #{version}"
         
     | 
| 
      
 32 
     | 
    
         
            +
                          system("dotnet add ClassLib.csproj package #{package} --version #{version}")
         
     | 
| 
      
 33 
     | 
    
         
            +
                        end
         
     | 
| 
      
 34 
     | 
    
         
            +
                      end
         
     | 
| 
      
 35 
     | 
    
         
            +
                      # The directory and its contents will be removed automatically after the block
         
     | 
| 
      
 36 
     | 
    
         
            +
                    end
         
     | 
| 
      
 37 
     | 
    
         
            +
                  end
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                def self.clear_cache(package, version)
         
     | 
| 
      
 41 
     | 
    
         
            +
                  if (Dir.exist?(get_cache_dir(package, version)))
         
     | 
| 
      
 42 
     | 
    
         
            +
                    FileUtils.rm_rf(get_cache_dir(package, version))
         
     | 
| 
      
 43 
     | 
    
         
            +
                  end
         
     | 
| 
      
 44 
     | 
    
         
            +
                end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                # get the latest version of the package
         
     | 
| 
      
 47 
     | 
    
         
            +
                def self.get_latest_version(package)
         
     | 
| 
      
 48 
     | 
    
         
            +
                  dir = File.join(Makit::Directories::NUGET_PACKAGE_CACHE, package)
         
     | 
| 
      
 49 
     | 
    
         
            +
                  if (Dir.exist?(dir))
         
     | 
| 
      
 50 
     | 
    
         
            +
                    versions = Dir.entries(dir).select { |entry| File.directory?(File.join(dir, entry)) && !(entry == "." || entry == "..") }
         
     | 
| 
      
 51 
     | 
    
         
            +
                    highest_version = Makit::Version::get_highest_version(versions)
         
     | 
| 
      
 52 
     | 
    
         
            +
                    return highest_version
         
     | 
| 
      
 53 
     | 
    
         
            +
                  end
         
     | 
| 
      
 54 
     | 
    
         
            +
                  nil
         
     | 
| 
      
 55 
     | 
    
         
            +
                end
         
     | 
| 
      
 56 
     | 
    
         
            +
              end
         
     | 
| 
      
 57 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/makit/protoc.rb
    ADDED
    
    | 
         @@ -0,0 +1,61 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            # This module provides classes for the Makit gem.
         
     | 
| 
      
 4 
     | 
    
         
            +
            module Makit
         
     | 
| 
      
 5 
     | 
    
         
            +
              # This class provide methods for working with the system Environment.
         
     | 
| 
      
 6 
     | 
    
         
            +
              #
         
     | 
| 
      
 7 
     | 
    
         
            +
              class Protoc
         
     | 
| 
      
 8 
     | 
    
         
            +
                def self.grpc_tools_path
         
     | 
| 
      
 9 
     | 
    
         
            +
                  File.join(Makit::Directories::NUGET_PACKAGE_CACHE, "grpc.tools", Makit::Protoc::get_latest_grpc_tools_version)
         
     | 
| 
      
 10 
     | 
    
         
            +
                end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                def self.grpc_csharp_plugin_path
         
     | 
| 
      
 13 
     | 
    
         
            +
                  Makit::Protoc::find_plugin_path("grpc_csharp_plugin")
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
                def self.setup
         
     | 
| 
      
 16 
     | 
    
         
            +
                  if (!Dir.exist?(Makit::Directories::NUGET_PACKAGE_CACHE))
         
     | 
| 
      
 17 
     | 
    
         
            +
                    puts "  warning: Nuget package cache directory #{Makit::Directories::NUGET_PACKAGE_CACHE} not found".colorize(:red)
         
     | 
| 
      
 18 
     | 
    
         
            +
                    puts "  warning: Unable to proceed with protoc setup".colorize(:red)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  else
         
     | 
| 
      
 20 
     | 
    
         
            +
                    Makit::NuGet::cache("Grpc.Tools", "2.66.0")
         
     | 
| 
      
 21 
     | 
    
         
            +
                    raise "Nuget package path #{Makit::Directories::NUGET_PACKAGE_CACHE} not found" if !Dir.exist?(Makit::Directories::NUGET_PACKAGE_CACHE)
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                    # test if protoc is installed by running >protoc --version
         
     | 
| 
      
 24 
     | 
    
         
            +
                    which_protoc = Makit::Environment.which("protoc")
         
     | 
| 
      
 25 
     | 
    
         
            +
                    if (Makit::Environment.which("protoc").nil?)
         
     | 
| 
      
 26 
     | 
    
         
            +
                      puts "  protoc not found, installing...".colorize(:red)
         
     | 
| 
      
 27 
     | 
    
         
            +
                      "go version".run
         
     | 
| 
      
 28 
     | 
    
         
            +
                      "go install google.golang.org/protobuf/cmd/protoc-gen-go@latest".run
         
     | 
| 
      
 29 
     | 
    
         
            +
                      "go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@latest".run
         
     | 
| 
      
 30 
     | 
    
         
            +
                      "go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@latest".run
         
     | 
| 
      
 31 
     | 
    
         
            +
                    else
         
     | 
| 
      
 32 
     | 
    
         
            +
                      puts "  protoc found at #{which_protoc}".colorize(:green)
         
     | 
| 
      
 33 
     | 
    
         
            +
                    end
         
     | 
| 
      
 34 
     | 
    
         
            +
                    raise "protoc not found" if !Makit::Environment.which("protoc")
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                    #"git clone https://github.com/googleapis/googleapis.git third_party".run unless File.directory?("third_party/google")
         
     | 
| 
      
 37 
     | 
    
         
            +
                    puts "  grpc_tools_path " + "#{Makit::Protoc::grpc_tools_path}".colorize(:green)
         
     | 
| 
      
 38 
     | 
    
         
            +
                    puts "  grpc_csharp_plugin_path " + "#{Makit::Protoc::grpc_csharp_plugin_path}".colorize(:green)
         
     | 
| 
      
 39 
     | 
    
         
            +
                  end
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                # get the latest version of the grpc.tools package
         
     | 
| 
      
 43 
     | 
    
         
            +
                def self.get_latest_grpc_tools_version
         
     | 
| 
      
 44 
     | 
    
         
            +
                  Makit::NuGet::get_latest_version("Grpc.Tools")
         
     | 
| 
      
 45 
     | 
    
         
            +
                end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                #GRPC_CSHARP_PLUGIN_PATH = Makit::Protoc::find_plugin_path("grpc_csharp_plugin")
         
     | 
| 
      
 48 
     | 
    
         
            +
                def self.find_plugin_path(plugin_name)
         
     | 
| 
      
 49 
     | 
    
         
            +
                  # search for a file matching the pattern *grpc_csharp_plugin* in the grpc.tools directory
         
     | 
| 
      
 50 
     | 
    
         
            +
                  # should match on Windows and Linux
         
     | 
| 
      
 51 
     | 
    
         
            +
                  if (Makit::Environment.is_windows?)
         
     | 
| 
      
 52 
     | 
    
         
            +
                    plugin_name = plugin_name + ".exe"
         
     | 
| 
      
 53 
     | 
    
         
            +
                  end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                  plugin_path = Dir.glob("#{Makit::Directories::GRPC_TOOLS_PATH}/**/#{plugin_name}").first
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                  raise "Plugin path #{plugin_path} not found" if !File.exist?(plugin_path)
         
     | 
| 
      
 58 
     | 
    
         
            +
                  plugin_path
         
     | 
| 
      
 59 
     | 
    
         
            +
                end
         
     | 
| 
      
 60 
     | 
    
         
            +
              end
         
     | 
| 
      
 61 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,70 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
            require "google/protobuf"
         
     | 
| 
      
 3 
     | 
    
         
            +
            # This module provides classes for the Makit gem.
         
     | 
| 
      
 4 
     | 
    
         
            +
            module Makit
         
     | 
| 
      
 5 
     | 
    
         
            +
              module Proto3Formats
         
     | 
| 
      
 6 
     | 
    
         
            +
                JSON = 0,
         
     | 
| 
      
 7 
     | 
    
         
            +
                       PRETTY_JSON = 1,
         
     | 
| 
      
 8 
     | 
    
         
            +
                BINARY = 3
         
     | 
| 
      
 9 
     | 
    
         
            +
              end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
              # This class provide methods for serializing and deserializing objects.
         
     | 
| 
      
 12 
     | 
    
         
            +
              #
         
     | 
| 
      
 13 
     | 
    
         
            +
              class Serializer
         
     | 
| 
      
 14 
     | 
    
         
            +
                attr_accessor :format_map
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                def initialize(proto3_format = Proto3Formats::PRETTY_JSON)
         
     | 
| 
      
 17 
     | 
    
         
            +
                  @format_maps = {
         
     | 
| 
      
 18 
     | 
    
         
            +
                    ::Google::Protobuf::MessageExts => proto3_format,
         
     | 
| 
      
 19 
     | 
    
         
            +
                  }
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                # Serialize an object to a byte[] or a string
         
     | 
| 
      
 23 
     | 
    
         
            +
                def serialize(object)
         
     | 
| 
      
 24 
     | 
    
         
            +
                  raise "Object is nil" if object.nil?
         
     | 
| 
      
 25 
     | 
    
         
            +
                  raise "object is not of type ::Google::Protobuf::MessageExts" if !object.is_a? ::Google::Protobuf::MessageExts
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  case @format_maps[::Google::Protobuf::MessageExts]
         
     | 
| 
      
 28 
     | 
    
         
            +
                  when Proto3Formats::JSON
         
     | 
| 
      
 29 
     | 
    
         
            +
                    puts "Serializing to protobuf json format"
         
     | 
| 
      
 30 
     | 
    
         
            +
                    object.to_json
         
     | 
| 
      
 31 
     | 
    
         
            +
                  when Proto3Formats::PRETTY_JSON
         
     | 
| 
      
 32 
     | 
    
         
            +
                    puts "Serializing to protobuf pretty json format"
         
     | 
| 
      
 33 
     | 
    
         
            +
                    json = object.to_json
         
     | 
| 
      
 34 
     | 
    
         
            +
                    pretty_json = JSON.pretty_generate(JSON.parse(json))
         
     | 
| 
      
 35 
     | 
    
         
            +
                    pretty_json
         
     | 
| 
      
 36 
     | 
    
         
            +
                  when Proto3Formats::BINARY
         
     | 
| 
      
 37 
     | 
    
         
            +
                    puts "Serializing to protobuf binary format"
         
     | 
| 
      
 38 
     | 
    
         
            +
                    serialized_object = object.to_proto
         
     | 
| 
      
 39 
     | 
    
         
            +
                  else
         
     | 
| 
      
 40 
     | 
    
         
            +
                    raise "Unknown serialization format"
         
     | 
| 
      
 41 
     | 
    
         
            +
                  end
         
     | 
| 
      
 42 
     | 
    
         
            +
                end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                # Deserialize a byte[] or a string to an object
         
     | 
| 
      
 45 
     | 
    
         
            +
                def deserialize(type, data)
         
     | 
| 
      
 46 
     | 
    
         
            +
                  raise "data is nil" if data.nil?
         
     | 
| 
      
 47 
     | 
    
         
            +
                  case @format_maps[::Google::Protobuf::MessageExts]
         
     | 
| 
      
 48 
     | 
    
         
            +
                  when Proto3Formats::JSON
         
     | 
| 
      
 49 
     | 
    
         
            +
                    raise "data is not of type string" if !data.is_a? String
         
     | 
| 
      
 50 
     | 
    
         
            +
                    json = data
         
     | 
| 
      
 51 
     | 
    
         
            +
                    puts "Deserializing from protobuf json format into type #{type}"
         
     | 
| 
      
 52 
     | 
    
         
            +
                    # use the from_json method to deserialize the object
         
     | 
| 
      
 53 
     | 
    
         
            +
                    type.decode_json(json)
         
     | 
| 
      
 54 
     | 
    
         
            +
                  when Proto3Formats::PRETTY_JSON
         
     | 
| 
      
 55 
     | 
    
         
            +
                    raise "data is not of type string" if !data.is_a? String
         
     | 
| 
      
 56 
     | 
    
         
            +
                    json = data
         
     | 
| 
      
 57 
     | 
    
         
            +
                    puts "Deserializing from protobuf pretty json format into type #{type}"
         
     | 
| 
      
 58 
     | 
    
         
            +
                    # use the from_json method to deserialize the object
         
     | 
| 
      
 59 
     | 
    
         
            +
                    type.decode_json(json)
         
     | 
| 
      
 60 
     | 
    
         
            +
                  when Proto3Formats::BINARY
         
     | 
| 
      
 61 
     | 
    
         
            +
                    #raise "data is not of type byte[]" if !data.is_a? Array
         
     | 
| 
      
 62 
     | 
    
         
            +
                    bytes = data
         
     | 
| 
      
 63 
     | 
    
         
            +
                    puts "Deserializing from protobuf binary format into type #{type}"
         
     | 
| 
      
 64 
     | 
    
         
            +
                    type.decode(bytes)
         
     | 
| 
      
 65 
     | 
    
         
            +
                  else
         
     | 
| 
      
 66 
     | 
    
         
            +
                    raise "Unknown serialization format"
         
     | 
| 
      
 67 
     | 
    
         
            +
                  end
         
     | 
| 
      
 68 
     | 
    
         
            +
                end
         
     | 
| 
      
 69 
     | 
    
         
            +
              end # class Storage
         
     | 
| 
      
 70 
     | 
    
         
            +
            end # module Makit
         
     | 
| 
         @@ -0,0 +1,131 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            # This module provides classes for the Makit gem.
         
     | 
| 
      
 4 
     | 
    
         
            +
            module Makit
         
     | 
| 
      
 5 
     | 
    
         
            +
              # This class provide methods for serializing and deserializing objects.
         
     | 
| 
      
 6 
     | 
    
         
            +
              #
         
     | 
| 
      
 7 
     | 
    
         
            +
              class Storage
         
     | 
| 
      
 8 
     | 
    
         
            +
                # declare a private class variable, connection_string
         
     | 
| 
      
 9 
     | 
    
         
            +
                attr_accessor :directory #= nil
         
     | 
| 
      
 10 
     | 
    
         
            +
                attr_accessor :protoc_json_serializer # = Makit::Serializer::new()
         
     | 
| 
      
 11 
     | 
    
         
            +
                attr_accessor :protoc_binary_serializer # = Makit::Serializer::new()
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                def initialize(directory)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  @directory = directory
         
     | 
| 
      
 15 
     | 
    
         
            +
                  @protoc_json_serializer = Makit::Serializer::new(Makit::Proto3Formats::JSON)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  @protoc_binary_serializer = Makit::Serializer::new(Makit::Proto3Formats::BINARY)
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                def save(object, key)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  puts "=" * 80
         
     | 
| 
      
 21 
     | 
    
         
            +
                  puts "Saving object to storage"
         
     | 
| 
      
 22 
     | 
    
         
            +
                  puts "=" * 80
         
     | 
| 
      
 23 
     | 
    
         
            +
                  raise "directory is nil" if @directory.nil?
         
     | 
| 
      
 24 
     | 
    
         
            +
                  raise "Object is nil" if object.nil?
         
     | 
| 
      
 25 
     | 
    
         
            +
                  raise "Key is nil" if key.nil?
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  # get the fully qualfied type name of the object
         
     | 
| 
      
 28 
     | 
    
         
            +
                  type_name = object.class.to_s
         
     | 
| 
      
 29 
     | 
    
         
            +
                  puts "Type name: #{type_name}"
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                  type_rel_dir = type_name.downcase.gsub("::", "/")
         
     | 
| 
      
 32 
     | 
    
         
            +
                  puts "Type relative directory: #{type_rel_dir}"
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                  # extract the file extension from the key
         
     | 
| 
      
 35 
     | 
    
         
            +
                  file_extension = File.extname(key)
         
     | 
| 
      
 36 
     | 
    
         
            +
                  puts "File extension: #{file_extension}"
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                  serializer = nil
         
     | 
| 
      
 39 
     | 
    
         
            +
                  if file_extension == ".json"
         
     | 
| 
      
 40 
     | 
    
         
            +
                    serializer = @protoc_json_serializer
         
     | 
| 
      
 41 
     | 
    
         
            +
                  elsif file_extension == ".pb"
         
     | 
| 
      
 42 
     | 
    
         
            +
                    serializer = @protoc_binary_serializer
         
     | 
| 
      
 43 
     | 
    
         
            +
                  else
         
     | 
| 
      
 44 
     | 
    
         
            +
                    raise "Unknown file extension: #{file_extension}"
         
     | 
| 
      
 45 
     | 
    
         
            +
                  end
         
     | 
| 
      
 46 
     | 
    
         
            +
                  bytes = serializer.serialize(object)
         
     | 
| 
      
 47 
     | 
    
         
            +
                  puts "Serialized object size: #{bytes.size} bytes"
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                  rel_filename = File.join(type_rel_dir, "#{key}")
         
     | 
| 
      
 50 
     | 
    
         
            +
                  puts "Relative filename: #{rel_filename}"
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                  filename = File.join(@directory, rel_filename)
         
     | 
| 
      
 53 
     | 
    
         
            +
                  puts "Saving object to file: #{filename}"
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                  # make sure the file directory has been created
         
     | 
| 
      
 56 
     | 
    
         
            +
                  FileUtils.mkdir_p(File.dirname(filename)) unless File.directory?(File.dirname(filename))
         
     | 
| 
      
 57 
     | 
    
         
            +
                  # write the bytes to the file
         
     | 
| 
      
 58 
     | 
    
         
            +
                  File.open(filename, "wb") do |file|
         
     | 
| 
      
 59 
     | 
    
         
            +
                    file.write(bytes)
         
     | 
| 
      
 60 
     | 
    
         
            +
                  end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                  puts "=" * 80
         
     | 
| 
      
 63 
     | 
    
         
            +
                end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                def load(type, key)
         
     | 
| 
      
 66 
     | 
    
         
            +
                  raise "directory is nil" if @directory.nil?
         
     | 
| 
      
 67 
     | 
    
         
            +
                  raise "Key is nil" if key.nil?
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                  # get the fully qualfied type name of the object
         
     | 
| 
      
 70 
     | 
    
         
            +
                  type_name = type.to_s # object.class.to_s
         
     | 
| 
      
 71 
     | 
    
         
            +
                  puts "Type name: #{type_name}"
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                  type_rel_dir = type_name.downcase.gsub("::", "/")
         
     | 
| 
      
 74 
     | 
    
         
            +
                  puts "Type relative directory: #{type_rel_dir}"
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
                  # extract the file extension from the key
         
     | 
| 
      
 77 
     | 
    
         
            +
                  file_extension = File.extname(key)
         
     | 
| 
      
 78 
     | 
    
         
            +
                  puts "File extension: #{file_extension}"
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
                  rel_filename = File.join(type_rel_dir, "#{key}")
         
     | 
| 
      
 81 
     | 
    
         
            +
                  puts "Relative filename: #{rel_filename}"
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
                  filename = File.join(@directory, rel_filename)
         
     | 
| 
      
 84 
     | 
    
         
            +
                  puts "Loading object from file: #{filename}"
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
                  # make sure the file exists
         
     | 
| 
      
 87 
     | 
    
         
            +
                  raise "File does not exist: #{filename}" unless File.exist?(filename)
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
                  # read the bytes from the file
         
     | 
| 
      
 90 
     | 
    
         
            +
                  bytes = File.read(filename, mode: "rb")
         
     | 
| 
      
 91 
     | 
    
         
            +
                  puts "Read object from file: #{filename}"
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
                  # extract the file extension from the key
         
     | 
| 
      
 94 
     | 
    
         
            +
                  file_extension = File.extname(key)
         
     | 
| 
      
 95 
     | 
    
         
            +
                  puts "File extension: #{file_extension}"
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
                  serializer = nil
         
     | 
| 
      
 98 
     | 
    
         
            +
                  if file_extension == ".json"
         
     | 
| 
      
 99 
     | 
    
         
            +
                    serializer = @protoc_json_serializer
         
     | 
| 
      
 100 
     | 
    
         
            +
                  elsif file_extension == ".pb"
         
     | 
| 
      
 101 
     | 
    
         
            +
                    serializer = @protoc_binary_serializer
         
     | 
| 
      
 102 
     | 
    
         
            +
                  else
         
     | 
| 
      
 103 
     | 
    
         
            +
                    raise "Unknown file extension: #{file_extension}"
         
     | 
| 
      
 104 
     | 
    
         
            +
                  end
         
     | 
| 
      
 105 
     | 
    
         
            +
             
     | 
| 
      
 106 
     | 
    
         
            +
                  # deserialize the object
         
     | 
| 
      
 107 
     | 
    
         
            +
                  object = serializer.deserialize(type, bytes)
         
     | 
| 
      
 108 
     | 
    
         
            +
                  puts "Deserialized object size: #{bytes.size} bytes"
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
      
 110 
     | 
    
         
            +
                  # if the object type inherits from Google::Protobuf::AbstractMessage,
         
     | 
| 
      
 111 
     | 
    
         
            +
                  # then serialize to protobuf json format
         
     | 
| 
      
 112 
     | 
    
         
            +
                  #if object.is_a? Google::Protobuf::MessageExts
         
     | 
| 
      
 113 
     | 
    
         
            +
                  #  puts "Serializing to protobuf json format"
         
     | 
| 
      
 114 
     | 
    
         
            +
                  #  serialized_object = object.to_json
         
     | 
| 
      
 115 
     | 
    
         
            +
                  #  pretty_json = JSON.pretty_generate(JSON.parse(serialized_object))
         
     | 
| 
      
 116 
     | 
    
         
            +
                  #  puts pretty_json
         
     | 
| 
      
 117 
     | 
    
         
            +
                  #else
         
     | 
| 
      
 118 
     | 
    
         
            +
                  #  puts "Serializing to Marshal format"
         
     | 
| 
      
 119 
     | 
    
         
            +
                  #  serialized_object = Marshal.dump(object)
         
     | 
| 
      
 120 
     | 
    
         
            +
                  #end
         
     | 
| 
      
 121 
     | 
    
         
            +
                  # serialize the object
         
     | 
| 
      
 122 
     | 
    
         
            +
                  #serialized_object = Marshal.dump(object)
         
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
| 
      
 124 
     | 
    
         
            +
                  # save the object to the storage
         
     | 
| 
      
 125 
     | 
    
         
            +
                  # ...
         
     | 
| 
      
 126 
     | 
    
         
            +
                  puts "=" * 80
         
     | 
| 
      
 127 
     | 
    
         
            +
             
     | 
| 
      
 128 
     | 
    
         
            +
                  object
         
     | 
| 
      
 129 
     | 
    
         
            +
                end
         
     | 
| 
      
 130 
     | 
    
         
            +
              end # class Storage
         
     | 
| 
      
 131 
     | 
    
         
            +
            end # module Makit
         
     |