lib/license_finder/reports/csv_report.rb
require 'csv'
module LicenseFinder
class CsvReport < Report
COMMA_SEP = ','.freeze
NEWLINE_SEP = '\@NL'.freeze
AVAILABLE_COLUMNS = %w[name version authors licenses license_links approved summary description homepage install_path package_manager groups texts notice approved_by approved_reason].freeze
MISSING_DEPENDENCY_TEXT = 'This package is not installed. Please install to determine licenses.'.freeze
def initialize(dependencies, options)
super
options[:columns] ||= %w[name version licenses]
@columns = Array(options[:columns]) & self.class::AVAILABLE_COLUMNS
@write_headers = options[:write_headers] || false
end
def to_s
CSV.generate(col_sep: self.class::COMMA_SEP, headers: @columns, write_headers: @write_headers) do |csv|
sorted_dependencies.each do |s|
csv << format_dependency(s)
end
end
end
private
def format_dependency(dep)
@columns.map do |column|
send("format_#{column}", dep)
end
end
def format_texts(dep)
dep.license_files.map { |file| file.text.split(/[\n\r]+/).join(self.class::NEWLINE_SEP) }
.join(self.class::NEWLINE_SEP).force_encoding("ISO-8859-1").encode("UTF-8")
end
def format_notice(dep)
dep.notice_files.map { |file| file.text.split(/[\n\r]+/).join(self.class::NEWLINE_SEP) }
.join(self.class::NEWLINE_SEP).force_encoding("ISO-8859-1").encode("UTF-8")
end
def format_name(dep)
dep.name
end
def format_version(dep)
dep.version
end
def format_authors(dep)
dep.authors.to_s.strip
end
def format_homepage(dep)
dep.homepage
end
def format_licenses(dep)
if dep.missing?
MISSING_DEPENDENCY_TEXT
else
dep.licenses.map(&@use_spdx_id ? :standard_id : :name).join(self.class::COMMA_SEP)
end
end
def format_license_links(dep)
dep.licenses.map(&:url).join(self.class::COMMA_SEP)
end
def format_approved(dep)
dep.approved? ? 'Approved' : 'Not approved'
end
def format_summary(dep)
dep.summary.to_s.strip
end
def format_description(dep)
dep.description.to_s.strip
end
def format_install_path(dep)
dep.install_path
end
def format_package_manager(dep)
dep.package_manager
end
def format_groups(dep)
if dep.groups.nil?
''
else
dep.groups.join(self.class::COMMA_SEP)
end
end
def format_approved_by(dep)
dep.approved_manually? ? dep.manual_approval.who : ''
end
def format_approved_reason(dep)
dep.approved_manually? ? dep.manual_approval.why : ''
end
end
end