Fix bug with mutable default parameter
							parent
							
								
									589c00064b
								
							
						
					
					
						commit
						e3bbc39353
					
				|  | @ -359,7 +359,7 @@ class DataSource(with_metaclass(ABCMeta)): | |||
| 
 | ||||
|         return results | ||||
| 
 | ||||
|     def related_to(self, obj, relationship_type=None, source_only=False, target_only=False, filters=[]): | ||||
|     def related_to(self, obj, relationship_type=None, source_only=False, target_only=False, filters=None): | ||||
|         """Retrieve STIX Objects that have a Relationship involving the given | ||||
|         STIX object. | ||||
| 
 | ||||
|  |  | |||
|  | @ -44,27 +44,35 @@ def _check_filter_components(prop, op, value): | |||
|     return True | ||||
| 
 | ||||
| 
 | ||||
| def _assemble_filters(filter_arg, filters=[]): | ||||
| def _assemble_filters(filters1=None, filters2=None): | ||||
|     """Assemble a list of filters. | ||||
| 
 | ||||
|     This can be used to allow certain functions to work correctly no matter if | ||||
|     the user provides a single filter or a list of them. | ||||
| 
 | ||||
|     Args: | ||||
|         filter_arg (Filter or list): The single Filter or list of Filters to be | ||||
|             coerced into a list of Filters. | ||||
|         filters (list, optional): A list of Filters to be automatically appended. | ||||
|         filters1 (Filter or list, optional): The single Filter or list of Filters to | ||||
|             coerce into a list of Filters. | ||||
|         filters2 (Filter or list, optional): The single Filter or list of Filters to | ||||
|             append to the list of Filters. | ||||
| 
 | ||||
|     Returns: | ||||
|         List of Filters. | ||||
| 
 | ||||
|     """ | ||||
|     if isinstance(filter_arg, list): | ||||
|         filters.extend(filter_arg) | ||||
|     if filters1 is None: | ||||
|         filter_list = [] | ||||
|     elif not isinstance(filters1, list): | ||||
|         filter_list = [filters1] | ||||
|     else: | ||||
|         filters.append(filter_arg) | ||||
|         filter_list = filters1 | ||||
| 
 | ||||
|     return filters | ||||
|     if isinstance(filters2, list): | ||||
|         filter_list.extend(filters2) | ||||
|     elif filters2 is not None: | ||||
|         filter_list.append(filters2) | ||||
| 
 | ||||
|     return filter_list | ||||
| 
 | ||||
| 
 | ||||
| class Filter(collections.namedtuple("Filter", ['property', 'op', 'value'])): | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ from taxii2client import Collection | |||
| from stix2 import Filter, MemorySink, MemorySource | ||||
| from stix2.datastore import (CompositeDataSource, DataSink, DataSource, | ||||
|                              make_id, taxii) | ||||
| from stix2.datastore.filters import apply_common_filters | ||||
| from stix2.datastore.filters import _assemble_filters, apply_common_filters | ||||
| from stix2.utils import deduplicate | ||||
| 
 | ||||
| COLLECTION_URL = 'https://example.com/api1/collections/91a7b528-80eb-42ed-a74d-c6fbd5a26116/' | ||||
|  | @ -473,6 +473,15 @@ def test_filters7(): | |||
|     assert len(resp) == 1 | ||||
| 
 | ||||
| 
 | ||||
| def test_assemble_filters(): | ||||
|     filter1 = Filter("name", "=", "Malicious site hosting downloader") | ||||
|     filter2 = Filter("modified", ">", "2017-01-28T13:49:53.935Z") | ||||
|     result = _assemble_filters(filter1, filter2) | ||||
|     assert len(result) == 2 | ||||
|     assert result[0].property == 'name' | ||||
|     assert result[1].property == 'modified' | ||||
| 
 | ||||
| 
 | ||||
| def test_deduplicate(): | ||||
|     unique = deduplicate(STIX_OBJS1) | ||||
| 
 | ||||
|  |  | |||
|  | @ -148,7 +148,7 @@ _setup_workbench() | |||
| # Functions to get all objects of a specific type | ||||
| 
 | ||||
| 
 | ||||
| def attack_patterns(filters=[]): | ||||
| def attack_patterns(filters=None): | ||||
|     """Retrieve all Attack Pattern objects. | ||||
| 
 | ||||
