puppet-debugger 0.4.1 → 0.4.2
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/.gitlab-ci.yml +25 -2
- data/.release_me.yaml +11 -0
- data/.rubocop.yml +239 -0
- data/.rubocop_todo.yml +196 -0
- data/.ruby-version +1 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +17 -1
- data/bin/pdb +1 -0
- data/lib/awesome_print/ext/awesome_puppet.rb +6 -5
- data/lib/puppet/application/debugger.rb +24 -24
- data/lib/puppet-debugger/cli.rb +76 -81
- data/lib/puppet-debugger/code/code_file.rb +82 -82
- data/lib/puppet-debugger/code/code_range.rb +56 -57
- data/lib/puppet-debugger/code/loc.rb +68 -70
- data/lib/puppet-debugger/debugger_code.rb +279 -280
- data/lib/puppet-debugger/support/compiler.rb +1 -1
- data/lib/puppet-debugger/support/environment.rb +2 -2
- data/lib/puppet-debugger/support/errors.rb +3 -4
- data/lib/puppet-debugger/support/facts.rb +7 -7
- data/lib/puppet-debugger/support/functions.rb +4 -5
- data/lib/puppet-debugger/support/input_responders.rb +26 -28
- data/lib/puppet-debugger/support/node.rb +7 -6
- data/lib/puppet-debugger/support/play.rb +16 -24
- data/lib/puppet-debugger/support/scope.rb +3 -4
- data/lib/puppet-debugger/support.rb +38 -40
- data/lib/puppet-debugger.rb +38 -17
- data/lib/version.rb +2 -1
- data/spec/facts_spec.rb +7 -6
- data/spec/pdb_spec.rb +1 -0
- data/spec/puppet/application/debugger_spec.rb +2 -3
- data/spec/{puppet-debugger_spec.rb → puppet_debugger_spec.rb} +27 -33
- data/spec/remote_node_spec.rb +13 -14
- data/spec/spec_helper.rb +8 -7
- data/spec/support_spec.rb +19 -24
- data/test_matrix.rb +4 -3
- metadata +6 -2
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.3.1
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -2,6 +2,7 @@ GEM
|
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
4
|
CFPropertyList (2.2.8)
|
5
|
+
ast (2.3.0)
|
5
6
|
awesome_print (1.7.0)
|
6
7
|
coderay (1.1.1)
|
7
8
|
diff-lcs (1.2.5)
|
@@ -17,6 +18,9 @@ GEM
|
|
17
18
|
json (1.8.3)
|
18
19
|
json_pure (1.8.3)
|
19
20
|
method_source (0.8.2)
|
21
|
+
parser (2.3.2.0)
|
22
|
+
ast (~> 2.2)
|
23
|
+
powerpack (0.1.1)
|
20
24
|
pry (0.10.4)
|
21
25
|
coderay (~> 1.1.0)
|
22
26
|
method_source (~> 0.8.1)
|
@@ -25,9 +29,11 @@ GEM
|
|
25
29
|
facter (> 2.0, < 4)
|
26
30
|
hiera (>= 2.0, < 4)
|
27
31
|
json_pure (~> 1.8)
|
32
|
+
rainbow (2.1.0)
|
28
33
|
rake (11.2.2)
|
29
34
|
rdoc (3.12.2)
|
30
35
|
json (~> 1.4)
|
36
|
+
release_me (0.1.1)
|
31
37
|
rspec (3.5.0)
|
32
38
|
rspec-core (~> 3.5.0)
|
33
39
|
rspec-expectations (~> 3.5.0)
|
@@ -41,12 +47,20 @@ GEM
|
|
41
47
|
diff-lcs (>= 1.2.0, < 2.0)
|
42
48
|
rspec-support (~> 3.5.0)
|
43
49
|
rspec-support (3.5.0)
|
50
|
+
rubocop (0.45.0)
|
51
|
+
parser (>= 2.3.1.1, < 3.0)
|
52
|
+
powerpack (~> 0.1)
|
53
|
+
rainbow (>= 1.99.1, < 3.0)
|
54
|
+
ruby-progressbar (~> 1.7)
|
55
|
+
unicode-display_width (~> 1.0, >= 1.0.1)
|
56
|
+
ruby-progressbar (1.8.1)
|
44
57
|
simplecov (0.12.0)
|
45
58
|
docile (~> 1.1.0)
|
46
59
|
json (>= 1.8, < 3)
|
47
60
|
simplecov-html (~> 0.10.0)
|
48
61
|
simplecov-html (0.10.0)
|
49
62
|
slop (3.6.0)
|
63
|
+
unicode-display_width (1.1.1)
|
50
64
|
|
51
65
|
PLATFORMS
|
52
66
|
ruby
|
@@ -57,10 +71,12 @@ DEPENDENCIES
|
|
57
71
|
facterdb (~> 0.3)
|
58
72
|
json_pure (<= 2.0.1)
|
59
73
|
pry
|
60
|
-
puppet (
|
74
|
+
puppet (>= 3.8)
|
61
75
|
rake
|
62
76
|
rdoc (~> 3.12)
|
77
|
+
release_me
|
63
78
|
rspec
|
79
|
+
rubocop
|
64
80
|
simplecov
|
65
81
|
|
66
82
|
BUNDLED WITH
|
data/bin/pdb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module AwesomePrint
|
2
3
|
module Puppet
|
3
4
|
def self.included(base)
|
@@ -10,11 +11,11 @@ module AwesomePrint
|
|
10
11
|
def cast_with_puppet_resource(object, type)
|
11
12
|
cast = cast_without_puppet_resource(object, type)
|
12
13
|
# check the object to see if it has an acestor (< ) of the specified type
|
13
|
-
if
|
14
|
+
if defined?(::Puppet::Type) && (object.class < ::Puppet::Type)
|
14
15
|
cast = :puppet_type
|
15
|
-
elsif
|
16
|
+
elsif defined?(::Puppet::Pops::Types) && (object.class < ::Puppet::Pops::Types)
|
16
17
|
cast = :puppet_type
|
17
|
-
elsif
|
18
|
+
elsif defined?(::Puppet::Parser::Resource) && (object.class < ::Puppet::Parser::Resource)
|
18
19
|
cast = :puppet_resource
|
19
20
|
elsif /Puppet::Pops::Types/.match(object.class.to_s)
|
20
21
|
cast = :puppet_type
|
@@ -30,9 +31,9 @@ module AwesomePrint
|
|
30
31
|
def awesome_puppet_type(object)
|
31
32
|
return '' if object.nil?
|
32
33
|
return object.to_s unless object.respond_to?(:name) && object.respond_to?(:title)
|
33
|
-
h = object.to_hash.merge(:
|
34
|
+
h = object.to_hash.merge(name: object.name, title: object.title)
|
34
35
|
res_str = awesome_hash(h)
|
35
|
-
"#{object.class} #{res_str.
|
36
|
+
"#{object.class} #{res_str.delete(':')}"
|
36
37
|
end
|
37
38
|
end
|
38
39
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'puppet/application'
|
2
3
|
require 'optparse'
|
3
4
|
require 'puppet/util/command_line'
|
@@ -5,38 +6,38 @@ require 'puppet/util/command_line'
|
|
5
6
|
class Puppet::Application::Debugger < Puppet::Application
|
6
7
|
attr_reader :use_facterdb, :use_stdin
|
7
8
|
|
8
|
-
option(
|
9
|
+
option('--execute EXECUTE', '-e') do |arg|
|
9
10
|
options[:code] = arg
|
10
11
|
end
|
11
12
|
|
12
|
-
option(
|
13
|
+
option('--facterdb-filter FILTER') do |arg|
|
13
14
|
@use_facterdb = true unless options[:node_name]
|
14
15
|
ENV['DEBUGGER_FACTERDB_FILTER'] = arg if arg
|
15
16
|
end
|
16
17
|
|
17
|
-
option(
|
18
|
+
option('--test') do |_arg|
|
18
19
|
options[:quiet] = true
|
19
20
|
options[:run_once] = true
|
20
21
|
@use_stdin = true
|
21
22
|
end
|
22
23
|
|
23
|
-
option(
|
24
|
+
option('--no-facterdb') { |_arg| @use_facterdb = false }
|
24
25
|
|
25
|
-
option(
|
26
|
+
option('--log-level LEVEL', '-l') do |arg|
|
26
27
|
Puppet::Util::Log.level = arg.to_sym
|
27
28
|
end
|
28
29
|
|
29
|
-
option(
|
30
|
+
option('--quiet', '-q') { |_arg| options[:quiet] = true }
|
30
31
|
|
31
|
-
option(
|
32
|
+
option('--play URL', '-p') do |arg|
|
32
33
|
options[:play] = arg
|
33
34
|
end
|
34
35
|
|
35
|
-
option(
|
36
|
+
option('--stdin', '-s') { |_arg| @use_stdin = true }
|
36
37
|
|
37
|
-
option(
|
38
|
+
option('--run-once', '-r') { |_arg| options[:run_once] = true }
|
38
39
|
|
39
|
-
option(
|
40
|
+
option('--node-name CERTNAME', '-n') do |arg|
|
40
41
|
@use_facterdb = false
|
41
42
|
options[:node_name] = arg
|
42
43
|
end
|
@@ -173,7 +174,7 @@ Copyright (c) 2016 NWOps
|
|
173
174
|
|
174
175
|
def app_defaults
|
175
176
|
Puppet::Settings.app_defaults_for_run_mode(self.class.run_mode).merge(
|
176
|
-
|
177
|
+
name: name
|
177
178
|
)
|
178
179
|
end
|
179
180
|
|
@@ -208,26 +209,26 @@ Copyright (c) 2016 NWOps
|
|
208
209
|
f.write(code_input)
|
209
210
|
end
|
210
211
|
options[:play] = file
|
211
|
-
elsif command_line.args.
|
212
|
+
elsif command_line.args.empty? && use_stdin
|
212
213
|
code_input = STDIN.read
|
213
214
|
file = Tempfile.new(['puppet_repl_input', '.pp'])
|
214
215
|
File.open(file, 'w') do |f|
|
215
216
|
f.write(code_input)
|
216
217
|
end
|
217
218
|
options[:play] = file
|
218
|
-
elsif command_line.args.
|
219
|
+
elsif !command_line.args.empty?
|
219
220
|
manifest = command_line.args.shift
|
220
221
|
raise "Could not find file #{manifest}" unless Puppet::FileSystem.exist?(manifest)
|
221
|
-
Puppet.warning("Only one file can be used per run. Skipping #{command_line.args.join(', ')}")
|
222
|
+
Puppet.warning("Only one file can be used per run. Skipping #{command_line.args.join(', ')}") unless command_line.args.empty?
|
222
223
|
options[:play] = file
|
223
224
|
end
|
224
|
-
if !
|
225
|
+
if !use_facterdb && options[:node_name].nil?
|
225
226
|
debug_environment = create_environment(nil)
|
226
227
|
Puppet.notice('Gathering node facts...')
|
227
228
|
node = create_node(debug_environment)
|
228
229
|
scope = create_scope(node)
|
229
230
|
# start_debugger(scope)
|
230
|
-
options
|
231
|
+
options[:scope] = scope
|
231
232
|
end
|
232
233
|
::PuppetDebugger::Cli.start_without_stdin(options)
|
233
234
|
end
|
@@ -235,7 +236,7 @@ Copyright (c) 2016 NWOps
|
|
235
236
|
def create_environment(manifest)
|
236
237
|
configured_environment = Puppet.lookup(:current_environment)
|
237
238
|
manifest ?
|
238
|
-
configured_environment.override_with(:
|
239
|
+
configured_environment.override_with(manifest: manifest) :
|
239
240
|
configured_environment
|
240
241
|
end
|
241
242
|
|
@@ -250,7 +251,7 @@ Copyright (c) 2016 NWOps
|
|
250
251
|
facts.name = Puppet[:node_name_value]
|
251
252
|
end
|
252
253
|
|
253
|
-
Puppet.override({:
|
254
|
+
Puppet.override({ current_environment: environment }, 'For puppet debugger') do
|
254
255
|
# Find our Node
|
255
256
|
unless node = Puppet::Node.indirection.find(Puppet[:node_name_value])
|
256
257
|
raise "Could not find node #{Puppet[:node_name_value]}"
|
@@ -275,10 +276,10 @@ Copyright (c) 2016 NWOps
|
|
275
276
|
|
276
277
|
def start_debugger(scope, options = {})
|
277
278
|
if $stdout.isatty
|
278
|
-
options = options.merge(
|
279
|
+
options = options.merge(scope: scope)
|
279
280
|
# required in order to use convert puppet hash into ruby hash with symbols
|
280
|
-
options = options.
|
281
|
-
#options[:source_file], options[:source_line] = stacktrace.last
|
281
|
+
options = options.each_with_object({}) { |(k, v), data| data[k.to_sym] = v; data }
|
282
|
+
# options[:source_file], options[:source_line] = stacktrace.last
|
282
283
|
::PuppetRepl::Cli.start(options)
|
283
284
|
else
|
284
285
|
Puppet.info 'puppet debug: refusing to start the debugger without a tty'
|
@@ -292,15 +293,14 @@ Copyright (c) 2016 NWOps
|
|
292
293
|
# for compatibility with older puppet versions
|
293
294
|
# The basics behind this are to find the `.pp` file in the list of loaded code
|
294
295
|
def stacktrace
|
295
|
-
result = caller
|
296
|
+
result = caller.each_with_object([]) do |loc, memo|
|
296
297
|
if loc =~ /\A(.*\.pp)?:([0-9]+):in\s(.*)/
|
297
298
|
# if the file is not found we set to code
|
298
299
|
# and read from Puppet[:code]
|
299
300
|
# $3 is reserved for the stacktrace type
|
300
|
-
memo << [
|
301
|
+
memo << [Regexp.last_match(1).nil? ? :code : Regexp.last_match(1), Regexp.last_match(2).to_i]
|
301
302
|
end
|
302
303
|
memo
|
303
304
|
end.reverse
|
304
305
|
end
|
305
|
-
|
306
306
|
end
|
data/lib/puppet-debugger/cli.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'puppet'
|
2
3
|
require 'readline'
|
3
4
|
require 'json'
|
@@ -9,23 +10,23 @@ module PuppetDebugger
|
|
9
10
|
|
10
11
|
attr_accessor :settings, :log_level, :in_buffer, :out_buffer, :html_mode
|
11
12
|
|
12
|
-
def initialize(options={})
|
13
|
+
def initialize(options = {})
|
13
14
|
@log_level = 'notice'
|
14
15
|
@out_buffer = options[:out_buffer] || $stdout
|
15
16
|
@html_mode = options[:html_mode] || false
|
16
17
|
@source_file = options[:source_file] || nil
|
17
18
|
@source_line_num = options[:source_line] || nil
|
18
19
|
@in_buffer = options[:in_buffer] || $stdin
|
19
|
-
comp =
|
20
|
+
comp = proc do |s|
|
20
21
|
key_words.grep(/^#{Regexp.escape(s)}/)
|
21
22
|
end
|
22
|
-
Readline.completion_append_character =
|
23
|
-
Readline.basic_word_break_characters =
|
23
|
+
Readline.completion_append_character = ''
|
24
|
+
Readline.basic_word_break_characters = ' '
|
24
25
|
Readline.completion_proc = comp
|
25
26
|
AwesomePrint.defaults = {
|
26
|
-
:
|
27
|
-
:
|
28
|
-
:
|
27
|
+
html: @html_mode,
|
28
|
+
sort_keys: true,
|
29
|
+
indent: 2
|
29
30
|
}
|
30
31
|
do_initialize
|
31
32
|
end
|
@@ -36,16 +37,16 @@ module PuppetDebugger
|
|
36
37
|
# list so its not explicitly clear what the keyword
|
37
38
|
variables = scope.to_hash.keys
|
38
39
|
# prepend a :: to topscope variables
|
39
|
-
scoped_vars = variables.map { |k,
|
40
|
+
scoped_vars = variables.map { |k, _v| scope.compiler.topscope.exist?(k) ? "$::#{k}" : "$#{k}" }
|
40
41
|
# append a () to functions so we know they are functions
|
41
|
-
funcs = function_map.keys.map { |k| "#{k.split('::').last}()"}
|
42
|
+
funcs = function_map.keys.map { |k| "#{k.split('::').last}()" }
|
42
43
|
(scoped_vars + funcs + static_responder_list).uniq.sort
|
43
44
|
end
|
44
45
|
|
45
46
|
# looks up the type in the catalog by using the type and title
|
46
47
|
# and returns the resource in ral format
|
47
48
|
def to_resource_declaration(type)
|
48
|
-
if type.respond_to?(:type_name)
|
49
|
+
if type.respond_to?(:type_name) && type.respond_to?(:title)
|
49
50
|
title = type.title
|
50
51
|
type_name = type.type_name
|
51
52
|
elsif type_result = /(\w+)\['?(\w+)'?\]/.match(type.to_s)
|
@@ -57,13 +58,11 @@ module PuppetDebugger
|
|
57
58
|
return type
|
58
59
|
end
|
59
60
|
res = scope.catalog.resource(type_name, title)
|
60
|
-
if res
|
61
|
-
return res.to_ral
|
62
|
-
end
|
61
|
+
return res.to_ral if res
|
63
62
|
# don't return anything or returns nil if item is not in the catalog
|
64
63
|
end
|
65
64
|
|
66
|
-
#
|
65
|
+
# returns a formatted array
|
67
66
|
def expand_resource_type(types)
|
68
67
|
output = [types].flatten.map do |t|
|
69
68
|
if t.class.to_s =~ /Puppet::Pops::Types/
|
@@ -78,9 +77,7 @@ module PuppetDebugger
|
|
78
77
|
def normalize_output(result)
|
79
78
|
if result.instance_of?(Array)
|
80
79
|
output = expand_resource_type(result)
|
81
|
-
if output.count == 1
|
82
|
-
return output.first
|
83
|
-
end
|
80
|
+
return output.first if output.count == 1
|
84
81
|
return output
|
85
82
|
elsif result.class.to_s =~ /Puppet::Pops::Types/
|
86
83
|
return to_resource_declaration(result)
|
@@ -91,56 +88,54 @@ module PuppetDebugger
|
|
91
88
|
# this method handles all input and expects a string of text.
|
92
89
|
#
|
93
90
|
def handle_input(input)
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
output = output.ai
|
119
|
-
end
|
120
|
-
end
|
121
|
-
rescue LoadError => e
|
122
|
-
output = e.message.fatal
|
123
|
-
rescue Errno::ETIMEDOUT => e
|
124
|
-
output = e.message.fatal
|
125
|
-
rescue ArgumentError => e
|
126
|
-
output = e.message.fatal
|
127
|
-
rescue Puppet::ResourceError => e
|
128
|
-
output = e.message.fatal
|
129
|
-
rescue Puppet::Error => e
|
130
|
-
output = e.message.fatal
|
131
|
-
rescue Puppet::ParseErrorWithIssue => e
|
132
|
-
output = e.message.fatal
|
133
|
-
rescue PuppetDebugger::Exception::FatalError => e
|
134
|
-
output = e.message.fatal
|
135
|
-
out_buffer.puts output
|
136
|
-
exit 1 # this can sometimes causes tests to fail
|
137
|
-
rescue PuppetDebugger::Exception::Error => e
|
138
|
-
output = e.message.fatal
|
139
|
-
end
|
140
|
-
unless output.empty?
|
141
|
-
out_buffer.print " => "
|
142
|
-
out_buffer.puts output unless output.empty?
|
91
|
+
raise ArgumentError unless input.instance_of?(String)
|
92
|
+
begin
|
93
|
+
output = ''
|
94
|
+
case input
|
95
|
+
when /^play|^classification|^whereami|^facterdb_filter|^facts|^vars|^functions|^classes|^resources|^krt|^environment|^reset|^help/
|
96
|
+
args = input.split(' ')
|
97
|
+
command = args.shift.to_sym
|
98
|
+
output = send(command, args) if respond_to?(command)
|
99
|
+
return out_buffer.puts output
|
100
|
+
when /exit/
|
101
|
+
exit 0
|
102
|
+
when /^:set/
|
103
|
+
output = handle_set(input)
|
104
|
+
when '_'
|
105
|
+
output = " => #{@last_item}"
|
106
|
+
else
|
107
|
+
result = puppet_eval(input)
|
108
|
+
@last_item = result
|
109
|
+
output = normalize_output(result)
|
110
|
+
output = if output.nil?
|
111
|
+
''
|
112
|
+
else
|
113
|
+
output.ai
|
114
|
+
end
|
143
115
|
end
|
116
|
+
rescue LoadError => e
|
117
|
+
output = e.message.fatal
|
118
|
+
rescue Errno::ETIMEDOUT => e
|
119
|
+
output = e.message.fatal
|
120
|
+
rescue ArgumentError => e
|
121
|
+
output = e.message.fatal
|
122
|
+
rescue Puppet::ResourceError => e
|
123
|
+
output = e.message.fatal
|
124
|
+
rescue Puppet::Error => e
|
125
|
+
output = e.message.fatal
|
126
|
+
rescue Puppet::ParseErrorWithIssue => e
|
127
|
+
output = e.message.fatal
|
128
|
+
rescue PuppetDebugger::Exception::FatalError => e
|
129
|
+
output = e.message.fatal
|
130
|
+
out_buffer.puts output
|
131
|
+
exit 1 # this can sometimes causes tests to fail
|
132
|
+
rescue PuppetDebugger::Exception::Error => e
|
133
|
+
output = e.message.fatal
|
134
|
+
end
|
135
|
+
unless output.empty?
|
136
|
+
out_buffer.print ' => '
|
137
|
+
out_buffer.puts output unless output.empty?
|
138
|
+
end
|
144
139
|
end
|
145
140
|
|
146
141
|
def self.print_repl_desc
|
@@ -195,15 +190,17 @@ Type "exit", "functions", "vars", "krt", "whereami", "facts", "resources", "clas
|
|
195
190
|
end
|
196
191
|
end
|
197
192
|
|
198
|
-
# used to start a
|
193
|
+
# used to start a debugger session without attempting to read from stdin
|
199
194
|
# or
|
195
|
+
# this is primarily used by the debug::break() module function and the puppet debugger face
|
200
196
|
# @param [Hash] must contain at least the puppet scope object
|
201
|
-
def self.start_without_stdin(options={:
|
197
|
+
def self.start_without_stdin(options = { scope: nil })
|
202
198
|
puts print_repl_desc unless options[:quiet]
|
203
199
|
repl_obj = PuppetDebugger::Cli.new(options)
|
204
200
|
repl_obj.remote_node_name = options[:node_name] if options[:node_name]
|
205
201
|
repl_obj.initialize_from_scope(options[:scope])
|
206
|
-
|
202
|
+
# TODO: make the output optional so we can have different output destinations
|
203
|
+
puts repl_obj.whereami if options[:source_file] && options[:source_line]
|
207
204
|
repl_obj.play_back(options) if options[:play]
|
208
205
|
repl_obj.read_loop unless options[:run_once]
|
209
206
|
end
|
@@ -212,12 +209,12 @@ Type "exit", "functions", "vars", "krt", "whereami", "facts", "resources", "clas
|
|
212
209
|
# if from stdin, the repl will process the input and exit
|
213
210
|
# if from a file, the repl will process the file and continue to prompt
|
214
211
|
# @param [Hash] puppet scope object
|
215
|
-
def self.start(options={:
|
216
|
-
opts = Trollop
|
217
|
-
opt :play,
|
218
|
-
opt :run_once,
|
219
|
-
opt :node_name,
|
220
|
-
opt :quiet,
|
212
|
+
def self.start(options = { scope: nil })
|
213
|
+
opts = Trollop.options do
|
214
|
+
opt :play, 'Url or file to load from', required: false, type: String
|
215
|
+
opt :run_once, 'Evaluate and quit', required: false, default: false
|
216
|
+
opt :node_name, 'Remote Node to grab facts from', required: false, type: String
|
217
|
+
opt :quiet, 'Do not display banner', required: false, default: false
|
221
218
|
end
|
222
219
|
options = opts.merge(options)
|
223
220
|
puts print_repl_desc unless options[:quiet]
|
@@ -227,18 +224,16 @@ Type "exit", "functions", "vars", "krt", "whereami", "facts", "resources", "clas
|
|
227
224
|
if options[:play]
|
228
225
|
repl_obj.play_back(opts)
|
229
226
|
# when the user supplied a file name without using the args (stdin)
|
230
|
-
elsif ARGF.filename !=
|
227
|
+
elsif ARGF.filename != '-'
|
231
228
|
path = File.expand_path(ARGF.filename)
|
232
|
-
repl_obj.play_back(:
|
229
|
+
repl_obj.play_back(play: path)
|
233
230
|
# when the user supplied a file content using stdin, aka. cat,pipe,echo or redirection
|
234
|
-
elsif ARGF.filename ==
|
231
|
+
elsif (ARGF.filename == '-') && (!STDIN.tty? && !STDIN.closed?)
|
235
232
|
input = ARGF.read
|
236
233
|
repl_obj.handle_input(input)
|
237
234
|
end
|
238
235
|
# helper code to make tests exit the loop
|
239
|
-
unless options[:run_once]
|
240
|
-
repl_obj.read_loop
|
241
|
-
end
|
236
|
+
repl_obj.read_loop unless options[:run_once]
|
242
237
|
end
|
243
238
|
end
|
244
239
|
end
|