cartography 0.102.0rc1__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 +327 -0
  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 -44
  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 +97 -0
  208. cartography/models/aws/ec2/route_tables.py +128 -0
  209. cartography/models/aws/ec2/routes.py +85 -0
  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.0rc1.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.0rc1.dist-info → cartography-0.103.0.dist-info}/WHEEL +1 -1
  294. cartography-0.102.0rc1.dist-info/RECORD +0 -377
  295. {cartography-0.102.0rc1.dist-info → cartography-0.103.0.dist-info}/entry_points.txt +0 -0
  296. {cartography-0.102.0rc1.dist-info → cartography-0.103.0.dist-info}/licenses/LICENSE +0 -0
  297. {cartography-0.102.0rc1.dist-info → cartography-0.103.0.dist-info}/top_level.txt +0 -0
@@ -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
  )
@@ -16,18 +16,19 @@ class SnipeitAssetNodeProperties(CartographyNodeProperties):
16
16
  """
17
17
  https://snipe-it.readme.io/reference/hardware-list
18
18
  """
19
+
19
20
  # Common properties
20
- id: PropertyRef = PropertyRef('id')
21
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
21
+ id: PropertyRef = PropertyRef("id")
22
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
22
23
 
23
24
  # SnipeIT specific properties
24
- asset_tag: PropertyRef = PropertyRef('asset_tag')
25
- assigned_to: PropertyRef = PropertyRef('assigned_to.email')
26
- category: PropertyRef = PropertyRef('category.name')
27
- company: PropertyRef = PropertyRef('company.name')
28
- manufacturer: PropertyRef = PropertyRef('manufacturer.name')
29
- model: PropertyRef = PropertyRef('model.name')
30
- serial: PropertyRef = PropertyRef('serial', extra_index=True)
25
+ asset_tag: PropertyRef = PropertyRef("asset_tag")
26
+ assigned_to: PropertyRef = PropertyRef("assigned_to.email")
27
+ category: PropertyRef = PropertyRef("category.name")
28
+ company: PropertyRef = PropertyRef("company.name")
29
+ manufacturer: PropertyRef = PropertyRef("manufacturer.name")
30
+ model: PropertyRef = PropertyRef("model.name")
31
+ serial: PropertyRef = PropertyRef("serial", extra_index=True)
31
32
 
32
33
 
33
34
  ###
@@ -35,45 +36,53 @@ class SnipeitAssetNodeProperties(CartographyNodeProperties):
35
36
  ###
36
37
  @dataclass(frozen=True)
37
38
  class SnipeitTenantToSnipeitAssetRelProperties(CartographyRelProperties):
38
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
39
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
39
40
 
40
41
 
41
42
  @dataclass(frozen=True)
42
43
  class SnipeitTenantToSnipeitAssetRel(CartographyRelSchema):
43
- target_node_label: str = 'SnipeitTenant'
44
+ target_node_label: str = "SnipeitTenant"
44
45
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
45
- {'id': PropertyRef('TENANT_ID', set_in_kwargs=True)},
46
+ {"id": PropertyRef("TENANT_ID", set_in_kwargs=True)},
46
47
  )
47
48
  direction: LinkDirection = LinkDirection.INWARD
48
49
  rel_label: str = "HAS_ASSET"
49
- properties: SnipeitTenantToSnipeitAssetRelProperties = SnipeitTenantToSnipeitAssetRelProperties()
50
+ properties: SnipeitTenantToSnipeitAssetRelProperties = (
51
+ SnipeitTenantToSnipeitAssetRelProperties()
52
+ )
50
53
 
51
54
 
52
55
  ###
53
56
  # (:SnipeitUser)-[:HAS_CHECKED_OUT]->(:SnipeitAsset)
54
57
  ###
55
58
  @dataclass(frozen=True)
56
- class SnipeitUserToSnipeitAssetProperties(CartographyRelProperties):
57
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
59
+ class SnipeitUserToSnipeitAssetRelProperties(CartographyRelProperties):
60
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
58
61
 
59
62
 
60
63
  @dataclass(frozen=True)
61
64
  class SnipeitUserToSnipeitAssetRel(CartographyRelSchema):
62
- target_node_label: str = 'SnipeitUser'
65
+ target_node_label: str = "SnipeitUser"
63
66
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
64
- {'email': PropertyRef('assigned_to.email')},
67
+ {"email": PropertyRef("assigned_to.email")},
65
68
  )
66
69
  direction: LinkDirection = LinkDirection.INWARD
67
70
  rel_label: str = "HAS_CHECKED_OUT"
68
- properties: SnipeitUserToSnipeitAssetProperties = SnipeitUserToSnipeitAssetProperties()
71
+ properties: SnipeitUserToSnipeitAssetRelProperties = (
72
+ SnipeitUserToSnipeitAssetRelProperties()
73
+ )
69
74
 
