license_finder 2.0.0.rc2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -1
- data/CHANGELOG.rdoc +16 -9
- data/CONTRIBUTING.md +3 -3
- data/README.md +4 -1
- data/TODO.md +6 -19
- data/bin/license_finder_pip.py +2 -2
- data/features/features/cli_spec.rb +18 -18
- data/features/features/configure/add_dependencies_spec.rb +16 -16
- data/features/features/configure/approve_dependencies_spec.rb +10 -9
- data/features/features/configure/assign_licenses_spec.rb +8 -8
- data/features/features/configure/ignore_dependencies_spec.rb +15 -15
- data/features/features/configure/ignore_groups_spec.rb +15 -15
- data/features/features/configure/name_project_spec.rb +15 -14
- data/features/features/configure/whitelist_licenses_spec.rb +21 -21
- data/features/features/package_managers/bower_spec.rb +3 -3
- data/features/features/package_managers/cocoapods_spec.rb +4 -4
- data/features/features/package_managers/gradle_spec.rb +3 -3
- data/features/features/package_managers/maven_spec.rb +3 -3
- data/features/features/package_managers/npm_spec.rb +3 -3
- data/features/features/package_managers/pip_spec.rb +3 -3
- data/features/features/report/csv_spec.rb +9 -8
- data/features/features/report/html_spec.rb +13 -12
- data/features/support/testing_dsl.rb +1 -1
- data/lib/license_finder.rb +1 -16
- data/lib/license_finder/cli/approvals.rb +3 -4
- data/lib/license_finder/cli/base.rb +40 -3
- data/lib/license_finder/cli/dependencies.rb +3 -3
- data/lib/license_finder/cli/main.rb +7 -25
- data/lib/license_finder/cli/makes_decisions.rb +2 -20
- data/lib/license_finder/cli/patched_thor.rb +0 -2
- data/lib/license_finder/cli/whitelist.rb +6 -8
- data/lib/license_finder/configuration.rb +1 -1
- data/lib/license_finder/core.rb +68 -0
- data/lib/license_finder/decision_applier.rb +10 -7
- data/lib/license_finder/license.rb +10 -10
- data/lib/license_finder/license/template.rb +3 -2
- data/lib/license_finder/logger.rb +2 -6
- data/lib/license_finder/package.rb +25 -44
- data/lib/license_finder/package_manager.rb +11 -13
- data/lib/license_finder/package_managers/bower.rb +1 -1
- data/lib/license_finder/package_managers/bundler.rb +1 -1
- data/lib/license_finder/package_managers/cocoa_pods.rb +3 -3
- data/lib/license_finder/package_managers/cocoa_pods_package.rb +3 -3
- data/lib/license_finder/package_managers/gradle.rb +2 -2
- data/lib/license_finder/package_managers/maven.rb +2 -2
- data/lib/license_finder/package_managers/npm.rb +1 -1
- data/lib/license_finder/package_managers/pip.rb +1 -1
- data/lib/license_finder/package_managers/pip_package.rb +6 -4
- data/lib/license_finder/packages/activation.rb +54 -0
- data/lib/license_finder/{possible_license_files.rb → packages/license_files.rb} +9 -7
- data/lib/license_finder/packages/licensing.rb +43 -0
- data/lib/license_finder/{package_managers → packages}/manual_package.rb +0 -0
- data/lib/license_finder/{possible_license_file.rb → packages/possible_license_file.rb} +0 -2
- data/lib/license_finder/version.rb +1 -1
- data/spec/fixtures/{license_directory/LICENSE/Apache.txt → all_pms/Gemfile} +0 -0
- data/spec/fixtures/all_pms/Podfile +0 -0
- data/spec/fixtures/all_pms/bower.json +0 -0
- data/spec/fixtures/all_pms/build.gradle +0 -0
- data/spec/fixtures/all_pms/package.json +0 -0
- data/spec/fixtures/all_pms/pom.xml +0 -0
- data/spec/fixtures/all_pms/requirements.txt +0 -0
- data/spec/fixtures/license_directory/COPYING +1 -0
- data/spec/fixtures/license_directory/LICENSE/MIT.txt +1 -0
- data/spec/fixtures/license_names/COPYING.txt +1 -0
- data/spec/fixtures/license_names/LICENSE +1 -0
- data/spec/fixtures/license_names/Licence.rdoc +1 -0
- data/spec/fixtures/license_names/Mit-License +1 -0
- data/spec/fixtures/license_names/README.rdoc +1 -0
- data/spec/fixtures/nested_gem/vendor/LICENSE +1 -0
- data/spec/lib/license_finder/cli/approvals_spec.rb +9 -3
- data/spec/lib/license_finder/cli/dependencies_spec.rb +5 -2
- data/spec/lib/license_finder/cli/main_spec.rb +20 -27
- data/spec/lib/license_finder/configuration_spec.rb +1 -3
- data/spec/lib/license_finder/decision_applier_spec.rb +15 -15
- data/spec/lib/license_finder/decisions_spec.rb +94 -95
- data/spec/lib/license_finder/license_spec.rb +5 -5
- data/spec/lib/license_finder/package_managers/bower_package_spec.rb +0 -4
- data/spec/lib/license_finder/package_managers/bower_spec.rb +6 -27
- data/spec/lib/license_finder/package_managers/bundler_package_spec.rb +0 -2
- data/spec/lib/license_finder/package_managers/bundler_spec.rb +0 -15
- data/spec/lib/license_finder/package_managers/cocoa_pods_package_spec.rb +5 -2
- data/spec/lib/license_finder/package_managers/cocoa_pods_spec.rb +13 -31
- data/spec/lib/license_finder/package_managers/gradle_package_spec.rb +0 -2
- data/spec/lib/license_finder/package_managers/gradle_spec.rb +11 -35
- data/spec/lib/license_finder/package_managers/maven_package_spec.rb +0 -2
- data/spec/lib/license_finder/package_managers/maven_spec.rb +18 -56
- data/spec/lib/license_finder/package_managers/npm_package_spec.rb +0 -2
- data/spec/lib/license_finder/package_managers/npm_spec.rb +0 -17
- data/spec/lib/license_finder/package_managers/pip_package_spec.rb +0 -2
- data/spec/lib/license_finder/package_managers/pip_spec.rb +8 -25
- data/spec/lib/license_finder/package_spec.rb +2 -4
- data/spec/lib/license_finder/packages/activation_spec.rb +47 -0
- data/spec/lib/license_finder/{possible_license_files_spec.rb → packages/license_files_spec.rb} +2 -6
- data/spec/lib/license_finder/packages/licensing_spec.rb +1 -0
- data/spec/lib/license_finder/{possible_license_file_spec.rb → packages/possible_license_file_spec.rb} +0 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/support/shared_examples_for_package_manager.rb +14 -1
- data/spec/support/test_fixtures.rb +7 -0
- metadata +117 -12
- data/spec/support/shared_examples_for_package.rb +0 -35
@@ -2,39 +2,39 @@ require 'feature_helper'
|
|
2
2
|
|
3
3
|
describe "Whitelisted licenses" do
|
4
4
|
# As a developer
|
5
|
-
# I want to whitelist certain
|
5
|
+
# I want to whitelist certain licenses that my business has pre-approved
|
6
6
|
# So that any dependencies with those licenses do not show up as action items
|
7
7
|
|
8
|
-
let(:
|
8
|
+
let(:developer) { LicenseFinder::TestingDSL::User.new }
|
9
9
|
|
10
|
-
before {
|
10
|
+
before { developer.create_empty_project }
|
11
11
|
|
12
12
|
specify "approve dependencies with those licenses" do
|
13
|
-
|
14
|
-
|
13
|
+
developer.execute_command 'license_finder dependencies add bsd_gem BSD'
|
14
|
+
developer.execute_command 'license_finder whitelist add BSD'
|
15
15
|
|
16
|
-
|
17
|
-
expect(
|
16
|
+
developer.run_license_finder
|
17
|
+
expect(developer).to_not be_seeing 'bsd_gem'
|
18
18
|
end
|
19
19
|
|
20
20
|
specify "approve dependencies with any of those licenses" do
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
developer.execute_command 'license_finder dependencies add dep_with_many_licenses GPL'
|
22
|
+
developer.execute_command 'license_finder licenses add dep_with_many_licenses MIT'
|
23
|
+
developer.execute_command 'license_finder whitelist add GPL'
|
24
24
|
|
25
|
-
|
26
|
-
expect(
|
25
|
+
developer.run_license_finder
|
26
|
+
expect(developer).not_to be_seeing 'dep_with_many_licenses'
|
27
27
|
end
|
28
28
|
|
29
29
|
specify "are shown in the CLI" do
|
30
|
-
|
31
|
-
expect(
|
32
|
-
|
33
|
-
expect(
|
34
|
-
|
35
|
-
|
36
|
-
expect(
|
37
|
-
|
38
|
-
expect(
|
30
|
+
developer.execute_command 'license_finder whitelist add Expat'
|
31
|
+
expect(developer).to be_seeing 'Expat'
|
32
|
+
developer.execute_command 'license_finder whitelist list'
|
33
|
+
expect(developer).to be_seeing 'MIT'
|
34
|
+
|
35
|
+
developer.execute_command 'license_finder whitelist remove Expat'
|
36
|
+
expect(developer).to be_seeing 'Expat'
|
37
|
+
developer.execute_command 'license_finder whitelist list'
|
38
|
+
expect(developer).to_not be_seeing 'MIT'
|
39
39
|
end
|
40
40
|
end
|
@@ -4,11 +4,11 @@ describe "Bower Dependencies" do
|
|
4
4
|
# As a JS developer
|
5
5
|
# I want to be able to manage Bower dependencies
|
6
6
|
|
7
|
-
let(:
|
7
|
+
let(:js_developer) { LicenseFinder::TestingDSL::User.new }
|
8
8
|
|
9
9
|
specify "are shown in reports" do
|
10
10
|
LicenseFinder::TestingDSL::BowerProject.create
|
11
|
-
|
12
|
-
expect(
|
11
|
+
js_developer.run_license_finder
|
12
|
+
expect(js_developer).to be_seeing_line "gmaps, 0.2.30, MIT"
|
13
13
|
end
|
14
14
|
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'feature_helper'
|
2
2
|
|
3
3
|
describe "CocoaPods Dependencies", ios: true do
|
4
|
-
# As a
|
4
|
+
# As a Cocoa developer
|
5
5
|
# I want to be able to manage CocoaPods dependencies
|
6
6
|
|
7
|
-
let(:
|
7
|
+
let(:cocoa_developer) { LicenseFinder::TestingDSL::User.new }
|
8
8
|
|
9
9
|
specify "are shown in reports" do
|
10
10
|
LicenseFinder::TestingDSL::CocoaPodsProject.create
|
11
|
-
|
12
|
-
expect(
|
11
|
+
cocoa_developer.run_license_finder
|
12
|
+
expect(cocoa_developer).to be_seeing_line "ABTest, 0.0.5, MIT"
|
13
13
|
end
|
14
14
|
end
|
@@ -4,11 +4,11 @@ describe "Gradle Dependencies" do
|
|
4
4
|
# As a Java developer
|
5
5
|
# I want to be able to manage Gradle dependencies
|
6
6
|
|
7
|
-
let(:
|
7
|
+
let(:java_developer) { LicenseFinder::TestingDSL::User.new }
|
8
8
|
|
9
9
|
specify "are shown in reports" do
|
10
10
|
LicenseFinder::TestingDSL::GradleProject.create
|
11
|
-
|
12
|
-
expect(
|
11
|
+
java_developer.run_license_finder
|
12
|
+
expect(java_developer).to be_seeing_line 'junit, 4.11, "Common Public License Version 1.0"'
|
13
13
|
end
|
14
14
|
end
|
@@ -4,11 +4,11 @@ describe "Maven Dependencies" do
|
|
4
4
|
# As a Java developer
|
5
5
|
# I want to be able to manage Maven dependencies
|
6
6
|
|
7
|
-
let(:
|
7
|
+
let(:java_developer) { LicenseFinder::TestingDSL::User.new }
|
8
8
|
|
9
9
|
specify "are shown in reports" do
|
10
10
|
LicenseFinder::TestingDSL::MavenProject.create
|
11
|
-
|
12
|
-
expect(
|
11
|
+
java_developer.run_license_finder
|
12
|
+
expect(java_developer).to be_seeing_line 'junit, 4.11, "Common Public License Version 1.0"'
|
13
13
|
end
|
14
14
|
end
|
@@ -4,11 +4,11 @@ describe "NPM Dependencies" do
|
|
4
4
|
# As a Node developer
|
5
5
|
# I want to be able to manage NPM dependencies
|
6
6
|
|
7
|
-
let(:
|
7
|
+
let(:node_developer) { LicenseFinder::TestingDSL::User.new }
|
8
8
|
|
9
9
|
specify "are shown in reports" do
|
10
10
|
LicenseFinder::TestingDSL::NpmProject.create
|
11
|
-
|
12
|
-
expect(
|
11
|
+
node_developer.run_license_finder
|
12
|
+
expect(node_developer).to be_seeing_line "http-server, 0.6.1, MIT"
|
13
13
|
end
|
14
14
|
end
|
@@ -4,11 +4,11 @@ describe "Pip Dependencies" do
|
|
4
4
|
# As a Python developer
|
5
5
|
# I want to be able to manage Pip dependencies
|
6
6
|
|
7
|
-
let(:
|
7
|
+
let(:python_developer) { LicenseFinder::TestingDSL::User.new }
|
8
8
|
|
9
9
|
specify "are shown in reports" do
|
10
10
|
LicenseFinder::TestingDSL::PipProject.create
|
11
|
-
|
12
|
-
expect(
|
11
|
+
python_developer.run_license_finder
|
12
|
+
expect(python_developer).to be_seeing_line 'rsa, 3.1.4, "ASL 2"'
|
13
13
|
end
|
14
14
|
end
|
@@ -1,17 +1,18 @@
|
|
1
1
|
require 'feature_helper'
|
2
2
|
|
3
3
|
describe "CSV report" do
|
4
|
-
# As a non-technical
|
5
|
-
# I want
|
6
|
-
# So that I can
|
4
|
+
# As a non-technical product owner
|
5
|
+
# I want a csv report
|
6
|
+
# So that I can easily review my application's dependencies and licenses
|
7
7
|
|
8
|
-
let(:
|
8
|
+
let(:developer) { LicenseFinder::TestingDSL::User.new }
|
9
|
+
let(:product_owner) { LicenseFinder::TestingDSL::User.new }
|
9
10
|
|
10
11
|
specify "shows dependency data in CSV form" do
|
11
|
-
|
12
|
-
|
12
|
+
developer.create_empty_project
|
13
|
+
developer.execute_command 'license_finder dependencies add info_gem BSD 1.1.1'
|
13
14
|
|
14
|
-
|
15
|
-
expect(
|
15
|
+
product_owner.execute_command('license_finder report --format csv --columns approved name version licenses')
|
16
|
+
expect(product_owner).to be_seeing "Not approved,info_gem,1.1.1,BSD"
|
16
17
|
end
|
17
18
|
end
|
@@ -1,11 +1,12 @@
|
|
1
1
|
require 'feature_helper'
|
2
2
|
|
3
3
|
describe "HTML report" do
|
4
|
-
# As a non-technical
|
5
|
-
# I want
|
6
|
-
# So that I can
|
4
|
+
# As a non-technical product owner
|
5
|
+
# I want an HTML report
|
6
|
+
# So that I can easily review my application's dependencies and licenses
|
7
7
|
|
8
|
-
let(:
|
8
|
+
let(:developer) { LicenseFinder::TestingDSL::User.new }
|
9
|
+
let(:product_owner) { LicenseFinder::TestingDSL::User.new }
|
9
10
|
|
10
11
|
specify "shows basic dependency data" do
|
11
12
|
gem_name = "a_gem"
|
@@ -18,11 +19,11 @@ describe "HTML report" do
|
|
18
19
|
homepage: "http://a_gem.github.com"
|
19
20
|
}
|
20
21
|
|
21
|
-
project =
|
22
|
-
gem =
|
22
|
+
project = developer.create_ruby_app
|
23
|
+
gem = developer.create_gem gem_name, gem_attributes
|
23
24
|
project.depend_on gem, groups: [gem_group]
|
24
25
|
|
25
|
-
|
26
|
+
product_owner.view_html.in_dep(gem_name) do |section|
|
26
27
|
expect(section.find("a[href='#{gem_attributes[:homepage]}']", text: gem_name)).to be
|
27
28
|
expect(section).to have_content gem_attributes[:license]
|
28
29
|
expect(section).to have_content gem_attributes[:summary]
|
@@ -33,12 +34,12 @@ describe "HTML report" do
|
|
33
34
|
end
|
34
35
|
|
35
36
|
specify "shows approval status of dependencies" do
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
developer.create_empty_project
|
38
|
+
developer.execute_command 'license_finder dependencies add gpl_dep GPL'
|
39
|
+
developer.execute_command 'license_finder dependencies add mit_dep MIT'
|
40
|
+
developer.execute_command 'license_finder whitelist add MIT'
|
40
41
|
|
41
|
-
html =
|
42
|
+
html = product_owner.view_html
|
42
43
|
expect(html).to be_unapproved 'gpl_dep'
|
43
44
|
expect(html).to be_approved 'mit_dep'
|
44
45
|
|
data/lib/license_finder.rb
CHANGED
@@ -6,21 +6,6 @@ module LicenseFinder
|
|
6
6
|
BIN_PATH = ROOT_PATH.join("../../bin")
|
7
7
|
end
|
8
8
|
|
9
|
-
require 'license_finder/
|
10
|
-
require 'license_finder/version'
|
11
|
-
require 'license_finder/logger'
|
12
|
-
require 'license_finder/configuration'
|
13
|
-
|
14
|
-
require 'license_finder/license'
|
15
|
-
|
16
|
-
require 'license_finder/possible_license_file'
|
17
|
-
require 'license_finder/possible_license_files'
|
18
|
-
require 'license_finder/package'
|
19
|
-
require 'license_finder/package_manager'
|
20
|
-
|
21
|
-
require 'license_finder/decisions'
|
22
|
-
require 'license_finder/decision_applier'
|
23
|
-
|
24
|
-
require 'license_finder/report'
|
9
|
+
require 'license_finder/core'
|
25
10
|
|
26
11
|
require 'license_finder/cli'
|
@@ -6,10 +6,9 @@ module LicenseFinder
|
|
6
6
|
|
7
7
|
auditable
|
8
8
|
desc "add DEPENDENCY...", "Approve one or more dependencies by name"
|
9
|
-
def add(
|
10
|
-
names
|
11
|
-
|
12
|
-
end
|
9
|
+
def add(*names)
|
10
|
+
assert_some names
|
11
|
+
modifying { names.each { |name| decisions.approve(name, txn) } }
|
13
12
|
|
14
13
|
say "The #{names.join(", ")} dependency has been approved!", :green
|
15
14
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'thor'
|
2
|
+
|
1
3
|
module LicenseFinder
|
2
4
|
module CLI
|
3
5
|
class Base < Thor
|
@@ -5,14 +7,49 @@ module LicenseFinder
|
|
5
7
|
|
6
8
|
no_commands do
|
7
9
|
def decisions
|
8
|
-
|
10
|
+
license_finder.decisions
|
9
11
|
end
|
10
12
|
end
|
11
13
|
|
12
14
|
private
|
13
15
|
|
14
|
-
def
|
15
|
-
@
|
16
|
+
def license_finder
|
17
|
+
@lf ||= LicenseFinder::Core.new(license_finder_config)
|
18
|
+
end
|
19
|
+
|
20
|
+
def license_finder_config
|
21
|
+
result = extract_options(:decisions_file, :gradle_command)
|
22
|
+
result[:logger] = logger_config
|
23
|
+
result[:project_path] = Pathname.pwd
|
24
|
+
result
|
25
|
+
end
|
26
|
+
|
27
|
+
def logger_config
|
28
|
+
@logger_config ||= extract_options(:quiet, :debug)
|
29
|
+
end
|
30
|
+
|
31
|
+
def say_each(coll)
|
32
|
+
if coll.any?
|
33
|
+
coll.each do |item|
|
34
|
+
say(block_given? ? yield(item) : item)
|
35
|
+
end
|
36
|
+
else
|
37
|
+
say '(none)'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def assert_some(things)
|
42
|
+
unless things.any?
|
43
|
+
raise ArgumentError, "wrong number of arguments (0 for 1+)", caller
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def extract_options(*keys)
|
48
|
+
result = {}
|
49
|
+
keys.each do |key|
|
50
|
+
result[key.to_sym] = options[key.to_s] if options.has_key? key.to_s
|
51
|
+
end
|
52
|
+
result
|
16
53
|
end
|
17
54
|
end
|
18
55
|
end
|
@@ -9,9 +9,9 @@ module LicenseFinder
|
|
9
9
|
desc "add DEPENDENCY LICENSE [VERSION] [--approve]", "Add a dependency that is not managed by a package manager, optionally approving it at the same time"
|
10
10
|
def add(name, license, version = nil)
|
11
11
|
modifying {
|
12
|
-
decisions
|
13
|
-
add_package(name, version, txn)
|
14
|
-
license(name, license, txn)
|
12
|
+
decisions
|
13
|
+
.add_package(name, version, txn)
|
14
|
+
.license(name, license, txn)
|
15
15
|
decisions.approve(name, txn) if options[:approve]
|
16
16
|
}
|
17
17
|
if options[:approve]
|
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'license_finder/report'
|
2
|
+
require 'license_finder/version'
|
3
|
+
|
1
4
|
module LicenseFinder
|
2
5
|
module CLI
|
3
6
|
class Main < Base
|
@@ -18,7 +21,7 @@ module LicenseFinder
|
|
18
21
|
method_option :debug, type: :boolean, desc: "emit detailed info about what LicenseFinder is doing"
|
19
22
|
desc "action_items", "List unapproved dependencies (the default action for `license_finder`)"
|
20
23
|
def action_items
|
21
|
-
unapproved =
|
24
|
+
unapproved = license_finder.unapproved
|
22
25
|
|
23
26
|
if unapproved.empty?
|
24
27
|
say "All dependencies are approved for use", :green
|
@@ -33,8 +36,8 @@ module LicenseFinder
|
|
33
36
|
|
34
37
|
desc "report", "Print a report of the project's dependencies to stdout"
|
35
38
|
def report
|
36
|
-
|
37
|
-
say report_of(
|
39
|
+
logger_config[:quiet] = true
|
40
|
+
say report_of(license_finder.acknowledged)
|
38
41
|
end
|
39
42
|
|
40
43
|
desc "version", "Print the version of LicenseFinder"
|
@@ -52,30 +55,9 @@ module LicenseFinder
|
|
52
55
|
|
53
56
|
private
|
54
57
|
|
55
|
-
# The core of the system. The saved decisions are applied to the current
|
56
|
-
# packages.
|
57
|
-
def decision_applier(logger = Logger.new(options))
|
58
|
-
DecisionApplier.new(
|
59
|
-
decisions: decisions,
|
60
|
-
packages: current_packages(logger)
|
61
|
-
)
|
62
|
-
end
|
63
|
-
|
64
|
-
def current_packages(logger)
|
65
|
-
PackageManager.current_packages(
|
66
|
-
logger: logger,
|
67
|
-
gradle_command: config.gradle_command,
|
68
|
-
ignore_groups: decisions.ignored_groups
|
69
|
-
)
|
70
|
-
end
|
71
|
-
|
72
58
|
def report_of(content)
|
73
59
|
report = FORMATS[options[:format]]
|
74
|
-
report.of(content, columns: options[:columns], project_name:
|
75
|
-
end
|
76
|
-
|
77
|
-
def fetch_project_name
|
78
|
-
decisions.project_name || Pathname.pwd.basename.to_s
|
60
|
+
report.of(content, columns: options[:columns], project_name: license_finder.project_name)
|
79
61
|
end
|
80
62
|
end
|
81
63
|
end
|
@@ -14,16 +14,6 @@ module LicenseFinder
|
|
14
14
|
|
15
15
|
private
|
16
16
|
|
17
|
-
def say_each(coll)
|
18
|
-
if coll.any?
|
19
|
-
coll.each do |item|
|
20
|
-
say(block_given? ? yield(item) : item)
|
21
|
-
end
|
22
|
-
else
|
23
|
-
say '(none)'
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
17
|
def txn
|
28
18
|
@txn ||= {
|
29
19
|
who: options[:who],
|
@@ -32,17 +22,9 @@ module LicenseFinder
|
|
32
22
|
}
|
33
23
|
end
|
34
24
|
|
35
|
-
def modifying
|
36
|
-
|
37
|
-
yield
|
38
|
-
decisions.save!(config.decisions_file)
|
39
|
-
end
|
40
|
-
|
41
|
-
def modify_each(*things)
|
42
|
-
modifying { things.each { |thing| yield thing } }
|
43
|
-
things
|
25
|
+
def modifying(&block)
|
26
|
+
license_finder.modifying(&block)
|
44
27
|
end
|
45
28
|
end
|
46
29
|
end
|
47
30
|
end
|
48
|
-
|