cartography 0.100.0rc4__py3-none-any.whl → 0.101.0rc1__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.

cartography/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.100.0rc4'
21
- __version_tuple__ = version_tuple = (0, 100, 0)
20
+ __version__ = version = '0.101.0rc1'
21
+ __version_tuple__ = version_tuple = (0, 101, 0)
@@ -73,7 +73,8 @@ class GraphStatement:
73
73
  if self.iterative:
74
74
  self._run_iterative(session)
75
75
  else:
76
- session.write_transaction(self._run_noniterative).consume()
76
+ session.write_transaction(self._run_noniterative)
77
+
77
78
  logger.info(f"Completed {self.parent_job_name} statement #{self.parent_job_sequence_num}")
78
79
 
79
80
  def as_dict(self) -> Dict[str, Any]:
@@ -87,14 +88,17 @@ class GraphStatement:
87
88
  "iterationsize": self.iterationsize,
88
89
  }
89
90
 
90
- def _run_noniterative(self, tx: neo4j.Transaction) -> neo4j.Result:
91
+ def _run_noniterative(self, tx: neo4j.Transaction) -> neo4j.ResultSummary:
91
92
  """
92
93
  Non-iterative statement execution.
94
+ Returns a ResultSummary instead of Result to avoid ResultConsumedError.
93
95
  """
94
96
  result: neo4j.Result = tx.run(self.query, self.parameters)
95
97
 
96
- # Handle stats
98
+ # Ensure we consume the result inside the transaction
97
99
  summary: neo4j.ResultSummary = result.consume()
100
+
101
+ # Handle stats
98
102
  stat_handler.incr('constraints_added', summary.counters.constraints_added)
99
103
  stat_handler.incr('constraints_removed', summary.counters.constraints_removed)
100
104
  stat_handler.incr('indexes_added', summary.counters.indexes_added)
@@ -107,7 +111,7 @@ class GraphStatement:
107
111
  stat_handler.incr('relationships_created', summary.counters.relationships_created)
108
112
  stat_handler.incr('relationships_deleted', summary.counters.relationships_deleted)
109
113
 
110
- return result
114
+ return summary
111
115
 
112
116
  def _run_iterative(self, session: neo4j.Session) -> None:
