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
@@ -13,51 +13,59 @@ from cartography.models.core.relationships import TargetNodeMatcher
13
13
 
14
14
  @dataclass(frozen=True)
15
15
  class DuoWebAuthnCredentialNodeProperties(CartographyNodeProperties):
16
- id: PropertyRef = PropertyRef('webauthnkey')
17
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
18
- admin: PropertyRef = PropertyRef('admin')
19
- credential_name: PropertyRef = PropertyRef('credential_name', extra_index=True)
20
- date_added: PropertyRef = PropertyRef('date_added')
21
- label: PropertyRef = PropertyRef('label')
22
- webauthnkey: PropertyRef = PropertyRef('webauthnkey', extra_index=True)
16
+ id: PropertyRef = PropertyRef("webauthnkey")
17
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
18
+ admin: PropertyRef = PropertyRef("admin")
19
+ credential_name: PropertyRef = PropertyRef("credential_name", extra_index=True)
20
+ date_added: PropertyRef = PropertyRef("date_added")
21
+ label: PropertyRef = PropertyRef("label")
22
+ webauthnkey: PropertyRef = PropertyRef("webauthnkey", extra_index=True)
23
23
 
24
24
 
25
25
  @dataclass(frozen=True)
26
26
  class DuoWebAuthnCredentialToDuoApiHostRelProperties(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
  class DuoWebAuthnCredentialToDuoApiHostRel(CartographyRelSchema):
32
- target_node_label: str = 'DuoApiHost'
32
+ target_node_label: str = "DuoApiHost"
33
33
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
34
- {'id': PropertyRef('DUO_API_HOSTNAME', set_in_kwargs=True)},
34
+ {"id": PropertyRef("DUO_API_HOSTNAME", set_in_kwargs=True)},
35
35
  )
36
36
  direction: LinkDirection = LinkDirection.INWARD
37
37
  rel_label: str = "RESOURCE"
38
- properties: DuoWebAuthnCredentialToDuoApiHostRelProperties = DuoWebAuthnCredentialToDuoApiHostRelProperties()
38
+ properties: DuoWebAuthnCredentialToDuoApiHostRelProperties = (
39
+ DuoWebAuthnCredentialToDuoApiHostRelProperties()
40
+ )
39
41
 
40
42
 
41
- class DuoWebAuthnCredentialToDuoUserProperties(CartographyRelProperties):
42
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
43
+ class DuoWebAuthnCredentialToDuoUserRelProperties(CartographyRelProperties):
44
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
43
45
 
44
46
 
45
47
  @dataclass(frozen=True)
46
48
  class DuoWebAuthnCredentialToDuoUserRel(CartographyRelSchema):
47
- target_node_label: str = 'DuoUser'
49
+ target_node_label: str = "DuoUser"
48
50
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
49
- {'user_id': PropertyRef('user_id')},
51
+ {"user_id": PropertyRef("user_id")},
50
52
  )
51
53
  direction: LinkDirection = LinkDirection.INWARD
52
54
  rel_label: str = "HAS_DUO_WEB_AUTHN_CREDENTIAL"
53
- properties: DuoWebAuthnCredentialToDuoUserProperties = DuoWebAuthnCredentialToDuoUserProperties()
55
+ properties: DuoWebAuthnCredentialToDuoUserRelProperties = (
56
+ DuoWebAuthnCredentialToDuoUserRelProperties()
57
+ )
54
58
 
55
59
 
56
60
  @dataclass(frozen=True)
57
61
  class DuoWebAuthnCredentialSchema(CartographyNodeSchema):
