From 27888daf19c84e646ffdae7a635f38db8bc05cdb Mon Sep 17 00:00:00 2001 From: mo khan Date: Wed, 21 Aug 2019 10:31:01 -0600 Subject: Move version classes to Report namespace --- lib/license/management.rb | 6 +- lib/license/management/json_report.rb | 31 ----------- lib/license/management/report.rb | 34 ++++++++++++ lib/license/management/report/versions/base.rb | 40 +++++++++++++ lib/license/management/report/versions/v1.rb | 77 ++++++++++++++++++++++++++ lib/license/management/versions/base.rb | 39 ------------- lib/license/management/versions/v1.rb | 75 ------------------------- 7 files changed, 153 insertions(+), 149 deletions(-) delete mode 100644 lib/license/management/json_report.rb create mode 100644 lib/license/management/report.rb create mode 100644 lib/license/management/report/versions/base.rb create mode 100644 lib/license/management/report/versions/v1.rb delete mode 100644 lib/license/management/versions/base.rb delete mode 100644 lib/license/management/versions/v1.rb (limited to 'lib') diff --git a/lib/license/management.rb b/lib/license/management.rb index 2fdb6b5..64fd4e8 100644 --- a/lib/license/management.rb +++ b/lib/license/management.rb @@ -6,13 +6,11 @@ require 'license_finder' require 'license/management/loggable' require 'license/management/verifiable' require 'license/management/repository' -require 'license/management/versions/base' -require 'license/management/versions/v1' -require 'license/management/json_report' +require 'license/management/report' require 'license/management/version' # This applies a monkey patch to the JsonReport found in the `license_finder` gem. -LicenseFinder::JsonReport.prepend(License::Management::JsonReport) +LicenseFinder::JsonReport.prepend(License::Management::Report) module License module Management diff --git a/lib/license/management/json_report.rb b/lib/license/management/json_report.rb deleted file mode 100644 index fde30ef..0000000 --- a/lib/license/management/json_report.rb +++ /dev/null @@ -1,31 +0,0 @@ -# frozen_string_literal: true - -module License - module Management - module JsonReport - DEFAULT_VERSION = '1' - VERSIONS = { - nil => ::License::Management::Versions::V1, - '' => ::License::Management::Versions::V1, - '1' => ::License::Management::Versions::V1, - '1.0' => ::License::Management::Versions::V1 - }.freeze - - # This method overrides the method defined in `License::Management::JsonReport` to - # allow us to generate a custom json report. - def to_s - JSON.pretty_generate(version_for(report_version).to_h) + "\n" - end - - private - - def report_version - ENV.fetch('LM_REPORT_VERSION', DEFAULT_VERSION) - end - - def version_for(version) - VERSIONS.fetch(version.to_s).new(dependencies) - end - end - end -end diff --git a/lib/license/management/report.rb b/lib/license/management/report.rb new file mode 100644 index 0000000..40fa854 --- /dev/null +++ b/lib/license/management/report.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require 'license/management/report/versions/base' +require 'license/management/report/versions/v1' + +module License + module Management + module Report + DEFAULT_VERSION = '1' + VERSIONS = { + nil => Versions::V1, + '' => Versions::V1, + '1' => Versions::V1, + '1.0' => Versions::V1 + }.freeze + + # This method overrides the method defined in `LicenseFinder::JsonReport` to + # allow us to generate a custom json report. + def to_s + JSON.pretty_generate(version_for(report_version).to_h) + "\n" + end + + private + + def report_version + ENV.fetch('LM_REPORT_VERSION', DEFAULT_VERSION) + end + + def version_for(version) + VERSIONS.fetch(version.to_s).new(dependencies) + end + end + end +end diff --git a/lib/license/management/report/versions/base.rb b/lib/license/management/report/versions/base.rb new file mode 100644 index 0000000..68bd41f --- /dev/null +++ b/lib/license/management/report/versions/base.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +module License + module Management + module Report + module Versions + class Base + include Loggable + include Verifiable + + attr_reader :dependencies, :repository + + def initialize(dependencies) + @dependencies = dependencies + @repository = License::Management::Repository.new + end + + def to_h + raise NotImplementedError + end + + private + + def paths_from(dependency) + return [] unless dependency.respond_to?(:aggregate_paths) + + paths = dependency.aggregate_paths + return [] if blank?(paths) + + paths.map { |x| x.gsub(Dir.pwd, '.') } + end + + def description_for(dependency) + present?(dependency.summary) ? dependency.summary : dependency.description + end + end + end + end + end +end diff --git a/lib/license/management/report/versions/v1.rb b/lib/license/management/report/versions/v1.rb new file mode 100644 index 0000000..c14864b --- /dev/null +++ b/lib/license/management/report/versions/v1.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +module License + module Management + module Report + module Versions + class V1 < Base + def to_h + { + licenses: license_summary, + dependencies: formatted_dependencies(dependencies) + } + end + + private + + # when a dependency has multiple licenses, this will join the licenses into a single name + # this defect was backported from the html2json version of this script. + def license_summary + dependencies + .map { |dependency| join_license_names(dependency.licenses) } + .flatten + .group_by { |name| name } + .map { |license, items| { count: items.count, name: license } } + .sort_by { |hash| [-hash[:count], hash[:name]] } + end + + # when a dependency has more than one license + # this method chooses one of the urls. + # to maintain backwards compatibility this bug has been carried forward. + def license_for(dependency) + license = { name: join_license_names(dependency.licenses) } + + urls = dependency.licenses.map(&:url).reject { |x| blank?(x) }.uniq.sort + log_info("multiple urls detected: #{urls.inspect}") if urls.size > 1 + url = urls[0] || license_data(dependency.licenses.first)['url'] + + license[:url] = url if present?(url) + license + end + + def join_license_names(licenses) + licenses.map { |x| best_name_for(x) }.sort.reverse.join(', ') + end + + def map_from_dependency(dependency) + result = { + license: license_for(dependency), + dependency: { + name: dependency.name, + url: dependency.homepage, + description: description_for(dependency), + pathes: paths_from(dependency) + } + } + result[:dependency].delete(:url) if blank?(dependency.homepage) + result + end + + def formatted_dependencies(dependencies) + dependencies + .sort_by(&:name) + .map { |x| map_from_dependency(x) } + end + + def best_name_for(license) + license_data(license)['name'] + end + + def license_data(license) + repository.item_for(license) + end + end + end + end + end +end diff --git a/lib/license/management/versions/base.rb b/lib/license/management/versions/base.rb deleted file mode 100644 index a087520..0000000 --- a/lib/license/management/versions/base.rb +++ /dev/null @@ -1,39 +0,0 @@ -# frozen_string_literal: true - -module License - module Management - module Versions - class Base - include Loggable - include Verifiable - - attr_reader :dependencies, :repository - - def initialize(dependencies) - @dependencies = dependencies - @repository = License::Management::Repository.new - end - - def to_h - raise NotImplementedError - end - - private - - - def paths_from(dependency) - return [] unless dependency.respond_to?(:aggregate_paths) - - paths = dependency.aggregate_paths - return [] if blank?(paths) - - paths.map { |x| x.gsub(Dir.pwd, '.') } - end - - def description_for(dependency) - present?(dependency.summary) ? dependency.summary : dependency.description - end - end - end - end -end diff --git a/lib/license/management/versions/v1.rb b/lib/license/management/versions/v1.rb deleted file mode 100644 index 1ef81c0..0000000 --- a/lib/license/management/versions/v1.rb +++ /dev/null @@ -1,75 +0,0 @@ -# frozen_string_literal: true - -module License - module Management - module Versions - class V1 < Base - def to_h - { - licenses: license_summary, - dependencies: formatted_dependencies(dependencies) - } - end - - private - - # when a dependency has multiple licenses, this will join the licenses into a single name - # this defect was backported from the html2json version of this script. - def license_summary - dependencies - .map { |dependency| join_license_names(dependency.licenses) } - .flatten - .group_by { |name| name } - .map { |license, items| { count: items.count, name: license } } - .sort_by { |hash| [-hash[:count], hash[:name]] } - end - - # when a dependency has more than one license - # this method chooses one of the urls. - # to maintain backwards compatibility this bug has been carried forward. - def license_for(dependency) - license = { name: join_license_names(dependency.licenses) } - - urls = dependency.licenses.map(&:url).reject { |x| blank?(x) }.uniq.sort - log_info("multiple urls detected: #{urls.inspect}") if urls.size > 1 - url = urls[0] || license_data(dependency.licenses.first)['url'] - - license[:url] = url if present?(url) - license - end - - def join_license_names(licenses) - licenses.map { |x| best_name_for(x) }.sort.reverse.join(', ') - end - - def map_from_dependency(dependency) - result = { - license: license_for(dependency), - dependency: { - name: dependency.name, - url: dependency.homepage, - description: description_for(dependency), - pathes: paths_from(dependency) - } - } - result[:dependency].delete(:url) if blank?(dependency.homepage) - result - end - - def formatted_dependencies(dependencies) - dependencies - .sort_by(&:name) - .map { |x| map_from_dependency(x) } - end - - def best_name_for(license) - license_data(license)['name'] - end - - def license_data(license) - repository.item_for(license) - end - end - end - end -end -- cgit v1.2.3