pltr-cli 0.9.3__py3-none-any.whl → 0.11.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.
pltr/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.9.3"
1
+ __version__ = "0.11.0"
pltr/commands/folder.py CHANGED
@@ -279,7 +279,7 @@ def _format_children_table(children: List[dict]):
279
279
  table = Table(title="Folder Children", show_header=True, header_style="bold cyan")
280
280
  table.add_column("Type", style="cyan")
281
281
  table.add_column("Display Name")
282
- table.add_column("RID")
282
+ table.add_column("RID", no_wrap=True)
283
283
 
284
284
  for child in children:
285
285
  table.add_row(
@@ -296,8 +296,8 @@ def _format_folders_batch_table(folders: List[dict]):
296
296
  """Format multiple folders as a table."""
297
297
  table = Table(title="Folders", show_header=True, header_style="bold cyan")
298
298
  table.add_column("Display Name")
299
- table.add_column("RID")
300
- table.add_column("Parent Folder")
299
+ table.add_column("RID", no_wrap=True)
300
+ table.add_column("Parent Folder", no_wrap=True)
301
301
  table.add_column("Description")
302
302
 
303
303
  for folder in folders:
pltr/commands/ontology.py CHANGED
@@ -366,6 +366,99 @@ def list_linked_objects(
366
366
  raise typer.Exit(1)
367
367
 
368
368
 
369
+ @app.command("object-count")
370
+ def count_objects(
371
+ ontology_rid: str = typer.Argument(..., help="Ontology Resource Identifier"),
372
+ object_type: str = typer.Argument(..., help="Object type API name"),
373
+ profile: Optional[str] = typer.Option(None, "--profile", "-p", help="Profile name"),
374
+ format: str = typer.Option(
375
+ "table", "--format", "-f", help="Output format (table, json, csv)"
376
+ ),
377
+ output: Optional[str] = typer.Option(
378
+ None, "--output", "-o", help="Output file path"
379
+ ),
380
+ branch: Optional[str] = typer.Option(None, "--branch", "-b", help="Branch name"),
381
+ ):
382
+ """Count objects of a specific type."""
383
+ try:
384
+ service = OntologyObjectService(profile=profile)
385
+
386
+ with SpinnerProgressTracker().track_spinner(
387
+ f"Counting {object_type} objects..."
388
+ ):
389
+ result = service.count_objects(ontology_rid, object_type, branch=branch)
390
+
391
+ formatter.format_dict(result, format=format, output=output)
392
+
393
+ if output:
394
+ formatter.print_success(f"Count result saved to {output}")
395
+
396
+ except (ProfileNotFoundError, MissingCredentialsError) as e:
397
+ formatter.print_error(f"Authentication error: {e}")
398
+ raise typer.Exit(1)
399
+ except Exception as e:
400
+ formatter.print_error(f"Failed to count objects: {e}")
401
+ raise typer.Exit(1)
402
+
403
+
404
+ @app.command("object-search")
405
+ def search_objects(
406
+ ontology_rid: str = typer.Argument(..., help="Ontology Resource Identifier"),
407
+ object_type: str = typer.Argument(..., help="Object type API name"),
408
+ query: str = typer.Option(..., "--query", "-q", help="Search query string"),
409
+ profile: Optional[str] = typer.Option(None, "--profile", "-p", help="Profile name"),
410
+ format: str = typer.Option(
411
+ "table", "--format", "-f", help="Output format (table, json, csv)"
412
+ ),
413
+ output: Optional[str] = typer.Option(
414
+ None, "--output", "-o", help="Output file path"
415
+ ),
416
+ page_size: Optional[int] = typer.Option(
417
+ None, "--page-size", help="Number of results per page"
418
+ ),
419
+ properties: Optional[str] = typer.Option(
420
+ None, "--properties", help="Comma-separated list of properties to include"
421
+ ),
422
+ branch: Optional[str] = typer.Option(None, "--branch", "-b", help="Branch name"),
423
+ ):
424
+ """Search objects by query."""
425
+ try:
426
+ service = OntologyObjectService(profile=profile)
427
+
428
+ prop_list = properties.split(",") if properties else None
429
+
430
+ with SpinnerProgressTracker().track_spinner(
431
+ f"Searching {object_type} objects..."
432
+ ):
433
+ objects = service.search_objects(
434
+ ontology_rid,
435
+ object_type,
436
+ query,
437
+ page_size=page_size,
438
+ properties=prop_list,
439
+ branch=branch,
440
+ )
441
+
442
+ if format == "table" and objects:
443
+ # Use first object's keys as columns
444
+ columns = list(objects[0].keys()) if objects else []
445
+ formatter.format_table(
446
+ objects, columns=columns, format=format, output=output
447
+ )
448
+ else:
449
+ formatter.format_list(objects, format=format, output=output)
450
+
451
+ if output:
452
+ formatter.print_success(f"Search results saved to {output}")
453
+
454
+ except (ProfileNotFoundError, MissingCredentialsError) as e:
455
+ formatter.print_error(f"Authentication error: {e}")
456
+ raise typer.Exit(1)
457
+ except Exception as e:
458
+ formatter.print_error(f"Failed to search objects: {e}")
459
+ raise typer.Exit(1)
460
+
461
+
369
462
  # Action commands
370
463
  @app.command("action-apply")
371
464
  def apply_action(
@@ -92,7 +92,46 @@ def create_build(
92
92
  "table", "--format", "-f", help="Output format (table, json, csv)"
93
93
  ),
94
94
  ):
95
- """Create a new build."""
95
+ """
96
+ Create a new build with specified target datasets.
97
+
98
+ The target parameter must be a JSON object with a 'type' field that specifies
99
+ the build strategy. Three types are supported:
100
+
101
+ \b
102
+ 1. Manual Build - Explicitly specify datasets to build:
103
+ {
104
+ "type": "manual",
105
+ "targetRids": ["ri.foundry.main.dataset.abc123..."]
106
+ }
107
+
108
+ \b
109
+ 2. Upstream Build - Build target datasets and all their upstream dependencies:
110
+ {
111
+ "type": "upstream",
112
+ "targetRids": ["ri.foundry.main.dataset.abc123..."],
113
+ "ignoredRids": []
114
+ }
115
+
116
+ \b
117
+ 3. Connecting Build - Build datasets between input and target datasets:
118
+ {
119
+ "type": "connecting",
120
+ "inputRids": ["ri.foundry.main.dataset.input123..."],
121
+ "targetRids": ["ri.foundry.main.dataset.target123..."],
122
+ "ignoredRids": []
123
+ }
124
+
125
+ Examples:
126
+
127
+ \b
128
+ # Build specific datasets manually
129
+ pltr orchestration builds create '{"type": "manual", "targetRids": ["ri.foundry.main.dataset.abc123"]}' --branch master
130
+
131
+ \b
132
+ # Build dataset and all upstream dependencies
133
+ pltr orchestration builds create '{"type": "upstream", "targetRids": ["ri.foundry.main.dataset.abc123"], "ignoredRids": []}' --branch master --force
134
+ """
96
135
  try:
97
136
  service = OrchestrationService(profile=profile)
98
137
 
pltr/commands/resource.py CHANGED
@@ -79,6 +79,64 @@ def get_resource(
79
79
  raise typer.Exit(1)
80
80
 
81
81
 
82
+ @app.command("get-by-path")
83
+ def get_resource_by_path(
84
+ path: str = typer.Argument(
85
+ ...,
86
+ help="Absolute path to the resource (e.g., '/My Organization/Project/Dataset')",
87
+ ),
88
+ profile: Optional[str] = typer.Option(
89
+ None, "--profile", help="Profile name", autocompletion=complete_profile
90
+ ),
91
+ format: str = typer.Option(
92
+ "table",
93
+ "--format",
94
+ "-f",
95
+ help="Output format (table, json, csv)",
96
+ autocompletion=complete_output_format,
97
+ ),
98
+ output: Optional[str] = typer.Option(
99
+ None, "--output", "-o", help="Output file path"
100
+ ),
101
+ ):
102
+ """Get detailed information about a specific resource by its path."""
103
+ try:
104
+ service = ResourceService(profile=profile)
105
+
106
+ with SpinnerProgressTracker().track_spinner(
107
+ f"Fetching resource at path '{path}'..."
108
+ ):
109
+ resource = service.get_resource_by_path(path)
110
+
111
+ # Cache the RID for future completions
112
+ if resource.get("rid"):
113
+ cache_rid(resource["rid"])
114
+
115
+ # Format output
116
+ if format == "json":
117
+ if output:
118
+ formatter.save_to_file(resource, output, "json")
119
+ else:
120
+ formatter.format_dict(resource)
121
+ elif format == "csv":
122
+ if output:
123
+ formatter.save_to_file([resource], output, "csv")
124
+ else:
125
+ formatter.format_list([resource])
126
+ else:
127
+ _format_resource_table(resource)
128
+
129
+ if output:
130
+ formatter.print_success(f"Resource information saved to {output}")
131
+
132
+ except (ProfileNotFoundError, MissingCredentialsError) as e:
133
+ formatter.print_error(f"Authentication error: {e}")
134
+ raise typer.Exit(1)
135
+ except Exception as e:
136
+ formatter.print_error(f"Failed to get resource: {e}")
137
+ raise typer.Exit(1)
138
+
139
+
82
140
  @app.command("list")
83
141
  def list_resources(
84
142
  folder_rid: Optional[str] = typer.Option(
@@ -469,12 +527,15 @@ def main():
469
527
 
470
528
  Manage resources in the Foundry filesystem. Get resource information,
471
529
  search resources, manage metadata, and perform operations using Resource
472
- Identifiers (RIDs).
530
+ Identifiers (RIDs) or paths.
473
531
 
474
532
  Examples:
475
- # Get resource information
533
+ # Get resource information by RID
476
534
  pltr resource get ri.compass.main.dataset.xyz123
477
535
 
536
+ # Get resource information by path
537
+ pltr resource get-by-path "/My Organization/Project/Dataset Name"
538
+
478
539
  # List all resources
479
540
  pltr resource list
480
541
 
pltr/services/dataset.py CHANGED
@@ -487,18 +487,15 @@ class DatasetService(BaseService):
487
487
  # Ensure output directory exists
488
488
  output_path.parent.mkdir(parents=True, exist_ok=True)
489
489
 
490
- file_content = self.service.Dataset.File.read(
490
+ # Use Dataset.File.content() which returns bytes directly
491
+ # Note: In SDK v1.27.0, the method is 'content' not 'read'
492
+ file_content = self.service.Dataset.File.content(
491
493
  dataset_rid=dataset_rid, file_path=file_path, branch_name=branch
492
494
  )
493
495
 
494
- # Write file content to disk
496
+ # Write file content to disk (file_content is bytes)
495
497
  with open(output_path, "wb") as f:
496
- if hasattr(file_content, "read"):
497
- # If it's a stream
498
- f.write(file_content.read())
499
- else:
500
- # If it's bytes
501
- f.write(file_content)
498
+ f.write(file_content)
502
499
 
503
500
  return {
504
501
  "dataset_rid": dataset_rid,
pltr/services/ontology.py CHANGED
@@ -287,6 +287,77 @@ class OntologyObjectService(BaseService):
287
287
  except Exception as e:
288
288
  raise RuntimeError(f"Failed to list linked objects: {e}")
289
289
 
290
+ def count_objects(
291
+ self,
292
+ ontology_rid: str,
293
+ object_type: str,
294
+ branch: Optional[str] = None,
295
+ ) -> Dict[str, Any]:
296
+ """
297
+ Count objects of a specific type.
298
+
299
+ Args:
300
+ ontology_rid: Ontology Resource Identifier
301
+ object_type: Object type API name
302
+ branch: Branch name (optional)
303
+
304
+ Returns:
305
+ Dictionary containing count information
306
+ """
307
+ try:
308
+ count = self.service.OntologyObject.count(
309
+ ontology_rid,
310
+ object_type,
311
+ branch_name=branch,
312
+ )
313
+ return {
314
+ "ontology_rid": ontology_rid,
315
+ "object_type": object_type,
316
+ "count": count,
317
+ "branch": branch,
318
+ }
319
+ except Exception as e:
320
+ raise RuntimeError(f"Failed to count objects: {e}")
321
+
322
+ def search_objects(
323
+ self,
324
+ ontology_rid: str,
325
+ object_type: str,
326
+ query: str,
327
+ page_size: Optional[int] = None,
328
+ properties: Optional[List[str]] = None,
329
+ branch: Optional[str] = None,
330
+ ) -> List[Dict[str, Any]]:
331
+ """
332
+ Search objects by query.
333
+
334
+ Args:
335
+ ontology_rid: Ontology Resource Identifier
336
+ object_type: Object type API name
337
+ query: Search query string
338
+ page_size: Number of results per page
339
+ properties: List of properties to include
340
+ branch: Branch name (optional)
341
+
342
+ Returns:
343
+ List of matching object dictionaries
344
+ """
345
+ try:
346
+ result = self.service.OntologyObject.search(
347
+ ontology_rid,
348
+ object_type,
349
+ query=query,
350
+ page_size=page_size,
351
+ properties=properties,
352
+ branch_name=branch,
353
+ )
354
+ objects = []
355
+ for obj in result:
356
+ objects.append(self._format_object(obj))
357
+ return objects
358
+ except Exception as e:
359
+ raise RuntimeError(f"Failed to search objects: {e}")
360
+
290
361
  def _format_object(self, obj: Any) -> Dict[str, Any]:
291
362
  """Format object for consistent output."""
292
363
  # Objects may have various properties - extract them dynamically
pltr/services/resource.py CHANGED
@@ -30,6 +30,22 @@ class ResourceService(BaseService):
30
30
  except Exception as e:
31
31
  raise RuntimeError(f"Failed to get resource {resource_rid}: {e}")
32
32
 
33
+ def get_resource_by_path(self, path: str) -> Dict[str, Any]:
34
+ """
35
+ Get information about a specific resource by its path.
36
+
37
+ Args:
38
+ path: Absolute path to the resource (e.g., "/My Organization/Project/Dataset")
39
+
40
+ Returns:
41
+ Resource information dictionary
42
+ """
43
+ try:
44
+ resource = self.service.Resource.get_by_path(path=path, preview=True)
45
+ return self._format_resource_info(resource)
46
+ except Exception as e:
47
+ raise RuntimeError(f"Failed to get resource at path '{path}': {e}")
48
+
33
49
  def list_resources(
34
50
  self,
35
51
  folder_rid: Optional[str] = None,
pltr/utils/formatting.py CHANGED
@@ -64,7 +64,8 @@ class OutputFormatter:
64
64
  f.write(json_str)
65
65
  return None
66
66
  else:
67
- rich_print(json_str)
67
+ # Use plain print to ensure valid JSON output without ANSI codes
68
+ print(json_str)
68
69
  return json_str
69
70
 
70
71
  def _format_csv(
@@ -141,7 +142,11 @@ class OutputFormatter:
141
142
 
142
143
  # Add columns to table
143
144
  for column in columns:
144
- table.add_column(column, overflow="fold")
145
+ # Don't truncate RID columns - they need full visibility
146
+ if "rid" in column.lower():
147
+ table.add_column(column, no_wrap=True, overflow="fold")
148
+ else:
149
+ table.add_column(column, overflow="fold")
145
150
 
146
151
  # Add rows
147
152
  for item in data:
@@ -424,7 +429,8 @@ class OutputFormatter:
424
429
  else:
425
430
  # For simple values, just print them
426
431
  if format_type == "json":
427
- rich_print(json.dumps(data, indent=2, default=str))
432
+ # Use plain print to ensure valid JSON output without ANSI codes
433
+ print(json.dumps(data, indent=2, default=str))
428
434
  else:
429
435
  rich_print(str(data))
430
436
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pltr-cli
3
- Version: 0.9.3
3
+ Version: 0.11.0
4
4
  Summary: Command-line interface for Palantir Foundry APIs
5
5
  Project-URL: Homepage, https://github.com/anjor/pltr-cli
6
6
  Project-URL: Repository, https://github.com/anjor/pltr-cli
@@ -1,4 +1,4 @@
1
- pltr/__init__.py,sha256=xKd3pzbczuMsdB08eLAOqZDUd_q1IRxwZ_ccAFL4c4A,22
1
+ pltr/__init__.py,sha256=raMu9XA9JEjvdoTmFqcOw7qhJX24rYDP7XmS59TAO-Q,23
2
2
  pltr/__main__.py,sha256=HWJ49UoAYBQCf8kjuySPmBTuUjTZrOx-y6PzMTyS1KE,879
3
3
  pltr/cli.py,sha256=DikRsWsU7QWvRWHgB6wZIct916ebWyaub7PlAjKJXws,2664
4
4
  pltr/auth/__init__.py,sha256=G0V-Rh25FaJsH2nhrf146XQQG_ApdbyPJNuHJC25kgk,38
@@ -14,12 +14,12 @@ pltr/commands/completion.py,sha256=YTxaRL4-rDs5n7aXf3ogFsxbHVJUBo_HiBbd0fbBPZ0,1
14
14
  pltr/commands/configure.py,sha256=oYj-VlOEj3MDwtB2RC4bYOYzI_sXTanPnz7y1GmMTqY,4800
15
15
  pltr/commands/connectivity.py,sha256=m8_BYwHij_5IbrYFTU_SYYtbqLCjxA8VIQpbdlWJqHs,14758
16
16
  pltr/commands/dataset.py,sha256=zuYtBXAGcfRjxE7cP9Hsz2tqSlsdNzdIflGKwytHbVI,53346
17
- pltr/commands/folder.py,sha256=IAPPA3Smk1IWqThneEtZ08Zp79vDKVUabSkL_nDvUWk,10679
17
+ pltr/commands/folder.py,sha256=ItUp49lyDWIoMv8RaNDo7JFyrlk-r_Klab9FCPXwUM8,10721
18
18
  pltr/commands/mediasets.py,sha256=FXq7OtYU9wLgUxQFcS_fkA4i_CozGnsYKxh8GOSI0ok,15342
19
- pltr/commands/ontology.py,sha256=zUgSrmv8xi26SQK7GsM3qusgR9Wuka0GyzE7L8DkduE,18317
20
- pltr/commands/orchestration.py,sha256=4gq5nb43bU0Ub3iaKV-EgXT_ka8ilwdyxY_9M5iS84s,21958
19
+ pltr/commands/ontology.py,sha256=I5USog2YyDP9rTrrhl_nEMmTrM94GICiR0T-HJ9LeAI,21858
20
+ pltr/commands/orchestration.py,sha256=mizGJIuMEJGAW9-ic_q-WawAe4PKBgtJSUfysk6YI68,23227
21
21
  pltr/commands/project.py,sha256=nlfyy4OYkYK9rtjOQp9awgCnSJ1P6sgsp0vaXdvkHFY,14183
22
- pltr/commands/resource.py,sha256=VQsDSdeHlLoind34DU9dKu13tqSvsCUtYzxwDYULXSA,16384
22
+ pltr/commands/resource.py,sha256=8lS_iHqkvjKwodvPwqaTD2vYbHwPdEx3U1u3IDgvcA4,18392
23
23
  pltr/commands/resource_role.py,sha256=pM0DQxLBU9xyIYzLv1Y0sOMZG5oZ1INNSkMubYBGHJM,15394
24
24
  pltr/commands/shell.py,sha256=QLF7TEGpaau9i0A9s3VjnegvtHde-SLRqI4suJFT4WI,3622
25
25
  pltr/commands/space.py,sha256=R9TN9OQVDtFB92DOjrh81_YYajiQaqRNELsBHK4O-pI,21944
@@ -33,23 +33,23 @@ pltr/services/__init__.py,sha256=zQpgrqPdAkZI-nobi33mctU2-iGNgazzvjBVY8YRbSQ,101
33
33
  pltr/services/admin.py,sha256=8FjExmDeIKeVqkAxM83SVvpp_pH9W-Q33cgVs6BHxLQ,9957
34
34
  pltr/services/base.py,sha256=JF9cyYf7njZuj1ldOLdgzIDhJjOfazBvXPNR-gKVnMY,3682
35
35
  pltr/services/connectivity.py,sha256=34kazXhue5gNi1_2s2R5Ma4VQe6jP25CO-ztiPhCeZw,10548
36
- pltr/services/dataset.py,sha256=LFoK8otJ_MYqH0x5rcmNyIi5X0zr_Q8KP-zG9reArPA,45027
36
+ pltr/services/dataset.py,sha256=PB5PrNpnuCfzr7bqQ0corTmFTdZ9j1YWUHtRjIrXorM,44995
37
37
  pltr/services/folder.py,sha256=mWElyvn-wXPB5sv8Ik_dLeW5JM6jZg3g9KKBk6UcrlQ,5389
38
38
  pltr/services/mediasets.py,sha256=HgHNFWoG9r-5xupANVOxHg_h5EKsBDl6PsO8hwdbm28,9854
39
- pltr/services/ontology.py,sha256=iW7qRK8ptlw-u4eAwLNC-mdzLoLZzh7SRqJyok2c3GU,14883
39
+ pltr/services/ontology.py,sha256=yZO0c2fzF0XTrXn-RImNWVBCKmAvngL55wxGJXR7mJU,17011
40
40
  pltr/services/orchestration.py,sha256=z1lofohVNRVlKyHffo_K1-I-1f9ZqsLKxQuyUOhAGlY,14729
41
41
  pltr/services/project.py,sha256=nwLXBX0MWgOnVQ7CAZQHnzZtSJY_hqlGyooFngQSjcc,7740
42
- pltr/services/resource.py,sha256=hX1DX5ZoVx8-ZImBitHqgMS8Ver022RoMbd4ZvCt-fA,9603
42
+ pltr/services/resource.py,sha256=J7cGsgy5lsWGu5fGhOQOo5TgFY7x0oCk3e1CRB3V9Dw,10186
43
43
  pltr/services/resource_role.py,sha256=Ootor16c6PR9TNxe6KJyd4W2lYM_HHDxJk-JvZhgRxU,10608
44
44
  pltr/services/space.py,sha256=4uea1nQ6CA-6_xWoD6n49E4Zm6KbW_7Cq9o89JorMTE,11544
45
45
  pltr/services/sql.py,sha256=19cscjlzN8WE1s8_ctiRcrOvMzCfmWRj49vjJ8Gs5Q4,11286
46
46
  pltr/utils/__init__.py,sha256=DF7TigL1XbKVGM5VjgU8_8AGIszofkdO80oCzLGGnTE,38
47
47
  pltr/utils/alias_resolver.py,sha256=DIF7P1UnUU8kqocJfIDEWjYq4s8_0KfqRZBbECeZEh8,1539
48
48
  pltr/utils/completion.py,sha256=bjeqjleEfB2YcQFpcxvF0GoQ763F6KBbULSZC4FWY_g,4980
49
- pltr/utils/formatting.py,sha256=38g3G2T5WUFKCCKo42NIBR8_Rdl4pp0ytCEZURoV3l4,50275
49
+ pltr/utils/formatting.py,sha256=TpxbOXdXbk_aUUnj8FrjMPLSnTmtlpYZf0Oe6g6Wmvc,50626
50
50
  pltr/utils/progress.py,sha256=BKYbiLO61uhQbibabU7pxvvbAWMRLRmqk4pZldBQK_g,9053
51
- pltr_cli-0.9.3.dist-info/METADATA,sha256=cbk9mQdi1knwhq-7jJw3V3AMF3oVvLd4Li21dOP9B0A,17714
52
- pltr_cli-0.9.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
53
- pltr_cli-0.9.3.dist-info/entry_points.txt,sha256=8tvEcW04kA_oAE2Dwwu-Og9efjl4ESJvs4AzlP2KBdQ,38
54
- pltr_cli-0.9.3.dist-info/licenses/LICENSE,sha256=6VUFd_ytnOBD2O1tmkKrA-smigi9QEhYr_tge4h4z8Y,1070
55
- pltr_cli-0.9.3.dist-info/RECORD,,
51
+ pltr_cli-0.11.0.dist-info/METADATA,sha256=rDBrj8VA3UmOuJvA0bCSN0vcAXrE-IYUQktuc7e3XNQ,17715
52
+ pltr_cli-0.11.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
53
+ pltr_cli-0.11.0.dist-info/entry_points.txt,sha256=8tvEcW04kA_oAE2Dwwu-Og9efjl4ESJvs4AzlP2KBdQ,38
54
+ pltr_cli-0.11.0.dist-info/licenses/LICENSE,sha256=6VUFd_ytnOBD2O1tmkKrA-smigi9QEhYr_tge4h4z8Y,1070
55
+ pltr_cli-0.11.0.dist-info/RECORD,,