113
117
  """
@@ -118,14 +122,10 @@ class GraphStatement:
118
122
  self.parameters["LIMIT_SIZE"] = self.iterationsize
119
123
 
120
124
  while True:
121
- result: neo4j.Result = session.write_transaction(self._run_noniterative)
125
+ summary: neo4j.ResultSummary = session.write_transaction(self._run_noniterative)
122
126
 
123
- # Exit if we have finished processing all items
124
- if not result.consume().counters.contains_updates:
125
- # Ensure network buffers are cleared
126
- result.consume()
127
+ if not summary.counters.contains_updates:
127
128
  break
128
- result.consume()
129
129
 
130
130
  @classmethod
131
131
  def create_from_json(
@@ -35,13 +35,29 @@ def get_launch_templates(
35
35
  def get_launch_template_versions(
36
36
  boto3_session: boto3.session.Session,
37
37
  region: str,
38
+ launch_templates: list[dict[str, Any]],
38
39
  ) -> list[dict[str, Any]]:
39
- client = boto3_session.client('ec2', region_name=region, config=get_botocore_config())
40
- paginator = client.get_paginator('describe_launch_template_versions')
41
40
  template_versions: list[dict[str, Any]] = []
42
- for page in paginator.paginate():
43
- paginated_versions = page['LaunchTemplateVersions']
44
- template_versions.extend(paginated_versions)
41
+ for template in launch_templates:
42
+ launch_template_id = template['LaunchTemplateId']
43
+ versions = get_launch_template_versions_by_template(boto3_session, launch_template_id, region)
44
+ template_versions.extend(versions)
45
+
46
+ return template_versions
47
+
48
+
49
+ @timeit
50
+ @aws_handle_regions
51
+ def get_launch_template_versions_by_template(
52
+ boto3_session: boto3.session.Session,
53
+ launch_template_id: str,
54
+ region: str,
55
+ ) -> list[dict[str, Any]]:
56
+ client = boto3_session.client('ec2', region_name=region, config=get_botocore_config())
57
+ v_paginator = client.get_paginator('describe_launch_template_versions')
58
+ template_versions = []
59
+ for versions in v_paginator.paginate(LaunchTemplateId=launch_template_id):
60
+ template_versions.extend(versions['LaunchTemplateVersions'])
45
61
  return template_versions
46
62
 
47
63
 
@@ -140,7 +156,7 @@ def sync_ec2_launch_templates(
140
156
  for region in regions:
141
157
  logger.info(f"Syncing launch templates for region '{region}' in account '{current_aws_account_id}'.")
142
158
  templates = get_launch_templates(boto3_session, region)
143
- versions = get_launch_template_versions(boto3_session, region)
159
+ versions = get_launch_template_versions(boto3_session, region, templates)
144
160
  templates = transform_launch_templates(templates)
145
161
  load_launch_templates(neo4j_session, templates, region, current_aws_account_id, update_tag)
146
162
  versions = transform_launch_template_versions(versions)
@@ -254,6 +254,30 @@ def _sync_single_project_dns(
254
254
  dns.sync(neo4j_session, dns_cred, project_id, gcp_update_tag, common_job_parameters)
255
255
 
256
256
 
257
+ def _sync_single_project_iam(
258
+ neo4j_session: neo4j.Session,
259
+ resources: Resource,
260
+ project_id: str,
261
+ gcp_update_tag: int,
262
+ common_job_parameters: Dict,
263
+ ) -> None:
264
+ """
265
+ Handles graph sync for a single GCP project's IAM resources.
266
+ :param neo4j_session: The Neo4j session
267
+ :param resources: namedtuple of the GCP resource objects
268
+ :param project_id: The project ID number to sync. See the `projectId` field in
269
+ https://cloud.google.com/resource-manager/reference/rest/v1/projects
270
+ :param gcp_update_tag: The timestamp value to set our new Neo4j nodes with
271
+ :param common_job_parameters: Other parameters sent to Neo4j
272
+ :return: Nothing
273
+ """
274
+ # Determine if IAM service is enabled
275
+ enabled_services = _services_enabled_on_project(resources.serviceusage, project_id)
276
+ iam_cred = _get_iam_resource(get_gcp_credentials())
277
+ if service_names.iam in enabled_services:
278
+ iam.sync(neo4j_session, iam_cred, project_id, gcp_update_tag, common_job_parameters)
279
+
280
+
257
281
  def _sync_multiple_projects(
258
282
  neo4j_session: neo4j.Session, resources: Resource, projects: List[Dict],
259
283
  gcp_update_tag: int, common_job_parameters: Dict,
@@ -300,13 +324,7 @@ def _sync_multiple_projects(
300
324
  for project in projects:
301
325
  project_id = project['projectId']
302
326
  logger.info("Syncing GCP project %s for IAM", project_id)
303
- iam.sync(
304
- neo4j_session,
305
- resources.iam,
306
- project_id,
307
- gcp_update_tag,
308
- common_job_parameters,
309
- )
327
+ _sync_single_project_iam(neo4j_session, resources, project_id, gcp_update_tag, common_job_parameters)
310
328
 
311
329
 
312
330
  @timeit
@@ -23,7 +23,6 @@ OAUTH_SCOPES = [
23
23
  'https://www.googleapis.com/auth/admin.directory.user.readonly',
24
24
  'https://www.googleapis.com/auth/admin.directory.group.readonly',
25
25
  'https://www.googleapis.com/auth/admin.directory.group.member',
26
- 'https://www.googleapis.com/auth/cloud-platform',
27
26
  ]
28
27
 
29
28
  logger = logging.getLogger(__name__)
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: cartography
3
- Version: 0.100.0rc4
3
+ Version: 0.101.0rc1
4
4
  Summary: Explore assets and their relationships across your technical infrastructure.
5
5
  Maintainer: Cartography Contributors
6
6
  License: apache2
@@ -26,7 +26,7 @@ Requires-Dist: backoff>=2.1.2
26
26
  Requires-Dist: boto3>=1.15.1
27
27
  Requires-Dist: botocore>=1.18.1
28
28
  Requires-Dist: dnspython>=1.15.0
29
- Requires-Dist: neo4j<5.0.0,>=4.4.4
29
+ Requires-Dist: neo4j>=4.4.4
30
30
  Requires-Dist: policyuniverse>=1.1.0.0
31
31
  Requires-Dist: google-api-python-client>=1.7.8
32
32
  Requires-Dist: google-auth>=2.37.0
@@ -62,7 +62,8 @@ Requires-Dist: pytest-mock; extra == "dev"
62
62
  Requires-Dist: pytest-cov==6.0.0; extra == "dev"
63
63
  Requires-Dist: pytest-rerunfailures; extra == "dev"
64
64
  Requires-Dist: types-PyYAML; extra == "dev"
65
- Requires-Dist: types-requests<2.32.0.20250302; extra == "dev"
65
+ Requires-Dist: types-requests<2.32.0.20250307; extra == "dev"
66
+ Dynamic: license-file
66
67
 
67
68
  ![Cartography](docs/root/images/logo-horizontal.png)
68
69
 
@@ -1,6 +1,6 @@
1
1
  cartography/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  cartography/__main__.py,sha256=JftXT_nUPkqcEh8uxCCT4n-OyHYqbldEgrDS-4ygy0U,101
3
- cartography/_version.py,sha256=XNabPAacgLtT7W1DDFP4RS2MjLNRDWXmvHKjCNXBM9A,518
3
+ cartography/_version.py,sha256=ORpBOjdY4rMeGh1HRP5Dqaew_G6Wkj15Ps0ozN8YaTs,518
4
4
  cartography/cli.py,sha256=-77DOKUQn3N-TDIi55V4RHLb3k36ZGZ64o1XgiT0qmE,33370
5
5
  cartography/config.py,sha256=ZcadsKmooAkti9Kv0eDl8Ec1PcZDu3lWobtNaCnwY3k,11872
6
6
  cartography/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -135,7 +135,7 @@ cartography/graph/cleanupbuilder.py,sha256=zZc7SvRz23sU_VN-RrHoyhug7dRZlqbbLwHbr
135
135
  cartography/graph/context.py,sha256=RGxGb8EnxowcqjR0nFF86baNhgRHeUF9wjIoFUoG8LU,1230
136
136
  cartography/graph/job.py,sha256=RZWsbNhHuJlcSpw4C73ZuovRTp7kGrcm3X9yUH8vT1Q,7488
137
137
  cartography/graph/querybuilder.py,sha256=7DtIGPlfeKcIWKw_ReCAX1OeUkhSnIRV_reeVaKL6I4,20416
138
- cartography/graph/statement.py,sha256=VsqG46ty_Mm87fr8YdIwfr6a82OUXU7yZe6S-Py9hZg,5345
138
+ cartography/graph/statement.py,sha256=Dr6wrlmodUwwh8jnMVaHZAuxrkYyTASokQcmn9AnA9E,5311
139
139
  cartography/intel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
140
  cartography/intel/analysis.py,sha256=gHtN42NqqLL1G5MOm2Q6rMyg-V5lU_wqbnKp5hbOOao,1499
141
141
  cartography/intel/create_indexes.py,sha256=HM2jB2v3NZvGqgVDtNoBQRVpkei_JXcYXqM14w8Rjss,741
@@ -174,7 +174,7 @@ cartography/intel/aws/ec2/images.py,sha256=SLoxcy_PQgNomVMDMdutm0zXJCOLosiHJlN63
174
174
  cartography/intel/aws/ec2/instances.py,sha256=uI8eVJmeEybS8y_T8CVKAkwxJyVDCH7sbuEJYeWGSWY,12468
175
175
  cartography/intel/aws/ec2/internet_gateways.py,sha256=dI-4-85_3DGGZZBcY_DN6XqESx9P26S6jKok314lcnQ,2883
176
176
  cartography/intel/aws/ec2/key_pairs.py,sha256=g4imIo_5jk8upq9J4--erg-OZXG2i3cJMe6SnNCYj9s,2635
177
- cartography/intel/aws/ec2/launch_templates.py,sha256=9s7opSzdpErDzxknAsPOXb63Cr0BJM4S-wcxFuInFXs,5346
177
+ cartography/intel/aws/ec2/launch_templates.py,sha256=uw0_knQW0DGFgD4BUyaxYW0RpWyA_oXcDe-oT6MEaps,5902
178
178
  cartography/intel/aws/ec2/load_balancer_v2s.py,sha256=95FfQQn740gexINIHDJizOM4OKzRtQT_y2XQMipQ5Dg,8661
179
179
  cartography/intel/aws/ec2/load_balancers.py,sha256=1GwErzGqi3BKCARqfGJcD_r_D84rFKVy5kNMas9jAok,6756
180
180
  cartography/intel/aws/ec2/network_acls.py,sha256=_UiOx79OxcqH0ecRjcVMglAzz5XJ4aVYLlv6dl_ism4,6809
@@ -220,7 +220,7 @@ cartography/intel/duo/phones.py,sha256=ueJheqSLD2xYcMus5eOiixPYS3_xVjgQzeomjV2a6
220
220
  cartography/intel/duo/tokens.py,sha256=bEEnjfc4waQnkRHVSnZLAeGE8wHOOZL7FA9m80GGQdQ,2396
221
221
  cartography/intel/duo/users.py,sha256=lc7ly_XKeUjJ50szw31WT_GiCrZfGKJv1zVUpmTchh4,4097
222
222
  cartography/intel/duo/web_authn_credentials.py,sha256=IbDf3CWqfEyI7f9zJugUvoDd6vZOECfb_7ANZaRYzuk,2636
223
- cartography/intel/gcp/__init__.py,sha256=csFnE0_lznp3UfJZZSCCWF0gzdf_qz7sXuMzzZs_NvY,16516
223
+ cartography/intel/gcp/__init__.py,sha256=iJPcmkXjMITBf2h9CFJ5-vpLMNRzReoKIazNihRPrNA,17472
224
224
  cartography/intel/gcp/compute.py,sha256=CH2cBdOwbLZCAbkfRJkkI-sFybXVKRWEUGDJANQmvyA,48333
225
225
  cartography/intel/gcp/crm.py,sha256=Uw5PILhVFhpM8gq7uu2v7F_YikDW3gsTZ3d7-e8Z1_k,12324
226
226
  cartography/intel/gcp/dns.py,sha256=y2pvbmV04cnrMyuu_nbW3oc7uwHX6yEzn1n7veCsjmk,7748
@@ -232,7 +232,7 @@ cartography/intel/github/repos.py,sha256=MmpxZASDJFQxDeSMxX3pZcpxCHFPos4_uYC_cX9
232
232
  cartography/intel/github/teams.py,sha256=AltQSmBHHmyzBtnRkez9Bo5yChEKBSt3wwzhGcfqmX4,14180
233
233
  cartography/intel/github/users.py,sha256=MCLE0V0UCzQm3k3KmrNe6PYkI6usRQZYy2rCN3mT8o0,8948
234
234
  cartography/intel/github/util.py,sha256=K0cXOPuhnGvN-aqcSUBO3vTuKQLjufVal9kn2HwOpbo,8110
235
- cartography/intel/gsuite/__init__.py,sha256=FZS4WVCjOCvGqrq2E-yhZ_dtViQSy1srs_YEohibpWU,5466
235
+ cartography/intel/gsuite/__init__.py,sha256=R3hMZkaRQKHIPcvNpupwJuj7w1RuBrT4skGQASqxyOk,5412
236
236
  cartography/intel/gsuite/api.py,sha256=bx0mPn6x6fgssxgm343NHdwjbtFkO6SZTucOsoW0Hgk,11143
237
237
  cartography/intel/jamf/__init__.py,sha256=Nof-LrUeevoieo6oP2GyfTwx8k5TUIgreW6hSj53YjQ,419
238
238
  cartography/intel/jamf/computers.py,sha256=EfjlupQ-9HYTjOrmuwrGuJDy9ApAnJvk8WrYcp6_Jkk,1673
@@ -358,9 +358,9 @@ cartography/models/snipeit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
358
358
  cartography/models/snipeit/asset.py,sha256=FyRAaeXuZjMy0eUQcSDFcgEAF5lbLMlvqp1Tv9d3Lv4,3238
359
359
  cartography/models/snipeit/tenant.py,sha256=p4rFnpNNuF1W5ilGBbexDaETWTwavfb38RcQGoImkQI,679
360
360
  cartography/models/snipeit/user.py,sha256=MsB4MiCVNTH6JpESime7cOkB89autZOXQpL6Z0l7L6o,2113
361
- cartography-0.100.0rc4.dist-info/LICENSE,sha256=kvLEBRYaQ1RvUni6y7Ti9uHeooqnjPoo6n_-0JO1ETc,11351
362
- cartography-0.100.0rc4.dist-info/METADATA,sha256=Ybi85b9tT6kYixO3WY-Y5TDc1El7FmVRTG_7oWyH95g,11859
363
- cartography-0.100.0rc4.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
364
- cartography-0.100.0rc4.dist-info/entry_points.txt,sha256=GVIAWD0o0_K077qMA_k1oZU4v-M0a8GLKGJR8tZ-qH8,112
365
- cartography-0.100.0rc4.dist-info/top_level.txt,sha256=BHqsNJQiI6Q72DeypC1IINQJE59SLhU4nllbQjgJi9g,12
366
- cartography-0.100.0rc4.dist-info/RECORD,,
361
+ cartography-0.101.0rc1.dist-info/licenses/LICENSE,sha256=kvLEBRYaQ1RvUni6y7Ti9uHeooqnjPoo6n_-0JO1ETc,11351
362
+ cartography-0.101.0rc1.dist-info/METADATA,sha256=3PbiexiXh8bkS9as6Dqn-auI1yOcDxfc93KOJ8CuIyI,11874
363
+ cartography-0.101.0rc1.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
364
+ cartography-0.101.0rc1.dist-info/entry_points.txt,sha256=GVIAWD0o0_K077qMA_k1oZU4v-M0a8GLKGJR8tZ-qH8,112
365
+ cartography-0.101.0rc1.dist-info/top_level.txt,sha256=BHqsNJQiI6Q72DeypC1IINQJE59SLhU4nllbQjgJi9g,12
366
+ cartography-0.101.0rc1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (76.0.0)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5