58
- label: str = 'DuoWebAuthnCredential'
59
- properties: DuoWebAuthnCredentialNodeProperties = DuoWebAuthnCredentialNodeProperties()
60
- sub_resource_relationship: DuoWebAuthnCredentialToDuoApiHostRel = DuoWebAuthnCredentialToDuoApiHostRel()
62
+ label: str = "DuoWebAuthnCredential"
63
+ properties: DuoWebAuthnCredentialNodeProperties = (
64
+ DuoWebAuthnCredentialNodeProperties()
65
+ )
66
+ sub_resource_relationship: DuoWebAuthnCredentialToDuoApiHostRel = (
67
+ DuoWebAuthnCredentialToDuoApiHostRel()
68
+ )
61
69
  other_relationships: OtherRelationships = OtherRelationships(
62
70
  rels=[
63
71
  DuoWebAuthnCredentialToDuoUserRel(),
@@ -0,0 +1,48 @@
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 EntraOUNodeProperties(CartographyNodeProperties):
15
+ id: PropertyRef = PropertyRef("id")
16
+ display_name: PropertyRef = PropertyRef("display_name")
17
+ description: PropertyRef = PropertyRef("description")
18
+ visibility: PropertyRef = PropertyRef("visibility")
19
+ membership_type: PropertyRef = PropertyRef("membership_type")
20
+ is_member_management_restricted: PropertyRef = PropertyRef(
21
+ "is_member_management_restricted"
22
+ )
23
+ deleted_date_time: PropertyRef = PropertyRef("deleted_date_time")
24
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
25
+
26
+
27
+ @dataclass(frozen=True)
28
+ class EntraTenantToOURelProperties(CartographyRelProperties):
29
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
30
+
31
+
32
+ @dataclass(frozen=True)
33
+ # (:EntraOU)<-[:RESOURCE]-(:AzureTenant)
34
+ class EntraOUToTenantRel(CartographyRelSchema):
35
+ target_node_label: str = "EntraTenant"
36
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
37
+ {"id": PropertyRef("TENANT_ID", set_in_kwargs=True)},
38
+ )
39
+ direction: LinkDirection = LinkDirection.INWARD
40
+ rel_label: str = "RESOURCE"
41
+ properties: EntraTenantToOURelProperties = EntraTenantToOURelProperties()
42
+
43
+
44
+ @dataclass(frozen=True)
45
+ class EntraOUSchema(CartographyNodeSchema):
46
+ label: str = "EntraOU"
47
+ properties: EntraOUNodeProperties = EntraOUNodeProperties()
48
+ sub_resource_relationship: EntraOUToTenantRel = EntraOUToTenantRel()
@@ -8,26 +8,32 @@ from cartography.models.core.nodes import ExtraNodeLabels
8
8
 
9
9
  @dataclass(frozen=True)
10
10
  class EntraTenantNodeProperties(CartographyNodeProperties):
11
- id: PropertyRef = PropertyRef('id')
12
- created_date_time: PropertyRef = PropertyRef('created_date_time')
13
- default_usage_location: PropertyRef = PropertyRef('default_usage_location')
14
- deleted_date_time: PropertyRef = PropertyRef('deleted_date_time')
15
- display_name: PropertyRef = PropertyRef('display_name')
16
- marketing_notification_emails: PropertyRef = PropertyRef('marketing_notification_emails')
17
- mobile_device_management_authority: PropertyRef = PropertyRef('mobile_device_management_authority')
18
- on_premises_last_sync_date_time: PropertyRef = PropertyRef('on_premises_last_sync_date_time')
19
- on_premises_sync_enabled: PropertyRef = PropertyRef('on_premises_sync_enabled')
20
- partner_tenant_type: PropertyRef = PropertyRef('partner_tenant_type')
21
- postal_code: PropertyRef = PropertyRef('postal_code')
22
- preferred_language: PropertyRef = PropertyRef('preferred_language')
23
- state: PropertyRef = PropertyRef('state')
24
- street: PropertyRef = PropertyRef('street')
25
- tenant_type: PropertyRef = PropertyRef('tenant_type')
26
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
11
+ id: PropertyRef = PropertyRef("id")
12
+ created_date_time: PropertyRef = PropertyRef("created_date_time")
13
+ default_usage_location: PropertyRef = PropertyRef("default_usage_location")
14
+ deleted_date_time: PropertyRef = PropertyRef("deleted_date_time")
15
+ display_name: PropertyRef = PropertyRef("display_name")
16
+ marketing_notification_emails: PropertyRef = PropertyRef(
17
+ "marketing_notification_emails"
18
+ )
19
+ mobile_device_management_authority: PropertyRef = PropertyRef(
20
+ "mobile_device_management_authority"
21
+ )
22
+ on_premises_last_sync_date_time: PropertyRef = PropertyRef(
23
+ "on_premises_last_sync_date_time"
24
+ )
25
+ on_premises_sync_enabled: PropertyRef = PropertyRef("on_premises_sync_enabled")
26
+ partner_tenant_type: PropertyRef = PropertyRef("partner_tenant_type")
27
+ postal_code: PropertyRef = PropertyRef("postal_code")
28
+ preferred_language: PropertyRef = PropertyRef("preferred_language")
29
+ state: PropertyRef = PropertyRef("state")
30
+ street: PropertyRef = PropertyRef("street")
31
+ tenant_type: PropertyRef = PropertyRef("tenant_type")
32
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
27
33
 
28
34
 
29
35
  @dataclass(frozen=True)
30
36
  class EntraTenantSchema(CartographyNodeSchema):
31
- label: str = 'AzureTenant'
37
+ label: str = "AzureTenant"
32
38
  properties: EntraTenantNodeProperties = EntraTenantNodeProperties()
33
- extra_node_labels: ExtraNodeLabels = ExtraNodeLabels(['EntraTenant'])
39
+ extra_node_labels: ExtraNodeLabels = ExtraNodeLabels(["EntraTenant"])
@@ -12,64 +12,80 @@ from cartography.models.core.relationships import TargetNodeMatcher
12
12
 
13
13
  @dataclass(frozen=True)
14
14
  class EntraUserNodeProperties(CartographyNodeProperties):
15
- id: PropertyRef = PropertyRef('id')
16
- user_principal_name: PropertyRef = PropertyRef('user_principal_name')
17
- display_name: PropertyRef = PropertyRef('display_name')
18
- given_name: PropertyRef = PropertyRef('given_name')
19
- surname: PropertyRef = PropertyRef('surname')
15
+ id: PropertyRef = PropertyRef("id")
16
+ user_principal_name: PropertyRef = PropertyRef("user_principal_name")
17
+ display_name: PropertyRef = PropertyRef("display_name")
18
+ given_name: PropertyRef = PropertyRef("given_name")
19
+ surname: PropertyRef = PropertyRef("surname")
20
20
  # The underlying datatype calls this 'mail' but everything else in cartography uses 'email'
21
- email: PropertyRef = PropertyRef('mail', extra_index=True)
22
- other_mails: PropertyRef = PropertyRef('other_mails')
23
- preferred_language: PropertyRef = PropertyRef('preferred_language')
24
- preferred_name: PropertyRef = PropertyRef('preferred_name')
25
- state: PropertyRef = PropertyRef('state')
26
- usage_location: PropertyRef = PropertyRef('usage_location')
27
- user_type: PropertyRef = PropertyRef('user_type')
28
- show_in_address_list: PropertyRef = PropertyRef('show_in_address_list')
29
- sign_in_sessions_valid_from_date_time: PropertyRef = PropertyRef('sign_in_sessions_valid_from_date_time')
30
- security_identifier: PropertyRef = PropertyRef('security_identifier')
31
- account_enabled: PropertyRef = PropertyRef('account_enabled')
32
- city: PropertyRef = PropertyRef('city')
33
- company_name: PropertyRef = PropertyRef('company_name')
34
- consent_provided_for_minor: PropertyRef = PropertyRef('consent_provided_for_minor')
35
- country: PropertyRef = PropertyRef('country')
36
- created_date_time: PropertyRef = PropertyRef('created_date_time')
37
- creation_type: PropertyRef = PropertyRef('creation_type')
38
- deleted_date_time: PropertyRef = PropertyRef('deleted_date_time')
39
- department: PropertyRef = PropertyRef('department')
40
- employee_id: PropertyRef = PropertyRef('employee_id')
41
- employee_type: PropertyRef = PropertyRef('employee_type')
42
- external_user_state: PropertyRef = PropertyRef('external_user_state')
43
- external_user_state_change_date_time: PropertyRef = PropertyRef('external_user_state_change_date_time')
44
- hire_date: PropertyRef = PropertyRef('hire_date')
45
- is_management_restricted: PropertyRef = PropertyRef('is_management_restricted')
46
- is_resource_account: PropertyRef = PropertyRef('is_resource_account')
47
- job_title: PropertyRef = PropertyRef('job_title')
48
- last_password_change_date_time: PropertyRef = PropertyRef('last_password_change_date_time')
49
- mail_nickname: PropertyRef = PropertyRef('mail_nickname')
50
- office_location: PropertyRef = PropertyRef('office_location')
51
- on_premises_distinguished_name: PropertyRef = PropertyRef('on_premises_distinguished_name')
52
- on_premises_domain_name: PropertyRef = PropertyRef('on_premises_domain_name')
53
- on_premises_immutable_id: PropertyRef = PropertyRef('on_premises_immutable_id')
54
- on_premises_last_sync_date_time: PropertyRef = PropertyRef('on_premises_last_sync_date_time')
55
- on_premises_sam_account_name: PropertyRef = PropertyRef('on_premises_sam_account_name')
56
- on_premises_security_identifier: PropertyRef = PropertyRef('on_premises_security_identifier')
57
- on_premises_sync_enabled: PropertyRef = PropertyRef('on_premises_sync_enabled')
58
- on_premises_user_principal_name: PropertyRef = PropertyRef('on_premises_user_principal_name')
59
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
21
+ email: PropertyRef = PropertyRef("mail", extra_index=True)
22
+ other_mails: PropertyRef = PropertyRef("other_mails")
23
+ preferred_language: PropertyRef = PropertyRef("preferred_language")
24
+ preferred_name: PropertyRef = PropertyRef("preferred_name")
25
+ state: PropertyRef = PropertyRef("state")
26
+ usage_location: PropertyRef = PropertyRef("usage_location")
27
+ user_type: PropertyRef = PropertyRef("user_type")
28
+ show_in_address_list: PropertyRef = PropertyRef("show_in_address_list")
29
+ sign_in_sessions_valid_from_date_time: PropertyRef = PropertyRef(
30
+ "sign_in_sessions_valid_from_date_time"
31
+ )
32
+ security_identifier: PropertyRef = PropertyRef("security_identifier")
33
+ account_enabled: PropertyRef = PropertyRef("account_enabled")
34
+ city: PropertyRef = PropertyRef("city")
35
+ company_name: PropertyRef = PropertyRef("company_name")
36
+ consent_provided_for_minor: PropertyRef = PropertyRef("consent_provided_for_minor")
37
+ country: PropertyRef = PropertyRef("country")
38
+ created_date_time: PropertyRef = PropertyRef("created_date_time")
39
+ creation_type: PropertyRef = PropertyRef("creation_type")
40
+ deleted_date_time: PropertyRef = PropertyRef("deleted_date_time")
41
+ department: PropertyRef = PropertyRef("department")
42
+ employee_id: PropertyRef = PropertyRef("employee_id")
43
+ employee_type: PropertyRef = PropertyRef("employee_type")
44
+ external_user_state: PropertyRef = PropertyRef("external_user_state")
45
+ external_user_state_change_date_time: PropertyRef = PropertyRef(
46
+ "external_user_state_change_date_time"
47
+ )
48
+ hire_date: PropertyRef = PropertyRef("hire_date")
49
+ is_management_restricted: PropertyRef = PropertyRef("is_management_restricted")
50
+ is_resource_account: PropertyRef = PropertyRef("is_resource_account")
51
+ job_title: PropertyRef = PropertyRef("job_title")
52
+ last_password_change_date_time: PropertyRef = PropertyRef(
53
+ "last_password_change_date_time"
54
+ )
55
+ mail_nickname: PropertyRef = PropertyRef("mail_nickname")
56
+ office_location: PropertyRef = PropertyRef("office_location")
57
+ on_premises_distinguished_name: PropertyRef = PropertyRef(
58
+ "on_premises_distinguished_name"
59
+ )
60
+ on_premises_domain_name: PropertyRef = PropertyRef("on_premises_domain_name")
61
+ on_premises_immutable_id: PropertyRef = PropertyRef("on_premises_immutable_id")
62
+ on_premises_last_sync_date_time: PropertyRef = PropertyRef(
63
+ "on_premises_last_sync_date_time"
64
+ )
65
+ on_premises_sam_account_name: PropertyRef = PropertyRef(
66
+ "on_premises_sam_account_name"
67
+ )
68
+ on_premises_security_identifier: PropertyRef = PropertyRef(
69
+ "on_premises_security_identifier"
70
+ )
71
+ on_premises_sync_enabled: PropertyRef = PropertyRef("on_premises_sync_enabled")
72
+ on_premises_user_principal_name: PropertyRef = PropertyRef(
73
+ "on_premises_user_principal_name"
74
+ )
75
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
60
76
 
61
77
 
62
78
  @dataclass(frozen=True)
63
79
  class EntraTenantToUserRelProperties(CartographyRelProperties):
64
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
80
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
65
81
 
66
82
 
67
83
  @dataclass(frozen=True)
68
84
  # (:EntraUser)<-[:RESOURCE]-(:AzureTenant)
69
85
  class EntraUserToTenantRel(CartographyRelSchema):
70
- target_node_label: str = 'AzureTenant'
86
+ target_node_label: str = "AzureTenant"
71
87
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
72
- {'id': PropertyRef('TENANT_ID', set_in_kwargs=True)},
88
+ {"id": PropertyRef("TENANT_ID", set_in_kwargs=True)},
73
89
  )
