greenhat 0.2.0 → 0.3.3

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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/lib/greenhat/accessors/disk.rb +13 -13
  3. data/lib/greenhat/accessors/gitlab.rb +75 -0
  4. data/lib/greenhat/accessors/memory.rb +10 -10
  5. data/lib/greenhat/accessors/process.rb +4 -0
  6. data/lib/greenhat/cli.rb +147 -58
  7. data/lib/greenhat/color.rb +27 -0
  8. data/lib/greenhat/logbot.rb +9 -9
  9. data/lib/greenhat/settings.rb +27 -7
  10. data/lib/greenhat/shell/args.rb +146 -0
  11. data/lib/greenhat/shell/cat.rb +25 -73
  12. data/lib/greenhat/shell/color_string.rb +8 -8
  13. data/lib/greenhat/shell/disk.rb +31 -4
  14. data/lib/greenhat/shell/faststats.rb +103 -56
  15. data/lib/greenhat/shell/field_helper.rb +75 -0
  16. data/lib/greenhat/shell/filter_help.rb +162 -0
  17. data/lib/greenhat/shell/gitlab.rb +61 -2
  18. data/lib/greenhat/shell/help.rb +98 -15
  19. data/lib/greenhat/shell/list.rb +46 -0
  20. data/lib/greenhat/shell/log.rb +118 -104
  21. data/lib/greenhat/shell/page.rb +11 -5
  22. data/lib/greenhat/shell/process.rb +29 -17
  23. data/lib/greenhat/shell/report.rb +37 -47
  24. data/lib/greenhat/shell/shell_helper.rb +661 -0
  25. data/lib/greenhat/shell.rb +23 -9
  26. data/lib/greenhat/thing/file_types.rb +31 -5
  27. data/lib/greenhat/thing/formatters/json_shellwords.rb +0 -3
  28. data/lib/greenhat/thing/formatters/nginx.rb +44 -0
  29. data/lib/greenhat/thing/helpers.rb +4 -4
  30. data/lib/greenhat/thing/kind.rb +9 -2
  31. data/lib/greenhat/thing/spinner.rb +3 -3
  32. data/lib/greenhat/thing.rb +25 -3
  33. data/lib/greenhat/tty/columns.rb +4 -0
  34. data/lib/greenhat/version.rb +1 -1
  35. data/lib/greenhat.rb +15 -14
  36. metadata +38 -18
  37. data/lib/greenhat/shell/filter.rb +0 -128
  38. data/lib/greenhat/shell/helper.rb +0 -584