|     Args: | ||||
|  | @ -160,7 +160,7 @@ def attack_patterns(filters=[]): | |||
|     return query(filter_list) | ||||
| 
 | ||||
| 
 | ||||
| def campaigns(filters=[]): | ||||
| def campaigns(filters=None): | ||||
|     """Retrieve all Campaign objects. | ||||
| 
 | ||||
|     Args: | ||||
|  | @ -172,7 +172,7 @@ def campaigns(filters=[]): | |||
|     return query(filter_list) | ||||
| 
 | ||||
| 
 | ||||
| def courses_of_action(filters=[]): | ||||
| def courses_of_action(filters=None): | ||||
|     """Retrieve all Course of Action objects. | ||||
| 
 | ||||
|     Args: | ||||
|  | @ -184,7 +184,7 @@ def courses_of_action(filters=[]): | |||
|     return query(filter_list) | ||||
| 
 | ||||
| 
 | ||||
| def identities(filters=[]): | ||||
| def identities(filters=None): | ||||
|     """Retrieve all Identity objects. | ||||
| 
 | ||||
|     Args: | ||||
|  | @ -196,7 +196,7 @@ def identities(filters=[]): | |||
|     return query(filter_list) | ||||
| 
 | ||||
| 
 | ||||
| def indicators(filters=[]): | ||||
| def indicators(filters=None): | ||||
|     """Retrieve all Indicator objects. | ||||
| 
 | ||||
|     Args: | ||||
|  | @ -208,7 +208,7 @@ def indicators(filters=[]): | |||
|     return query(filter_list) | ||||
| 
 | ||||
| 
 | ||||
| def intrusion_sets(filters=[]): | ||||
| def intrusion_sets(filters=None): | ||||
|     """Retrieve all Intrusion Set objects. | ||||
| 
 | ||||
|     Args: | ||||
|  | @ -220,7 +220,7 @@ def intrusion_sets(filters=[]): | |||
|     return query(filter_list) | ||||
| 
 | ||||
| 
 | ||||
| def malware(filters=[]): | ||||
| def malware(filters=None): | ||||
|     """Retrieve all Malware objects. | ||||
| 
 | ||||
|     Args: | ||||
|  | @ -232,7 +232,7 @@ def malware(filters=[]): | |||
|     return query(filter_list) | ||||
| 
 | ||||
| 
 | ||||
| def observed_data(filters=[]): | ||||
| def observed_data(filters=None): | ||||
|     """Retrieve all Observed Data objects. | ||||
| 
 | ||||
|     Args: | ||||
|  | @ -244,7 +244,7 @@ def observed_data(filters=[]): | |||
|     return query(filter_list) | ||||
| 
 | ||||
| 
 | ||||
| def reports(filters=[]): | ||||
| def reports(filters=None): | ||||
|     """Retrieve all Report objects. | ||||
| 
 | ||||
|     Args: | ||||
|  | @ -256,7 +256,7 @@ def reports(filters=[]): | |||
|     return query(filter_list) | ||||
| 
 | ||||
| 
 | ||||
| def threat_actors(filters=[]): | ||||
| def threat_actors(filters=None): | ||||
|     """Retrieve all Threat Actor objects. | ||||
| 
 | ||||
|     Args: | ||||
|  | @ -268,7 +268,7 @@ def threat_actors(filters=[]): | |||
|     return query(filter_list) | ||||
| 
 | ||||
| 
 | ||||
| def tools(filters=[]): | ||||
| def tools(filters=None): | ||||
|     """Retrieve all Tool objects. | ||||
| 
 | ||||
|     Args: | ||||
|  | @ -280,7 +280,7 @@ def tools(filters=[]): | |||
|     return query(filter_list) | ||||
| 
 | ||||
| 
 | ||||
| def vulnerabilities(filters=[]): | ||||
| def vulnerabilities(filters=None): | ||||
|     """Retrieve all Vulnerability objects. | ||||
| 
 | ||||
|     Args: | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Chris Lenk
						Chris Lenk