cartography 0.102.0rc2__py3-none-any.whl → 0.103.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of cartography might be problematic. Click here for more details.

Files changed (297) hide show
  1. cartography/__main__.py +1 -2
  2. cartography/_version.py +2 -2
  3. cartography/cli.py +376 -249
  4. cartography/client/core/tx.py +39 -18
  5. cartography/config.py +28 -0
  6. cartography/driftdetect/__main__.py +1 -2
  7. cartography/driftdetect/add_shortcut.py +10 -2
  8. cartography/driftdetect/cli.py +71 -75
  9. cartography/driftdetect/detect_deviations.py +7 -3
  10. cartography/driftdetect/get_states.py +20 -8
  11. cartography/driftdetect/model.py +5 -5
  12. cartography/driftdetect/serializers.py +8 -6
  13. cartography/driftdetect/storage.py +2 -2
  14. cartography/graph/cleanupbuilder.py +35 -15
  15. cartography/graph/job.py +46 -17
  16. cartography/graph/querybuilder.py +165 -80
  17. cartography/graph/statement.py +35 -26
  18. cartography/intel/analysis.py +4 -1
  19. cartography/intel/aws/__init__.py +114 -55
  20. cartography/intel/aws/apigateway.py +134 -63
  21. cartography/intel/aws/cloudtrail.py +127 -0
  22. cartography/intel/aws/cloudwatch.py +93 -0
  23. cartography/intel/aws/config.py +56 -20
  24. cartography/intel/aws/dynamodb.py +108 -40
  25. cartography/intel/aws/ec2/__init__.py +2 -2
  26. cartography/intel/aws/ec2/auto_scaling_groups.py +181 -78
  27. cartography/intel/aws/ec2/elastic_ip_addresses.py +41 -13
  28. cartography/intel/aws/ec2/images.py +49 -20
  29. cartography/intel/aws/ec2/instances.py +234 -136
  30. cartography/intel/aws/ec2/internet_gateways.py +40 -11
  31. cartography/intel/aws/ec2/key_pairs.py +44 -20
  32. cartography/intel/aws/ec2/launch_templates.py +101 -59
  33. cartography/intel/aws/ec2/load_balancer_v2s.py +104 -39
  34. cartography/intel/aws/ec2/load_balancers.py +82 -42
  35. cartography/intel/aws/ec2/network_acls.py +89 -65
  36. cartography/intel/aws/ec2/network_interfaces.py +146 -87
  37. cartography/intel/aws/ec2/reserved_instances.py +45 -16
  38. cartography/intel/aws/ec2/route_tables.py +138 -98
  39. cartography/intel/aws/ec2/security_groups.py +71 -21
  40. cartography/intel/aws/ec2/snapshots.py +61 -22
  41. cartography/intel/aws/ec2/subnets.py +54 -18
  42. cartography/intel/aws/ec2/tgw.py +100 -34
  43. cartography/intel/aws/ec2/util.py +1 -1
  44. cartography/intel/aws/ec2/volumes.py +69 -41
  45. cartography/intel/aws/ec2/vpc.py +37 -12
  46. cartography/intel/aws/ec2/vpc_peerings.py +83 -24
  47. cartography/intel/aws/ecr.py +88 -32
  48. cartography/intel/aws/ecs.py +83 -47
  49. cartography/intel/aws/efs.py +93 -0
  50. cartography/intel/aws/eks.py +55 -29
  51. cartography/intel/aws/elasticache.py +42 -18
  52. cartography/intel/aws/elasticsearch.py +57 -20
  53. cartography/intel/aws/emr.py +61 -23
  54. cartography/intel/aws/iam.py +401 -145
  55. cartography/intel/aws/iam_instance_profiles.py +22 -22
  56. cartography/intel/aws/identitycenter.py +71 -37
  57. cartography/intel/aws/inspector.py +159 -89
  58. cartography/intel/aws/kms.py +92 -38
  59. cartography/intel/aws/lambda_function.py +103 -34
  60. cartography/intel/aws/organizations.py +30 -10
  61. cartography/intel/aws/permission_relationships.py +133 -51
  62. cartography/intel/aws/rds.py +249 -85
  63. cartography/intel/aws/redshift.py +107 -46
  64. cartography/intel/aws/resourcegroupstaggingapi.py +120 -66
  65. cartography/intel/aws/resources.py +57 -46
  66. cartography/intel/aws/route53.py +108 -61
  67. cartography/intel/aws/s3.py +168 -83
  68. cartography/intel/aws/s3accountpublicaccessblock.py +157 -0
  69. cartography/intel/aws/secretsmanager.py +24 -12
  70. cartography/intel/aws/securityhub.py +20 -9
  71. cartography/intel/aws/sns.py +166 -0
  72. cartography/intel/aws/sqs.py +60 -28
  73. cartography/intel/aws/ssm.py +70 -30
  74. cartography/intel/aws/util/arns.py +7 -7
  75. cartography/intel/aws/util/common.py +31 -4
  76. cartography/intel/azure/__init__.py +78 -19
  77. cartography/intel/azure/compute.py +101 -27
  78. cartography/intel/azure/cosmosdb.py +496 -170
  79. cartography/intel/azure/sql.py +296 -105
  80. cartography/intel/azure/storage.py +322 -113
  81. cartography/intel/azure/subscription.py +39 -23
  82. cartography/intel/azure/tenant.py +13 -4
  83. cartography/intel/azure/util/credentials.py +95 -55
  84. cartography/intel/bigfix/__init__.py +2 -2
  85. cartography/intel/bigfix/computers.py +93 -65
  86. cartography/intel/cloudflare/__init__.py +74 -0
  87. cartography/intel/cloudflare/accounts.py +57 -0
  88. cartography/intel/cloudflare/dnsrecords.py +64 -0
  89. cartography/intel/cloudflare/members.py +75 -0
  90. cartography/intel/cloudflare/roles.py +65 -0
  91. cartography/intel/cloudflare/zones.py +64 -0
  92. cartography/intel/create_indexes.py +3 -2
  93. cartography/intel/crowdstrike/__init__.py +11 -9
  94. cartography/intel/crowdstrike/endpoints.py +5 -1
  95. cartography/intel/crowdstrike/spotlight.py +8 -3
  96. cartography/intel/cve/__init__.py +46 -13
  97. cartography/intel/cve/feed.py +48 -12
  98. cartography/intel/digitalocean/__init__.py +22 -13
  99. cartography/intel/digitalocean/compute.py +75 -108
  100. cartography/intel/digitalocean/management.py +44 -80
  101. cartography/intel/digitalocean/platform.py +48 -43
  102. cartography/intel/dns.py +36 -10
  103. cartography/intel/duo/__init__.py +21 -16
  104. cartography/intel/duo/api_host.py +14 -9
  105. cartography/intel/duo/endpoints.py +50 -45
  106. cartography/intel/duo/groups.py +18 -14
  107. cartography/intel/duo/phones.py +37 -34
  108. cartography/intel/duo/tokens.py +26 -23
  109. cartography/intel/duo/users.py +54 -50
  110. cartography/intel/duo/web_authn_credentials.py +30 -25
  111. cartography/intel/entra/__init__.py +25 -7
  112. cartography/intel/entra/ou.py +112 -0
  113. cartography/intel/entra/users.py +69 -63
  114. cartography/intel/gcp/__init__.py +185 -49
  115. cartography/intel/gcp/compute.py +418 -231
  116. cartography/intel/gcp/crm.py +96 -43
  117. cartography/intel/gcp/dns.py +60 -19
  118. cartography/intel/gcp/gke.py +72 -38
  119. cartography/intel/gcp/iam.py +61 -41
  120. cartography/intel/gcp/storage.py +84 -55
  121. cartography/intel/github/__init__.py +13 -11
  122. cartography/intel/github/repos.py +270 -137
  123. cartography/intel/github/teams.py +170 -88
  124. cartography/intel/github/users.py +70 -39
  125. cartography/intel/github/util.py +36 -34
  126. cartography/intel/gsuite/__init__.py +47 -26
  127. cartography/intel/gsuite/api.py +73 -30
  128. cartography/intel/jamf/__init__.py +19 -1
  129. cartography/intel/jamf/computers.py +30 -7
  130. cartography/intel/jamf/util.py +7 -2
  131. cartography/intel/kandji/__init__.py +6 -3
  132. cartography/intel/kandji/devices.py +14 -8
  133. cartography/intel/kubernetes/namespaces.py +7 -4
  134. cartography/intel/kubernetes/pods.py +7 -4
  135. cartography/intel/kubernetes/services.py +8 -4
  136. cartography/intel/lastpass/__init__.py +2 -2
  137. cartography/intel/lastpass/users.py +23 -12
  138. cartography/intel/oci/__init__.py +44 -11
  139. cartography/intel/oci/iam.py +134 -38
  140. cartography/intel/oci/organizations.py +13 -6
  141. cartography/intel/oci/utils.py +43 -20
  142. cartography/intel/okta/__init__.py +66 -15
  143. cartography/intel/okta/applications.py +42 -20
  144. cartography/intel/okta/awssaml.py +93 -33
  145. cartography/intel/okta/factors.py +16 -4
  146. cartography/intel/okta/groups.py +56 -29
  147. cartography/intel/okta/organization.py +5 -1
  148. cartography/intel/okta/origins.py +6 -2
  149. cartography/intel/okta/roles.py +15 -5
  150. cartography/intel/okta/users.py +20 -8
  151. cartography/intel/okta/utils.py +6 -4
  152. cartography/intel/openai/__init__.py +86 -0
  153. cartography/intel/openai/adminapikeys.py +90 -0
  154. cartography/intel/openai/apikeys.py +96 -0
  155. cartography/intel/openai/projects.py +94 -0
  156. cartography/intel/openai/serviceaccounts.py +82 -0
  157. cartography/intel/openai/users.py +78 -0
  158. cartography/intel/openai/util.py +29 -0
  159. cartography/intel/pagerduty/__init__.py +8 -7
  160. cartography/intel/pagerduty/escalation_policies.py +18 -6
  161. cartography/intel/pagerduty/schedules.py +12 -4
  162. cartography/intel/pagerduty/services.py +11 -4
  163. cartography/intel/pagerduty/teams.py +8 -3
  164. cartography/intel/pagerduty/users.py +3 -1
  165. cartography/intel/pagerduty/vendors.py +3 -1
  166. cartography/intel/semgrep/__init__.py +24 -6
  167. cartography/intel/semgrep/dependencies.py +50 -28
  168. cartography/intel/semgrep/deployment.py +3 -1
  169. cartography/intel/semgrep/findings.py +42 -18
  170. cartography/intel/snipeit/__init__.py +17 -3
  171. cartography/intel/snipeit/asset.py +12 -6
  172. cartography/intel/snipeit/user.py +8 -5
  173. cartography/intel/snipeit/util.py +9 -4
  174. cartography/intel/tailscale/__init__.py +77 -0
  175. cartography/intel/tailscale/acls.py +146 -0
  176. cartography/intel/tailscale/devices.py +127 -0
  177. cartography/intel/tailscale/postureintegrations.py +81 -0
  178. cartography/intel/tailscale/tailnets.py +76 -0
  179. cartography/intel/tailscale/users.py +80 -0
  180. cartography/intel/tailscale/utils.py +132 -0
  181. cartography/models/aws/apigateway.py +21 -17
  182. cartography/models/aws/apigatewaycertificate.py +28 -22
  183. cartography/models/aws/apigatewayresource.py +28 -20
  184. cartography/models/aws/apigatewaystage.py +33 -25
  185. cartography/models/aws/cloudtrail/__init__.py +0 -0
  186. cartography/models/aws/cloudtrail/trail.py +61 -0
  187. cartography/models/aws/cloudwatch/__init__.py +0 -0
  188. cartography/models/aws/cloudwatch/loggroup.py +52 -0
  189. cartography/models/aws/dynamodb/gsi.py +30 -22
  190. cartography/models/aws/dynamodb/tables.py +25 -17
  191. cartography/models/aws/ec2/auto_scaling_groups.py +102 -82
  192. cartography/models/aws/ec2/images.py +36 -34
  193. cartography/models/aws/ec2/instances.py +51 -45
  194. cartography/models/aws/ec2/keypair.py +21 -16
  195. cartography/models/aws/ec2/keypair_instance.py +28 -21
  196. cartography/models/aws/ec2/launch_configurations.py +30 -26
  197. cartography/models/aws/ec2/launch_template_versions.py +48 -38
  198. cartography/models/aws/ec2/launch_templates.py +21 -17
  199. cartography/models/aws/ec2/load_balancer_listeners.py +27 -23
  200. cartography/models/aws/ec2/load_balancers.py +47 -37
  201. cartography/models/aws/ec2/network_acl_rules.py +38 -30
  202. cartography/models/aws/ec2/network_acls.py +38 -29
  203. cartography/models/aws/ec2/networkinterface_instance.py +52 -39
  204. cartography/models/aws/ec2/networkinterfaces.py +53 -37
  205. cartography/models/aws/ec2/privateip_networkinterface.py +32 -22
  206. cartography/models/aws/ec2/reservations.py +18 -14
  207. cartography/models/aws/ec2/route_table_associations.py +44 -34
  208. cartography/models/aws/ec2/route_tables.py +50 -43
  209. cartography/models/aws/ec2/routes.py +45 -37
  210. cartography/models/aws/ec2/securitygroup_instance.py +29 -20
  211. cartography/models/aws/ec2/securitygroup_networkinterface.py +24 -15
  212. cartography/models/aws/ec2/subnet_instance.py +24 -19
  213. cartography/models/aws/ec2/subnet_networkinterface.py +40 -31
  214. cartography/models/aws/ec2/volumes.py +47 -40
  215. cartography/models/aws/efs/__init__.py +0 -0
  216. cartography/models/aws/efs/mount_target.py +52 -0
  217. cartography/models/aws/eks/clusters.py +23 -21
  218. cartography/models/aws/emr.py +32 -30
  219. cartography/models/aws/iam/instanceprofile.py +33 -24
  220. cartography/models/aws/identitycenter/awsidentitycenter.py +18 -14
  221. cartography/models/aws/identitycenter/awspermissionset.py +37 -29
  222. cartography/models/aws/identitycenter/awsssouser.py +23 -21
  223. cartography/models/aws/inspector/findings.py +77 -65
  224. cartography/models/aws/inspector/packages.py +35 -29
  225. cartography/models/aws/s3/__init__.py +0 -0
  226. cartography/models/aws/s3/account_public_access_block.py +51 -0
  227. cartography/models/aws/sns/__init__.py +0 -0
  228. cartography/models/aws/sns/topic.py +50 -0
  229. cartography/models/aws/ssm/instance_information.py +51 -39
  230. cartography/models/aws/ssm/instance_patch.py +32 -26
  231. cartography/models/bigfix/bigfix_computer.py +42 -38
  232. cartography/models/bigfix/bigfix_root.py +3 -3
  233. cartography/models/cloudflare/__init__.py +0 -0
  234. cartography/models/cloudflare/account.py +25 -0
  235. cartography/models/cloudflare/dnsrecord.py +55 -0
  236. cartography/models/cloudflare/member.py +82 -0
  237. cartography/models/cloudflare/role.py +44 -0
  238. cartography/models/cloudflare/zone.py +59 -0
  239. cartography/models/core/common.py +12 -10
  240. cartography/models/core/nodes.py +5 -2
  241. cartography/models/core/relationships.py +14 -6
  242. cartography/models/crowdstrike/hosts.py +37 -35
  243. cartography/models/cve/cve.py +34 -32
  244. cartography/models/cve/cve_feed.py +6 -6
  245. cartography/models/digitalocean/__init__.py +0 -0
  246. cartography/models/digitalocean/account.py +21 -0
  247. cartography/models/digitalocean/droplet.py +56 -0
  248. cartography/models/digitalocean/project.py +48 -0
  249. cartography/models/duo/api_host.py +3 -3
  250. cartography/models/duo/endpoint.py +43 -41
  251. cartography/models/duo/group.py +14 -14
  252. cartography/models/duo/phone.py +27 -27
  253. cartography/models/duo/token.py +16 -16
  254. cartography/models/duo/user.py +46 -44
  255. cartography/models/duo/web_authn_credential.py +27 -19
  256. cartography/models/entra/ou.py +48 -0
  257. cartography/models/entra/tenant.py +24 -18
  258. cartography/models/entra/user.py +64 -48
  259. cartography/models/gcp/iam.py +23 -23
  260. cartography/models/github/orgs.py +5 -4
  261. cartography/models/github/teams.py +37 -31
  262. cartography/models/github/users.py +34 -23
  263. cartography/models/kandji/device.py +22 -16
  264. cartography/models/kandji/tenant.py +6 -4
  265. cartography/models/lastpass/tenant.py +3 -3
  266. cartography/models/lastpass/user.py +32 -28
  267. cartography/models/openai/__init__.py +0 -0
  268. cartography/models/openai/adminapikey.py +90 -0
  269. cartography/models/openai/apikey.py +84 -0
  270. cartography/models/openai/organization.py +17 -0
  271. cartography/models/openai/project.py +70 -0
  272. cartography/models/openai/serviceaccount.py +50 -0
  273. cartography/models/openai/user.py +49 -0
  274. cartography/models/semgrep/dependencies.py +36 -24
  275. cartography/models/semgrep/deployment.py +5 -5
  276. cartography/models/semgrep/findings.py +58 -42
  277. cartography/models/semgrep/locations.py +27 -21
  278. cartography/models/snipeit/asset.py +30 -21
  279. cartography/models/snipeit/tenant.py +6 -4
  280. cartography/models/snipeit/user.py +19 -12
  281. cartography/models/tailscale/__init__.py +0 -0
  282. cartography/models/tailscale/device.py +95 -0
  283. cartography/models/tailscale/group.py +86 -0
  284. cartography/models/tailscale/postureintegration.py +58 -0
  285. cartography/models/tailscale/tag.py +102 -0
  286. cartography/models/tailscale/tailnet.py +29 -0
  287. cartography/models/tailscale/user.py +52 -0
  288. cartography/stats.py +3 -3
  289. cartography/sync.py +113 -31
  290. cartography/util.py +84 -62
  291. {cartography-0.102.0rc2.dist-info → cartography-0.103.0.dist-info}/METADATA +8 -15
  292. cartography-0.103.0.dist-info/RECORD +442 -0
  293. {cartography-0.102.0rc2.dist-info → cartography-0.103.0.dist-info}/WHEEL +1 -1
  294. cartography-0.102.0rc2.dist-info/RECORD +0 -381
  295. {cartography-0.102.0rc2.dist-info → cartography-0.103.0.dist-info}/entry_points.txt +0 -0
  296. {cartography-0.102.0rc2.dist-info → cartography-0.103.0.dist-info}/licenses/LICENSE +0 -0
  297. {cartography-0.102.0rc2.dist-info → cartography-0.103.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,17 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+
7
+
8
+ @dataclass(frozen=True)
9
+ class OpenAIOrganizationNodeProperties(CartographyNodeProperties):
10
+ id: PropertyRef = PropertyRef("id")
11
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class OpenAIOrganizationSchema(CartographyNodeSchema):
16
+ label: str = "OpenAIOrganization"
17
+ properties: OpenAIOrganizationNodeProperties = OpenAIOrganizationNodeProperties()
@@ -0,0 +1,70 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.relationships import CartographyRelProperties
7
+ from cartography.models.core.relationships import CartographyRelSchema
8
+ from cartography.models.core.relationships import LinkDirection
9
+ from cartography.models.core.relationships import make_target_node_matcher
10
+ from cartography.models.core.relationships import OtherRelationships
11
+ from cartography.models.core.relationships import TargetNodeMatcher
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class OpenAIProjectNodeProperties(CartographyNodeProperties):
16
+ id: PropertyRef = PropertyRef("id")
17
+ object: PropertyRef = PropertyRef("object")
18
+ name: PropertyRef = PropertyRef("name")
19
+ created_at: PropertyRef = PropertyRef("created_at")
20
+ archived_at: PropertyRef = PropertyRef("archived_at")
21
+ status: PropertyRef = PropertyRef("status")
22
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
23
+
24
+
25
+ @dataclass(frozen=True)
26
+ class OpenAIProjectToOrganizationRelProperties(CartographyRelProperties):
27
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
28
+
29
+
30
+ @dataclass(frozen=True)
31
+ # (:OpenAIOrganization)-[:RESOURCE]->(:OpenAIProject)
32
+ class OpenAIProjectToOrganizationRel(CartographyRelSchema):
33
+ target_node_label: str = "OpenAIOrganization"
34
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
35
+ {"id": PropertyRef("ORG_ID", set_in_kwargs=True)},
36
+ )
37
+ direction: LinkDirection = LinkDirection.INWARD
38
+ rel_label: str = "RESOURCE"
39
+ properties: OpenAIProjectToOrganizationRelProperties = (
40
+ OpenAIProjectToOrganizationRelProperties()
41
+ )
42
+
43
+
44
+ @dataclass(frozen=True)
45
+ class OpenAIProjectToUserRelProperties(CartographyRelProperties):
46
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
47
+
48
+
49
+ @dataclass(frozen=True)
50
+ # (:OpenAIUser)-[:MEMBER_OF]->(:OpenAIProject)
51
+ class OpenAIProjectToUserRel(CartographyRelSchema):
52
+ target_node_label: str = "OpenAIUser"
53
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
54
+ {"id": PropertyRef("users", one_to_many=True)},
55
+ )
56
+ direction: LinkDirection = LinkDirection.INWARD
57
+ rel_label: str = "MEMBER_OF"
58
+ properties: OpenAIProjectToUserRelProperties = OpenAIProjectToUserRelProperties()
59
+
60
+
61
+ @dataclass(frozen=True)
62
+ class OpenAIProjectSchema(CartographyNodeSchema):
63
+ label: str = "OpenAIProject"
64
+ properties: OpenAIProjectNodeProperties = OpenAIProjectNodeProperties()
65
+ sub_resource_relationship: OpenAIProjectToOrganizationRel = (
66
+ OpenAIProjectToOrganizationRel()
67
+ )
68
+ other_relationships: OtherRelationships = OtherRelationships(
69
+ [OpenAIProjectToUserRel()],
70
+ )
@@ -0,0 +1,50 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.relationships import CartographyRelProperties
7
+ from cartography.models.core.relationships import CartographyRelSchema
8
+ from cartography.models.core.relationships import LinkDirection
9
+ from cartography.models.core.relationships import make_target_node_matcher
10
+ from cartography.models.core.relationships import TargetNodeMatcher
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class OpenAIServiceAccountNodeProperties(CartographyNodeProperties):
15
+ object: PropertyRef = PropertyRef("object")
16
+ id: PropertyRef = PropertyRef("id")
17
+ name: PropertyRef = PropertyRef("name")
18
+ role: PropertyRef = PropertyRef("role")
19
+ created_at: PropertyRef = PropertyRef("created_at")
20
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
21
+
22
+
23
+ @dataclass(frozen=True)
24
+ class OpenAIServiceAccountToProjectRelProperties(CartographyRelProperties):
25
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
26
+
27
+
28
+ @dataclass(frozen=True)
29
+ # (:OpenAIServiceAccount)<-[:RESOURCE]-(:OpenAIProject)
30
+ class OpenAIServiceAccountToProjectRel(CartographyRelSchema):
31
+ target_node_label: str = "OpenAIProject"
32
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
33
+ {"id": PropertyRef("project_id", set_in_kwargs=True)},
34
+ )
35
+ direction: LinkDirection = LinkDirection.INWARD
36
+ rel_label: str = "RESOURCE"
37
+ properties: OpenAIServiceAccountToProjectRelProperties = (
38
+ OpenAIServiceAccountToProjectRelProperties()
39
+ )
40
+
41
+
42
+ @dataclass(frozen=True)
43
+ class OpenAIServiceAccountSchema(CartographyNodeSchema):
44
+ label: str = "OpenAIServiceAccount"
45
+ properties: OpenAIServiceAccountNodeProperties = (
46
+ OpenAIServiceAccountNodeProperties()
47
+ )
48
+ sub_resource_relationship: OpenAIServiceAccountToProjectRel = (
49
+ OpenAIServiceAccountToProjectRel()
50
+ )
@@ -0,0 +1,49 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.relationships import CartographyRelProperties
7
+ from cartography.models.core.relationships import CartographyRelSchema
8
+ from cartography.models.core.relationships import LinkDirection
9
+ from cartography.models.core.relationships import make_target_node_matcher
10
+ from cartography.models.core.relationships import TargetNodeMatcher
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class OpenAIUserNodeProperties(CartographyNodeProperties):
15
+ object: PropertyRef = PropertyRef("object")
16
+ id: PropertyRef = PropertyRef("id")
17
+ name: PropertyRef = PropertyRef("name")
18
+ email: PropertyRef = PropertyRef("email", extra_index=True)
19
+ role: PropertyRef = PropertyRef("role")
20
+ added_at: PropertyRef = PropertyRef("added_at")
21
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
22
+
23
+
24
+ @dataclass(frozen=True)
25
+ class OpenAIUserToOrganizationRelProperties(CartographyRelProperties):
26
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
27
+
28
+
29
+ @dataclass(frozen=True)
30
+ # (:OpenAIOrganization)-[:RESOURCE]->(:OpenAIUser)
31
+ class OpenAIUserToOrganizationRel(CartographyRelSchema):
32
+ target_node_label: str = "OpenAIOrganization"
33
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
34
+ {"id": PropertyRef("ORG_ID", set_in_kwargs=True)},
35
+ )
36
+ direction: LinkDirection = LinkDirection.INWARD
37
+ rel_label: str = "RESOURCE"
38
+ properties: OpenAIUserToOrganizationRelProperties = (
39
+ OpenAIUserToOrganizationRelProperties()
40
+ )
41
+
42
+
43
+ @dataclass(frozen=True)
44
+ class OpenAIUserSchema(CartographyNodeSchema):
45
+ label: str = "OpenAIUser"
46
+ properties: OpenAIUserNodeProperties = OpenAIUserNodeProperties()
47
+ sub_resource_relationship: OpenAIUserToOrganizationRel = (
48
+ OpenAIUserToOrganizationRel()
49
+ )
@@ -15,61 +15,69 @@ from cartography.models.core.relationships import TargetNodeMatcher
15
15
 