70
75
 
71
76
  ###
72
77
  @dataclass(frozen=True)
73
78
  class SnipeitAssetSchema(CartographyNodeSchema):
74
- label: str = 'SnipeitAsset' # The label of the node
75
- properties: SnipeitAssetNodeProperties = SnipeitAssetNodeProperties() # An object representing all properties
76
- sub_resource_relationship: SnipeitTenantToSnipeitAssetRel = SnipeitTenantToSnipeitAssetRel()
79
+ label: str = "SnipeitAsset" # The label of the node
80
+ properties: SnipeitAssetNodeProperties = (
81
+ SnipeitAssetNodeProperties()
82
+ ) # An object representing all properties
83
+ sub_resource_relationship: SnipeitTenantToSnipeitAssetRel = (
84
+ SnipeitTenantToSnipeitAssetRel()
85
+ )
77
86
  other_relationships: OtherRelationships = OtherRelationships(
78
87
  [
79
88
  SnipeitUserToSnipeitAssetRel(),
@@ -7,11 +7,13 @@ from cartography.models.core.nodes import CartographyNodeSchema
7
7
 
8
8
  @dataclass(frozen=True)
9
9
  class SnipeitTenantNodeProperties(CartographyNodeProperties):
10
- id: PropertyRef = PropertyRef('id')
11
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
10
+ id: PropertyRef = PropertyRef("id")
11
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
12
12
 
13
13
 
14
14
  @dataclass(frozen=True)
15
15
  class SnipeitTenantSchema(CartographyNodeSchema):
16
- label: str = 'SnipeitTenant' # The label of the node
17
- properties: SnipeitTenantNodeProperties = SnipeitTenantNodeProperties() # An object representing all properties
16
+ label: str = "SnipeitTenant" # The label of the node
17
+ properties: SnipeitTenantNodeProperties = (
18
+ SnipeitTenantNodeProperties()
19
+ ) # An object representing all properties
@@ -15,35 +15,42 @@ class SnipeitUserNodeProperties(CartographyNodeProperties):
15
15
  """
16
16
  Ref: https://snipe-it.readme.io/reference/users
17
17
  """
18
+
18
19
  # Common properties
19
- id: PropertyRef = PropertyRef('id')
20
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
20
+ id: PropertyRef = PropertyRef("id")
21
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
21
22
 
22
23
  # SnipeIT specific properties
23
- company: PropertyRef = PropertyRef('company_id.name', extra_index=True)
24
- email: PropertyRef = PropertyRef('email', extra_index=True)
25
- username: PropertyRef = PropertyRef('username')
24
+ company: PropertyRef = PropertyRef("company_id.name", extra_index=True)
25
+ email: PropertyRef = PropertyRef("email", extra_index=True)
26
+ username: PropertyRef = PropertyRef("username")
26
27
 
27
28
 
28
29
  @dataclass(frozen=True)
29
30
  class SnipeitTenantToSnipeitUserRelProperties(CartographyRelProperties):
30
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
31
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
31
32
 
32
33
 
33
34
  @dataclass(frozen=True)
34
35
  # (:SnipeitTenant)-[:HAS_USER]->(:SnipeitUser)
35
36
  class SnipeitTenantToSnipeitUserRel(CartographyRelSchema):
36
- target_node_label: str = 'SnipeitTenant'
37
+ target_node_label: str = "SnipeitTenant"
37
38
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
38
- {'id': PropertyRef('TENANT_ID', set_in_kwargs=True)},
39
+ {"id": PropertyRef("TENANT_ID", set_in_kwargs=True)},
39
40
  )
40
41
  direction: LinkDirection = LinkDirection.INWARD
41
42
  rel_label: str = "HAS_USER"
42
- properties: SnipeitTenantToSnipeitUserRelProperties = SnipeitTenantToSnipeitUserRelProperties()
43
+ properties: SnipeitTenantToSnipeitUserRelProperties = (
44
+ SnipeitTenantToSnipeitUserRelProperties()
45
+ )
43
46
 
44
47
 
45
48
  @dataclass(frozen=True)
46
49
  class SnipeitUserSchema(CartographyNodeSchema):
47
- label: str = 'SnipeitUser' # The label of the node
48
- properties: SnipeitUserNodeProperties = SnipeitUserNodeProperties() # An object representing all properties
49
- sub_resource_relationship: SnipeitTenantToSnipeitUserRel = SnipeitTenantToSnipeitUserRel()
50
+ label: str = "SnipeitUser" # The label of the node
51
+ properties: SnipeitUserNodeProperties = (
52
+ SnipeitUserNodeProperties()
53
+ ) # An object representing all properties
54
+ sub_resource_relationship: SnipeitTenantToSnipeitUserRel = (
55
+ SnipeitTenantToSnipeitUserRel()
56
+ )
File without changes