hiddenlayer-sdk 0.1.2__py3-none-any.whl → 1.1.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. hiddenlayer/sdk/constants.py +1 -0
  2. hiddenlayer/sdk/models.py +45 -8
  3. hiddenlayer/sdk/rest/__init__.py +80 -3
  4. hiddenlayer/sdk/rest/api/__init__.py +3 -0
  5. hiddenlayer/sdk/rest/api/aidr_predictive_api.py +1 -1
  6. hiddenlayer/sdk/rest/api/health_api.py +272 -0
  7. hiddenlayer/sdk/rest/api/model_scan_api.py +1 -1
  8. hiddenlayer/sdk/rest/api/model_supply_chain_api.py +2927 -0
  9. hiddenlayer/sdk/rest/api/readiness_api.py +272 -0
  10. hiddenlayer/sdk/rest/api/sensor_api.py +354 -37
  11. hiddenlayer/sdk/rest/api_client.py +1 -1
  12. hiddenlayer/sdk/rest/configuration.py +4 -4
  13. hiddenlayer/sdk/rest/exceptions.py +1 -1
  14. hiddenlayer/sdk/rest/models/__init__.py +77 -3
  15. hiddenlayer/sdk/rest/models/address.py +110 -0
  16. hiddenlayer/sdk/rest/models/artifact.py +155 -0
  17. hiddenlayer/sdk/rest/models/artifact_change.py +108 -0
  18. hiddenlayer/sdk/rest/models/artifact_content.py +101 -0
  19. hiddenlayer/sdk/rest/models/artifact_location.py +109 -0
  20. hiddenlayer/sdk/rest/models/attachment.py +129 -0
  21. hiddenlayer/sdk/rest/models/code_flow.py +113 -0
  22. hiddenlayer/sdk/rest/models/configuration_override.py +108 -0
  23. hiddenlayer/sdk/rest/models/conversion.py +114 -0
  24. hiddenlayer/sdk/rest/models/create_sensor_request.py +1 -1
  25. hiddenlayer/sdk/rest/models/detections.py +101 -0
  26. hiddenlayer/sdk/rest/models/edge.py +108 -0
  27. hiddenlayer/sdk/rest/models/edge_traversal.py +122 -0
  28. hiddenlayer/sdk/rest/models/exception.py +113 -0
  29. hiddenlayer/sdk/rest/models/external_properties.py +273 -0
  30. hiddenlayer/sdk/rest/models/external_property_file_reference.py +102 -0
  31. hiddenlayer/sdk/rest/models/external_property_file_references.py +240 -0
  32. hiddenlayer/sdk/rest/models/file_details_v3.py +140 -0
  33. hiddenlayer/sdk/rest/models/file_scan_report_v3.py +132 -0
  34. hiddenlayer/sdk/rest/models/file_scan_reports_v3.py +95 -0
  35. hiddenlayer/sdk/rest/models/fix.py +113 -0
  36. hiddenlayer/sdk/rest/models/get_multipart_upload_response.py +1 -1
  37. hiddenlayer/sdk/rest/models/graph.py +123 -0
  38. hiddenlayer/sdk/rest/models/graph_traversal.py +97 -0
  39. hiddenlayer/sdk/rest/models/invocation.py +199 -0
  40. hiddenlayer/sdk/rest/models/location.py +146 -0
  41. hiddenlayer/sdk/rest/models/{validation_error_model_loc_inner.py → location_inner.py} +7 -7
  42. hiddenlayer/sdk/rest/models/location_relationship.py +107 -0
  43. hiddenlayer/sdk/rest/models/logical_location.py +104 -0
  44. hiddenlayer/sdk/rest/models/message.py +92 -0
  45. hiddenlayer/sdk/rest/models/mitre_atlas_inner.py +110 -0
  46. hiddenlayer/sdk/rest/models/model.py +1 -1
  47. hiddenlayer/sdk/rest/models/model_inventory_info.py +99 -0
  48. hiddenlayer/sdk/rest/models/model_query_response.py +1 -1
  49. hiddenlayer/sdk/rest/models/model_scan_api_v3_scan_model_version_id_patch200_response.py +87 -0
  50. hiddenlayer/sdk/rest/models/model_scan_api_v3_scan_query200_response.py +102 -0
  51. hiddenlayer/sdk/rest/models/multiformat_message_string.py +95 -0
  52. hiddenlayer/sdk/rest/models/multipart_upload_part.py +1 -1
  53. hiddenlayer/sdk/rest/models/node.py +122 -0
  54. hiddenlayer/sdk/rest/models/notification.py +157 -0
  55. hiddenlayer/sdk/rest/models/paged_response_with_total.py +94 -0
  56. hiddenlayer/sdk/rest/models/physical_location.py +94 -0
  57. hiddenlayer/sdk/rest/models/property_bag.py +101 -0
  58. hiddenlayer/sdk/rest/models/rectangle.py +110 -0
  59. hiddenlayer/sdk/rest/models/region.py +127 -0
  60. hiddenlayer/sdk/rest/models/replacement.py +103 -0
  61. hiddenlayer/sdk/rest/models/reporting_configuration.py +113 -0
  62. hiddenlayer/sdk/rest/models/reporting_descriptor.py +162 -0
  63. hiddenlayer/sdk/rest/models/reporting_descriptor_reference.py +103 -0
  64. hiddenlayer/sdk/rest/models/reporting_descriptor_relationship.py +115 -0
  65. hiddenlayer/sdk/rest/models/result.py +312 -0
  66. hiddenlayer/sdk/rest/models/result_provenance.py +133 -0
  67. hiddenlayer/sdk/rest/models/rule_details_inner.py +102 -0
  68. hiddenlayer/sdk/rest/models/run.py +318 -0
  69. hiddenlayer/sdk/rest/models/run_automation_details.py +129 -0
  70. hiddenlayer/sdk/rest/models/sarif210.py +123 -0
  71. hiddenlayer/sdk/rest/models/scan_create_request.py +87 -0
  72. hiddenlayer/sdk/rest/models/scan_detection_v3.py +156 -0
  73. hiddenlayer/sdk/rest/models/scan_header_v3.py +129 -0
  74. hiddenlayer/sdk/rest/models/scan_job.py +109 -0
  75. hiddenlayer/sdk/rest/models/scan_job_inventory.py +137 -0
  76. hiddenlayer/sdk/rest/models/scan_model_details_v3.py +95 -0
  77. hiddenlayer/sdk/rest/models/scan_model_ids_v3.py +89 -0
  78. hiddenlayer/sdk/rest/models/scan_model_request.py +1 -1
  79. hiddenlayer/sdk/rest/models/scan_report_v3.py +139 -0
  80. hiddenlayer/sdk/rest/models/{file_info.py → scan_results.py} +14 -6
  81. hiddenlayer/sdk/rest/models/scan_results_v2.py +30 -10
  82. hiddenlayer/sdk/rest/models/security_posture.py +89 -0
  83. hiddenlayer/sdk/rest/models/sensor_sor_model_card_query_response.py +101 -0
  84. hiddenlayer/sdk/rest/models/sensor_sor_model_card_response.py +127 -0
  85. hiddenlayer/sdk/rest/models/sensor_sor_query_filter.py +1 -1
  86. hiddenlayer/sdk/rest/models/sensor_sor_query_request.py +1 -1
  87. hiddenlayer/sdk/rest/models/special_locations.py +97 -0
  88. hiddenlayer/sdk/rest/models/stack.py +113 -0
  89. hiddenlayer/sdk/rest/models/stack_frame.py +104 -0
  90. hiddenlayer/sdk/rest/models/submission_response.py +1 -1
  91. hiddenlayer/sdk/rest/models/submission_v2.py +1 -1
  92. hiddenlayer/sdk/rest/models/suppression.py +133 -0
  93. hiddenlayer/sdk/rest/models/thread_flow.py +144 -0
  94. hiddenlayer/sdk/rest/models/thread_flow_location.py +166 -0
  95. hiddenlayer/sdk/rest/models/tool.py +107 -0
  96. hiddenlayer/sdk/rest/models/tool_component.py +251 -0
  97. hiddenlayer/sdk/rest/models/tool_component_reference.py +108 -0
  98. hiddenlayer/sdk/rest/models/translation_metadata.py +110 -0
  99. hiddenlayer/sdk/rest/models/validation_error_model.py +4 -4
  100. hiddenlayer/sdk/rest/models/version_control_details.py +108 -0
  101. hiddenlayer/sdk/rest/models/web_request.py +112 -0
  102. hiddenlayer/sdk/rest/models/web_response.py +112 -0
  103. hiddenlayer/sdk/rest/rest.py +1 -1
  104. hiddenlayer/sdk/services/model.py +51 -3
  105. hiddenlayer/sdk/services/model_scan.py +153 -105
  106. hiddenlayer/sdk/version.py +1 -1
  107. {hiddenlayer_sdk-0.1.2.dist-info → hiddenlayer_sdk-1.1.0.dist-info}/METADATA +40 -21
  108. hiddenlayer_sdk-1.1.0.dist-info/RECORD +118 -0
  109. {hiddenlayer_sdk-0.1.2.dist-info → hiddenlayer_sdk-1.1.0.dist-info}/WHEEL +1 -1
  110. hiddenlayer/sdk/enterprise/__init__.py +0 -0
  111. hiddenlayer/sdk/enterprise/enterprise_model_scan_api.py +0 -55
  112. hiddenlayer_sdk-0.1.2.dist-info/RECORD +0 -43
  113. {hiddenlayer_sdk-0.1.2.dist-info → hiddenlayer_sdk-1.1.0.dist-info}/LICENSE +0 -0
  114. {hiddenlayer_sdk-0.1.2.dist-info → hiddenlayer_sdk-1.1.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,108 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ HiddenLayer ModelScan V2
5
+
6
+ HiddenLayer ModelScan API for scanning of models
7
+
8
+ The version of the OpenAPI document: 1
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictStr
21
+ from typing import Any, ClassVar, Dict, List, Optional
22
+ from hiddenlayer.sdk.rest.models.message import Message
23
+ from hiddenlayer.sdk.rest.models.property_bag import PropertyBag
24
+ from typing import Optional, Set
25
+ from typing_extensions import Self
26
+
27
+ class Edge(BaseModel):
28
+ """
29
+ Represents a directed edge in a graph.
30
+ """ # noqa: E501
31
+ id: StrictStr = Field(description="A string that uniquely identifies the edge within its graph.")
32
+ label: Optional[Message] = None
33
+ source_node_id: StrictStr = Field(description="Identifies the source node (the node at which the edge starts).", alias="sourceNodeId")
34
+ target_node_id: StrictStr = Field(description="Identifies the target node (the node at which the edge ends).", alias="targetNodeId")
35
+ properties: Optional[PropertyBag] = None
36
+ __properties: ClassVar[List[str]] = ["id", "label", "sourceNodeId", "targetNodeId", "properties"]
37
+
38
+ model_config = ConfigDict(
39
+ populate_by_name=True,
40
+ validate_assignment=True,
41
+ protected_namespaces=(),
42
+ )
43
+
44
+
45
+ def to_str(self) -> str:
46
+ """Returns the string representation of the model using alias"""
47
+ return pprint.pformat(self.model_dump(by_alias=True))
48
+
49
+ def to_json(self) -> str:
50
+ """Returns the JSON representation of the model using alias"""
51
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
52
+ return json.dumps(self.to_dict())
53
+
54
+ @classmethod
55
+ def from_json(cls, json_str: str) -> Optional[Self]:
56
+ """Create an instance of Edge from a JSON string"""
57
+ return cls.from_dict(json.loads(json_str))
58
+
59
+ def to_dict(self) -> Dict[str, Any]:
60
+ """Return the dictionary representation of the model using alias.
61
+
62
+ This has the following differences from calling pydantic's
63
+ `self.model_dump(by_alias=True)`:
64
+
65
+ * `None` is only added to the output dict for nullable fields that
66
+ were set at model initialization. Other fields with value `None`
67
+ are ignored.
68
+ """
69
+ excluded_fields: Set[str] = set([
70
+ ])
71
+
72
+ _dict = self.model_dump(
73
+ by_alias=True,
74
+ exclude=excluded_fields,
75
+ exclude_none=True,
76
+ )
77
+ # override the default output from pydantic by calling `to_dict()` of label
78
+ if self.label:
79
+ _dict['label'] = self.label.to_dict()
80
+ # override the default output from pydantic by calling `to_dict()` of properties
81
+ if self.properties:
82
+ _dict['properties'] = self.properties.to_dict()
83
+ # set to None if label (nullable) is None
84
+ # and model_fields_set contains the field
85
+ if self.label is None and "label" in self.model_fields_set:
86
+ _dict['label'] = None
87
+
88
+ return _dict
89
+
90
+ @classmethod
91
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
92
+ """Create an instance of Edge from a dict"""
93
+ if obj is None:
94
+ return None
95
+
96
+ if not isinstance(obj, dict):
97
+ return cls.model_validate(obj)
98
+
99
+ _obj = cls.model_validate({
100
+ "id": obj.get("id"),
101
+ "label": Message.from_dict(obj["label"]) if obj.get("label") is not None else None,
102
+ "sourceNodeId": obj.get("sourceNodeId"),
103
+ "targetNodeId": obj.get("targetNodeId"),
104
+ "properties": PropertyBag.from_dict(obj["properties"]) if obj.get("properties") is not None else None
105
+ })
106
+ return _obj
107
+
108
+
@@ -0,0 +1,122 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ HiddenLayer ModelScan V2
5
+
6
+ HiddenLayer ModelScan API for scanning of models
7
+
8
+ The version of the OpenAPI document: 1
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictStr
21
+ from typing import Any, ClassVar, Dict, List, Optional
22
+ from typing_extensions import Annotated
23
+ from hiddenlayer.sdk.rest.models.message import Message
24
+ from hiddenlayer.sdk.rest.models.multiformat_message_string import MultiformatMessageString
25
+ from hiddenlayer.sdk.rest.models.property_bag import PropertyBag
26
+ from typing import Optional, Set
27
+ from typing_extensions import Self
28
+
29
+ class EdgeTraversal(BaseModel):
30
+ """
31
+ Represents the traversal of a single edge during a graph traversal.
32
+ """ # noqa: E501
33
+ edge_id: StrictStr = Field(description="Identifies the edge being traversed.", alias="edgeId")
34
+ message: Optional[Message] = None
35
+ final_state: Optional[Dict[str, MultiformatMessageString]] = Field(default=None, description="The values of relevant expressions after the edge has been traversed.", alias="finalState")
36
+ step_over_edge_count: Optional[Annotated[int, Field(strict=True, ge=0)]] = Field(default=None, description="The number of edge traversals necessary to return from a nested graph.", alias="stepOverEdgeCount")
37
+ properties: Optional[PropertyBag] = None
38
+ __properties: ClassVar[List[str]] = ["edgeId", "message", "finalState", "stepOverEdgeCount", "properties"]
39
+
40
+ model_config = ConfigDict(
41
+ populate_by_name=True,
42
+ validate_assignment=True,
43
+ protected_namespaces=(),
44
+ )
45
+
46
+
47
+ def to_str(self) -> str:
48
+ """Returns the string representation of the model using alias"""
49
+ return pprint.pformat(self.model_dump(by_alias=True))
50
+
51
+ def to_json(self) -> str:
52
+ """Returns the JSON representation of the model using alias"""
53
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
54
+ return json.dumps(self.to_dict())
55
+
56
+ @classmethod
57
+ def from_json(cls, json_str: str) -> Optional[Self]:
58
+ """Create an instance of EdgeTraversal from a JSON string"""
59
+ return cls.from_dict(json.loads(json_str))
60
+
61
+ def to_dict(self) -> Dict[str, Any]:
62
+ """Return the dictionary representation of the model using alias.
63
+
64
+ This has the following differences from calling pydantic's
65
+ `self.model_dump(by_alias=True)`:
66
+
67
+ * `None` is only added to the output dict for nullable fields that
68
+ were set at model initialization. Other fields with value `None`
69
+ are ignored.
70
+ """
71
+ excluded_fields: Set[str] = set([
72
+ ])
73
+
74
+ _dict = self.model_dump(
75
+ by_alias=True,
76
+ exclude=excluded_fields,
77
+ exclude_none=True,
78
+ )
79
+ # override the default output from pydantic by calling `to_dict()` of message
80
+ if self.message:
81
+ _dict['message'] = self.message.to_dict()
82
+ # override the default output from pydantic by calling `to_dict()` of each value in final_state (dict)
83
+ _field_dict = {}
84
+ if self.final_state:
85
+ for _key in self.final_state:
86
+ if self.final_state[_key]:
87
+ _field_dict[_key] = self.final_state[_key].to_dict()
88
+ _dict['finalState'] = _field_dict
89
+ # override the default output from pydantic by calling `to_dict()` of properties
90
+ if self.properties:
91
+ _dict['properties'] = self.properties.to_dict()
92
+ # set to None if message (nullable) is None
93
+ # and model_fields_set contains the field
94
+ if self.message is None and "message" in self.model_fields_set:
95
+ _dict['message'] = None
96
+
97
+ return _dict
98
+
99
+ @classmethod
100
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
101
+ """Create an instance of EdgeTraversal from a dict"""
102
+ if obj is None:
103
+ return None
104
+
105
+ if not isinstance(obj, dict):
106
+ return cls.model_validate(obj)
107
+
108
+ _obj = cls.model_validate({
109
+ "edgeId": obj.get("edgeId"),
110
+ "message": Message.from_dict(obj["message"]) if obj.get("message") is not None else None,
111
+ "finalState": dict(
112
+ (_k, MultiformatMessageString.from_dict(_v))
113
+ for _k, _v in obj["finalState"].items()
114
+ )
115
+ if obj.get("finalState") is not None
116
+ else None,
117
+ "stepOverEdgeCount": obj.get("stepOverEdgeCount"),
118
+ "properties": PropertyBag.from_dict(obj["properties"]) if obj.get("properties") is not None else None
119
+ })
120
+ return _obj
121
+
122
+
@@ -0,0 +1,113 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ HiddenLayer ModelScan V2
5
+
6
+ HiddenLayer ModelScan API for scanning of models
7
+
8
+ The version of the OpenAPI document: 1
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictStr
21
+ from typing import Any, ClassVar, Dict, List, Optional
22
+ from typing_extensions import Annotated
23
+ from hiddenlayer.sdk.rest.models.property_bag import PropertyBag
24
+ from hiddenlayer.sdk.rest.models.stack import Stack
25
+ from typing import Optional, Set
26
+ from typing_extensions import Self
27
+
28
+ class Exception(BaseModel):
29
+ """
30
+ Describes a runtime exception encountered during the execution of an analysis tool.
31
+ """ # noqa: E501
32
+ kind: Optional[StrictStr] = Field(default=None, description="A string that identifies the kind of exception, for example, the fully qualified type name of an object that was thrown, or the symbolic name of a signal.")
33
+ message: Optional[StrictStr] = Field(default=None, description="A message that describes the exception.")
34
+ stack: Optional[Stack] = None
35
+ inner_exceptions: Optional[Annotated[List[Exception], Field(min_length=0)]] = Field(default=None, description="An array of exception objects each of which is considered a cause of this exception.", alias="innerExceptions")
36
+ properties: Optional[PropertyBag] = None
37
+ __properties: ClassVar[List[str]] = ["kind", "message", "stack", "innerExceptions", "properties"]
38
+
39
+ model_config = ConfigDict(
40
+ populate_by_name=True,
41
+ validate_assignment=True,
42
+ protected_namespaces=(),
43
+ )
44
+
45
+
46
+ def to_str(self) -> str:
47
+ """Returns the string representation of the model using alias"""
48
+ return pprint.pformat(self.model_dump(by_alias=True))
49
+
50
+ def to_json(self) -> str:
51
+ """Returns the JSON representation of the model using alias"""
52
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
53
+ return json.dumps(self.to_dict())
54
+
55
+ @classmethod
56
+ def from_json(cls, json_str: str) -> Optional[Self]:
57
+ """Create an instance of Exception from a JSON string"""
58
+ return cls.from_dict(json.loads(json_str))
59
+
60
+ def to_dict(self) -> Dict[str, Any]:
61
+ """Return the dictionary representation of the model using alias.
62
+
63
+ This has the following differences from calling pydantic's
64
+ `self.model_dump(by_alias=True)`:
65
+
66
+ * `None` is only added to the output dict for nullable fields that
67
+ were set at model initialization. Other fields with value `None`
68
+ are ignored.
69
+ """
70
+ excluded_fields: Set[str] = set([
71
+ ])
72
+
73
+ _dict = self.model_dump(
74
+ by_alias=True,
75
+ exclude=excluded_fields,
76
+ exclude_none=True,
77
+ )
78
+ # override the default output from pydantic by calling `to_dict()` of stack
79
+ if self.stack:
80
+ _dict['stack'] = self.stack.to_dict()
81
+ # override the default output from pydantic by calling `to_dict()` of each item in inner_exceptions (list)
82
+ _items = []
83
+ if self.inner_exceptions:
84
+ for _item in self.inner_exceptions:
85
+ if _item:
86
+ _items.append(_item.to_dict())
87
+ _dict['innerExceptions'] = _items
88
+ # override the default output from pydantic by calling `to_dict()` of properties
89
+ if self.properties:
90
+ _dict['properties'] = self.properties.to_dict()
91
+ return _dict
92
+
93
+ @classmethod
94
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
95
+ """Create an instance of Exception from a dict"""
96
+ if obj is None:
97
+ return None
98
+
99
+ if not isinstance(obj, dict):
100
+ return cls.model_validate(obj)
101
+
102
+ _obj = cls.model_validate({
103
+ "kind": obj.get("kind"),
104
+ "message": obj.get("message"),
105
+ "stack": Stack.from_dict(obj["stack"]) if obj.get("stack") is not None else None,
106
+ "innerExceptions": [Exception.from_dict(_item) for _item in obj["innerExceptions"]] if obj.get("innerExceptions") is not None else None,
107
+ "properties": PropertyBag.from_dict(obj["properties"]) if obj.get("properties") is not None else None
108
+ })
109
+ return _obj
110
+
111
+ # TODO: Rewrite to not use raise_errors
112
+ Exception.model_rebuild(raise_errors=False)
113
+
@@ -0,0 +1,273 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ HiddenLayer ModelScan V2
5
+
6
+ HiddenLayer ModelScan API for scanning of models
7
+
8
+ The version of the OpenAPI document: 1
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator
21
+ from typing import Any, ClassVar, Dict, List, Optional
22
+ from typing_extensions import Annotated
23
+ from hiddenlayer.sdk.rest.models.address import Address
24
+ from hiddenlayer.sdk.rest.models.artifact import Artifact
25
+ from hiddenlayer.sdk.rest.models.conversion import Conversion
26
+ from hiddenlayer.sdk.rest.models.graph import Graph
27
+ from hiddenlayer.sdk.rest.models.invocation import Invocation
28
+ from hiddenlayer.sdk.rest.models.logical_location import LogicalLocation
29
+ from hiddenlayer.sdk.rest.models.property_bag import PropertyBag
30
+ from hiddenlayer.sdk.rest.models.result import Result
31
+ from hiddenlayer.sdk.rest.models.thread_flow_location import ThreadFlowLocation
32
+ from hiddenlayer.sdk.rest.models.tool_component import ToolComponent
33
+ from hiddenlayer.sdk.rest.models.web_request import WebRequest
34
+ from hiddenlayer.sdk.rest.models.web_response import WebResponse
35
+ from typing import Optional, Set
36
+ from typing_extensions import Self
37
+
38
+ class ExternalProperties(BaseModel):
39
+ """
40
+ The top-level element of an external property file.
41
+ """ # noqa: E501
42
+ var_schema: Optional[StrictStr] = Field(default=None, description="The URI of the JSON schema corresponding to the version of the external property file format.", alias="schema")
43
+ version: Optional[StrictStr] = Field(default=None, description="The SARIF format version of this external properties object.")
44
+ guid: Optional[Annotated[str, Field(strict=True)]] = Field(default=None, description="A stable, unique identifier for this external properties object, in the form of a GUID.")
45
+ run_guid: Optional[Annotated[str, Field(strict=True)]] = Field(default=None, description="A stable, unique identifier for the run associated with this external properties object, in the form of a GUID.", alias="runGuid")
46
+ conversion: Optional[Conversion] = None
47
+ graphs: Optional[Annotated[List[Graph], Field(min_length=0)]] = Field(default=None, description="An array of graph objects that will be merged with a separate run.")
48
+ externalized_properties: Optional[PropertyBag] = Field(default=None, alias="externalizedProperties")
49
+ artifacts: Optional[Annotated[List[Artifact], Field(min_length=0)]] = Field(default=None, description="An array of artifact objects that will be merged with a separate run.")
50
+ invocations: Optional[Annotated[List[Invocation], Field(min_length=0)]] = Field(default=None, description="Describes the invocation of the analysis tool that will be merged with a separate run.")
51
+ logical_locations: Optional[Annotated[List[LogicalLocation], Field(min_length=0)]] = Field(default=None, description="An array of logical locations such as namespaces, types or functions that will be merged with a separate run.", alias="logicalLocations")
52
+ thread_flow_locations: Optional[Annotated[List[ThreadFlowLocation], Field(min_length=0)]] = Field(default=None, description="An array of threadFlowLocation objects that will be merged with a separate run.", alias="threadFlowLocations")
53
+ results: Optional[Annotated[List[Result], Field(min_length=0)]] = Field(default=None, description="An array of result objects that will be merged with a separate run.")
54
+ taxonomies: Optional[Annotated[List[ToolComponent], Field(min_length=0)]] = Field(default=None, description="Tool taxonomies that will be merged with a separate run.")
55
+ driver: Optional[ToolComponent] = None
56
+ extensions: Optional[Annotated[List[ToolComponent], Field(min_length=0)]] = Field(default=None, description="Tool extensions that will be merged with a separate run.")
57
+ policies: Optional[Annotated[List[ToolComponent], Field(min_length=0)]] = Field(default=None, description="Tool policies that will be merged with a separate run.")
58
+ translations: Optional[Annotated[List[ToolComponent], Field(min_length=0)]] = Field(default=None, description="Tool translations that will be merged with a separate run.")
59
+ addresses: Optional[Annotated[List[Address], Field(min_length=0)]] = Field(default=None, description="Addresses that will be merged with a separate run.")
60
+ web_requests: Optional[Annotated[List[WebRequest], Field(min_length=0)]] = Field(default=None, description="Requests that will be merged with a separate run.", alias="webRequests")
61
+ web_responses: Optional[Annotated[List[WebResponse], Field(min_length=0)]] = Field(default=None, description="Responses that will be merged with a separate run.", alias="webResponses")
62
+ properties: Optional[PropertyBag] = None
63
+ __properties: ClassVar[List[str]] = ["schema", "version", "guid", "runGuid", "conversion", "graphs", "externalizedProperties", "artifacts", "invocations", "logicalLocations", "threadFlowLocations", "results", "taxonomies", "driver", "extensions", "policies", "translations", "addresses", "webRequests", "webResponses", "properties"]
64
+
65
+ @field_validator('version')
66
+ def version_validate_enum(cls, value):
67
+ """Validates the enum"""
68
+ if value is None:
69
+ return value
70
+
71
+ if value not in set(['2.1.0']):
72
+ raise ValueError("must be one of enum values ('2.1.0')")
73
+ return value
74
+
75
+ @field_validator('guid')
76
+ def guid_validate_regular_expression(cls, value):
77
+ """Validates the regular expression"""
78
+ if value is None:
79
+ return value
80
+
81
+ if not re.match(r"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", value):
82
+ raise ValueError(r"must validate the regular expression /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/")
83
+ return value
84
+
85
+ @field_validator('run_guid')
86
+ def run_guid_validate_regular_expression(cls, value):
87
+ """Validates the regular expression"""
88
+ if value is None:
89
+ return value
90
+
91
+ if not re.match(r"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", value):
92
+ raise ValueError(r"must validate the regular expression /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/")
93
+ return value
94
+
95
+ model_config = ConfigDict(
96
+ populate_by_name=True,
97
+ validate_assignment=True,
98
+ protected_namespaces=(),
99
+ )
100
+
101
+
102
+ def to_str(self) -> str:
103
+ """Returns the string representation of the model using alias"""
104
+ return pprint.pformat(self.model_dump(by_alias=True))
105
+
106
+ def to_json(self) -> str:
107
+ """Returns the JSON representation of the model using alias"""
108
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
109
+ return json.dumps(self.to_dict())
110
+
111
+ @classmethod
112
+ def from_json(cls, json_str: str) -> Optional[Self]:
113
+ """Create an instance of ExternalProperties from a JSON string"""
114
+ return cls.from_dict(json.loads(json_str))
115
+
116
+ def to_dict(self) -> Dict[str, Any]:
117
+ """Return the dictionary representation of the model using alias.
118
+
119
+ This has the following differences from calling pydantic's
120
+ `self.model_dump(by_alias=True)`:
121
+
122
+ * `None` is only added to the output dict for nullable fields that
123
+ were set at model initialization. Other fields with value `None`
124
+ are ignored.
125
+ """
126
+ excluded_fields: Set[str] = set([
127
+ ])
128
+
129
+ _dict = self.model_dump(
130
+ by_alias=True,
131
+ exclude=excluded_fields,
132
+ exclude_none=True,
133
+ )
134
+ # override the default output from pydantic by calling `to_dict()` of conversion
135
+ if self.conversion:
136
+ _dict['conversion'] = self.conversion.to_dict()
137
+ # override the default output from pydantic by calling `to_dict()` of each item in graphs (list)
138
+ _items = []
139
+ if self.graphs:
140
+ for _item in self.graphs:
141
+ if _item:
142
+ _items.append(_item.to_dict())
143
+ _dict['graphs'] = _items
144
+ # override the default output from pydantic by calling `to_dict()` of externalized_properties
145
+ if self.externalized_properties:
146
+ _dict['externalizedProperties'] = self.externalized_properties.to_dict()
147
+ # override the default output from pydantic by calling `to_dict()` of each item in artifacts (list)
148
+ _items = []
149
+ if self.artifacts:
150
+ for _item in self.artifacts:
151
+ if _item:
152
+ _items.append(_item.to_dict())
153
+ _dict['artifacts'] = _items
154
+ # override the default output from pydantic by calling `to_dict()` of each item in invocations (list)
155
+ _items = []
156
+ if self.invocations:
157
+ for _item in self.invocations:
158
+ if _item:
159
+ _items.append(_item.to_dict())
160
+ _dict['invocations'] = _items
161
+ # override the default output from pydantic by calling `to_dict()` of each item in logical_locations (list)
162
+ _items = []
163
+ if self.logical_locations:
164
+ for _item in self.logical_locations:
165
+ if _item:
166
+ _items.append(_item.to_dict())
167
+ _dict['logicalLocations'] = _items
168
+ # override the default output from pydantic by calling `to_dict()` of each item in thread_flow_locations (list)
169
+ _items = []
170
+ if self.thread_flow_locations:
171
+ for _item in self.thread_flow_locations:
172
+ if _item:
173
+ _items.append(_item.to_dict())
174
+ _dict['threadFlowLocations'] = _items
175
+ # override the default output from pydantic by calling `to_dict()` of each item in results (list)
176
+ _items = []
177
+ if self.results:
178
+ for _item in self.results:
179
+ if _item:
180
+ _items.append(_item.to_dict())
181
+ _dict['results'] = _items
182
+ # override the default output from pydantic by calling `to_dict()` of each item in taxonomies (list)
183
+ _items = []
184
+ if self.taxonomies:
185
+ for _item in self.taxonomies:
186
+ if _item:
187
+ _items.append(_item.to_dict())
188
+ _dict['taxonomies'] = _items
189
+ # override the default output from pydantic by calling `to_dict()` of driver
190
+ if self.driver:
191
+ _dict['driver'] = self.driver.to_dict()
192
+ # override the default output from pydantic by calling `to_dict()` of each item in extensions (list)
193
+ _items = []
194
+ if self.extensions:
195
+ for _item in self.extensions:
196
+ if _item:
197
+ _items.append(_item.to_dict())
198
+ _dict['extensions'] = _items
199
+ # override the default output from pydantic by calling `to_dict()` of each item in policies (list)
200
+ _items = []
201
+ if self.policies:
202
+ for _item in self.policies:
203
+ if _item:
204
+ _items.append(_item.to_dict())
205
+ _dict['policies'] = _items
206
+ # override the default output from pydantic by calling `to_dict()` of each item in translations (list)
207
+ _items = []
208
+ if self.translations:
209
+ for _item in self.translations:
210
+ if _item:
211
+ _items.append(_item.to_dict())
212
+ _dict['translations'] = _items
213
+ # override the default output from pydantic by calling `to_dict()` of each item in addresses (list)
214
+ _items = []
215
+ if self.addresses:
216
+ for _item in self.addresses:
217
+ if _item:
218
+ _items.append(_item.to_dict())
219
+ _dict['addresses'] = _items
220
+ # override the default output from pydantic by calling `to_dict()` of each item in web_requests (list)
221
+ _items = []
222
+ if self.web_requests:
223
+ for _item in self.web_requests:
224
+ if _item:
225
+ _items.append(_item.to_dict())
226
+ _dict['webRequests'] = _items
227
+ # override the default output from pydantic by calling `to_dict()` of each item in web_responses (list)
228
+ _items = []
229
+ if self.web_responses:
230
+ for _item in self.web_responses:
231
+ if _item:
232
+ _items.append(_item.to_dict())
233
+ _dict['webResponses'] = _items
234
+ # override the default output from pydantic by calling `to_dict()` of properties
235
+ if self.properties:
236
+ _dict['properties'] = self.properties.to_dict()
237
+ return _dict
238
+
239
+ @classmethod
240
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
241
+ """Create an instance of ExternalProperties from a dict"""
242
+ if obj is None:
243
+ return None
244
+
245
+ if not isinstance(obj, dict):
246
+ return cls.model_validate(obj)
247
+
248
+ _obj = cls.model_validate({
249
+ "schema": obj.get("schema"),
250
+ "version": obj.get("version"),
251
+ "guid": obj.get("guid"),
252
+ "runGuid": obj.get("runGuid"),
253
+ "conversion": Conversion.from_dict(obj["conversion"]) if obj.get("conversion") is not None else None,
254
+ "graphs": [Graph.from_dict(_item) for _item in obj["graphs"]] if obj.get("graphs") is not None else None,
255
+ "externalizedProperties": PropertyBag.from_dict(obj["externalizedProperties"]) if obj.get("externalizedProperties") is not None else None,
256
+ "artifacts": [Artifact.from_dict(_item) for _item in obj["artifacts"]] if obj.get("artifacts") is not None else None,
257
+ "invocations": [Invocation.from_dict(_item) for _item in obj["invocations"]] if obj.get("invocations") is not None else None,
258
+ "logicalLocations": [LogicalLocation.from_dict(_item) for _item in obj["logicalLocations"]] if obj.get("logicalLocations") is not None else None,
259
+ "threadFlowLocations": [ThreadFlowLocation.from_dict(_item) for _item in obj["threadFlowLocations"]] if obj.get("threadFlowLocations") is not None else None,
260
+ "results": [Result.from_dict(_item) for _item in obj["results"]] if obj.get("results") is not None else None,
261
+ "taxonomies": [ToolComponent.from_dict(_item) for _item in obj["taxonomies"]] if obj.get("taxonomies") is not None else None,
262
+ "driver": ToolComponent.from_dict(obj["driver"]) if obj.get("driver") is not None else None,
263
+ "extensions": [ToolComponent.from_dict(_item) for _item in obj["extensions"]] if obj.get("extensions") is not None else None,
264
+ "policies": [ToolComponent.from_dict(_item) for _item in obj["policies"]] if obj.get("policies") is not None else None,
265
+ "translations": [ToolComponent.from_dict(_item) for _item in obj["translations"]] if obj.get("translations") is not None else None,
266
+ "addresses": [Address.from_dict(_item) for _item in obj["addresses"]] if obj.get("addresses") is not None else None,
267
+ "webRequests": [WebRequest.from_dict(_item) for _item in obj["webRequests"]] if obj.get("webRequests") is not None else None,
268
+ "webResponses": [WebResponse.from_dict(_item) for _item in obj["webResponses"]] if obj.get("webResponses") is not None else None,
269
+ "properties": PropertyBag.from_dict(obj["properties"]) if obj.get("properties") is not None else None
270
+ })
271
+ return _obj
272
+
273
+