16
16
  @dataclass(frozen=True)
17
17
  class SemgrepDependencyNodeProperties(CartographyNodeProperties):
18
- id: PropertyRef = PropertyRef('id')
19
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
20
- name: PropertyRef = PropertyRef('name')
21
- ecosystem: PropertyRef = PropertyRef('ecosystem')
22
- version: PropertyRef = PropertyRef('version')
18
+ id: PropertyRef = PropertyRef("id")
19
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
20
+ name: PropertyRef = PropertyRef("name")
21
+ ecosystem: PropertyRef = PropertyRef("ecosystem")
22
+ version: PropertyRef = PropertyRef("version")
23
23
 
24
24
 
25
25
  @dataclass(frozen=True)
26
26
  class SemgrepDependencyToSemgrepDeploymentRelProperties(CartographyRelProperties):
27
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
27
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
28
28
 
29
29
 
30
30
  @dataclass(frozen=True)
31
31
  # (:SemgrepDependency)<-[:RESOURCE]-(:SemgrepDeployment)
32
- class SemgrepDependencyToSemgrepDeploymentSchema(CartographyRelSchema):
33
- target_node_label: str = 'SemgrepDeployment'
32
+ class SemgrepDependencyToSemgrepDeploymentRel(CartographyRelSchema):
33
+ target_node_label: str = "SemgrepDeployment"
34
34
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
35
- {'id': PropertyRef('DEPLOYMENT_ID', set_in_kwargs=True)},
35
+ {"id": PropertyRef("DEPLOYMENT_ID", set_in_kwargs=True)},
36
36
  )
