cartography 0.100.0rc3__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 +2 -2
- cartography/graph/statement.py +10 -10
- cartography/intel/aws/ec2/launch_templates.py +35 -32
- cartography/intel/gcp/__init__.py +25 -7
- cartography/intel/gsuite/__init__.py +0 -1
- {cartography-0.100.0rc3.dist-info → cartography-0.101.0rc1.dist-info}/METADATA +5 -4
- {cartography-0.100.0rc3.dist-info → cartography-0.101.0rc1.dist-info}/RECORD +11 -11
- {cartography-0.100.0rc3.dist-info → cartography-0.101.0rc1.dist-info}/WHEEL +1 -1
- {cartography-0.100.0rc3.dist-info → cartography-0.101.0rc1.dist-info}/entry_points.txt +0 -0
- {cartography-0.100.0rc3.dist-info → cartography-0.101.0rc1.dist-info/licenses}/LICENSE +0 -0
- {cartography-0.100.0rc3.dist-info → cartography-0.101.0rc1.dist-info}/top_level.txt +0 -0
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.
|
|
21
|
-
__version_tuple__ = version_tuple = (0,
|
|
20
|
+
__version__ = version = '0.101.0rc1'
|
|
21
|
+
__version_tuple__ = version_tuple = (0, 101, 0)
|
cartography/graph/statement.py
CHANGED
|
@@ -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)
|
|
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.
|
|
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
|
-
#
|
|
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
|
|
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
|
-
|
|
125
|
+
summary: neo4j.ResultSummary = session.write_transaction(self._run_noniterative)
|
|
122
126
|
|
|
123
|
-
|
|
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(
|
|
@@ -3,7 +3,6 @@ from typing import Any
|
|
|
3
3
|
|
|
4
4
|
import boto3
|
|
5
5
|
import neo4j
|
|
6
|
-
from botocore.exceptions import ClientError
|
|
7
6
|
|
|
8
7
|
from .util import get_botocore_config
|
|
9
8
|
from cartography.client.core.tx import load
|
|
@@ -21,27 +20,45 @@ logger = logging.getLogger(__name__)
|
|
|
21
20
|
def get_launch_templates(
|
|
22
21
|
boto3_session: boto3.session.Session,
|
|
23
22
|
region: str,
|
|
24
|
-
) ->
|
|
23
|
+
) -> list[dict[str, Any]]:
|
|
25
24
|
client = boto3_session.client('ec2', region_name=region, config=get_botocore_config())
|
|
26
25
|
paginator = client.get_paginator('describe_launch_templates')
|
|
27
26
|
templates: list[dict[str, Any]] = []
|
|
28
|
-
template_versions: list[dict[str, Any]] = []
|
|
29
27
|
for page in paginator.paginate():
|
|
30
28
|
paginated_templates = page['LaunchTemplates']
|
|
31
|
-
for template in paginated_templates:
|
|
32
|
-
template_id = template['LaunchTemplateId']
|
|
33
|
-
try:
|
|
34
|
-
versions = get_launch_template_versions_by_template(boto3_session, template_id, region)
|
|
35
|
-
except ClientError as e:
|
|
36
|
-
logger.warning(
|
|
37
|
-
f"Failed to get launch template versions for {template_id}: {e}",
|
|
38
|
-
exc_info=True,
|
|
39
|
-
)
|
|
40
|
-
versions = []
|
|
41
|
-
# Using a key not defined in latest boto3 documentation
|
|
42
|
-
template_versions.extend(versions)
|
|
43
29
|
templates.extend(paginated_templates)
|
|
44
|
-
return templates
|
|
30
|
+
return templates
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@timeit
|
|
34
|
+
@aws_handle_regions
|
|
35
|
+
def get_launch_template_versions(
|
|
36
|
+
boto3_session: boto3.session.Session,
|
|
37
|
+
region: str,
|
|
38
|
+
launch_templates: list[dict[str, Any]],
|
|
39
|
+
) -> list[dict[str, Any]]:
|
|
40
|
+
template_versions: list[dict[str, Any]] = []
|
|
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'])
|
|
61
|
+
return template_versions
|
|
45
62
|
|
|
46
63
|
|
|
47
64
|
def transform_launch_templates(templates: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
|
@@ -71,21 +88,6 @@ def load_launch_templates(
|
|
|
71
88
|
)
|
|
72
89
|
|
|
73
90
|
|
|
74
|
-
@timeit
|
|
75
|
-
@aws_handle_regions
|
|
76
|
-
def get_launch_template_versions_by_template(
|
|
77
|
-
boto3_session: boto3.session.Session,
|
|
78
|
-
template: str,
|
|
79
|
-
region: str,
|
|
80
|
-
) -> list[dict[str, Any]]:
|
|
81
|
-
client = boto3_session.client('ec2', region_name=region, config=get_botocore_config())
|
|
82
|
-
v_paginator = client.get_paginator('describe_launch_template_versions')
|
|
83
|
-
template_versions = []
|
|
84
|
-
for versions in v_paginator.paginate(LaunchTemplateId=template):
|
|
85
|
-
template_versions.extend(versions['LaunchTemplateVersions'])
|
|
86
|
-
return template_versions
|
|
87
|
-
|
|
88
|
-
|
|
89
91
|
def transform_launch_template_versions(versions: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
|
90
92
|
result: list[dict[str, Any]] = []
|
|
91
93
|
for version in versions:
|
|
@@ -153,7 +155,8 @@ def sync_ec2_launch_templates(
|
|
|
153
155
|
) -> None:
|
|
154
156
|
for region in regions:
|
|
155
157
|
logger.info(f"Syncing launch templates for region '{region}' in account '{current_aws_account_id}'.")
|
|
156
|
-
templates
|
|
158
|
+
templates = get_launch_templates(boto3_session, region)
|
|
159
|
+
versions = get_launch_template_versions(boto3_session, region, templates)
|
|
157
160
|
templates = transform_launch_templates(templates)
|
|
158
161
|
load_launch_templates(neo4j_session, templates, region, current_aws_account_id, update_tag)
|
|
159
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
|
-
|
|
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.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: cartography
|
|
3
|
-
Version: 0.
|
|
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
|
|
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.
|
|
65
|
+
Requires-Dist: types-requests<2.32.0.20250307; extra == "dev"
|
|
66
|
+
Dynamic: license-file
|
|
66
67
|
|
|
67
68
|

|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
362
|
-
cartography-0.
|
|
363
|
-
cartography-0.
|
|
364
|
-
cartography-0.
|
|
365
|
-
cartography-0.
|
|
366
|
-
cartography-0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|