From b7f7ef8b81d193b5535cb3c48b9244ecd446057f Mon Sep 17 00:00:00 2001 From: Serafima Ostrovskaya Date: Tue, 28 May 2019 17:40:18 -0400 Subject: [PATCH] [Added] --homepage option to `dependencies add` - Uses most recently added homepage for dependencies [finish #164251236] Signed-off-by: Vikram Yadav --- README.md | 4 +-- .../configure/add_dependencies_spec.rb | 7 ++++ lib/license_finder/cli/dependencies.rb | 4 ++- lib/license_finder/decision_applier.rb | 7 ++++ lib/license_finder/decisions.rb | 11 +++++++ lib/license_finder/package.rb | 4 ++- .../license_finder/cli/dependencies_spec.rb | 9 +++++ .../license_finder/decision_applier_spec.rb | 8 +++++ spec/lib/license_finder/decisions_spec.rb | 33 +++++++++++++++++++ 9 files changed, 83 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3421e126f..3909d9fc0 100644 --- a/README.md +++ b/README.md @@ -310,11 +310,11 @@ you should manually research what the actual license is. When you have established the real license, you can record it with: ```sh -$ license_finder licenses add my_unknown_dependency MIT +$ license_finder licenses add my_unknown_dependency MIT --homepage="www.unknown-code.org" ``` This command would assign the MIT license to the dependency -`my_unknown_dependency`. +`my_unknown_dependency`. It will also set its homepage to `wwww.unknown-code.org`. ### Adding Hidden Dependencies diff --git a/features/features/configure/add_dependencies_spec.rb b/features/features/configure/add_dependencies_spec.rb index 7420901d4..fc79e5cb4 100644 --- a/features/features/configure/add_dependencies_spec.rb +++ b/features/features/configure/add_dependencies_spec.rb @@ -25,6 +25,13 @@ expect(developer).not_to be_seeing 'manual_dep' end + specify 'can be simultaneously homepaged' do + developer.execute_command 'license_finder dependencies add manual Whatever --homepage=some-homepage' + + developer.run_license_finder(nil, '--columns="name" "homepage"') + expect(developer).to be_seeing 'manual, some-homepage' + end + specify 'appear in the CLI' do developer.execute_command 'license_finder dependencies add manual_dep Whatever' expect(developer).to be_seeing 'manual_dep' diff --git a/lib/license_finder/cli/dependencies.rb b/lib/license_finder/cli/dependencies.rb index 30ac8af19..01dd0df9f 100644 --- a/lib/license_finder/cli/dependencies.rb +++ b/lib/license_finder/cli/dependencies.rb @@ -7,13 +7,15 @@ class Dependencies < Base include MakesDecisions method_option :approve, type: :boolean, desc: 'Approve the added dependency' + method_option :homepage, type: :string, desc: 'Source of the added dependency' auditable - desc 'add DEPENDENCY LICENSE [VERSION] [--approve]', 'Add a dependency that is not managed by a package manager, optionally approving it at the same time' + desc 'add DEPENDENCY LICENSE [VERSION] [--homepage=HOMEPAGE] [--approve]', 'Add a dependency that is not managed by a package manager, optionally approving it at the same time' def add(name, license, version = nil) modifying do decisions .add_package(name, version, txn) .license(name, license, txn) + decisions.homepage(name, options[:homepage], txn) if options[:homepage] decisions.approve(name, txn) if options[:approve] end if options[:approve] diff --git a/lib/license_finder/decision_applier.rb b/lib/license_finder/decision_applier.rb index adfb9a940..8c9e3151c 100644 --- a/lib/license_finder/decision_applier.rb +++ b/lib/license_finder/decision_applier.rb @@ -30,6 +30,7 @@ def apply_decisions all_packages .map { |package| with_decided_licenses(package) } .map { |package| with_approval(package) } + .map { |package| with_homepage(package) } .reject { |package| ignored?(package) } end @@ -45,6 +46,12 @@ def with_decided_licenses(package) package end + def with_homepage(package) + homepage = decisions.homepage_of(package.name) + package.homepage = homepage if homepage + package + end + def with_approval(package) if package.licenses.all? { |license| decisions.blacklisted?(license) } package.blacklisted! diff --git a/lib/license_finder/decisions.rb b/lib/license_finder/decisions.rb index a86b5a99d..32efd403d 100644 --- a/lib/license_finder/decisions.rb +++ b/lib/license_finder/decisions.rb @@ -12,6 +12,10 @@ def licenses_of(name) @licenses[name] end + def homepage_of(name) + @homepages[name] + end + def approval_of(name, version = nil) if !@approvals.key?(name) nil @@ -62,6 +66,7 @@ def initialize @decisions = [] @packages = Set.new @licenses = Hash.new { |h, k| h[k] = Set.new } + @homepages = {} @approvals = {} @whitelisted = Set.new @blacklisted = Set.new @@ -93,6 +98,12 @@ def unlicense(name, lic, txn = {}) self end + def homepage(name, homepage, txn = {}) + @decisions << [:homepage, name, homepage, txn] + @homepages[name] = homepage + self + end + def approve(name, txn = {}) @decisions << [:approve, name, txn] diff --git a/lib/license_finder/package.rb b/lib/license_finder/package.rb index 72d455155..25742f2fb 100644 --- a/lib/license_finder/package.rb +++ b/lib/license_finder/package.rb @@ -61,8 +61,10 @@ def initialize(name, version = nil, options = {}) ## DESCRIPTION + attr_accessor :homepage + attr_reader :name, :version, :authors, - :summary, :description, :homepage, + :summary, :description, :children, :parents, :groups ## APPROVAL diff --git a/spec/lib/license_finder/cli/dependencies_spec.rb b/spec/lib/license_finder/cli/dependencies_spec.rb index 3a2a521a1..1d5e172da 100644 --- a/spec/lib/license_finder/cli/dependencies_spec.rb +++ b/spec/lib/license_finder/cli/dependencies_spec.rb @@ -52,6 +52,15 @@ module CLI expect(approval.why).to eq 'We really need this' expect(approval.safe_versions).to eq ['1.0.0.RELEASE'] end + + it 'has a --homepage=HOMEPAGE option to add a homepage to the added dependency' do + subject.options = { homepage: 'some-homepage' } + silence_stdout do + subject.add('js_dep', 'MIT') + end + homepage = subject.decisions.homepage_of('js_dep') + expect(homepage).to eq 'some-homepage' + end end describe 'remove' do diff --git a/spec/lib/license_finder/decision_applier_spec.rb b/spec/lib/license_finder/decision_applier_spec.rb index d7b5bce84..675d02fac 100644 --- a/spec/lib/license_finder/decision_applier_spec.rb +++ b/spec/lib/license_finder/decision_applier_spec.rb @@ -29,6 +29,14 @@ module LicenseFinder expect(decision_applier.acknowledged.last.licenses).to eq Set.new([License.find_by_name('MIT')]) end + it 'applies decided homepage' do + decisions = Decisions.new + .add_package('manual', nil) + .homepage('manual', 'some-homepage') + decision_applier = described_class.new(decisions: decisions, packages: []) + expect(decision_applier.acknowledged.last.homepage).to eq 'some-homepage' + end + it 'ignores specific packages' do decisions = Decisions.new .add_package('manual', nil) diff --git a/spec/lib/license_finder/decisions_spec.rb b/spec/lib/license_finder/decisions_spec.rb index e1bb45bf0..2b9b57ea9 100644 --- a/spec/lib/license_finder/decisions_spec.rb +++ b/spec/lib/license_finder/decisions_spec.rb @@ -91,6 +91,23 @@ module LicenseFinder end end + describe '.homepage' do + it 'will report homepage for a dependency' do + homepage = subject + .homepage('dep', 'home-page/dep') + .homepage_of('dep') + expect(homepage).to eq 'home-page/dep' + end + + it 'will report overwritten homepages' do + homepages = subject + .homepage('dep', 'home-page/dep') + .homepage('dep', 'other-page/dep') + .homepage_of('dep') + expect(homepages).to eq 'other-page/dep' + end + end + describe '.approve' do it 'will report a dependency as approved' do decisions = subject.approve('dep') @@ -302,6 +319,22 @@ def roundtrip(decisions) expect(licenses).to eq [License.find_by_name('GPL')].to_set end + it 'can restore homepage' do + homepage = roundtrip( + subject.homepage('dep', 'home-page/dep') + ).homepage_of('dep') + expect(homepage).to eq 'home-page/dep' + end + + it 'can restore overwritten homepages' do + homepage = roundtrip( + subject + .homepage('dep', 'home-page/dep') + .homepage('dep', 'other-page/dep') + ).homepage_of('dep') + expect(homepage).to eq 'other-page/dep' + end + it 'can restore approvals without versions' do time = Time.now.getutc roundtrip(subject.approve('dep', who: 'Somebody', why: 'Some reason', when: time))