37
37
  direction: LinkDirection = LinkDirection.INWARD
38
38
  rel_label: str = "RESOURCE"
39
- properties: SemgrepDependencyToSemgrepDeploymentRelProperties = SemgrepDependencyToSemgrepDeploymentRelProperties()
39
+ properties: SemgrepDependencyToSemgrepDeploymentRelProperties = (
40
+ SemgrepDependencyToSemgrepDeploymentRelProperties()
41
+ )
40
42
 
41
43
 
42
44
  @dataclass(frozen=True)
43
45
  class SemgrepDependencyToGithubRepoRelProperties(CartographyRelProperties):
44
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
45
- specifier: PropertyRef = PropertyRef('specifier')
46
- transitivity: PropertyRef = PropertyRef('transitivity')
47
- url: PropertyRef = PropertyRef('url')
46
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
47
+ specifier: PropertyRef = PropertyRef("specifier")
48
+ transitivity: PropertyRef = PropertyRef("transitivity")
49
+ url: PropertyRef = PropertyRef("url")
48
50
 
49
51
 
50
52
  @dataclass(frozen=True)
51
53
  # (:SemgrepDependency)<-[:REQUIRES]-(:GitHubRepository)
52
54
  class SemgrepDependencyToGithubRepoRel(CartographyRelSchema):
