1515from jinja2 import Environment , PackageLoader
1616
1717JINJA2_ENV = Environment (loader = PackageLoader ("sublime.cli" ),
18- extensions = ['jinja2.ext.loopcontrols' ])
18+ extensions = ['jinja2.ext.loopcontrols' ])
1919
2020colorama .init ()
2121ANSI_MARKUP = ansimarkup .AnsiMarkup (
@@ -60,14 +60,22 @@ def json_formatter(result, verbose=False, indent=4, offset=0):
6060 return string
6161
6262
63+ def filter_none_recursive (item ):
64+ """Recursive Filter Out Values"""
65+ if isinstance (item , list ):
66+ return [filter_none_recursive (sub_item ) for sub_item in item if sub_item is not None and (not isinstance (sub_item , list ) or any (sub_sub_item is not None for sub_sub_item in sub_item ))]
67+ return item
68+
69+
6370@colored_output
6471def analyze_formatter (results , verbose ):
6572 """Convert Analyze output into human-readable text."""
6673 mql_offset = 3
6774 json_offset = 2
68- template_file = "analyze_multi.txt.j2" if len (results ) > 1 else "analyze.txt.j2"
75+ template_file = "analyze_multi.txt.j2" if len (
76+ results ) > 1 else "analyze.txt.j2"
6977 template = JINJA2_ENV .get_template (template_file )
70-
78+
7179 # calculate total stats
7280 sample_result = next (iter (results .values ()))
7381 summary_stats = {
@@ -77,7 +85,7 @@ def analyze_formatter(results, verbose):
7785 }
7886 rules = [rule for rule in sample_result ['rule_results' ]]
7987 queries = [query for query in sample_result ['query_results' ]]
80-
88+
8189 # separate matched/unmatched messages and distinguish flagged/unflagged rules
8290 flagged_messages = []
8391 unflagged_messages = []
@@ -87,9 +95,17 @@ def analyze_formatter(results, verbose):
8795 falsey_queries = []
8896 failed_queries = []
8997 for query in result ['query_results' ]:
90- if query ['result' ]:
98+ result_value = query .get ('result' )
99+ if isinstance (result_value , list ):
100+ # Filter out None values from the result array
101+ filtered_result = filter_none_recursive (result_value )
102+ if filtered_result and any (item is not None for item in filtered_result ):
103+ query ['result' ] = filtered_result
104+ normal_queries .append (query )
105+ elif result_value :
106+ # If the result is not a list and exists (is truthy)
91107 normal_queries .append (query )
92- elif query [ 'success' ] :
108+ elif query . get ( 'success' ) :
93109 falsey_queries .append (query )
94110 else :
95111 failed_queries .append (query )
@@ -101,10 +117,12 @@ def analyze_formatter(results, verbose):
101117 unflagged_rules = []
102118 failed_rules = []
103119 for rule in result ['rule_results' ]:
104- if rule [ 'result' ] :
120+ if rule . get ( 'matched' ) :
105121 flagged_rules .append (rule )
106- all_flagged_rules .add (rule ['name' ]+ rule ['source' ]) # no unique identifier
107- elif rule ['success' ]:
122+ # no unique identifier
123+ all_flagged_rules .add (
124+ rule .get ("rule" ).get ('name' )+ rule .get ("rule" ).get ('source' ))
125+ elif rule .get ('success' ):
108126 unflagged_rules .append (rule )
109127 else :
110128 failed_rules .append (rule )
@@ -116,30 +134,29 @@ def analyze_formatter(results, verbose):
116134 flagged_messages .append (result )
117135 else :
118136 unflagged_messages .append (result )
119-
137+
120138 # calculate flagged stats
121139 summary_stats ['flagged_rules' ] = len (all_flagged_rules )
122140 summary_stats ['flagged_messages' ] = len (flagged_messages )
123141
124142 # format mql and json outputs
125- for msg in flagged_messages + unflagged_messages :
143+ for msg in flagged_messages + unflagged_messages :
126144 for result in msg ['rule_results' ] + msg ['query_results' ]:
127145 if 'result' in result and (isinstance (result ['result' ], dict ) or isinstance (result ['result' ], list )):
128146 result ['result' ] = json_formatter (
129- result ['result' ],
130- offset = json_offset ,
131- indent = 2 )
132-
147+ result ['result' ],
148+ offset = json_offset ,
149+ indent = 2 )
133150
134151 # TO DO: sort each list of messages by extension and file name (or directory?)
135152
136153 return template .render (
137- stats = summary_stats ,
138- flagged_messages = flagged_messages ,
139- unflagged_messages = unflagged_messages ,
140- rules = rules ,
141- queries = queries ,
142- verbose = verbose )
154+ stats = summary_stats ,
155+ flagged_messages = flagged_messages ,
156+ unflagged_messages = unflagged_messages ,
157+ rules = rules ,
158+ queries = queries ,
159+ verbose = verbose )
143160
144161
145162def mdm_formatter (results , verbose ):
@@ -153,13 +170,15 @@ def mdm_formatter(results, verbose):
153170 # template = JINJA2_ENV.get_template("message_data_model.txt.j2")
154171 # return template.render(results=results, verbose=verbose)
155172
173+
156174@colored_output
157175def me_formatter (result , verbose ):
158176 """Convert 'me' output into human-readable text."""
159177 template = JINJA2_ENV .get_template ("me_result.txt.j2" )
160178
161179 return template .render (result = result , verbose = verbose )
162180
181+
163182@colored_output
164183def feedback_formatter (result , verbose ):
165184 """Convert 'feedback' output into human-readable text."""
0 commit comments