22
33import argparse
44import os
5- from typing import Dict , List
5+ from typing import Dict , List , Optional
66
77import pandas as pd
88import requests
1616SUB_CHARACTERS = ["\\ " , "/" ]
1717
1818
19- def get_stix_data (domain : str , version : str = None , remote : str = None , stix_file : str = None ) -> MemoryStore :
19+ def get_stix_data (
20+ domain : str , version : Optional [str ] = None , remote : Optional [str ] = None , stix_file : Optional [str ] = None
21+ ) -> MemoryStore :
2022 """Download the ATT&CK STIX data for the given domain and version from MITRE/CTI (or just domain if a remote workbench is specified).
2123
2224 Parameters
@@ -105,12 +107,12 @@ def build_dataframes(src: MemoryStore, domain: str) -> Dict:
105107 "mitigations" : stixToDf .mitigationsToDf (src ),
106108 "matrices" : stixToDf .matricesToDf (src , domain ),
107109 "relationships" : stixToDf .relationshipsToDf (src ),
108- "datasources" : stixToDf .datasourcesToDf (src )
110+ "datasources" : stixToDf .datasourcesToDf (src ),
109111 }
110112 return df
111113
112114
113- def write_excel (dataframes : Dict , domain : str , version : str = None , output_dir : str = "." ) -> List :
115+ def write_excel (dataframes : Dict , domain : str , version : Optional [ str ] = None , output_dir : str = "." ) -> List :
114116 """Given a set of dataframes from build_dataframes, write the ATT&CK dataset to output directory.
115117
116118 Parameters
@@ -262,11 +264,11 @@ def write_excel(dataframes: Dict, domain: str, version: str = None, output_dir:
262264
263265def export (
264266 domain : str = "enterprise-attack" ,
265- version : str = None ,
267+ version : Optional [ str ] = None ,
266268 output_dir : str = "." ,
267- remote : str = None ,
268- stix_file : str = None ,
269- mem_store : MemoryStore = None ,
269+ remote : Optional [ str ] = None ,
270+ stix_file : Optional [ str ] = None ,
271+ mem_store : Optional [ MemoryStore ] = None ,
270272):
271273 """Download ATT&CK data from MITRE/CTI and convert it to Excel spreadsheets.
272274
@@ -298,6 +300,8 @@ def export(
298300 ------
299301 TypeError
300302 Raised when missing exactly one of `remote`, `stix_file`, or `mem_store`.
303+ ValueError
304+ Raised when `mem_store` fails to load.
301305 """
302306 if (
303307 (remote and stix_file and mem_store )
@@ -312,6 +316,9 @@ def export(
312316 if get_stix_from_github or remote or stix_file :
313317 mem_store = get_stix_data (domain = domain , version = version , remote = remote , stix_file = stix_file )
314318
319+ if mem_store is None :
320+ raise ValueError ("`mem_store` is empty - this should not be possible!" )
321+
315322 logger .info (f"************ Exporting { domain } to Excel ************" )
316323
317324 # build dataframes
0 commit comments