@@ -0,0 +1,146 @@
1
+ module GreenHat
2
+ # Module for Argument Parsing
3
+ # Possible Args
4
+ # --value=thing
5
+ # --value / Default => --value=thing
6
+ # --flag
7
+ # --slice=value,value2
8
+ # files
9
+
10
+ # Variable Breakdown
11
+ # Args:Array supplied or default values for entry looping action
12
+ # Flags:Hash Key/Value filter Actionables
13
+ # Files:Array/String are any non start `-` dash entries
14
+ module Args
15
+ def self.parse(raw, skip_flags = [])
16
+ # Don't affect original object / Better deep clone?
17
+ cmd = raw.clone
18
+ # cmd = Marshal.load(Marshal.dump(raw))
19
+
20
+ # Extract Files
21
+ files = cmd.grep_v(/^-+([^=]+)/)
22
+
23
+ # Collect and Naturalize Arguments
24
+ args = cmd.flat_map { |arg| arg_scan(arg) }
25
+
26
+ # Collect all Flags to Hash
27
+ flags = cmd.flat_map { |flag| flag_scan(flag) }.to_h
28
+
29
+ # Move Flags to Args
30
+ arg_to_flag(flags, args)
31
+
32
+ # Logic
33
+ # And / Or
34
+ flag_defaults(flags, skip_flags)
35
+
36
+ [files, flags, args]
37
+ end
38
+
39
+ def self.flag_defaults(flags, skip_flags)
40
+ # Update other user defaults
41
+ Settings.default_log_flags(flags, skip_flags)
42
+
43
+ # FastStats / Don't set default flags
44
+ return if skip_flags.include? :logic
45
+
46
+ # Default Logic
47
+ if flags.key?(:or)
48
+ flags.logic = :any?
49
+ flags.delete(:or)
50
+ else
51
+ flags.logic = :all?
52
+ end
53
+ end
54
+
55
+ # Move Valued Flags to arguments (--truncate=5)
56
+ def self.arg_to_flag(flags, args)
57
+ args.reject! do |arg|
58
+ # Entries specifically to move to Args
59
+ if arg_to_flag_list.include?(arg.field)
60
+ flags[arg.field] = arg.value
61
+
62
+ true
63
+ # Ignore Good Entries
64
+ else
65
+ false
66
+ end
67
+ end
68
+ end
69
+
70
+ # Flags Anything that isn't sent as a key/filter
71
+ def self.arg_to_flag_list
72
+ %i[
73
+ archive end except exists json limit pluck reverse round slice sort start
74
+ stats truncate uniq page time_zone table_style
75
+ ]
76
+ end
77
+
78
+ # Arg Scan (Split -- values into keys)
79
+ def self.arg_scan(arg)
80
+ arg.scan(/^-+([^=]+)=(.*)/).map do |field, value|
81
+ bang = false
82
+ if field.include? '!'
83
+ field.delete!('!')
84
+ bang = true
85
+ end
86
+
87
+ # Symbolize
88
+ field = field.to_sym
89
+
90
+ {
91
+ field: field,
92
+ value: arg_normalize(field, value),
93
+ bang: bang
94
+ }
95
+ end
96
+ end
97
+
98
+ # Collect All Flags
99
+ def self.flag_scan(arg)
100
+ arg.scan(/^-+([^=]+)$/).map do |field, _val|
101
+ # Symbolize
102
+ field = field.to_sym
103
+
104
+ [field, flag_arg_defaults(field)]
105
+ end
106
+ end
107
+
108
+ # Naturlalize Values, Manipluate Special Values
109
+ def self.arg_normalize(field, value)
110
+ # Special Comma Params With Symbol
111
+ return value.split(',').map(&:to_sym) if arg_special_split.include?(field)
112
+
113
+ # Integer Arguments
114
+ return value.to_i if value.numeric?
115
+
116
+ # Other Field Manipulation
117
+ case field
118
+ when :page then value == 'true'
119
+ else
120
+
121
+ # Default Original
122
+ value
123
+ end
124
+ end
125
+
126
+ # Arguments that Accept multiple options / Comma Delimted
127
+ def self.arg_special_split
128
+ %i[
129
+ slice except uniq pluck sort archive stats exists
130
+ ]
131
+ end
132
+
133
+ # Arg Defaults
134
+ def self.flag_arg_defaults(field)
135
+ case field
136
+ when :round then 2
137
+ when :limit then (TTY::Screen.height / 3) - 3
138
+ when :truncate then TTY::Screen.width * 4
139
+ # when :page, :case, :exact then :true # Override Specials
140
+ when *arg_special_split then []
141
+ else
142
+ true
143
+ end
144
+ end
145
+ end
146
+ end
@@ -3,60 +3,38 @@ module GreenHat
3
3
  module Shell
4
4
  # Common File Reader File
5
5
  module Cat
6
- # rubocop:disable Metrics/MethodLength
7
6
  def self.help
8
- puts "\u2500".colorize(:cyan) * 20
9
- puts "#{'Cat'.colorize(:yellow)} All the files"
10
- puts "\u2500".colorize(:cyan) * 20
7
+ puts "\u2500".pastel(:cyan) * 20
8
+ puts "#{'Cat'.pastel(:yellow)} All the files"
9
+ puts "\u2500".pastel(:cyan) * 20
11
10
  puts 'Print raw file by just entering the file name'