74
90
  direction: LinkDirection = LinkDirection.INWARD
75
91
  rel_label: str = "RESOURCE"
@@ -78,6 +94,6 @@ class EntraUserToTenantRel(CartographyRelSchema):
78
94
 
79
95
  @dataclass(frozen=True)
80
96
  class EntraUserSchema(CartographyNodeSchema):
81
- label: str = 'EntraUser'
97
+ label: str = "EntraUser"
82
98
  properties: EntraUserNodeProperties = EntraUserNodeProperties()
83
99
  sub_resource_relationship: EntraUserToTenantRel = EntraUserToTenantRel()
@@ -15,41 +15,41 @@ logger = logging.getLogger(__name__)
15
15
 
16
16
  @dataclass(frozen=True)
17
17
  class GCPServiceAccountNodeProperties(CartographyNodeProperties):
18
- id: PropertyRef = PropertyRef('id', extra_index=True)
19
- email: PropertyRef = PropertyRef('email', extra_index=True)
20
- display_name: PropertyRef = PropertyRef('displayName')
21
- oauth2_client_id: PropertyRef = PropertyRef('oauth2ClientId')
22
- unique_id: PropertyRef = PropertyRef('uniqueId')
23
- disabled: PropertyRef = PropertyRef('disabled')
24
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
25
- project_id: PropertyRef = PropertyRef('projectId', set_in_kwargs=True)
18
+ id: PropertyRef = PropertyRef("id", extra_index=True)
19
+ email: PropertyRef = PropertyRef("email", extra_index=True)
20
+ display_name: PropertyRef = PropertyRef("displayName")
21
+ oauth2_client_id: PropertyRef = PropertyRef("oauth2ClientId")
22
+ unique_id: PropertyRef = PropertyRef("uniqueId")
23
+ disabled: PropertyRef = PropertyRef("disabled")
24
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
25
+ project_id: PropertyRef = PropertyRef("projectId", set_in_kwargs=True)
26
26
 
