raykit 0.0.482 → 0.0.484

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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +21 -21
  3. data/README.md +20 -20
  4. data/bin/raykit +6 -6
  5. data/lib/raykit/auto_setup.rb +43 -43
  6. data/lib/raykit/command.rb +341 -341
  7. data/lib/raykit/conan/buildinfo.rb +69 -69
  8. data/lib/raykit/conanpackage.rb +49 -49
  9. data/lib/raykit/console.rb +272 -272
  10. data/lib/raykit/default_content.rb +227 -227
  11. data/lib/raykit/dir.rb +49 -49
  12. data/lib/raykit/dotnet.rb +176 -174
  13. data/lib/raykit/environment.rb +109 -109
  14. data/lib/raykit/filesystem.rb +34 -34
  15. data/lib/raykit/git/commit.rb +16 -16
  16. data/lib/raykit/git/directory.rb +216 -216
  17. data/lib/raykit/git/files.rb +46 -46
  18. data/lib/raykit/git/repositories.rb +89 -89
  19. data/lib/raykit/git/repository.rb +244 -244
  20. data/lib/raykit/installer.rb +17 -17
  21. data/lib/raykit/log.rb +80 -80
  22. data/lib/raykit/logevent.rb +49 -49
  23. data/lib/raykit/logging.rb +57 -57
  24. data/lib/raykit/markdown.rb +21 -21
  25. data/lib/raykit/msbuild.rb +54 -54
  26. data/lib/raykit/nugetpackage.rb +54 -54
  27. data/lib/raykit/nunit.rb +13 -13
  28. data/lib/raykit/project.rb +339 -339
  29. data/lib/raykit/rake.rb +39 -39
  30. data/lib/raykit/runner.rb +42 -42
  31. data/lib/raykit/secrets.rb +38 -38
  32. data/lib/raykit/sourceImport.rb +74 -74
  33. data/lib/raykit/sourceImports.rb +43 -43
  34. data/lib/raykit/string.rb +18 -18
  35. data/lib/raykit/tasks.rb +99 -99
  36. data/lib/raykit/text.rb +32 -32
  37. data/lib/raykit/timer.rb +31 -31
  38. data/lib/raykit/version.rb +103 -103
  39. data/lib/raykit/vstest.rb +24 -24
  40. data/lib/raykit/wt.rb +28 -28
  41. data/lib/raykit/zip.rb +73 -73
  42. data/lib/raykit.rb +125 -125
  43. metadata +2 -2