12
11
  puts
13
12
 
14
- puts 'Common Options'.colorize(:blue)
15
- puts ' --raw'.colorize(:green)
16
- puts ' Do not use less/paging'
17
- puts
18
- puts ' --archive'.colorize(:green)
19
- puts ' Limit to specific archvie name (inclusive). Matching SOS tar.gz name'
20
- puts ' Ex: --archive=dev-gitlab_20210622154626, --archive=202106,202107'
21
- puts ' cat mount --archive=dev-gitlab_202106221546'
22
- puts
13
+ ShellHelper.common_opts
23
14
 
24
- puts 'Commands'.colorize(:blue)
25
- puts 'ls'.colorize(:green)
26
- puts ' List available files'
27
- puts ' Options'
28
- puts ' -a, --all, show all files including source'
29
- puts
15
+ puts 'Commands'.pastel(:blue)
16
+ puts ShellHelper::List.help
30
17
 
31
- puts '<file names+>'.colorize(:green)
32
- puts ' Print any file names'
33
- puts ' Ex: `free_m`'
34
- puts ' Ex: `ps mount --raw`'
18
+ puts ' <file names+>'.pastel(:green)
19
+ puts ' Print any file names'
20
+ puts ' Ex: `free_m`'
21
+ puts ' Ex: `ps mount --raw`'
35
22
  puts
36
23
 
37
- puts "#{'show'.colorize(:green)} <file names>"
38
- puts ' Attempt to print formatted output'
39
- puts ' Ex: show `free_m`'
40
-
41
- puts '--archive'.colorize(:green)
42
- puts ' Limit to specific archvie name (inclusive). Matching SOS tar.gz name'
43
- puts ' Ex: --archive=dev-gitlab_20210622154626, --archive=202106,202107'
44
- puts
24
+ puts " #{'show'.pastel(:green)} <file names>"
25
+ puts ' Attempt to print formatted output'
26
+ puts ' Ex: show `free_m`'
45
27
  end
46
- # rubocop:enable Metrics/MethodLength
47
28
 
48
29
  # ========================================================================
49
30
  # Default
50
31
  # ========================================================================
51
- def self.default(file_list)
32
+ def self.default(raw)
52
33
  # Extract Args
53
- file_list, _opts, args = ShellHelper.param_parse(file_list)
54
-
55
- # Prepare Log List
56
- file_list = ShellHelper.prepare_list(file_list, Thing.all)
34
+ files_list, flags, _args = Args.parse(raw)
57
35
 
58
- # Convert to Things
59
- files = ShellHelper.find_things(file_list, args)
36
+ # Collect Files
37
+ files = ShellHelper.files(files_list, Thing.all, flags)
60
38
 
61
39
  results = ShellHelper.file_process(files) do |file|
62
40
  [
@@ -66,58 +44,32 @@ module GreenHat
66
44
  ]
67
45
  end
68
46
 
69
- ShellHelper.show(results.flatten, args)
47
+ ShellHelper.show(results.flatten, flags)
70
48
  end
71
49
 
72
50
  # ========================================================================
73
51
  # Show Attempted Formatting
74
52
  # ========================================================================
75
- def self.show(file_list)
53
+ def self.show(raw)
76
54
  # Extract Args
77
- file_list, _opts, args = ShellHelper.param_parse(file_list)
55
+ files_list, flags, _args = Args.parse(raw)
78
56
 
79
- # Prepare Log List
80
- file_list = ShellHelper.prepare_list(file_list, Thing.all)
81
-
82
- # Convert to Things
83
- files = ShellHelper.find_things(file_list, args)
57
+ # Collect Files
58
+ files = ShellHelper.files(files_list, Thing.all, flags)
84
59
 