53
- target_node_label: str = 'GitHubRepository'
55
+ target_node_label: str = "GitHubRepository"
54
56
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
55
- {'id': PropertyRef('repo_url')},
57
+ {"id": PropertyRef("repo_url")},
56
58
  )
57
59
  direction: LinkDirection = LinkDirection.INWARD
58
60
  rel_label: str = "REQUIRES"
59
- properties: SemgrepDependencyToGithubRepoRelProperties = SemgrepDependencyToGithubRepoRelProperties()
61
+ properties: SemgrepDependencyToGithubRepoRelProperties = (
62
+ SemgrepDependencyToGithubRepoRelProperties()
63
+ )
60
64
 
61
65
 
62
66
  @dataclass(frozen=True)
63
67
  class SemgrepSCAFindngToDependencyRelProperties(CartographyRelProperties):
64
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
68
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
65
69
 
66
70
 
67
71
  @dataclass(frozen=True)
68
72
  class SemgrepGoLibrarySchema(CartographyNodeSchema):
69
- label: str = 'GoLibrary'
70
- extra_node_labels: Optional[ExtraNodeLabels] = ExtraNodeLabels(['Dependency', 'SemgrepDependency'])
73
+ label: str = "GoLibrary"
74
+ extra_node_labels: Optional[ExtraNodeLabels] = ExtraNodeLabels(
75
+ ["Dependency", "SemgrepDependency"],
76
+ )
71
77
  properties: SemgrepDependencyNodeProperties = SemgrepDependencyNodeProperties()
