6
6
# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7
7
# See the License for the specific language governing permissions and limitations under the License.
8
8
9
+ import gzip
9
10
import json
10
11
import collections
12
+ from typing import Dict
11
13
from pathlib import Path
12
14
13
15
import tabulate
@@ -85,16 +87,18 @@ def render_capabilities(doc: rd.ResultDocument, ostream: StringIO):
85
87
+-------------------------------------------------------+-------------------------------------------------+
86
88
"""
87
89
88
- def load_rules_prevalence (file : Path ) -> dict :
90
+ def load_rules_prevalence (file : Path ) -> Dict [ str , str ] :
89
91
try :
90
- return json .load (file .open ("r" ))
92
+ with gzip .open (file , "rb" ) as gzfile :
93
+ return json .loads (gzfile .read ().decode ("utf-8" ))
91
94
except FileNotFoundError :
92
95
raise FileNotFoundError (f"File '{ file } ' not found." )
93
96
except Exception as e :
94
97
raise RuntimeError (f"An error occurred while loading '{ file } ': { e } " )
95
98
96
99
subrule_matches = find_subrule_matches (doc )
97
- rules_prevalence = load_rules_prevalence (Path ("./assets/rules_prevalence.json" ))
100
+ CD = Path (__file__ ).resolve ().parent .parent .parent
101
+ rules_prevalence = load_rules_prevalence (CD / "assets" / "rules_prevalence.json.gz" )
98
102
99
103
# seperate rules based on their prevalence
100
104
common = []
@@ -106,17 +110,14 @@ def load_rules_prevalence(file: Path) -> dict:
106
110
count = len (rule .matches )
107
111
matches = f"({ count } matches)" if count > 1 else ""
108
112
109
- rule_prevalence = float (rules_prevalence .get (rule .meta .name , 0 ))
110
- if rule_prevalence < 0 :
111
- raise ValueError ("Match probability cannot be negative" )
113
+ prevalence = rules_prevalence .get (rule .meta .name , None )
112
114
113
- prevalences = [rutils .bold ("rare" ), rutils .bold ("common" ), "unknown" ]
114
-
115
- if rule_prevalence == 0 or rule_prevalence >= 0.05 :
116
- prevalence = prevalences [2 ] if rule_prevalence == 0 else prevalences [1 ]
117
- common .append ((rule .meta .namespace , rule .meta .name , matches , prevalence ))
115
+ if prevalence == "rare" :
116
+ rare .append ((rule .meta .namespace , rule .meta .name , matches , rutils .bold (prevalence )))
117
+ elif prevalence == "common" :
118
+ common .append ((rule .meta .namespace , rule .meta .name , matches , rutils .bold (prevalence )))
118
119
else :
119
- rare .append ((rule .meta .namespace , rule .meta .name , matches , prevalences [ 0 ] ))
120
+ common .append ((rule .meta .namespace , rule .meta .name , matches , "unknown" ))
120
121
121
122
rows = []
122
123
0 commit comments