85
60
  results = ShellHelper.file_process(files) do |file|
86
61
  [
87
62
  file.friendly_name,
88
- file.output(false),
63
+ file.data,
89
64
  "\n"
90
65
  ]
91
66
  end
92
67
 
93
- ShellHelper.show(results.flatten, args)
94
- end
95
-
96
- # List Files Helpers
97
- def self.list(args = [])
98
- all = false
99
- all = true if args.include?('-a') || args.include?('--all')
100
-
101
- files = Thing.all
102
-
103
- # Sort
104
- files.sort_by!(&:name)
105
-
106
- # Short & Uniq
107
- files.uniq!(&:name) unless all
108
-
109
- # Print
110
- files.each do |log|
111
- if all
112
- puts "- #{log.friendly_name}"
113
- else
114
- puts "- #{log.name.colorize(:yellow)}"
115
- end
116
- end
68
+ ShellHelper.show(results.flatten, flags)
117
69
  end
118
70
 
119
71
  def self.ls(args = [])
120
- list(args)
72
+ ShellHelper::List.list(args, Thing.all)
121
73
  end
122
74
  # ------------------------------------------------------------------------
123
75
  end
@@ -6,20 +6,20 @@ module GreenHat
6
6
  LogBot.debug('Unknown Format', entry.class) if ENV['DEBUG'] && !entry.instance_of?(String)
7
7
 
8
8
  # Other Helpful colorizers
9
- if colorize?(key)
10
- colorize(key, entry)
9
+ if pastel?(key)
10
+ pastel(key, entry)
11
11
  else
12
12
  entry.to_s
13
13
  end
14
14
  end
15
15
 
16
16
  # Add Color?
17
- def self.colorize?(key)
17
+ def self.pastel?(key)
18
18
  [:severity].any? key
19
19
  end
20
20
 
21
21
  # General Key/Value Coloring
22
- def self.colorize(key, value)
22
+ def self.pastel(key, value)
23
23
  case key
24
24
  when :severity then severity(value)
25
25
  else
@@ -30,10 +30,10 @@ module GreenHat
30
30
 
31
31
  def self.severity(value)
32
32
  case value.to_s.downcase.to_sym
33
- when :debug then value.colorize(:blue)
34
- when :info then value.colorize(:cyan)
35
- when :warn then value.colorize(:yellow)
36
- when :fatal, :error then value.colorize(:light_red)
33
+ when :debug then value.pastel(:blue)
34
+ when :info then value.pastel(:cyan)
35
+ when :warn then value.pastel(:yellow)
36
+ when :fatal, :error then value.pastel(:bright_red)
37
37
  else
38
38
  value.to_s
39
39
  end
@@ -8,15 +8,42 @@ module GreenHat
8
8
  Cli.help
9
9
  end
10
10
 
11
+ def self.help
12
+ puts "\u2500".pastel(:cyan) * 22
13
+ puts "#{'Disk'.pastel(:yellow)} - Storage Helper"
14
+ puts "\u2500".pastel(:cyan) * 22
15
+
16
+ ShellHelper.common_opts
17
+
18
+ puts 'Command Summary'.pastel(:blue)
19
+ puts ' df'.pastel(:green)
20
+ puts " Raw #{'df'.pastel(:cyan)} output"
21
+ puts
22
+ puts ' free'.pastel(:green)
23
+ puts ' Formatted / Bar Output'
24
+ puts
25
+ end
26
+
11
27
  # Easy Show All
12
- def self.df
13
- ShellHelper.file_output GreenHat::Disk.df
28
+ def self.df(raw = {})
29
+ # Extract Args
30
+ files_list, flags, _args = Args.parse(raw)
31
+
32
+ # Collect Files
33
+ files = ShellHelper.files(files_list, GreenHat::Disk.df, flags)
34
+
35
+ # Output
36
+ ShellHelper.file_output(files, flags)
14
37
  end