27
27
 
28
28
  @dataclass(frozen=True)
29
29
  class GCPRoleNodeProperties(CartographyNodeProperties):
30
- id: PropertyRef = PropertyRef('name', extra_index=True)
31
- name: PropertyRef = PropertyRef('name', extra_index=True)
32
- title: PropertyRef = PropertyRef('title')
33
- description: PropertyRef = PropertyRef('description')
34
- deleted: PropertyRef = PropertyRef('deleted')
35
- etag: PropertyRef = PropertyRef('etag')
36
- permissions: PropertyRef = PropertyRef('includedPermissions')
37
- role_type: PropertyRef = PropertyRef('roleType')
38
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
39
- project_id: PropertyRef = PropertyRef('projectId', set_in_kwargs=True)
30
+ id: PropertyRef = PropertyRef("name", extra_index=True)
31
+ name: PropertyRef = PropertyRef("name", extra_index=True)
32
+ title: PropertyRef = PropertyRef("title")
33
+ description: PropertyRef = PropertyRef("description")
34
+ deleted: PropertyRef = PropertyRef("deleted")
35
+ etag: PropertyRef = PropertyRef("etag")
36
+ permissions: PropertyRef = PropertyRef("includedPermissions")
37
+ role_type: PropertyRef = PropertyRef("roleType")
38
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
39
+ project_id: PropertyRef = PropertyRef("projectId", set_in_kwargs=True)
40
40
 