72
- sub_resource_relationship: SemgrepDependencyToSemgrepDeploymentSchema = SemgrepDependencyToSemgrepDeploymentSchema()
78
+ sub_resource_relationship: SemgrepDependencyToSemgrepDeploymentRel = (
79
+ SemgrepDependencyToSemgrepDeploymentRel()
80
+ )
73
81
  other_relationships: OtherRelationships = OtherRelationships(
74
82
  [
75
83
  SemgrepDependencyToGithubRepoRel(),
@@ -79,10 +87,14 @@ class SemgrepGoLibrarySchema(CartographyNodeSchema):
79
87
 
80
88
  @dataclass(frozen=True)
81
89
  class SemgrepNpmLibrarySchema(CartographyNodeSchema):
82
- label: str = 'NpmLibrary'
83
- extra_node_labels: Optional[ExtraNodeLabels] = ExtraNodeLabels(['Dependency', 'SemgrepDependency'])
90
+ label: str = "NpmLibrary"
91
+ extra_node_labels: Optional[ExtraNodeLabels] = ExtraNodeLabels(
92
+ ["Dependency", "SemgrepDependency"],
93
+ )
84
94
  properties: SemgrepDependencyNodeProperties = SemgrepDependencyNodeProperties()
85
- sub_resource_relationship: SemgrepDependencyToSemgrepDeploymentSchema = SemgrepDependencyToSemgrepDeploymentSchema()
95
+ sub_resource_relationship: SemgrepDependencyToSemgrepDeploymentRel = (
96
+ SemgrepDependencyToSemgrepDeploymentRel()
97
+ )
86
98
  other_relationships: OtherRelationships = OtherRelationships(
87
99
  [
88
100
  SemgrepDependencyToGithubRepoRel(),
@@ -7,13 +7,13 @@ from cartography.models.core.nodes import CartographyNodeSchema
7
7
 
8
8
  @dataclass(frozen=True)
9
9
  class SemgrepDeploymentProperties(CartographyNodeProperties):
10
- id: PropertyRef = PropertyRef('id')
11
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
12
- name: PropertyRef = PropertyRef('name', extra_index=True)
13
- slug: PropertyRef = PropertyRef('slug', extra_index=True)
10
+ id: PropertyRef = PropertyRef("id")
11
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
12
+ name: PropertyRef = PropertyRef("name", extra_index=True)
13
+ slug: PropertyRef = PropertyRef("slug", extra_index=True)
14
14
 
15
15
 
16
16
  @dataclass(frozen=True)
17
17
  class SemgrepDeploymentSchema(CartographyNodeSchema):
18
- label: str = 'SemgrepDeployment'
18
+ label: str = "SemgrepDeployment"
19
19
  properties: SemgrepDeploymentProperties = SemgrepDeploymentProperties()
@@ -13,104 +13,120 @@ from cartography.models.core.relationships import TargetNodeMatcher
13
13
 
14
14
  @dataclass(frozen=True)
15
15
  class SemgrepSCAFindingNodeProperties(CartographyNodeProperties):
16
- id: PropertyRef = PropertyRef('id')
17
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
18
- rule_id: PropertyRef = PropertyRef('ruleId', extra_index=True)
19
- repository: PropertyRef = PropertyRef('repositoryName', extra_index=True)
20
- branch: PropertyRef = PropertyRef('branch')
21
- summary: PropertyRef = PropertyRef('title', extra_index=True)
22
- description: PropertyRef = PropertyRef('description')
23
- package_manager: PropertyRef = PropertyRef('ecosystem')
24
- severity: PropertyRef = PropertyRef('severity')
25
- cve_id: PropertyRef = PropertyRef('cveId', extra_index=True)
26
- reachability_check: PropertyRef = PropertyRef('reachability')
27
- reachability_condition: PropertyRef = PropertyRef('reachableIf')
28
- reachability: PropertyRef = PropertyRef('exposureType')
29
- transitivity: PropertyRef = PropertyRef('transitivity')
30
- dependency: PropertyRef = PropertyRef('matchedDependency')
31
- dependency_fix: PropertyRef = PropertyRef('closestSafeDependency')
32
- ref_urls: PropertyRef = PropertyRef('ref_urls')
33
- dependency_file: PropertyRef = PropertyRef('dependencyFileLocation_path', extra_index=True)
34
- dependency_file_url: PropertyRef = PropertyRef('dependencyFileLocation_url', extra_index=True)
35
- scan_time: PropertyRef = PropertyRef('openedAt')
36
- fix_status: PropertyRef = PropertyRef('fixStatus')
37
- triage_status: PropertyRef = PropertyRef('triageStatus')
38
- confidence: PropertyRef = PropertyRef('confidence')
16
+ id: PropertyRef = PropertyRef("id")
17
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
18
+ rule_id: PropertyRef = PropertyRef("ruleId", extra_index=True)
19
+ repository: PropertyRef = PropertyRef("repositoryName", extra_index=True)
20
+ branch: PropertyRef = PropertyRef("branch")
21
+ summary: PropertyRef = PropertyRef("title", extra_index=True)
22
+ description: PropertyRef = PropertyRef("description")
23
+ package_manager: PropertyRef = PropertyRef("ecosystem")
24
+ severity: PropertyRef = PropertyRef("severity")
25
+ cve_id: PropertyRef = PropertyRef("cveId", extra_index=True)
26
+ reachability_check: PropertyRef = PropertyRef("reachability")
27
+ reachability_condition: PropertyRef = PropertyRef("reachableIf")
28
+ reachability: PropertyRef = PropertyRef("exposureType")
29
+ transitivity: PropertyRef = PropertyRef("transitivity")
30
+ dependency: PropertyRef = PropertyRef("matchedDependency")
31
+ dependency_fix: PropertyRef = PropertyRef("closestSafeDependency")
32
+ ref_urls: PropertyRef = PropertyRef("ref_urls")
33
+ dependency_file: PropertyRef = PropertyRef(
34
+ "dependencyFileLocation_path",
35
+ extra_index=True,
36
+ )
37
+ dependency_file_url: PropertyRef = PropertyRef(
38
+ "dependencyFileLocation_url",
39
+ extra_index=True,
40
+ )
41
+ scan_time: PropertyRef = PropertyRef("openedAt")
42
+ fix_status: PropertyRef = PropertyRef("fixStatus")
43
+ triage_status: PropertyRef = PropertyRef("triageStatus")
44
+ confidence: PropertyRef = PropertyRef("confidence")
39
45
 
40
46
 
41
47
  @dataclass(frozen=True)
42
48
  class SemgrepSCAFindingToSemgrepDeploymentRelProperties(CartographyRelProperties):
43
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
49
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
44
50
 
45
51
 
46
52
  @dataclass(frozen=True)
47
53
  # (:SemgrepSCAFinding)<-[:RESOURCE]-(:SemgrepDeployment)
48
- class SemgrepSCAFindingToSemgrepDeploymentSchema(CartographyRelSchema):
49
- target_node_label: str = 'SemgrepDeployment'
54
+ class SemgrepSCAFindingToSemgrepDeploymentRel(CartographyRelSchema):
55
+ target_node_label: str = "SemgrepDeployment"
50
56
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
51
- {'id': PropertyRef('DEPLOYMENT_ID', set_in_kwargs=True)},
57
+ {"id": PropertyRef("DEPLOYMENT_ID", set_in_kwargs=True)},
52
58
  )
53
59
  direction: LinkDirection = LinkDirection.INWARD
54
60
  rel_label: str = "RESOURCE"
55
- properties: SemgrepSCAFindingToSemgrepDeploymentRelProperties = SemgrepSCAFindingToSemgrepDeploymentRelProperties()
61
+ properties: SemgrepSCAFindingToSemgrepDeploymentRelProperties = (
62
+ SemgrepSCAFindingToSemgrepDeploymentRelProperties()
63
+ )
56
64
 
57
65
 
58
66
  @dataclass(frozen=True)
59
67
  class SemgrepSCAFindingToGithubRepoRelProperties(CartographyRelProperties):
60
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
68
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
61
69
 
62
70
 
63
71
  @dataclass(frozen=True)
64
72
  # (:SemgrepSCAFinding)-[:FOUND_IN]->(:GitHubRepository)
65
73
  class SemgrepSCAFindingToGithubRepoRel(CartographyRelSchema):
66
- target_node_label: str = 'GitHubRepository'
74
+ target_node_label: str = "GitHubRepository"
67
75
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
68
- {'fullname': PropertyRef('repositoryName')},
76
+ {"fullname": PropertyRef("repositoryName")},
69
77
  )
70
78
  direction: LinkDirection = LinkDirection.OUTWARD
71
79
  rel_label: str = "FOUND_IN"
72
- properties: SemgrepSCAFindingToGithubRepoRelProperties = SemgrepSCAFindingToGithubRepoRelProperties()
80
+ properties: SemgrepSCAFindingToGithubRepoRelProperties = (
81
+ SemgrepSCAFindingToGithubRepoRelProperties()
82
+ )
73
83
 
74
84
 
75
85
  @dataclass(frozen=True)
76
86
  class SemgrepSCAFindngToDependencyRelProperties(CartographyRelProperties):
77
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
87
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
78
88
 
79
89
 
80
90
  @dataclass(frozen=True)
81
91
  # (:SemgrepSCAFinding)-[:AFFECTS]->(:Dependency)
82
92
  class SemgrepSCAFindingToDependencyRel(CartographyRelSchema):
83
- target_node_label: str = 'Dependency'
93
+ target_node_label: str = "Dependency"
84
94
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
85
- {'id': PropertyRef('matchedDependency')},
95
+ {"id": PropertyRef("matchedDependency")},
86
96
  )
87
97
  direction: LinkDirection = LinkDirection.OUTWARD
88
98
  rel_label: str = "AFFECTS"
89
- properties: SemgrepSCAFindngToDependencyRelProperties = SemgrepSCAFindngToDependencyRelProperties()
99
+ properties: SemgrepSCAFindngToDependencyRelProperties = (
100
+ SemgrepSCAFindngToDependencyRelProperties()
101
+ )
90
102
 
91
103
 
92
104
  @dataclass(frozen=True)
93
105
  class SemgrepSCAFindingToCVERelProperties(CartographyRelProperties):
94
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
106
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
95
107
 
96
108
 
97
109
  @dataclass(frozen=True)
98
110
  # (:SemgrepSCAFinding)<-[:LINKED_TO]-(:CVE)
99
111
  class SemgrepSCAFindingToCVERel(CartographyRelSchema):
100
- target_node_label: str = 'CVE'
112
+ target_node_label: str = "CVE"
101
113
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
102
- {'id': PropertyRef('cveId')},
114
+ {"id": PropertyRef("cveId")},
103
115
  )