15
38
 
16
39
  def self.free(raw = {})
17
- _log_list, _1opts, args = ShellHelper.param_parse(raw)
40
+ # Extract Args
41
+ files_list, flags, _args = Args.parse(raw)
42
+
43
+ # Collect Files
44
+ files = ShellHelper.files(files_list, GreenHat::Disk.df, flags)
18
45
 
19
- GreenHat::Disk.df(args).each do |file|
46
+ files.each do |file|
20
47
  puts GreenHat::Disk.format_output(file, true)
21
48
 
22
49
  # File End Loop / Break
@@ -5,52 +5,82 @@ module GreenHat
5
5
  module Faststats
6
6
  # rubocop:disable Metrics/MethodLength)
7
7
  def self.help
8
- puts "\u2500".colorize(:cyan) * 25
9
- puts "Gimme #{'Performance Stats'.colorize(:yellow)}"
10
- puts "\u2500".colorize(:cyan) * 25
8
+ puts "\u2500".pastel(:cyan) * 25
9
+ puts "Gimme #{'Performance Stats'.pastel(:yellow)}"
10
+ puts "\u2500".pastel(:cyan) * 25
11
11
 
12
- puts 'General'.colorize(:blue)
13
- puts " Any double dash arguments (e.g. #{'--color-output'.colorize(:green)}) are passed directly to fast-stats"
14
- puts " See #{'`fast-stats --help`'.colorize(:light_black)} for all available options"
12
+ puts 'General'.pastel(:blue)
13
+ puts " Any double dash arguments (e.g. #{'--color-output'.pastel(:green)}) are passed directly to fast-stats"
14
+ puts " See #{'`fast-stats --help`'.pastel(:bright_black)} for all available options"
15
15
  puts
16
16
 
17
- puts 'Common Options'.colorize(:blue)
18
- puts ' --raw'.colorize(:green)
17
+ puts 'Common Options'.pastel(:blue)
18
+ puts ' --raw'.pastel(:green)
19
19
  puts ' Do not use less/paging'
20
- puts ' --display'.colorize(:green)
21
- puts ' Show percentage of totals and/or actual durations (value, perc, both, default: both)'
22
- puts ' --sort'.colorize(:green)
20
+ puts ' --search'.pastel(:green)
21
+ puts ' Case-insensitive search of controller/method/worker field'
22
+ puts ' --sort'.pastel(:green)
23
23
  puts ' count,fail,max,median,min,p95,p99,rps,score'
24
- puts ' --limit'.colorize(:green)
24
+ puts ' --limit'.pastel(:green)
25
25
  puts ' The number of rows to print'
26
- puts ' --verbose'.colorize(:green)
26
+ puts ' --verbose'.pastel(:green)
27
27
  puts ' Prints the component details of the maximum, P99, P95, and median events by total duration for each'
28
28
  puts
29
29
 
30
- puts 'Commands'.colorize(:blue)
31
- puts 'ls'.colorize(:green)
30
+ puts 'Commands'.pastel(:blue)
31
+ puts 'ls'.pastel(:green)
32
32
  puts ' List available files'
33
33
  puts ' Options'
34
34
  puts ' -a, --all, show all files including source'
35
35
  puts
36
36
 
37
- puts '<file names+>'.colorize(:green)
37
+ puts '<file names+>'.pastel(:green)
38
38
  puts ' Print any file names'
39
39
  puts ' Ex: `gitaly/current`'
40
40
  puts ' Ex: `gitlab-rails/api_json.log gitlab-rails/production_json.log --raw`'
41
41
  puts
42
42
 
43
- puts 'top'.colorize(:green)
43
+ puts 'top'.pastel(:green)
44
44
  puts ' Print a summary of top items in a category'
45
45
  puts
46
46
 
47
- puts 'errors'.colorize(:green)
47
+ puts 'errors'.pastel(:green)
48
48
  puts ' Show summary of errors captured in log'