41
41
 
42
42
  @dataclass(frozen=True)
43
43
  class GCPIAMToProjectRelProperties(CartographyRelProperties):
44
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
44
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
45
45
 
46
46
 
47
47
  @dataclass(frozen=True)
48
48
  # (:GCPUser|GCPServiceAccount|GCPRole)<-[:RESOURCE]-(:GCPProject)
49
49
  class GCPPrincipalToProject(CartographyRelSchema):
50
- target_node_label: str = 'GCPProject'
50
+ target_node_label: str = "GCPProject"
51
51
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
52
- {'id': PropertyRef('projectId', set_in_kwargs=True)},
52
+ {"id": PropertyRef("projectId", set_in_kwargs=True)},
53
53
  )
54
54
  direction: LinkDirection = LinkDirection.INWARD
55
55
  rel_label: str = "RESOURCE"
@@ -58,13 +58,13 @@ class GCPPrincipalToProject(CartographyRelSchema):
58
58
 
59
59
  @dataclass(frozen=True)
60
60
  class GCPServiceAccountSchema(CartographyNodeSchema):
61
- label: str = 'GCPServiceAccount'
61
+ label: str = "GCPServiceAccount"
62
62
  properties: GCPServiceAccountNodeProperties = GCPServiceAccountNodeProperties()
