license-acceptance 0.2.10 → 0.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +2 -2
- data/lib/license_acceptance/acceptor.rb +24 -22
- data/lib/license_acceptance/strategy/argument.rb +44 -0
- data/lib/license_acceptance/strategy/base.rb +11 -0
- data/lib/license_acceptance/strategy/environment.rb +38 -0
- data/lib/license_acceptance/strategy/file.rb +102 -0
- data/lib/license_acceptance/strategy/prompt.rb +111 -0
- data/lib/license_acceptance/strategy/provided_value.rb +28 -0
- data/lib/license_acceptance/version.rb +1 -1
- data/spec/license_acceptance/acceptor_spec.rb +37 -73
- data/spec/license_acceptance/strategy/argument_spec.rb +82 -0
- data/spec/license_acceptance/strategy/environment_spec.rb +76 -0
- data/spec/license_acceptance/{file_acceptance_spec.rb → strategy/file_spec.rb} +3 -3
- data/spec/license_acceptance/{prompt_acceptance_spec.rb → strategy/prompt_spec.rb} +4 -4
- data/spec/license_acceptance/strategy/provided_value_spec.rb +55 -0
- metadata +14 -11
- data/lib/license_acceptance/arg_acceptance.rb +0 -32
- data/lib/license_acceptance/env_acceptance.rb +0 -26
- data/lib/license_acceptance/file_acceptance.rb +0 -97
- data/lib/license_acceptance/prompt_acceptance.rb +0 -106
- data/spec/license_acceptance/arg_acceptance_spec.rb +0 -57
- data/spec/license_acceptance/env_acceptance_spec.rb +0 -65
@@ -1,14 +1,14 @@
|
|
1
1
|
require "spec_helper"
|
2
|
-
require "license_acceptance/
|
2
|
+
require "license_acceptance/strategy/prompt"
|
3
3
|
require "license_acceptance/product"
|
4
4
|
require "tty-prompt"
|
5
5
|
|
6
|
-
RSpec.describe LicenseAcceptance::
|
6
|
+
RSpec.describe LicenseAcceptance::Strategy::Prompt do
|
7
7
|
let(:output) { StringIO.new }
|
8
8
|
let(:config) do
|
9
9
|
instance_double(LicenseAcceptance::Config, output: output)
|
10
10
|
end
|
11
|
-
let(:acc) { LicenseAcceptance::
|
11
|
+
let(:acc) { LicenseAcceptance::Strategy::Prompt.new(config) }
|
12
12
|
let(:prompt) { instance_double(TTY::Prompt) }
|
13
13
|
let(:p1) { instance_double(LicenseAcceptance::Product, name: "name", pretty_name: "Pretty Name") }
|
14
14
|
let(:missing_licenses) { [p1] }
|
@@ -60,7 +60,7 @@ RSpec.describe LicenseAcceptance::PromptAcceptance do
|
|
60
60
|
describe "when the prompt times out" do
|
61
61
|
it "returns false" do
|
62
62
|
expect(Timeout).to receive(:timeout).twice.and_yield
|
63
|
-
expect(prompt).to receive(:ask).twice.and_raise(LicenseAcceptance::PromptTimeout)
|
63
|
+
expect(prompt).to receive(:ask).twice.and_raise(LicenseAcceptance::Strategy::PromptTimeout)
|
64
64
|
expect(prompt).to receive(:unsubscribe).twice
|
65
65
|
expect(prompt).to receive(:reader).twice
|
66
66
|
msg1 = /Prompt timed out./
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "license_acceptance/strategy/provided_value"
|
3
|
+
|
4
|
+
RSpec.describe LicenseAcceptance::Strategy::ProvidedValue do
|
5
|
+
let(:acc) { LicenseAcceptance::Strategy::ProvidedValue.new(value) }
|
6
|
+
|
7
|
+
describe "#accepted?" do
|
8
|
+
describe "when the value is correct" do
|
9
|
+
let(:value) { "accept" }
|
10
|
+
it "returns true" do
|
11
|
+
expect(acc.accepted?).to eq(true)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "when the value is incorrect" do
|
16
|
+
let(:value) { nil }
|
17
|
+
it "returns false" do
|
18
|
+
expect(acc.accepted?).to eq(false)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "#silent?" do
|
24
|
+
describe "when the value is correct" do
|
25
|
+
let(:value) { "accept-silent" }
|
26
|
+
it "returns true" do
|
27
|
+
expect(acc.silent?).to eq(true)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "when the value is incorrect" do
|
32
|
+
let(:value) { "accept" }
|
33
|
+
it "returns false" do
|
34
|
+
expect(acc.silent?).to eq(false)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#no_persist?" do
|
40
|
+
describe "when the value is correct" do
|
41
|
+
let(:value) { "accept-no-persist" }
|
42
|
+
it "returns true" do
|
43
|
+
expect(acc.no_persist?).to eq(true)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "when the value is incorrect" do
|
48
|
+
let(:value) { "accept-silent" }
|
49
|
+
it "returns false" do
|
50
|
+
expect(acc.no_persist?).to eq(false)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: license-acceptance
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- tyler-ball
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-04-
|
11
|
+
date: 2019-04-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pastel
|
@@ -191,28 +191,31 @@ files:
|
|
191
191
|
- Rakefile
|
192
192
|
- config/product_info.toml
|
193
193
|
- lib/license_acceptance/acceptor.rb
|
194
|
-
- lib/license_acceptance/arg_acceptance.rb
|
195
194
|
- lib/license_acceptance/cli_flags/mixlib_cli.rb
|
196
195
|
- lib/license_acceptance/cli_flags/thor.rb
|
197
196
|
- lib/license_acceptance/config.rb
|
198
|
-
- lib/license_acceptance/env_acceptance.rb
|
199
|
-
- lib/license_acceptance/file_acceptance.rb
|
200
197
|
- lib/license_acceptance/logger.rb
|
201
198
|
- lib/license_acceptance/product.rb
|
202
199
|
- lib/license_acceptance/product_reader.rb
|
203
200
|
- lib/license_acceptance/product_relationship.rb
|
204
|
-
- lib/license_acceptance/
|
201
|
+
- lib/license_acceptance/strategy/argument.rb
|
202
|
+
- lib/license_acceptance/strategy/base.rb
|
203
|
+
- lib/license_acceptance/strategy/environment.rb
|
204
|
+
- lib/license_acceptance/strategy/file.rb
|
205
|
+
- lib/license_acceptance/strategy/prompt.rb
|
206
|
+
- lib/license_acceptance/strategy/provided_value.rb
|
205
207
|
- lib/license_acceptance/version.rb
|
206
208
|
- spec/license_acceptance/acceptor_spec.rb
|
207
|
-
- spec/license_acceptance/arg_acceptance_spec.rb
|
208
209
|
- spec/license_acceptance/cli_flags/mixlib_cli_spec.rb
|
209
210
|
- spec/license_acceptance/cli_flags/thor_spec.rb
|
210
211
|
- spec/license_acceptance/config_spec.rb
|
211
|
-
- spec/license_acceptance/env_acceptance_spec.rb
|
212
|
-
- spec/license_acceptance/file_acceptance_spec.rb
|
213
212
|
- spec/license_acceptance/product_reader_spec.rb
|
214
213
|
- spec/license_acceptance/product_spec.rb
|
215
|
-
- spec/license_acceptance/
|
214
|
+
- spec/license_acceptance/strategy/argument_spec.rb
|
215
|
+
- spec/license_acceptance/strategy/environment_spec.rb
|
216
|
+
- spec/license_acceptance/strategy/file_spec.rb
|
217
|
+
- spec/license_acceptance/strategy/prompt_spec.rb
|
218
|
+
- spec/license_acceptance/strategy/provided_value_spec.rb
|
216
219
|
- spec/spec_helper.rb
|
217
220
|
homepage: https://github.com/chef/license-acceptance/
|
218
221
|
licenses:
|
@@ -226,7 +229,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
226
229
|
requirements:
|
227
230
|
- - ">="
|
228
231
|
- !ruby/object:Gem::Version
|
229
|
-
version: '
|
232
|
+
version: '2.4'
|
230
233
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
231
234
|
requirements:
|
232
235
|
- - ">="
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module LicenseAcceptance
|
2
|
-
class ArgAcceptance
|
3
|
-
|
4
|
-
def accepted?(argv)
|
5
|
-
look_for_value(argv, "accept")
|
6
|
-
end
|
7
|
-
|
8
|
-
def silent?(argv)
|
9
|
-
look_for_value(argv, "accept-silent")
|
10
|
-
end
|
11
|
-
|
12
|
-
def no_persist?(argv)
|
13
|
-
look_for_value(argv, "accept-no-persist")
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def look_for_value(argv, sought)
|
19
|
-
if argv.include?("--chef-license=#{sought}")
|
20
|
-
return true
|
21
|
-
end
|
22
|
-
i = argv.index("--chef-license")
|
23
|
-
unless i.nil?
|
24
|
-
val = argv[i+1]
|
25
|
-
if val != nil && val.downcase == sought
|
26
|
-
return true
|
27
|
-
end
|
28
|
-
end
|
29
|
-
return false
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module LicenseAcceptance
|
2
|
-
class EnvAcceptance
|
3
|
-
|
4
|
-
def accepted?(env)
|
5
|
-
look_for_value(env, "accept")
|
6
|
-
end
|
7
|
-
|
8
|
-
def silent?(env)
|
9
|
-
look_for_value(env, "accept-silent")
|
10
|
-
end
|
11
|
-
|
12
|
-
def no_persist?(env)
|
13
|
-
look_for_value(env, "accept-no-persist")
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def look_for_value(env, sought)
|
19
|
-
if env['CHEF_LICENSE'] && env['CHEF_LICENSE'].downcase == sought
|
20
|
-
return true
|
21
|
-
end
|
22
|
-
return false
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
end
|
@@ -1,97 +0,0 @@
|
|
1
|
-
require 'date'
|
2
|
-
require 'yaml'
|
3
|
-
require 'fileutils'
|
4
|
-
require 'etc'
|
5
|
-
require "license_acceptance/logger"
|
6
|
-
|
7
|
-
module LicenseAcceptance
|
8
|
-
class FileAcceptance
|
9
|
-
include Logger
|
10
|
-
|
11
|
-
attr_reader :config
|
12
|
-
|
13
|
-
def initialize(config)
|
14
|
-
@config = config
|
15
|
-
end
|
16
|
-
|
17
|
-
INVOCATION_TIME = DateTime.now.freeze
|
18
|
-
|
19
|
-
# For all the given products in the product set, search all possible locations for the
|
20
|
-
# license acceptance files.
|
21
|
-
def accepted?(product_relationship)
|
22
|
-
searching = [product_relationship.parent] + product_relationship.children
|
23
|
-
missing_licenses = searching.clone
|
24
|
-
logger.debug("Searching for the following licenses: #{missing_licenses.map(&:name)}")
|
25
|
-
|
26
|
-
searching.each do |product|
|
27
|
-
found = false
|
28
|
-
config.license_locations.each do |loc|
|
29
|
-
f = File.join(loc, product.filename)
|
30
|
-
if File.exist?(f)
|
31
|
-
found = true
|
32
|
-
logger.debug("Found license #{product.filename} at #{f}")
|
33
|
-
missing_licenses.delete(product)
|
34
|
-
break
|
35
|
-
end
|
36
|
-
end
|
37
|
-
break if missing_licenses.empty?
|
38
|
-
end
|
39
|
-
logger.debug("Missing licenses remaining: #{missing_licenses.map(&:name)}")
|
40
|
-
missing_licenses
|
41
|
-
end
|
42
|
-
|
43
|
-
def persist(product_relationship, missing_licenses)
|
44
|
-
parent = product_relationship.parent
|
45
|
-
parent_version = product_relationship.parent_version
|
46
|
-
root_dir = config.persist_location
|
47
|
-
|
48
|
-
if !Dir.exist?(root_dir)
|
49
|
-
begin
|
50
|
-
FileUtils.mkdir_p(root_dir)
|
51
|
-
rescue StandardError => e
|
52
|
-
msg = "Could not create license directory #{root_dir}"
|
53
|
-
logger.info "#{msg}\n\t#{e.message}\n\t#{e.backtrace.join("\n\t")}"
|
54
|
-
return [e]
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
errs = []
|
59
|
-
if missing_licenses.include?(parent)
|
60
|
-
err = persist_license(root_dir, parent, parent, parent_version)
|
61
|
-
errs << err unless err.nil?
|
62
|
-
end
|
63
|
-
product_relationship.children.each do |child|
|
64
|
-
if missing_licenses.include?(child)
|
65
|
-
err = persist_license(root_dir, child, parent, parent_version)
|
66
|
-
errs << err unless err.nil?
|
67
|
-
end
|
68
|
-
end
|
69
|
-
return errs
|
70
|
-
end
|
71
|
-
|
72
|
-
private
|
73
|
-
|
74
|
-
def persist_license(folder_path, product, parent, parent_version)
|
75
|
-
path = File.join(folder_path, product.filename)
|
76
|
-
logger.info("Persisting a license for #{product.name} at path #{path}")
|
77
|
-
File.open(path, File::WRONLY | File::CREAT | File::EXCL) do |license_file|
|
78
|
-
contents = {
|
79
|
-
name: product.name,
|
80
|
-
date_accepted: INVOCATION_TIME.iso8601,
|
81
|
-
accepting_product: parent.name,
|
82
|
-
accepting_product_version: parent_version,
|
83
|
-
user: Etc.getlogin,
|
84
|
-
file_format: 1,
|
85
|
-
}
|
86
|
-
contents = Hash[contents.map { |k, v| [k.to_s, v] }]
|
87
|
-
license_file << YAML.dump(contents)
|
88
|
-
end
|
89
|
-
return nil
|
90
|
-
rescue StandardError => e
|
91
|
-
msg = "Could not persist license to #{path}"
|
92
|
-
logger.info "#{msg}\n\t#{e.message}\n\t#{e.backtrace.join("\n\t")}"
|
93
|
-
return e
|
94
|
-
end
|
95
|
-
|
96
|
-
end
|
97
|
-
end
|
@@ -1,106 +0,0 @@
|
|
1
|
-
require 'tty-prompt'
|
2
|
-
require 'pastel'
|
3
|
-
require "license_acceptance/logger"
|
4
|
-
require "timeout"
|
5
|
-
|
6
|
-
module LicenseAcceptance
|
7
|
-
class PromptAcceptance
|
8
|
-
include Logger
|
9
|
-
|
10
|
-
attr_reader :output
|
11
|
-
|
12
|
-
def initialize(config)
|
13
|
-
@output = config.output
|
14
|
-
end
|
15
|
-
|
16
|
-
WIDTH = 50.freeze
|
17
|
-
PASTEL = Pastel.new
|
18
|
-
BORDER = "+---------------------------------------------+".freeze
|
19
|
-
YES = PASTEL.green.bold("yes")
|
20
|
-
CHECK = PASTEL.green("✔")
|
21
|
-
|
22
|
-
def request(missing_licenses, &persist_callback)
|
23
|
-
logger.debug("Requesting a license for #{missing_licenses.map(&:name)}")
|
24
|
-
c = missing_licenses.size
|
25
|
-
s = c > 1 ? "s": ""
|
26
|
-
|
27
|
-
acceptance_question = "Do you accept the #{c} product license#{s} (#{YES}/no)?"
|
28
|
-
output.puts <<~EOM
|
29
|
-
#{BORDER}
|
30
|
-
Chef License Acceptance
|
31
|
-
|
32
|
-
Before you can continue, #{c} product license#{s}
|
33
|
-
must be accepted. View the license at
|
34
|
-
https://www.chef.io/end-user-license-agreement/
|
35
|
-
|
36
|
-
License#{s} that need accepting:
|
37
|
-
* #{missing_licenses.map(&:pretty_name).join("\n * ")}
|
38
|
-
|
39
|
-
#{acceptance_question}
|
40
|
-
|
41
|
-
EOM
|
42
|
-
|
43
|
-
if ask(output, c, s, persist_callback)
|
44
|
-
output.puts BORDER
|
45
|
-
return true
|
46
|
-
end
|
47
|
-
|
48
|
-
output.puts <<~EOM
|
49
|
-
|
50
|
-
If you do not accept this license you will
|
51
|
-
not be able to use Chef products.
|
52
|
-
|
53
|
-
#{acceptance_question}
|
54
|
-
|
55
|
-
EOM
|
56
|
-
|
57
|
-
answer = ask(output, c, s, persist_callback)
|
58
|
-
if answer != "yes"
|
59
|
-
output.puts BORDER
|
60
|
-
end
|
61
|
-
return answer
|
62
|
-
end
|
63
|
-
|
64
|
-
private
|
65
|
-
|
66
|
-
def ask(output, c, s, persist_callback)
|
67
|
-
logger.debug("Attempting to request interactive prompt on TTY")
|
68
|
-
prompt = TTY::Prompt.new(track_history: false, active_color: :bold, interrupt: :exit, output: output)
|
69
|
-
|
70
|
-
answer = "no"
|
71
|
-
begin
|
72
|
-
Timeout::timeout(60, PromptTimeout) do
|
73
|
-
answer = prompt.ask(">") do |q|
|
74
|
-
q.modify :down, :trim
|
75
|
-
q.required true
|
76
|
-
q.messages[:required?] = "You must enter 'yes' or 'no'"
|
77
|
-
q.validate /^\s*(yes|no)\s*$/i
|
78
|
-
q.messages[:valid?] = "You must enter 'yes' or 'no'"
|
79
|
-
end
|
80
|
-
end
|
81
|
-
rescue PromptTimeout
|
82
|
-
prompt.unsubscribe(prompt.reader)
|
83
|
-
output.puts "Prompt timed out. Use non-interactive flags or enter an answer within 60 seconds."
|
84
|
-
end
|
85
|
-
|
86
|
-
if answer == "yes"
|
87
|
-
output.puts
|
88
|
-
output.puts "Persisting #{c} product license#{s}..."
|
89
|
-
errs = persist_callback.call
|
90
|
-
if errs.empty?
|
91
|
-
output.puts "#{CHECK} #{c} product license#{s} persisted.\n\n"
|
92
|
-
else
|
93
|
-
output.puts <<~EOM
|
94
|
-
#{CHECK} #{c} product license#{s} accepted.
|
95
|
-
Could not persist acceptance:\n\t* #{errs.map(&:message).join("\n\t* ")}
|
96
|
-
EOM
|
97
|
-
end
|
98
|
-
return true
|
99
|
-
end
|
100
|
-
return false
|
101
|
-
end
|
102
|
-
|
103
|
-
end
|
104
|
-
|
105
|
-
class PromptTimeout < StandardError; end
|
106
|
-
end
|
@@ -1,57 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
require "license_acceptance/arg_acceptance"
|
3
|
-
|
4
|
-
RSpec.describe LicenseAcceptance::ArgAcceptance do
|
5
|
-
let(:acc) { LicenseAcceptance::ArgAcceptance.new }
|
6
|
-
|
7
|
-
describe "with an accept option" do
|
8
|
-
describe "#accepted?" do
|
9
|
-
it "returns true if the args contain the required flag with spaces" do
|
10
|
-
expect(acc.accepted?(["--chef-license", "accept"])).to eq(true)
|
11
|
-
end
|
12
|
-
|
13
|
-
it "returns true if the args contain the required flag with equal" do
|
14
|
-
expect(acc.accepted?(["--chef-license=accept"])).to eq(true)
|
15
|
-
end
|
16
|
-
|
17
|
-
it "returns false if the args do not contain the required value" do
|
18
|
-
expect(acc.accepted?(["--chef-license"])).to eq(false)
|
19
|
-
expect(acc.accepted?(["--chef-license=foo"])).to eq(false)
|
20
|
-
expect(acc.accepted?(["--chef-license", "foo"])).to eq(false)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
describe "#silent?" do
|
25
|
-
it "returns true if the args contain the required flag with spaces" do
|
26
|
-
expect(acc.silent?(["--chef-license", "accept-silent"])).to eq(true)
|
27
|
-
end
|
28
|
-
|
29
|
-
it "returns true if the args contain the required flag with equal" do
|
30
|
-
expect(acc.silent?(["--chef-license=accept-silent"])).to eq(true)
|
31
|
-
end
|
32
|
-
|
33
|
-
it "returns false if the args do not contain the required value" do
|
34
|
-
expect(acc.silent?(["--chef-license"])).to eq(false)
|
35
|
-
expect(acc.silent?(["--chef-license=accept"])).to eq(false)
|
36
|
-
expect(acc.silent?(["--chef-license", "accept"])).to eq(false)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
describe "#no_persist?" do
|
42
|
-
it "returns true if the args contain the required flag with spaces" do
|
43
|
-
expect(acc.no_persist?(["--chef-license", "accept-no-persist"])).to eq(true)
|
44
|
-
end
|
45
|
-
|
46
|
-
it "returns true if the args contain the required flag with equal" do
|
47
|
-
expect(acc.no_persist?(["--chef-license=accept-no-persist"])).to eq(true)
|
48
|
-
end
|
49
|
-
|
50
|
-
it "returns false if the args do not contain the required value" do
|
51
|
-
expect(acc.no_persist?(["--chef-license"])).to eq(false)
|
52
|
-
expect(acc.no_persist?(["--chef-license=accept"])).to eq(false)
|
53
|
-
expect(acc.no_persist?(["--chef-license", "accept"])).to eq(false)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
end
|