49
+ puts
50
+
51
+ puts 'Examples'.pastel(:blue)
52
+ puts ' Default'.pastel(:bright_white)
53
+ puts ' gitaly/current'
54
+ puts ' --raw gitlab-rails/production_json.log'
55
+ puts ' gitlab-rails/api_json.log --sort=count'
56
+ puts ' --search=pipeline sidekiq/current'
57
+ puts
58
+
59
+ puts ' Top'.pastel(:bright_white)
60
+ puts ' top gitaly/current'
61
+ puts ' top --limit=5 sidekiq/current'
62
+ puts
63
+
64
+ puts ' Errors'.pastel(:bright_white)
65
+ puts ' errors gitaly/current'
66
+ puts ' errors gitaly/current --no-border'
49
67
  end
50
68
  # rubocop:enable Metrics/MethodLength)
51
69
 
70
+ def self.faststats_installation
71
+ puts "#{'Unable to find'.pastel(:red)} #{'fast-stats'.pastel(:blue)}"
72
+ puts ' Release Downloads here'
73
+ puts ' - https://gitlab.com/gitlab-com/support/toolbox/fast-stats/-/releases'.pastel(:yellow)
74
+ puts ''
75
+ end
76
+
52
77
  # List Files Helpers
53
78
  def self.list(args = [])
79
+ unless TTY::Which.exist? 'fast-stats'
80
+ faststats_installation
81
+ return false
82
+ end
83
+
54
84
  all = false
55
85
  all = true if args.include?('-a') || args.include?('--all')
56
86
 
@@ -67,7 +97,7 @@ module GreenHat
67
97
  if all
68
98
  puts "- #{log.friendly_name}"
69
99
  else
70
- puts "- #{log.name.colorize(:yellow)}"
100
+ puts "- #{log.name.pastel(:yellow)}"
71
101
  end
72
102
  end
73
103
  end
@@ -77,18 +107,15 @@ module GreenHat
77
107
  end
78
108
 
79
109
  # Vanilla Fast Stats
80
- def self.default(file_list, _other = nil)
81
- # Extract Args
82
- file_list, opts, args = ShellHelper.param_parse(file_list)
83
-
84
- cmd = opts.map { |opt| "--#{opt.field}=#{opt.value}" }.join(' ')
85
- cmd += args.keys.map { |arg| "--#{arg}" }.join(' ')
110
+ def self.default(raw, _other = nil)
111
+ unless TTY::Which.exist? 'fast-stats'
112
+ faststats_installation
113
+ return false
114
+ end
86
115
 
87
- # Prepare List
88
- file_list = ShellHelper.prepare_list(file_list, ShellHelper::Faststats.things)
116
+ files, flags, cmd = ShellHelper::Faststats.parse(raw)
89
117
 
90
- # Convert to Things
91
- files = ShellHelper.find_things(file_list)
118
+ LogBot.debug('FastStats CMD', cmd) if ENV['DEBUG']
92
119
 
93
120
  results = ShellHelper.file_process(files) do |file|
94
121
  [
@@ -98,7 +125,7 @@ module GreenHat
98
125
  ]
99
126
  end
100
127
 
101
- ShellHelper.show(results.flatten, args)
128
+ ShellHelper.show(results.flatten, flags)
102
129
  end
103
130
 
104
131
  # ========================================================================
@@ -110,18 +137,15 @@ module GreenHat
110
137
  # --limit=X
111
138
  # --sort=count,fail,max,median,min,p95,p99,rps,score
112
139
  # ========================================================================
113
- def self.top(log_list)
114
- # Extract Args, No Round / Truncate for Fast Stats
115
- log_list, opts, args = ShellHelper.param_parse(log_list, %i[page round truncate])
116
-
117
- cmd = opts.map { |opt| "--#{opt.field}=#{opt.value}" }.join(' ')
118
- cmd += args.keys.map { |arg| "--#{arg}" }.join(' ')
140
+ def self.top(raw)
141
+ unless TTY::Which.exist? 'fast-stats'
142
+ faststats_installation
143
+ return false
144
+ end
119
145
 
