makit 0.0.35 → 0.0.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/lib/makit/apache.rb +32 -32
  3. data/lib/makit/cli/clean.rb +14 -14
  4. data/lib/makit/cli/clone.rb +59 -59
  5. data/lib/makit/cli/init.rb +38 -38
  6. data/lib/makit/cli/main.rb +33 -33
  7. data/lib/makit/cli/make.rb +54 -54
  8. data/lib/makit/cli/new.rb +37 -37
  9. data/lib/makit/cli/nuget_cache.rb +38 -38
  10. data/lib/makit/cli/pull.rb +31 -31
  11. data/lib/makit/cli/setup.rb +71 -71
  12. data/lib/makit/cli/work.rb +21 -21
  13. data/lib/makit/command_runner.rb +391 -353
  14. data/lib/makit/commands.rb +21 -21
  15. data/lib/makit/content/default_gitignore.rb +5 -5
  16. data/lib/makit/content/default_gitignore.txt +222 -222
  17. data/lib/makit/content/default_rakefile.rb +11 -11
  18. data/lib/makit/content/gem_rakefile.rb +14 -14
  19. data/lib/makit/data.rb +50 -50
  20. data/lib/makit/directories.rb +140 -140
  21. data/lib/makit/directory.rb +184 -184
  22. data/lib/makit/dotnet.rb +156 -156
  23. data/lib/makit/environment.rb +127 -127
  24. data/lib/makit/fileinfo.rb +16 -16
  25. data/lib/makit/files.rb +47 -47
  26. data/lib/makit/git.rb +86 -86
  27. data/lib/makit/gitlab_runner.rb +60 -60
  28. data/lib/makit/humanize.rb +112 -112
  29. data/lib/makit/indexer.rb +56 -0
  30. data/lib/makit/logging.rb +96 -96
  31. data/lib/makit/markdown.rb +75 -75
  32. data/lib/makit/mp/basic_object_mp.rb +16 -16
  33. data/lib/makit/mp/command_request.mp.rb +16 -16
  34. data/lib/makit/mp/project_mp.rb +210 -210
  35. data/lib/makit/mp/string_mp.rb +122 -122
  36. data/lib/makit/nuget.rb +57 -57
  37. data/lib/makit/protoc.rb +104 -104
  38. data/lib/makit/serializer.rb +115 -115
  39. data/lib/makit/show.rb +76 -77
  40. data/lib/makit/storage.rb +131 -131
  41. data/lib/makit/symbols.rb +149 -149
  42. data/lib/makit/tasks.rb +60 -60
  43. data/lib/makit/tree.rb +37 -37
  44. data/lib/makit/v1/makit.v1_pb.rb +4 -3
  45. data/lib/makit/v1/makit.v1_services_pb.rb +25 -25
  46. data/lib/makit/version.rb +12 -12
  47. data/lib/makit/wix.rb +95 -95
  48. data/lib/makit/zip.rb +17 -17
  49. data/lib/makit.rb +267 -267
  50. metadata +4 -5
  51. data/lib/generated/makit/v1/makit.v1_pb.rb +0 -34
  52. data/lib/generated/makit/v1/web/link_pb.rb +0 -20