104
116
  direction: LinkDirection = LinkDirection.INWARD
105
117
  rel_label: str = "LINKED_TO"
106
- properties: SemgrepSCAFindingToCVERelProperties = SemgrepSCAFindingToCVERelProperties()
118
+ properties: SemgrepSCAFindingToCVERelProperties = (
119
+ SemgrepSCAFindingToCVERelProperties()
120
+ )
107
121
 
108
122
 
109
123
  @dataclass(frozen=True)
110
124
  class SemgrepSCAFindingSchema(CartographyNodeSchema):
111
- label: str = 'SemgrepSCAFinding'
125
+ label: str = "SemgrepSCAFinding"
112
126
  properties: SemgrepSCAFindingNodeProperties = SemgrepSCAFindingNodeProperties()
113
- sub_resource_relationship: SemgrepSCAFindingToSemgrepDeploymentSchema = SemgrepSCAFindingToSemgrepDeploymentSchema()
127
+ sub_resource_relationship: SemgrepSCAFindingToSemgrepDeploymentRel = (
128
+ SemgrepSCAFindingToSemgrepDeploymentRel()
129
+ )
114
130
  other_relationships: OtherRelationships = OtherRelationships(
115
131
  [
116
132
  SemgrepSCAFindingToGithubRepoRel(),
@@ -13,57 +13,63 @@ from cartography.models.core.relationships import TargetNodeMatcher
13
13
 
14
14
  @dataclass(frozen=True)
15
15
  class SemgrepSCALocationProperties(CartographyNodeProperties):
16
- id: PropertyRef = PropertyRef('findingId')
17
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
18
- path: PropertyRef = PropertyRef('path', extra_index=True)
19
- start_line: PropertyRef = PropertyRef('startLine')
20
- start_col: PropertyRef = PropertyRef('startCol')
21
- end_line: PropertyRef = PropertyRef('endLine')
22
- end_col: PropertyRef = PropertyRef('endCol')
23
- url: PropertyRef = PropertyRef('url')
16
+ id: PropertyRef = PropertyRef("findingId")
17
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
18
+ path: PropertyRef = PropertyRef("path", extra_index=True)
19
+ start_line: PropertyRef = PropertyRef("startLine")
20
+ start_col: PropertyRef = PropertyRef("startCol")
21
+ end_line: PropertyRef = PropertyRef("endLine")
22
+ end_col: PropertyRef = PropertyRef("endCol")
23
+ url: PropertyRef = PropertyRef("url")
24
24
 
25
25
 
26
26
  @dataclass(frozen=True)
27
27
  class SemgrepSCALocToSemgrepSCAFindingRelProperties(CartographyRelProperties):
28
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
28
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
29
29
 
30
30
 
31
31
  @dataclass(frozen=True)
32
32
  # (:SemgrepSCALocation)<-[:USAGE_AT]-(:SemgrepSCAFinding)
33
- class SemgrepSCALocToSemgrepSCAFindingRelSchema(CartographyRelSchema):
34
- target_node_label: str = 'SemgrepSCAFinding'
33
+ class SemgrepSCALocToSemgrepSCAFindingRel(CartographyRelSchema):
34
+ target_node_label: str = "SemgrepSCAFinding"
35
35
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
36
- {'id': PropertyRef('SCA_ID')},
36
+ {"id": PropertyRef("SCA_ID")},
37
37
  )
38
38
  direction: LinkDirection = LinkDirection.INWARD
39
39
  rel_label: str = "USAGE_AT"
40
- properties: SemgrepSCALocToSemgrepSCAFindingRelProperties = SemgrepSCALocToSemgrepSCAFindingRelProperties()
40
+ properties: SemgrepSCALocToSemgrepSCAFindingRelProperties = (
41
+ SemgrepSCALocToSemgrepSCAFindingRelProperties()
42
+ )
41
43
 
42
44
 
43
45
  @dataclass(frozen=True)
44
46
  class SemgrepSCALocToSemgrepSCADeploymentRelProperties(CartographyRelProperties):
45
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
47
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
46
48
 
47
49
 
48
50
  @dataclass(frozen=True)
49
51
  # (:SemgrepSCALocation)<-[:RESOURCE]-(:SemgrepSCADeployment)
50
- class SemgrepSCALocToSCADeploymentRelSchema(CartographyRelSchema):
51
- target_node_label: str = 'SemgrepDeployment'
52
+ class SemgrepSCALocToSCADeploymentRel(CartographyRelSchema):
53
+ target_node_label: str = "SemgrepDeployment"
52
54
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
53
- {'id': PropertyRef('DEPLOYMENT_ID', set_in_kwargs=True)},
55
+ {"id": PropertyRef("DEPLOYMENT_ID", set_in_kwargs=True)},
54
56
  )
