class YAVDB::Database

Public Class Methods

save(database_path, vulns) click to toggle source
# File lib/yavdb/database.rb, line 23
def self.save(database_path, vulns)
  vulns_grouped_by_package_manager = group_by_package_manager(vulns)
  save_to_file(database_path, vulns_grouped_by_package_manager)
end

Private Class Methods

group_by_package_manager(vulns) click to toggle source
# File lib/yavdb/database.rb, line 42
def group_by_package_manager(vulns)
  vulns
    .group_by(&:package_manager)
    .map do |package_manager, vunerabilities_by_pm|
    puts "#{package_manager}: #{vunerabilities_by_pm.length}"

    vunerabilities_by_pm =
      vunerabilities_by_pm
        .group_by(&:affected_package)
        .map do |package, vunerabilities_by_p|
        [package, vunerabilities_by_p]
      end.to_h

    [package_manager, vunerabilities_by_pm]
  end.to_h
end
package_path(database_path, package_manager, package_name) click to toggle source
# File lib/yavdb/database.rb, line 94
def package_path(database_path, package_manager, package_name)
  File.expand_path(File.join(database_path, package_manager, "#{package_name}.yml"))
end
save_to_file(database_path, vulns) click to toggle source
# File lib/yavdb/database.rb, line 59
def save_to_file(database_path, vulns)
  vulns.map do |package_manager, vunerabilities_by_pm|
    vunerabilities_by_pm.map do |package, vunerabilities_by_p|
      previous_vulnerabilities = search(database_path, package_manager, package)

      package_path           = package_path(database_path, package_manager, package)
      package_path_directory = File.dirname(package_path)
      FileUtils.mkdir_p(package_path_directory) unless File.exist?(package_path_directory)

      uniq_vunerabilities_by_p = Hash[previous_vulnerabilities.concat(vunerabilities_by_p).map { |vuln| [vuln.id, vuln] }].values

      next unless uniq_vunerabilities_by_p.any?

      File.open(package_path, 'wb') do |file|
        package_vulns_yml_str = uniq_vunerabilities_by_p
                                  .sort_by(&:id)
                                  .map(&:to_map)
                                  .to_yaml(
                                    :Indent => 4,
                                    :SortKeys => true,
                                    :UseHeader => true,
                                    :UseVersion => true,
                                    :ExplicitTypes => true,
                                    :BestWidth => 80,
                                    :UseFold => true,
                                    :UseBlock => true,
                                    :Encoding => :Utf8
                                  )

        file.puts(package_vulns_yml_str)
      end
    end
  end
end