120
- # Prepare Log List
121
- log_list = ShellHelper.prepare_list(log_list, ShellHelper::Faststats.things)
146
+ files, flags, cmd = ShellHelper::Faststats.parse(raw)
122
147
 
123
- # Convert to Things
124
- files = ShellHelper.find_things(log_list)
148
+ LogBot.debug('FastStats CMD', cmd) if ENV['DEBUG']
125
149
 
126
150
  results = ShellHelper.file_process(files) do |file|
127
151
  [
@@ -131,28 +155,22 @@ module GreenHat
131
155
  ]
132
156
  end
133
157
 
134
- ShellHelper.show(results.flatten, args)
158
+ ShellHelper.show(results.flatten, flags)
135
159
  end
136
160
  # ========================================================================
137
161
 
138
162
  # ========================================================================
139
163
  # ===== [ Fast Stats - Errors ] ====================
140
164
  # ========================================================================
141
- def self.errors(log_list)
142
- # Extract Args, No Round / Truncate for Fast Stats
143
- log_list, opts, args = ShellHelper.param_parse(log_list, %i[page round truncate])
144
-
145
- # Default to color output
146
- args['color-output'] ||= true
147
-
148
- cmd = opts.map { |opt| "--#{opt.field}=#{opt.value}" }.join(' ')
149
- cmd += args.keys.map { |arg| "--#{arg}" }.join(' ')
150
-
151
- # Prepare Log List
152
- log_list = ShellHelper.prepare_list(log_list, ShellHelper::Faststats.things)
165
+ def self.errors(raw)
166
+ unless TTY::Which.exist? 'fast-stats'
167
+ faststats_installation
168
+ return false
169
+ end
153
170
 
154
- # Convert to Things
155
- files = ShellHelper.find_things(log_list)
171
+ # Add Color Output
172
+ raw.push '--color-output'
173
+ files, flags, cmd = ShellHelper::Faststats.parse(raw)
156
174
 
157
175
  LogBot.debug('FastStats CMD', cmd) if ENV['DEBUG']
158
176
 
@@ -164,7 +182,7 @@ module GreenHat
164
182
  ]
165
183
  end
166
184
 
167
- ShellHelper.show(results.flatten, args)
185
+ ShellHelper.show(results.flatten, flags)
168
186
  end
169
187
  # ========================================================================
170
188
  end
@@ -175,6 +193,35 @@ module GreenHat
175
193
  module ShellHelper
176
194
  # Hide from Commands
177
195
  module Faststats
196
+ # Default Settings from arg parse that won't work
197
+ def self.invalid_settings
198
+ %i[page round truncate logic fuzzy_file_match]
199
+ end
200
+
201
+ def self.parse(raw)
202
+ file_list, flags, args = Args.parse(raw, invalid_settings)
203
+ cmd = args.map { |opt| "--#{opt.field}=#{opt.value}" }.join(' ')
204
+ cmd += flags.map do |flag, value|
205
+ # Don't Include Raw
206
+ next if flag == :raw
207
+
208
+ case value
209
+ when true then "--#{flag}"
210
+ when Array then "--#{flag}=#{value.join}"
211
+ else
212
+ "--#{flag}=#{value}"
213
+ end
214
+ end.join(' ')
215
+
216
+ # Prepare Log List
217
+ file_list = ShellHelper.prepare_list(file_list, ShellHelper::Faststats.things, flags)
218
+
219
+ # Convert to Things
220
+ files = ShellHelper.find_things(file_list)
221
+
222
+ [files, flags, cmd]
223
+ end
224
+
178
225
  def self.files
179
226
  %w[
180
227
  production_json