63
63
  sub_resource_relationship: GCPPrincipalToProject = GCPPrincipalToProject()
64
64
 
65
65
 
66
66
  @dataclass(frozen=True)
67
67
  class GCPRoleSchema(CartographyNodeSchema):
68
- label: str = 'GCPRole'
68
+ label: str = "GCPRole"
69
69
  properties: GCPRoleNodeProperties = GCPRoleNodeProperties()
70
70
  sub_resource_relationship: GCPPrincipalToProject = GCPPrincipalToProject()
@@ -4,6 +4,7 @@ This schema does not handle the org's relationships. Those are handled by other
4
4
  * GitHubUserSchema defines (GitHubUser)-[MEMBER_OF|ADMIN_OF|UNAFFILIATED]->(GitHubOrganization)
5
5
  (There may be others, these are just two examples.)
6
6
  """
7
+
7
8
  from dataclasses import dataclass
8
9
 
9
10
  from cartography.models.core.common import PropertyRef
@@ -13,14 +14,14 @@ from cartography.models.core.nodes import CartographyNodeSchema
13
14
 
14
15
  @dataclass(frozen=True)
15
16
  class GitHubOrganizationNodeProperties(CartographyNodeProperties):
16
- id: PropertyRef = PropertyRef('url')
17
- username: PropertyRef = PropertyRef('login', extra_index=True)
18
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
17
+ id: PropertyRef = PropertyRef("url")
18
+ username: PropertyRef = PropertyRef("login", extra_index=True)
19
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
19
20
 
20
21
 
21
22
  @dataclass(frozen=True)
22
23
  class GitHubOrganizationSchema(CartographyNodeSchema):
23
- label: str = 'GitHubOrganization'
24
+ label: str = "GitHubOrganization"
24
25
  properties: GitHubOrganizationNodeProperties = GitHubOrganizationNodeProperties()
25
26
  other_relationships = None
26
27
  sub_resource_relationship = None
@@ -13,23 +13,23 @@ from cartography.models.core.relationships import TargetNodeMatcher
13
13
 
14
14
  @dataclass(frozen=True)
15
15
  class GitHubTeamNodeProperties(CartographyNodeProperties):
16
- id: PropertyRef = PropertyRef('url')
17
- url: PropertyRef = PropertyRef('url')
18
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
19
- name: PropertyRef = PropertyRef('name', extra_index=True)
20
- description: PropertyRef = PropertyRef('description')
16
+ id: PropertyRef = PropertyRef("url")
17
+ url: PropertyRef = PropertyRef("url")
18
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
19
+ name: PropertyRef = PropertyRef("name", extra_index=True)
20
+ description: PropertyRef = PropertyRef("description")
21
21
 
22
22
 
23
23
  @dataclass(frozen=True)
24
24
  class GitHubTeamToRepoRelProperties(CartographyRelProperties):
25
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
25
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
26
26
 
27
27
 
28
28
  @dataclass(frozen=True)
29
29
  class GitHubTeamAdminRepoRel(CartographyRelSchema):
30
- target_node_label: str = 'GitHubRepository'
30
+ target_node_label: str = "GitHubRepository"
31
31
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
32
- {'id': PropertyRef('ADMIN')},
32
+ {"id": PropertyRef("ADMIN")},
33
33
  )
34
34
  direction: LinkDirection = LinkDirection.OUTWARD
35
35
  rel_label: str = "ADMIN"
@@ -38,9 +38,9 @@ class GitHubTeamAdminRepoRel(CartographyRelSchema):
38
38
 
39
39
  @dataclass(frozen=True)
40
40
  class GitHubTeamMaintainRepoRel(CartographyRelSchema):
41
- target_node_label: str = 'GitHubRepository'
41
+ target_node_label: str = "GitHubRepository"
42
42
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
43
- {'id': PropertyRef('MAINTAIN')},
43
+ {"id": PropertyRef("MAINTAIN")},
44
44
  )
45
45
  direction: LinkDirection = LinkDirection.OUTWARD
46
46
  rel_label: str = "MAINTAIN"
@@ -49,9 +49,9 @@ class GitHubTeamMaintainRepoRel(CartographyRelSchema):
49
49
 
50
50
  @dataclass(frozen=True)
51
51
  class GitHubTeamReadRepoRel(CartographyRelSchema):
52
- target_node_label: str = 'GitHubRepository'
52
+ target_node_label: str = "GitHubRepository"
53
53
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
54
- {'id': PropertyRef('READ')},
54
+ {"id": PropertyRef("READ")},
55
55
  )
56
56
  direction: LinkDirection = LinkDirection.OUTWARD
57
57
  rel_label: str = "READ"
@@ -60,9 +60,9 @@ class GitHubTeamReadRepoRel(CartographyRelSchema):
60
60
 
61
61
  @dataclass(frozen=True)
62
62
  class GitHubTeamTriageRepoRel(CartographyRelSchema):
63
- target_node_label: str = 'GitHubRepository'
63
+ target_node_label: str = "GitHubRepository"
64
64
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
65
- {'id': PropertyRef('TRIAGE')},
65
+ {"id": PropertyRef("TRIAGE")},
66
66
  )
67
67
  direction: LinkDirection = LinkDirection.OUTWARD
68
68
  rel_label: str = "TRIAGE"
@@ -71,9 +71,9 @@ class GitHubTeamTriageRepoRel(CartographyRelSchema):
71
71
 
72
72
  @dataclass(frozen=True)
73
73
  class GitHubTeamWriteRepoRel(CartographyRelSchema):
74
- target_node_label: str = 'GitHubRepository'
74
+ target_node_label: str = "GitHubRepository"
75
75
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
76
- {'id': PropertyRef('WRITE')},
76
+ {"id": PropertyRef("WRITE")},
77
77
  )
78
78
  direction: LinkDirection = LinkDirection.OUTWARD
79
79
  rel_label: str = "WRITE"
@@ -82,14 +82,14 @@ class GitHubTeamWriteRepoRel(CartographyRelSchema):
82
82
 
83
83
  @dataclass(frozen=True)
84
84
  class GitHubTeamToUserRelProperties(CartographyRelProperties):
85
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
85
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
86
86
 
87
87
 
88
88
  @dataclass(frozen=True)
89
89
  class GitHubTeamMaintainerUserRel(CartographyRelSchema):
90
- target_node_label: str = 'GitHubUser'
90
+ target_node_label: str = "GitHubUser"
91
91
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
92
- {'id': PropertyRef('MAINTAINER')},
92
+ {"id": PropertyRef("MAINTAINER")},
93
93
  )
94
94
  direction: LinkDirection = LinkDirection.INWARD
95
95
  rel_label: str = "MAINTAINER"
@@ -98,9 +98,9 @@ class GitHubTeamMaintainerUserRel(CartographyRelSchema):
98
98
 
99
99
  @dataclass(frozen=True)
100
100
  class GitHubTeamMemberUserRel(CartographyRelSchema):
101
- target_node_label: str = 'GitHubUser'
101
+ target_node_label: str = "GitHubUser"
102
102
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
103
- {'id': PropertyRef('MEMBER')},
103
+ {"id": PropertyRef("MEMBER")},
104
104
  )
105
105
  direction: LinkDirection = LinkDirection.INWARD
106
106
  rel_label: str = "MEMBER"
@@ -109,39 +109,43 @@ class GitHubTeamMemberUserRel(CartographyRelSchema):
109
109
 
110
110
  @dataclass(frozen=True)
111
111
  class GitHubTeamToOrganizationRelProperties(CartographyRelProperties):
112
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
112
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
113
113
 
114
114
 
115
115
  @dataclass(frozen=True)
116
116
  class GitHubTeamToOrganizationRel(CartographyRelSchema):
117
- target_node_label: str = 'GitHubOrganization'
117
+ target_node_label: str = "GitHubOrganization"
118
118
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
119
- {'id': PropertyRef('org_url', set_in_kwargs=True)},
119
+ {"id": PropertyRef("org_url", set_in_kwargs=True)},
120
120
  )
121
121
  direction: LinkDirection = LinkDirection.INWARD
122
122
  rel_label: str = "RESOURCE"
123
- properties: GitHubTeamToOrganizationRelProperties = GitHubTeamToOrganizationRelProperties()
123
+ properties: GitHubTeamToOrganizationRelProperties = (
124
+ GitHubTeamToOrganizationRelProperties()
125
+ )
124
126
 
125
127
 
126
128
  @dataclass(frozen=True)
127
129
  class GitHubTeamToChildTeamRelProperties(CartographyRelProperties):
128
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
130
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
129
131
 
130
132
 
131
133
  @dataclass(frozen=True)
132
134
  class GitHubTeamChildTeamRel(CartographyRelSchema):
133
- target_node_label: str = 'GitHubTeam'
135
+ target_node_label: str = "GitHubTeam"
134
136
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
135
- {'id': PropertyRef('MEMBER_OF_TEAM')},
137
+ {"id": PropertyRef("MEMBER_OF_TEAM")},
136
138
  )
137
139
  direction: LinkDirection = LinkDirection.INWARD
138
140
  rel_label: str = "MEMBER_OF_TEAM"
139
- properties: GitHubTeamToChildTeamRelProperties = GitHubTeamToChildTeamRelProperties()
141
+ properties: GitHubTeamToChildTeamRelProperties = (
142
+ GitHubTeamToChildTeamRelProperties()
143
+ )
140
144
 
141
145
 
142
146
  @dataclass(frozen=True)
143
147
  class GitHubTeamSchema(CartographyNodeSchema):
144
- label: str = 'GitHubTeam'
148
+ label: str = "GitHubTeam"
145
149
  properties: GitHubTeamNodeProperties = GitHubTeamNodeProperties()
146
150
  other_relationships: OtherRelationships = OtherRelationships(
147
151
  [
@@ -155,4 +159,6 @@ class GitHubTeamSchema(CartographyNodeSchema):
155
159
  GitHubTeamChildTeamRel(),
156
160
  ],
157
161
  )
158
- sub_resource_relationship: GitHubTeamToOrganizationRel = GitHubTeamToOrganizationRel()
162
+ sub_resource_relationship: GitHubTeamToOrganizationRel = (
163
+ GitHubTeamToOrganizationRel()
164
+ )