@@ -1,341 +1,341 @@
1
- require "open3"
2
- require "timeout"
3
- require "json"
4
- require "yaml"
5
- require "logger"
6
- require "securerandom"
7
-
8
- module Raykit
9
- # Functionality to support executing and logging system commands
10
- class Command
11
- @@commands = []
12
- # The timeout in seconds, defaults to 0 if not specified
13
- attr_accessor :timeout
14
- # The working directory, defaults the current directory if not specified
15
- attr_accessor :directory
16
- # The start time
17
- attr_accessor :start_time
18
- # The execution time in seconds
19
- attr_accessor :elapsed
20
- attr_accessor :command, :output, :error, :exitstatus, :user, :machine, :logging_enabled, :success_log_level
21
-
22
- def init_defaults
23
- @timeout = 0
24
- @directory = Dir.pwd
25
- @output = +""
26
- @error = +""
27
- @exitstatus = 0
28
- @user = Environment.user
29
- @machine = Environment.machine
30
- @logging_enabled = true
31
- end
32
-
33
- def initialize(command)
34
- #def initialize(command, timeout = 0, success_log_level = Logger::DEBUG, logging_enabled = true)
35
- timeout = 0
36
- success_log_level = nil
37
- logging_enabled = false
38
- @@commands = []
39
- init_defaults
40
- @success_log_level = success_log_level
41
- @logging_enabled = logging_enabled
42
- @command = command
43
- @timeout = timeout
44
- #t = Time.now
45
- @elapsed = 0
46
- #run if @command.length.positive?
47
- self
48
- end
49
-
50
- def set_timeout(timeout)
51
- @timeout = timeout
52
- self
53
- end
54
-
55
- def run
56
- # puts '---running---'
57
- @start_time = Time.now
58
- @elapsed = 0
59
- timer = Timer.new
60
- if @timeout.zero?
61
- @output, @error, process_status = Open3.capture3(@command)
62
- @exitstatus = process_status.exitstatus
63
- else
64
- # =================================================
65
- #puts "@timeout is #{@timeout}"
66
- Open3.popen3(@command, chdir: @directory) do |_stdin, stdout, stderr, thread|
67
- tick = 1
68
- pid = thread.pid
69
- start = Time.now
70
- while ((Time.now - start) < @timeout) && thread.alive?
71
- Kernel.select([stdout, stderr], nil, nil, tick)
72
- begin
73
- @output << stdout.read_nonblock(BUFFER_SIZE)
74
- #@error << stderr.read_nonblock(BUFFER_SIZE)
75
- rescue IO::WaitReadable
76
- rescue EOFError
77
- #puts "rescue block entered"
78
- @exitstatus = thread.value.exitstatus
79
- until stdout.eof?
80
- @output << stdout.read_nonblock(BUFFER_SIZE)
81
- end
82
- until stderr.eof?
83
- @error << stderr.read_nonblock(BUFFER_SIZE)
84
- end
85
- break
86
- end
87
-
88
- #begin
89
- # @output << stdout.read_nonblock(BUFFER_SIZE)
90
- # @error << stderr.read_nonblock(BUFFER_SIZE)
91
- #rescue IO::WaitReadable
92
- #rescue EOFError
93
- # @exitstatus = thread.value.exitstatus
94
- # until stdout.eof?
95
- # @output << stdout.read_nonblock(BUFFER_SIZE)
96
- # end
97
- # until stderr.eof?
98
- # @error << stderr.read_nonblock(BUFFER_SIZE)
99
- # end
100
- # break
101
- #end
102
- end
103
- sleep 1
104
- if thread.alive?
105
- if Gem.win_platform?
106
- `taskkill /f /pid #{pid}`
107
- else
108
- Process.kill("TERM", pid)
109
- end
110
- @exitstatus = 5
111
- @error = +"timed out"
112
- else
113
- @exitstatus = thread.value.exitstatus
114
- end
115
- end
116
-
117
- # =================================================
118
- end
119
- @elapsed = timer.elapsed
120
- if @logging_enabled
121
- log
122
- if @exitstatus != 0
123
- to_log_event.to_seq
124
- else
125
- # puts '---logging---'
126
- unless @success_log_level.nil?
127
- e = to_log_event
128
- e["Level"] = "Verbose" if @success_log_level == "Verbose"
129
- e["Level"] = "Debug" if @success_log_level == Logger::DEBUG
130
- e["Level"] = "Information" if @success_log_level == Logger::INFO
131
- e["Level"] = "Warning" if @elapsed > 60 * 2
132
- e.to_seq
133
- end
134
- end
135
- end
136
- self
137
- end
138
-
139
- def to_log_event
140
- secrets = Secrets.new
141
- msg = secrets.hide(@command)
142
- level = "Verbose"
143
- level = "Warning" if @exitstatus != 0
144
- output = @output
145
- error = @error
146
- output = @output[-1000..-1] if @output.length > 1200
147
- error = @error[-1000..-1] if @error.length > 1200
148
- Raykit::LogEvent.new(level, msg, {
149
- "SourceContext" => "Raykit::Command",
150
- "Category" => "Command",
151
- "Timeout" => @timeout,
152
- "Directory" => @directory,
153
- "Output" => output,
154
- "Error" => error,
155
- "ExitStatus" => @exitstatus,
156
- "Elapsed" => elapsed_str,
157
- "ElapsedSeconds" => @elapsed,
158
- })
159
- end
160
-
161
- def log
162
- # --- Rolling File JSON -----
163
- log = Logger.new("#{Raykit::Environment.log_dir}/Raykit.Commands.txt", "daily")
164
- log.formatter = proc do |_severity, _datetime, _progname, msg|
165
- "#{msg}\n"
166
- end
167
- secrets = Secrets.new
168
- msg = secrets.hide(@command) # "?"# self.summary(false)
169
- level = "Verbose"
170
- level = "Warning" if @exitstatus != 0
171
- event = Raykit::LogEvent.new(level, msg, {
172
- "Timeout" => @timeout,
173
- "Directory" => @directory,
174
- "Output" => @output,
175
- "Error" => @error,
176
- "ExitStatus" => @exitstatus,
177
- "Elapsed" => elapsed_str,
178
- })
179
- log.info event.to_json
180
- # ---------------------------
181
- begin
182
- json = JSON.generate(to_hash)
183
- log_filename = "#{Environment.get_dev_dir("log")}/Raykit.Command/#{SecureRandom.uuid}.json"
184
- log_dir = File.dirname(log_filename)
185
- FileUtils.mkdir_p(log_dir) unless Dir.exist?(log_dir)
186
- File.open(log_filename, "w") { |f| f.write(json) }
187
- if !@exitstatus.nil? && @exitstatus.zero?
188
- LOG.log("Raykit.Command", Logger::Severity::INFO, json)
189
- else
190
- LOG.log("Raykit.Command", Logger::Severity::ERROR, json)
191
- end
192
- rescue JSON::GeneratorError => e
193
- puts to_hash.to_s
194
- puts e.to_s
195
- json = JSON.generate(to_hash)
196
- end
197
- end
198
-
199
- def elapsed_str
200
- if elapsed < 1.0
201
- end
202
- "#{format("%.0f", elapsed)}s"
203
- end
204
-
205
- def summary(show_directory = false)
206
- checkmark = "\u2713"
207
- # warning="\u26A0"
208
- error = "\u0058"
209
- symbol = Rainbow(checkmark.encode("utf-8")).green
210
- symbol = Rainbow(error.encode("utf-8")).red if @exitstatus != 0
211
- cmd = "#{Rainbow(SECRETS.hide(@command)).yellow}"
212
- if show_directory
213
- puts "#{symbol} #{cmd} " + Rainbow("#{elapsed_str}").cyan
214
- puts Rainbow(" #{@directory}").white + " "
215
- else
216
- puts "#{symbol} #{Rainbow(SECRETS.hide(@command)).yellow} " + Rainbow("#{elapsed_str}").cyan
217
- #puts "#{symbol} #{Rainbow(SECRETS.hide(@command)).yellow} (#{elapsed_str})"
218
- end
219
- self
220
- end
221
-
222
- def details_on_failure
223
- if @exitstatus != 0
224
- details
225
- end
226
- self
227
- end
228
-
229
- def details
230
- #puts " exit_code: " + @exitstatus.to_s
231
- summary
232
- if @output.length > 0
233
- @output.lines.each do |line|
234
- puts " " + line
235
- end
236
- end
237
- if @error.length > 0
238
- @error.lines.each do |line|
239
- puts " " + line
240
- end
241
- end
242
- self
243
- end
244
-
245
- def to_markdown
246
- checkmark = "\u2713"
247
- error = "\u0058"
248
- symbol = checkmark.encode("utf-8")
249
- symbol = error.encode("utf-8") if @exitstatus != 0
250
- cmd = "#{SECRETS.hide(@command)}"
251
- md = "#{symbol} #{SECRETS.hide(@command)} (#{elapsed_str})"
252
- md
253
- end
254
-
255
- def save
256
- filename = "#{Environment.get_dev_dir("log")}/Commands/#{SecureRandom.uuid}"
257
- log_dir = File.dirname(filename)
258
- FileUtils.mkdir_p(log_dir) unless Dir.exist?(log_dir)
259
-
260
- File.open(filename, "w") do |f|
261
- f.write(JSON.pretty_generate(to_hash))
262
- end
263
- self
264
- end
265
-
266
- def save_as(filename)
267
- File.open(filename, "w") do |f|
268
- f.write(JSON.pretty_generate(to_hash))
269
- end
270
- self
271
- end
272
-
273
- def log_to_file(filename)
274
- File.delete(filename) if File.exist?(filename)
275
- File.open(filename, "w") { |f|
276
- f.puts output
277
- f.puts error
278
- }
279
- self
280
- end
281
-
282
- def to_hash
283
- hash = {}
284
- hash[:command] = @command
285
- hash[:directory] = @directory
286
- hash[:timeout] = @timeout
287
- hash[:start_time] = @start_time
288
- hash[:elapsed] = @elapsed
289
- hash[:output] = @output.force_encoding("ISO-8859-1").encode("UTF-8")
290
- hash[:error] = @error.force_encoding("ISO-8859-1").encode("UTF-8")
291
- hash[:exitstatus] = @exitstatus
292
- hash[:user] = @user
293
- hash[:machine] = @machine
294
- hash[:context] = "Raykit.Command"
295
- hash
296
- end
297
-
298
- def from_hash(hash)
299
- @command = hash["command"]
300
- @directory = hash["directory"]
301
- @timeout = hash["timeout"]
302
- @start_time = hash["start_time"]
303
- @elapsed = hash["elapsed"]
304
- @output = hash["output"]
305
- @error = hash["error"]
306
- @exitstatus = hash["exitstatus"]
307
- @user = hash["user"] if hash.include?("user")
308
- @machine = hash["machine"] if hash.include?("machine")
309
- end
310
-
311
- def self.parse(json)
312
- cmd = Command.new("")
313
- cmd.from_hash(JSON.parse(json))
314
- cmd
315
- end
316
-
317
- def self.parse_yaml_commands(yaml)
318
- # commands=Array.new()
319
- data = YAML.safe_load(yaml)
320
- commands = get_script_commands(data)
321
- end
322
-
323
- def self.get_script_commands(hash)
324
- commands = []
325
- if hash.key?("script")
326
- hash["script"].each do |cmd|
327
- commands << cmd
328
- end
329
- end
330
- hash.each do |_k, v|
331
- next unless v.is_a?(Hash)
332
-
333
- subcommands = get_script_commands(v)
334
- subcommands.each do |c|
335
- commands << c
336
- end
337
- end
338
- commands
339
- end
340
- end
341
- end
1
+ require "open3"
2
+ require "timeout"
3
+ require "json"
4
+ require "yaml"
5
+ require "logger"
6
+ require "securerandom"
7
+
8
+ module Raykit
9
+ # Functionality to support executing and logging system commands
10
+ class Command
11
+ @@commands = []
12
+ # The timeout in seconds, defaults to 0 if not specified
13
+ attr_accessor :timeout
14
+ # The working directory, defaults the current directory if not specified
15
+ attr_accessor :directory
16
+ # The start time
17
+ attr_accessor :start_time
18
+ # The execution time in seconds
19
+ attr_accessor :elapsed
20
+ attr_accessor :command, :output, :error, :exitstatus, :user, :machine, :logging_enabled, :success_log_level
21
+
22
+ def init_defaults
23
+ @timeout = 0
24
+ @directory = Dir.pwd
25
+ @output = +""
26
+ @error = +""
27
+ @exitstatus = 0
28
+ @user = Environment.user
29
+ @machine = Environment.machine
30
+ @logging_enabled = true
31
+ end
32
+
33
+ def initialize(command)
34
+ #def initialize(command, timeout = 0, success_log_level = Logger::DEBUG, logging_enabled = true)
35
+ timeout = 0
36
+ success_log_level = nil
37
+ logging_enabled = false
38
+ @@commands = []
39
+ init_defaults
40
+ @success_log_level = success_log_level
41
+ @logging_enabled = logging_enabled
42
+ @command = command
43
+ @timeout = timeout
44
+ #t = Time.now
45
+ @elapsed = 0
46
+ #run if @command.length.positive?
47
+ self
48
+ end
49
+
50
+ def set_timeout(timeout)
51
+ @timeout = timeout
52
+ self
53
+ end
54
+
55
+ def run
56
+ # puts '---running---'
57
+ @start_time = Time.now
58
+ @elapsed = 0
59
+ timer = Timer.new
60
+ if @timeout.zero?
61
+ @output, @error, process_status = Open3.capture3(@command)
62
+ @exitstatus = process_status.exitstatus
63
+ else
64
+ # =================================================
65
+ #puts "@timeout is #{@timeout}"
66
+ Open3.popen3(@command, chdir: @directory) do |_stdin, stdout, stderr, thread|
67
+ tick = 1
68
+ pid = thread.pid
69
+ start = Time.now
70
+ while ((Time.now - start) < @timeout) && thread.alive?
71
+ Kernel.select([stdout, stderr], nil, nil, tick)
72
+ begin
73
+ @output << stdout.read_nonblock(BUFFER_SIZE)
74
+ #@error << stderr.read_nonblock(BUFFER_SIZE)
75
+ rescue IO::WaitReadable
76
+ rescue EOFError
77
+ #puts "rescue block entered"
78
+ @exitstatus = thread.value.exitstatus
79
+ until stdout.eof?
80
+ @output << stdout.read_nonblock(BUFFER_SIZE)
81
+ end
82
+ until stderr.eof?
83
+ @error << stderr.read_nonblock(BUFFER_SIZE)
84
+ end
85
+ break
86
+ end
87
+
88
+ #begin
89
+ # @output << stdout.read_nonblock(BUFFER_SIZE)
90
+ # @error << stderr.read_nonblock(BUFFER_SIZE)
91
+ #rescue IO::WaitReadable
92
+ #rescue EOFError
93
+ # @exitstatus = thread.value.exitstatus
94
+ # until stdout.eof?
95
+ # @output << stdout.read_nonblock(BUFFER_SIZE)
96
+ # end
97
+ # until stderr.eof?
98
+ # @error << stderr.read_nonblock(BUFFER_SIZE)
99
+ # end
100
+ # break
101
+ #end
102
+ end
103
+ sleep 1
104
+ if thread.alive?
105
+ if Gem.win_platform?
106
+ `taskkill /f /pid #{pid}`
107
+ else
108
+ Process.kill("TERM", pid)
109
+ end
110
+ @exitstatus = 5
111
+ @error = +"timed out"
112
+ else
113
+ @exitstatus = thread.value.exitstatus
114
+ end
115
+ end
116
+
117
+ # =================================================
118
+ end
119
+ @elapsed = timer.elapsed
120
+ if @logging_enabled
121
+ log
122
+ if @exitstatus != 0
123
+ to_log_event.to_seq
124
+ else
125
+ # puts '---logging---'
126
+ unless @success_log_level.nil?
127
+ e = to_log_event
128
+ e["Level"] = "Verbose" if @success_log_level == "Verbose"
129
+ e["Level"] = "Debug" if @success_log_level == Logger::DEBUG
130
+ e["Level"] = "Information" if @success_log_level == Logger::INFO
131
+ e["Level"] = "Warning" if @elapsed > 60 * 2
132
+ e.to_seq
133
+ end
134
+ end
135
+ end
136
+ self
137
+ end
138
+
139
+ def to_log_event
140
+ secrets = Secrets.new
141
+ msg = secrets.hide(@command)
142
+ level = "Verbose"
143
+ level = "Warning" if @exitstatus != 0
144
+ output = @output
145
+ error = @error
146
+ output = @output[-1000..-1] if @output.length > 1200
147
+ error = @error[-1000..-1] if @error.length > 1200
148
+ Raykit::LogEvent.new(level, msg, {
149
+ "SourceContext" => "Raykit::Command",
150
+ "Category" => "Command",
151
+ "Timeout" => @timeout,
152
+ "Directory" => @directory,
153
+ "Output" => output,
154
+ "Error" => error,
155
+ "ExitStatus" => @exitstatus,
156
+ "Elapsed" => elapsed_str,
157
+ "ElapsedSeconds" => @elapsed,
158
+ })
159
+ end
160
+
161
+ def log
162
+ # --- Rolling File JSON -----
163
+ log = Logger.new("#{Raykit::Environment.log_dir}/Raykit.Commands.txt", "daily")
164
+ log.formatter = proc do |_severity, _datetime, _progname, msg|
165
+ "#{msg}\n"
166
+ end
167
+ secrets = Secrets.new
168
+ msg = secrets.hide(@command) # "?"# self.summary(false)
169
+ level = "Verbose"
170
+ level = "Warning" if @exitstatus != 0
171
+ event = Raykit::LogEvent.new(level, msg, {
172
+ "Timeout" => @timeout,
173
+ "Directory" => @directory,
174
+ "Output" => @output,
175
+ "Error" => @error,
176
+ "ExitStatus" => @exitstatus,
177
+ "Elapsed" => elapsed_str,
178
+ })
179
+ log.info event.to_json
180
+ # ---------------------------
181
+ begin
182
+ json = JSON.generate(to_hash)
183
+ log_filename = "#{Environment.get_dev_dir("log")}/Raykit.Command/#{SecureRandom.uuid}.json"
184
+ log_dir = File.dirname(log_filename)
185
+ FileUtils.mkdir_p(log_dir) unless Dir.exist?(log_dir)
186
+ File.open(log_filename, "w") { |f| f.write(json) }
187
+ if !@exitstatus.nil? && @exitstatus.zero?
188
+ LOG.log("Raykit.Command", Logger::Severity::INFO, json)
189
+ else
190
+ LOG.log("Raykit.Command", Logger::Severity::ERROR, json)
191
+ end
192
+ rescue JSON::GeneratorError => e
193
+ puts to_hash.to_s
194
+ puts e.to_s
195
+ json = JSON.generate(to_hash)
196
+ end
197
+ end
198
+
199
+ def elapsed_str
200
+ if elapsed < 1.0
201
+ end
202
+ "#{format("%.0f", elapsed)}s"
203
+ end
204
+
205
+ def summary(show_directory = false)
206
+ checkmark = "\u2713"
207
+ # warning="\u26A0"
208
+ error = "\u0058"
209
+ symbol = Rainbow(checkmark.encode("utf-8")).green
210
+ symbol = Rainbow(error.encode("utf-8")).red if @exitstatus != 0
211
+ cmd = "#{Rainbow(SECRETS.hide(@command)).yellow}"
212
+ if show_directory
213
+ puts "#{symbol} #{cmd} " + Rainbow("#{elapsed_str}").cyan
214
+ puts Rainbow(" #{@directory}").white + " "
215
+ else
216
+ puts "#{symbol} #{Rainbow(SECRETS.hide(@command)).yellow} " + Rainbow("#{elapsed_str}").cyan
217
+ #puts "#{symbol} #{Rainbow(SECRETS.hide(@command)).yellow} (#{elapsed_str})"
218
+ end
219
+ self
220
+ end
221
+
222
+ def details_on_failure
223
+ if @exitstatus != 0
224
+ details
225
+ end
226
+ self
227
+ end
228
+
229
+ def details
230
+ #puts " exit_code: " + @exitstatus.to_s
231
+ summary
232
+ if @output.length > 0
233
+ @output.lines.each do |line|
234
+ puts " " + line
235
+ end
236
+ end
237
+ if @error.length > 0
238
+ @error.lines.each do |line|
239
+ puts " " + line
240
+ end
241
+ end
242
+ self
243
+ end
244
+
245
+ def to_markdown
246
+ checkmark = "\u2713"
247
+ error = "\u0058"
248
+ symbol = checkmark.encode("utf-8")
249
+ symbol = error.encode("utf-8") if @exitstatus != 0
250
+ cmd = "#{SECRETS.hide(@command)}"
251
+ md = "#{symbol} #{SECRETS.hide(@command)} (#{elapsed_str})"
252
+ md
253
+ end
254
+
255
+ def save
256
+ filename = "#{Environment.get_dev_dir("log")}/Commands/#{SecureRandom.uuid}"
257
+ log_dir = File.dirname(filename)
258
+ FileUtils.mkdir_p(log_dir) unless Dir.exist?(log_dir)
259
+
260
+ File.open(filename, "w") do |f|
261
+ f.write(JSON.pretty_generate(to_hash))
262
+ end
263
+ self
264
+ end
265
+
266
+ def save_as(filename)
267
+ File.open(filename, "w") do |f|
268
+ f.write(JSON.pretty_generate(to_hash))
269
+ end
270
+ self
271
+ end
272
+
273
+ def log_to_file(filename)
274
+ File.delete(filename) if File.exist?(filename)
275
+ File.open(filename, "w") { |f|
276
+ f.puts output
277
+ f.puts error
278
+ }
279
+ self
280
+ end
281
+
282
+ def to_hash
283
+ hash = {}
284
+ hash[:command] = @command
285
+ hash[:directory] = @directory
286
+ hash[:timeout] = @timeout
287
+ hash[:start_time] = @start_time
288
+ hash[:elapsed] = @elapsed
289
+ hash[:output] = @output.force_encoding("ISO-8859-1").encode("UTF-8")
290
+ hash[:error] = @error.force_encoding("ISO-8859-1").encode("UTF-8")
291
+ hash[:exitstatus] = @exitstatus
292
+ hash[:user] = @user
293
+ hash[:machine] = @machine
294
+ hash[:context] = "Raykit.Command"
295
+ hash
296
+ end
297
+
298
+ def from_hash(hash)
299
+ @command = hash["command"]
300
+ @directory = hash["directory"]
301
+ @timeout = hash["timeout"]
302
+ @start_time = hash["start_time"]
303
+ @elapsed = hash["elapsed"]
304
+ @output = hash["output"]
305
+ @error = hash["error"]
306
+ @exitstatus = hash["exitstatus"]
307
+ @user = hash["user"] if hash.include?("user")
308
+ @machine = hash["machine"] if hash.include?("machine")
309
+ end
310
+
311
+ def self.parse(json)
312
+ cmd = Command.new("")
313
+ cmd.from_hash(JSON.parse(json))
314
+ cmd
315
+ end
316
+
317
+ def self.parse_yaml_commands(yaml)
318
+ # commands=Array.new()
319
+ data = YAML.safe_load(yaml)
320
+ commands = get_script_commands(data)
321
+ end
322
+
323
+ def self.get_script_commands(hash)
324
+ commands = []
325
+ if hash.key?("script")
326
+ hash["script"].each do |cmd|
327
+ commands << cmd
328
+ end
329
+ end
330
+ hash.each do |_k, v|
331
+ next unless v.is_a?(Hash)
332
+
333
+ subcommands = get_script_commands(v)
334
+ subcommands.each do |c|
335
+ commands << c
336
+ end
337
+ end
338
+ commands
339
+ end
340
+ end
341
+ end