55
57
  direction: LinkDirection = LinkDirection.INWARD
56
58
  rel_label: str = "RESOURCE"
57
- properties: SemgrepSCALocToSemgrepSCADeploymentRelProperties = SemgrepSCALocToSemgrepSCADeploymentRelProperties()
59
+ properties: SemgrepSCALocToSemgrepSCADeploymentRelProperties = (
60
+ SemgrepSCALocToSemgrepSCADeploymentRelProperties()
61
+ )
58
62
 
59
63
 
60
64
  @dataclass(frozen=True)
61
65
  class SemgrepSCALocationSchema(CartographyNodeSchema):
62
- label: str = 'SemgrepSCALocation'
66
+ label: str = "SemgrepSCALocation"
63
67
  properties: SemgrepSCALocationProperties = SemgrepSCALocationProperties()
64
- sub_resource_relationship: SemgrepSCALocToSCADeploymentRelSchema = SemgrepSCALocToSCADeploymentRelSchema()
68
+ sub_resource_relationship: SemgrepSCALocToSCADeploymentRel = (
69
+ SemgrepSCALocToSCADeploymentRel()
70
+ )
65
71
  other_relationships: OtherRelationships = OtherRelationships(
66
72
  [
67
- SemgrepSCALocToSemgrepSCAFindingRelSchema(),
73
+ SemgrepSCALocToSemgrepSCAFindingRel(),
68
74
  ],
69
75
  )