data/lib/makit/files.rb CHANGED
@@ -1,47 +1,47 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "directory"
4
- require_relative "environment"
5
- require_relative "protoc"
6
- require_relative "nuget"
7
- require_relative "version"
8
- require "rake"
9
-
10
- # This module provides classes for the Makit gem.
11
- module Makit
12
- # This class provide methods for working with the system Environment.
13
- #
14
- module Files
15
- if (Makit::Directories::PROJECT_ROOT != nil)
16
- Dir.chdir(Makit::Directories::PROJECT_ROOT) do
17
- CSPROJ = Dir.glob("**/*.csproj")
18
- end
19
- else
20
- CSPROJ = Array.new
21
- end
22
-
23
- # show all the files constants in a nicely formatted table format with the name of the constant and the value
24
- def self.show
25
- # Array of constant names (symbols)
26
- constant_names = [:CSPROJ]
27
-
28
- # Find the length of the longest constant name and add 1
29
- max_length = constant_names.map(&:to_s).max_by(&:length).length + 1
30
-
31
- # Iterate through each constant name
32
- constant_names.each do |constant_name|
33
- begin
34
- constant_value = const_get(constant_name) # Fetch the value of the constant
35
- if (constant_value != nil && File.exist?(constant_value))
36
- constant_value = constant_value.colorize(:green)
37
- end
38
- # Print the constant name right justified to the max_length
39
- puts "#{constant_name.to_s.rjust(max_length)} = #{constant_value}"
40
- rescue NameError
41
- # Handle the case where the constant is not defined
42
- puts "#{constant_name.to_s.rjust(max_length)} = [Constant not defined]"
43
- end
44
- end
45
- end
46
- end # module Files
47
- end # module Makit
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "directory"
4
+ require_relative "environment"
5
+ require_relative "protoc"
6
+ require_relative "nuget"
7
+ require_relative "version"
8
+ require "rake"
9
+
10
+ # This module provides classes for the Makit gem.
11
+ module Makit
12
+ # This class provide methods for working with the system Environment.
13
+ #
14
+ module Files
15
+ if (Makit::Directories::PROJECT_ROOT != nil)
16
+ Dir.chdir(Makit::Directories::PROJECT_ROOT) do
17
+ CSPROJ = Dir.glob("**/*.csproj")
18
+ end
19
+ else
20
+ CSPROJ = Array.new
21
+ end
22
+
23
+ # show all the files constants in a nicely formatted table format with the name of the constant and the value
24
+ def self.show
25
+ # Array of constant names (symbols)
26
+ constant_names = [:CSPROJ]
27
+
28
+ # Find the length of the longest constant name and add 1
29
+ max_length = constant_names.map(&:to_s).max_by(&:length).length + 1
30
+
31
+ # Iterate through each constant name
32
+ constant_names.each do |constant_name|
33
+ begin
34
+ constant_value = const_get(constant_name) # Fetch the value of the constant
35
+ if (constant_value != nil && File.exist?(constant_value))
36
+ constant_value = constant_value.colorize(:green)
37
+ end
38
+ # Print the constant name right justified to the max_length
39
+ puts "#{constant_name.to_s.rjust(max_length)} = #{constant_value}"
40
+ rescue NameError
41
+ # Handle the case where the constant is not defined
42
+ puts "#{constant_name.to_s.rjust(max_length)} = [Constant not defined]"
43
+ end
44
+ end
45
+ end
46
+ end # module Files
47
+ end # module Makit
data/lib/makit/git.rb CHANGED
@@ -1,86 +1,86 @@
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 Git
8
- def self.is_git_repo
9
- Dir.exist? ".git"
10
- end
11
-
12
- def self.detached
13
- `git status`.include?("detached")
14
- end
15
-
16
- def self.is_read_only
17
- !is_git_repo || detached
18
- end
19
-
20
- def self.is_clean
21
- `git status --porcelain`.empty?
22
- end
23
-
24
- def self.integrate
25
- if is_git_repo && !detached
26
- "git add .".run
27
- "git commit -m \"integrate\"".run unless is_clean
28
- end
29
- end
30
-
31
- def self.sync
32
- if is_git_repo && !detached
33
- "git pull".try
34
- "git push origin".try
35
- end
36
- end
37
-
38
- def self.pull
39
- if is_git_repo && !detached
40
- "git pull".try
41
- end
42
- end
43
-
44
- def self.zip_source_files(zipfilename)
45
- "git archive --format zip --output #{zipfilename} HEAD".run
46
- end
47
-
48
- def self.get_file_infos()
49
- file_infos = []
50
- command = `git ls-files`
51
- command.split("\n").map do |path|
52
- begin
53
- file_infos << FileInfo.new(name: path, mtime: File.mtime(path), size: File.size(path))
54
- rescue
55
- next
56
- end
57
- end
58
- file_infos.sort_by! { |info| info.mtime }.reverse!
59
- file_infos
60
- end
61
-
62
- def self.branch
63
- `git branch --show-current`.strip
64
- end
65
-
66
- def self.commitsha
67
- `git rev-parse HEAD`.strip
68
- end
69
-
70
- def self.commitmsg
71
- `git log -1 --pretty=%B`.strip
72
- end
73
-
74
- def self.commitdate
75
- `git log -1 --pretty=%cd`.strip
76
- end
77
-
78
- def self.commitauthor
79
- `git log -1 --pretty=%an`.strip
80
- end
81
-
82
- def self.commitemail
83
- `git log -1 --pretty=%ae`.strip
84
- end
85
- end
86
- end
1
+ # frozen_string_literal: true
2
+
3
+ # This module provides classes for the Makit gem.
4
+ module Makit
5
+ # This class provide methods for working with the system Environment.
6
+ #
7
+ class Git
8
+ def self.is_git_repo
9
+ Dir.exist? ".git"
10
+ end
11
+
12
+ def self.detached
13
+ `git status`.include?("detached")
14
+ end
15
+
16
+ def self.is_read_only
17
+ !is_git_repo || detached
18
+ end
19
+
20
+ def self.is_clean
21
+ `git status --porcelain`.empty?
22
+ end
23
+
24
+ def self.integrate
25
+ if is_git_repo && !detached
26
+ "git add .".run
27
+ "git commit -m \"integrate\"".run unless is_clean
28
+ end
29
+ end
30
+
31
+ def self.sync
32
+ if is_git_repo && !detached
33
+ "git pull".try
34
+ "git push origin".try
35
+ end
36
+ end
37
+
38
+ def self.pull
39
+ if is_git_repo && !detached
40
+ "git pull".try
41
+ end
42
+ end
43
+
44
+ def self.zip_source_files(zipfilename)
45
+ "git archive --format zip --output #{zipfilename} HEAD".run
46
+ end
47
+
48
+ def self.get_file_infos()
49
+ file_infos = []
50
+ command = `git ls-files`
51
+ command.split("\n").map do |path|
52
+ begin
53
+ file_infos << FileInfo.new(name: path, mtime: File.mtime(path), size: File.size(path))
54
+ rescue
55
+ next
56
+ end
57
+ end
58
+ file_infos.sort_by! { |info| info.mtime }.reverse!
59
+ file_infos
60
+ end
61
+
62
+ def self.branch
63
+ `git branch --show-current`.strip
64
+ end
65
+
66
+ def self.commitsha
67
+ `git rev-parse HEAD`.strip
68
+ end
69
+
70
+ def self.commitmsg
71
+ `git log -1 --pretty=%B`.strip
72
+ end
73
+
74
+ def self.commitdate
75
+ `git log -1 --pretty=%cd`.strip
76
+ end
77
+
78
+ def self.commitauthor
79
+ `git log -1 --pretty=%an`.strip
80
+ end
81
+
82
+ def self.commitemail
83
+ `git log -1 --pretty=%ae`.strip
84
+ end
85
+ end
86
+ end
@@ -1,60 +1,60 @@
1
- # frozen_string_literal: true
2
-
3
- require "yaml"
4
- require "fileutils"
5
-
6
- # This module provides classes for the Makit gem.
7
- module Makit
8
- # This class provide methods for working with Directories/
9
- #
10
- # Example:
11
- #
12
- # Makit::Directory.find_directory_with_pattern("/home/user", "*.rb")
13
- #
14
- class GitLabRunner
15
-
16
- # Parse the .gitlab-ci.yml file
17
- def parse_gitlab_ci_file(file_path)
18
- YAML.load_file(file_path)
19
- end
20
-
21
- # Extract the script for a specified job
22
- def extract_script(ci_config, job_name)
23
- job = ci_config[job_name]
24
- job ? job["script"] : nil
25
- end
26
-
27
- # Write the script to a temporary file
28
- def write_script_to_file(script, file_path)
29
- File.open(file_path, "w") do |file|
30
- script.each { |line| file.puts(line) }
31
- end
32
- end
33
-
34
- # Run the script in a Docker container
35
- def run_script_in_docker(image, script_file)
36
- system("docker run --rm -v #{Dir.pwd}:/workspace -w /workspace #{image} /bin/sh #{script_file}")
37
- end
38
-
39
- # Main function to execute the process
40
- def run_job(ci_file_path, job_name, docker_image)
41
- ci_config = parse_gitlab_ci_file(ci_file_path)
42
- script = extract_script(ci_config, job_name)
43
-
44
- unless script
45
- puts "Job '#{job_name}' not found in #{ci_file_path}"
46
- return
47
- end
48
-
49
- script_file = "temp_script.sh"
50
- write_script_to_file(script, script_file)
51
- FileUtils.chmod("+x", script_file)
52
-
53
- puts "Running script in Docker container..."
54
- run_script_in_docker(docker_image, script_file)
55
-
56
- # Clean up the temporary script file
57
- FileUtils.rm(script_file)
58
- end
59
- end
60
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "yaml"
4
+ require "fileutils"
5
+
6
+ # This module provides classes for the Makit gem.
7
+ module Makit
8
+ # This class provide methods for working with Directories/
9
+ #
10
+ # Example:
11
+ #
12
+ # Makit::Directory.find_directory_with_pattern("/home/user", "*.rb")
13
+ #
14
+ class GitLabRunner
15
+
16
+ # Parse the .gitlab-ci.yml file
17
+ def parse_gitlab_ci_file(file_path)
18
+ YAML.load_file(file_path)
19
+ end
20
+
21
+ # Extract the script for a specified job
22
+ def extract_script(ci_config, job_name)
23
+ job = ci_config[job_name]
24
+ job ? job["script"] : nil
25
+ end
26
+
27
+ # Write the script to a temporary file
28
+ def write_script_to_file(script, file_path)
29
+ File.open(file_path, "w") do |file|
30
+ script.each { |line| file.puts(line) }
31
+ end
32
+ end
33
+
34
+ # Run the script in a Docker container
35
+ def run_script_in_docker(image, script_file)
36
+ system("docker run --rm -v #{Dir.pwd}:/workspace -w /workspace #{image} /bin/sh #{script_file}")
37
+ end
38
+
39
+ # Main function to execute the process
40
+ def run_job(ci_file_path, job_name, docker_image)
41
+ ci_config = parse_gitlab_ci_file(ci_file_path)
42
+ script = extract_script(ci_config, job_name)
43
+
44
+ unless script
45
+ puts "Job '#{job_name}' not found in #{ci_file_path}"
46
+ return
47
+ end
48
+
49
+ script_file = "temp_script.sh"
50
+ write_script_to_file(script, script_file)
51
+ FileUtils.chmod("+x", script_file)
52
+
53
+ puts "Running script in Docker container..."
54
+ run_script_in_docker(docker_image, script_file)
55
+
56
+ # Clean up the temporary script file
57
+ FileUtils.rm(script_file)
58
+ end
59
+ end
60
+ end
@@ -1,112 +1,112 @@
1
- # frozen_string_literal: true
2
-
3
- # This module provides classes for the Makit gem.
4
- module Makit
5
- class Humanize
6
- def self.get_humanized_size(bytes, precision = 2)
7
- units = ["B", "KB", "MB", "GB", "TB", "PB"]
8
- return "0 B" if bytes == 0
9
-
10
- exp = (Math.log(bytes) / Math.log(1024)).to_i
11
- exp = units.size - 1 if exp >= units.size
12
-
13
- size = bytes.to_f / (1024 ** exp)
14
- format("%.#{precision}f %s", size, units[exp])
15
- end
16
-
17
- def self.get_humanized_timestamp(timestamp)
18
- return timestamp.strftime("%Y-%m-%d %I:%M:%S %p") if timestamp.respond_to?(:strftime)
19
- timestamp.strftime("%Y-%m-%d %H:%M:%S")
20
- end
21
-
22
- def self.get_make_result_summary(make_result)
23
- summary = "Make Result\n"
24
- summary += " Repository: #{make_result.repository}\n"
25
- summary += " Commit: #{make_result.commit}\n"
26
- summary += " Branch: #{make_result.branch}\n"
27
- summary += " Tag: #{make_result.tag}\n"
28
- summary += " Device: #{make_result.device}\n"
29
- summary += " Runtime Identifier: #{make_result.runtime_identifier}\n"
30
- summary += " Initial Size: #{get_humanized_size(make_result.initial_size)}\n"
31
- summary += " Final Size: #{get_humanized_size(make_result.final_size)}\n"
32
- summary += " Delta Size: #{get_humanized_size(make_result.final_size - make_result.initial_size)}\n"
33
- summary += " Commands: (#{make_result.commands.length})\n"
34
- make_result.commands.each do |command|
35
- details = get_command_details(command)
36
- summary += "\n"
37
- summary += indent_string(details, 4)
38
- summary += "\n"
39
- end
40
-
41
- summary
42
- end
43
-
44
- def self.get_commands(commands)
45
- message = ""
46
- commands.each do |command|
47
- message += Makit::Humanize::get_command_details(command)
48
- end
49
- message
50
- end
51
-
52
- def self.get_command_summary(command)
53
- symbol = Makit::Symbols.warning
54
- symbol = Makit::Symbols.checkmark if !command.exit_code.nil? && command.exit_code.zero?
55
- symbol = Makit::Symbols.error if command.exit_code != 0
56
- "#{symbol} #{command.name} #{command.arguments.join(" ")}"
57
- end
58
-
59
- def self.get_command_details(command)
60
- summary = "#{get_command_summary(command)}\n"
61
- summary += " Name: #{command.name}\n"
62
- summary += " Arguments: #{command.arguments.join(" ")}\n"
63
- summary += " Directory: #{command.directory}\n"
64
- summary += " Exit Code: #{command.exit_code}\n"
65
- if command.output.length > 0
66
- summary += " Output:\n"
67
- summary += indent_string(command.output, 4)
68
- summary += "\n"
69
- end
70
- if command.error.length > 0
71
- summary += " Error:\n"
72
- summary += indent_string(command.error, 4)
73
- summary += "\n"
74
- end
75
- summary
76
- end
77
-
78
- def self.indent_string(string, spaces)
79
- string.split("\n").map { |line| " " * spaces + line }.join("\n")
80
- end
81
-
82
- def self.get_protobuf_timestamp(timestamp)
83
- Time.at(timestamp.seconds, timestamp.nanos / 1000.0).strftime("%Y-%m-%d %H:%M:%S")
84
- end
85
-
86
- def self.get_protobuf_duration(duration)
87
- total_seconds = duration.seconds + (duration.nanos / 1_000_000_000.0)
88
- hours = (total_seconds / 3600).to_i
89
- minutes = ((total_seconds % 3600) / 60).to_i
90
- seconds = (total_seconds % 60).round(2)
91
- "#{hours}h #{minutes}m #{seconds}s"
92
- end
93
-
94
- def self.get_humanized_duration(seconds)
95
- minutes = (seconds / 60).to_i
96
- seconds = (seconds % 60).to_i
97
- hours = (minutes / 60).to_i
98
- minutes = minutes % 60
99
- days = (hours / 24).to_i
100
- hours = hours % 24
101
- milliseconds = (seconds % 1 * 1000).to_i
102
-
103
- parts = []
104
- parts << "#{days} days" if days > 0
105
- parts << "#{hours} hours" if hours > 0
106
- parts << "#{minutes} minutes" if minutes > 0
107
- parts << "#{seconds} seconds" if seconds > 0
108
- parts << "#{milliseconds} milliseconds" if milliseconds > 0 && seconds < 1
109
- parts.join(", ")
110
- end
111
- end
112
- end
1
+ # frozen_string_literal: true
2
+
3
+ # This module provides classes for the Makit gem.
4
+ module Makit
5
+ class Humanize
6
+ def self.get_humanized_size(bytes, precision = 2)
7
+ units = ["B", "KB", "MB", "GB", "TB", "PB"]
8
+ return "0 B" if bytes == 0
9
+
10
+ exp = (Math.log(bytes) / Math.log(1024)).to_i
11
+ exp = units.size - 1 if exp >= units.size
12
+
13
+ size = bytes.to_f / (1024 ** exp)
14
+ format("%.#{precision}f %s", size, units[exp])
15
+ end
16
+
17
+ def self.get_humanized_timestamp(timestamp)
18
+ return timestamp.strftime("%Y-%m-%d %I:%M:%S %p") if timestamp.respond_to?(:strftime)
19
+ timestamp.strftime("%Y-%m-%d %H:%M:%S")
20
+ end
21
+
22
+ def self.get_make_result_summary(make_result)
23
+ summary = "Make Result\n"
24
+ summary += " Repository: #{make_result.repository}\n"
25
+ summary += " Commit: #{make_result.commit}\n"
26
+ summary += " Branch: #{make_result.branch}\n"
27
+ summary += " Tag: #{make_result.tag}\n"
28
+ summary += " Device: #{make_result.device}\n"
29
+ summary += " Runtime Identifier: #{make_result.runtime_identifier}\n"
30
+ summary += " Initial Size: #{get_humanized_size(make_result.initial_size)}\n"
31
+ summary += " Final Size: #{get_humanized_size(make_result.final_size)}\n"
32
+ summary += " Delta Size: #{get_humanized_size(make_result.final_size - make_result.initial_size)}\n"
33
+ summary += " Commands: (#{make_result.commands.length})\n"
34
+ make_result.commands.each do |command|
35
+ details = get_command_details(command)
36
+ summary += "\n"
37
+ summary += indent_string(details, 4)
38
+ summary += "\n"
39
+ end
40
+
41
+ summary
42
+ end
43
+
44
+ def self.get_commands(commands)
45
+ message = ""
46
+ commands.each do |command|
47
+ message += Makit::Humanize::get_command_details(command)
48
+ end
49
+ message
50
+ end
51
+
52
+ def self.get_command_summary(command)
53
+ symbol = Makit::Symbols.warning
54
+ symbol = Makit::Symbols.checkmark if !command.exit_code.nil? && command.exit_code.zero?
55
+ symbol = Makit::Symbols.error if command.exit_code != 0
56
+ "#{symbol} #{command.name} #{command.arguments.join(" ")}"
57
+ end
58
+
59
+ def self.get_command_details(command)
60
+ summary = "#{get_command_summary(command)}\n"
61
+ summary += " Name: #{command.name}\n"
62
+ summary += " Arguments: #{command.arguments.join(" ")}\n"
63
+ summary += " Directory: #{command.directory}\n"
64
+ summary += " Exit Code: #{command.exit_code}\n"
65
+ if command.output.length > 0
66
+ summary += " Output:\n"
67
+ summary += indent_string(command.output, 4)
68
+ summary += "\n"
69
+ end
70
+ if command.error.length > 0
71
+ summary += " Error:\n"
72
+ summary += indent_string(command.error, 4)
73
+ summary += "\n"
74
+ end
75
+ summary
76
+ end
77
+
78
+ def self.indent_string(string, spaces)
79
+ string.split("\n").map { |line| " " * spaces + line }.join("\n")
80
+ end
81
+
82
+ def self.get_protobuf_timestamp(timestamp)
83
+ Time.at(timestamp.seconds, timestamp.nanos / 1000.0).strftime("%Y-%m-%d %H:%M:%S")
84
+ end
85
+
86
+ def self.get_protobuf_duration(duration)
87
+ total_seconds = duration.seconds + (duration.nanos / 1_000_000_000.0)
88
+ hours = (total_seconds / 3600).to_i
89
+ minutes = ((total_seconds % 3600) / 60).to_i
90
+ seconds = (total_seconds % 60).round(2)
91
+ "#{hours}h #{minutes}m #{seconds}s"
92
+ end
93
+
94
+ def self.get_humanized_duration(seconds)
95
+ minutes = (seconds / 60).to_i
96
+ seconds = (seconds % 60).to_i
97
+ hours = (minutes / 60).to_i
98
+ minutes = minutes % 60
99
+ days = (hours / 24).to_i
100
+ hours = hours % 24
101
+ milliseconds = (seconds % 1 * 1000).to_i
102
+
103
+ parts = []
104
+ parts << "#{days} days" if days > 0
105
+ parts << "#{hours} hours" if hours > 0
106
+ parts << "#{minutes} minutes" if minutes > 0
107
+ parts << "#{seconds} seconds" if seconds > 0
108
+ parts << "#{milliseconds} milliseconds" if milliseconds > 0 && seconds < 1
109
+ parts.join(", ")
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This module provides classes for the Makit gem.
4
+ module Makit
5
+ # This class provide methods for indexing objects.
6
+ #
7
+ class Indexer
8
+ attr_accessor :keywords_index # Hash of string key to string[] of keyword
9
+ attr_accessor :protoc_json_serializer
10
+
11
+ def initialize
12
+ @keywords_index=Hash.new
13
+ @protoc_json_serializer = Makit::Serializer::new(Makit::Proto3Formats::JSON)
14
+ end
15
+
16
+ def index(key, item)
17
+ # item must be serializable to json
18
+ keywords = []
19
+ hash = JSON.parse(item.to_json)
20
+ hash.each do |key, value|
21
+ value = value.to_s.downcase
22
+ if(value.length >= 3 && !keywords.include?(value))
23
+ keywords << value
24
+ end
25
+ end
26
+ keywords.each do |keyword|
27
+ if !@keywords_index.key?(keyword)
28
+ @keywords_index[keyword] = []
29
+ end
30
+ @keywords_index[keyword] << key unless @keywords_index[keyword].include?(key)
31
+ end
32
+ end
33
+
34
+ def search(query)
35
+ keys = []
36
+ # todo, remove terms less that length of 3
37
+ terms = query.downcase.split(' ').reject { |term| term.length < 3 }
38
+ keywords_index.each do |key,value|#{|kvp|
39
+ if(get_match_count(terms,value) == terms.length)
40
+ keys << key
41
+ end
42
+ end
43
+ keys
44
+ end
45
+
46
+ def get_match_count(terms,keywords)
47
+ match_count = 0
48
+ terms.each{ |term|
49
+ if(keywords.include?(term))
50
+ match_count +=1
51
+ end
52
+ }
53
+ return match_count
54
+ end
55
+ end # class Indexer
56
+ end # module Makit