pltr-cli 0.3.0__py3-none-any.whl → 0.5.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/cli.py +10 -0
- pltr/commands/dataset.py +309 -0
- pltr/commands/folder.py +338 -0
- pltr/commands/mediasets.py +422 -0
- pltr/commands/orchestration.py +642 -0
- pltr/services/dataset.py +368 -10
- pltr/services/folder.py +167 -0
- pltr/services/mediasets.py +293 -0
- pltr/services/orchestration.py +457 -0
- pltr/utils/formatting.py +638 -0
- {pltr_cli-0.3.0.dist-info → pltr_cli-0.5.0.dist-info}/METADATA +139 -5
- {pltr_cli-0.3.0.dist-info → pltr_cli-0.5.0.dist-info}/RECORD +15 -11
- pltr/services/dataset_full.py +0 -302
- pltr/services/dataset_v2.py +0 -128
- {pltr_cli-0.3.0.dist-info → pltr_cli-0.5.0.dist-info}/WHEEL +0 -0
- {pltr_cli-0.3.0.dist-info → pltr_cli-0.5.0.dist-info}/entry_points.txt +0 -0
- {pltr_cli-0.3.0.dist-info → pltr_cli-0.5.0.dist-info}/licenses/LICENSE +0 -0
pltr/services/dataset.py
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
"""
|
|
2
|
-
Dataset service wrapper for Foundry SDK
|
|
3
|
-
Only includes operations that are actually supported by foundry-platform-sdk v1.27.0.
|
|
2
|
+
Dataset service wrapper for Foundry SDK.
|
|
4
3
|
"""
|
|
5
4
|
|
|
6
|
-
from typing import Any, Optional, Dict
|
|
5
|
+
from typing import Any, Optional, List, Dict, Union
|
|
6
|
+
from pathlib import Path
|
|
7
7
|
|
|
8
8
|
from .base import BaseService
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class DatasetService(BaseService):
|
|
12
|
-
"""Service wrapper for Foundry dataset operations
|
|
12
|
+
"""Service wrapper for Foundry dataset operations."""
|
|
13
13
|
|
|
14
14
|
def _get_service(self) -> Any:
|
|
15
15
|
"""Get the Foundry datasets service."""
|
|
16
16
|
return self.client.datasets
|
|
17
17
|
|
|
18
|
+
# list_datasets method removed - not supported by foundry-platform-sdk v1.27.0
|
|
19
|
+
|
|
18
20
|
def get_dataset(self, dataset_rid: str) -> Dict[str, Any]:
|
|
19
21
|
"""
|
|
20
22
|
Get information about a specific dataset.
|
|
@@ -32,7 +34,26 @@ class DatasetService(BaseService):
|
|
|
32
34
|
except Exception as e:
|
|
33
35
|
raise RuntimeError(f"Failed to get dataset {dataset_rid}: {e}")
|
|
34
36
|
|
|
35
|
-
|
|
37
|
+
def get_schema(self, dataset_rid: str) -> Dict[str, Any]:
|
|
38
|
+
"""
|
|
39
|
+
Get dataset schema.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
dataset_rid: Dataset Resource Identifier
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
Schema information
|
|
46
|
+
"""
|
|
47
|
+
try:
|
|
48
|
+
schema = self.service.Dataset.get_schema(dataset_rid)
|
|
49
|
+
return {
|
|
50
|
+
"dataset_rid": dataset_rid,
|
|
51
|
+
"schema": schema,
|
|
52
|
+
"type": str(type(schema)),
|
|
53
|
+
"status": "Schema retrieved successfully",
|
|
54
|
+
}
|
|
55
|
+
except Exception as e:
|
|
56
|
+
raise RuntimeError(f"Failed to get schema for dataset {dataset_rid}: {e}")
|
|
36
57
|
|
|
37
58
|
def create_dataset(
|
|
38
59
|
self, name: str, parent_folder_rid: Optional[str] = None
|
|
@@ -48,11 +69,20 @@ class DatasetService(BaseService):
|
|
|
48
69
|
Created dataset information
|
|
49
70
|
"""
|
|
50
71
|
try:
|
|
51
|
-
#
|
|
72
|
+
# Try the v2 API first (Dataset.create)
|
|
52
73
|
dataset = self.service.Dataset.create(
|
|
53
74
|
name=name, parent_folder_rid=parent_folder_rid
|
|
54
75
|
)
|
|
55
76
|
return self._format_dataset_info(dataset)
|
|
77
|
+
except AttributeError:
|
|
78
|
+
# Fallback to service.create_dataset
|
|
79
|
+
try:
|
|
80
|
+
dataset = self.service.create_dataset(
|
|
81
|
+
name=name, parent_folder_rid=parent_folder_rid
|
|
82
|
+
)
|
|
83
|
+
return self._format_dataset_info(dataset)
|
|
84
|
+
except Exception as e:
|
|
85
|
+
raise RuntimeError(f"Failed to create dataset '{name}': {e}")
|
|
56
86
|
except Exception as e:
|
|
57
87
|
raise RuntimeError(f"Failed to create dataset '{name}': {e}")
|
|
58
88
|
|
|
@@ -68,10 +98,328 @@ class DatasetService(BaseService):
|
|
|
68
98
|
Table data in specified format
|
|
69
99
|
"""
|
|
70
100
|
try:
|
|
101
|
+
# Try the v2 API first (Dataset.read_table)
|
|
71
102
|
return self.service.Dataset.read_table(dataset_rid, format=format)
|
|
103
|
+
except AttributeError:
|
|
104
|
+
# Fallback to service.read_table
|
|
105
|
+
try:
|
|
106
|
+
return self.service.read_table(dataset_rid, format=format)
|
|
107
|
+
except Exception as e:
|
|
108
|
+
raise RuntimeError(f"Failed to read dataset {dataset_rid}: {e}")
|
|
72
109
|
except Exception as e:
|
|
73
110
|
raise RuntimeError(f"Failed to read dataset {dataset_rid}: {e}")
|
|
74
111
|
|
|
112
|
+
def delete_dataset(self, dataset_rid: str) -> bool:
|
|
113
|
+
"""
|
|
114
|
+
Delete a dataset.
|
|
115
|
+
|
|
116
|
+
Args:
|
|
117
|
+
dataset_rid: Dataset Resource Identifier
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
True if deletion was successful
|
|
121
|
+
"""
|
|
122
|
+
try:
|
|
123
|
+
self.service.delete_dataset(dataset_rid)
|
|
124
|
+
return True
|
|
125
|
+
except Exception as e:
|
|
126
|
+
raise RuntimeError(f"Failed to delete dataset {dataset_rid}: {e}")
|
|
127
|
+
|
|
128
|
+
def upload_file(
|
|
129
|
+
self,
|
|
130
|
+
dataset_rid: str,
|
|
131
|
+
file_path: Union[str, Path],
|
|
132
|
+
branch: str = "master",
|
|
133
|
+
transaction_rid: Optional[str] = None,
|
|
134
|
+
) -> Dict[str, Any]:
|
|
135
|
+
"""
|
|
136
|
+
Upload a file to a dataset.
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
dataset_rid: Dataset Resource Identifier
|
|
140
|
+
file_path: Path to file to upload
|
|
141
|
+
branch: Dataset branch name
|
|
142
|
+
transaction_rid: Transaction RID (optional)
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
Upload result information
|
|
146
|
+
"""
|
|
147
|
+
file_path = Path(file_path)
|
|
148
|
+
if not file_path.exists():
|
|
149
|
+
raise FileNotFoundError(f"File not found: {file_path}")
|
|
150
|
+
|
|
151
|
+
try:
|
|
152
|
+
with open(file_path, "rb") as f:
|
|
153
|
+
result = self.service.upload_file(
|
|
154
|
+
dataset_rid=dataset_rid,
|
|
155
|
+
file_path=file_path.name,
|
|
156
|
+
file_data=f,
|
|
157
|
+
branch=branch,
|
|
158
|
+
transaction_rid=transaction_rid,
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
return {
|
|
162
|
+
"dataset_rid": dataset_rid,
|
|
163
|
+
"file_path": str(file_path),
|
|
164
|
+
"branch": branch,
|
|
165
|
+
"size_bytes": file_path.stat().st_size,
|
|
166
|
+
"uploaded": True,
|
|
167
|
+
"transaction_rid": getattr(result, "transaction_rid", transaction_rid),
|
|
168
|
+
}
|
|
169
|
+
except Exception as e:
|
|
170
|
+
raise RuntimeError(
|
|
171
|
+
f"Failed to upload file {file_path} to dataset {dataset_rid}: {e}"
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
def download_file(
|
|
175
|
+
self,
|
|
176
|
+
dataset_rid: str,
|
|
177
|
+
file_path: str,
|
|
178
|
+
output_path: Union[str, Path],
|
|
179
|
+
branch: str = "master",
|
|
180
|
+
) -> Dict[str, Any]:
|
|
181
|
+
"""
|
|
182
|
+
Download a file from a dataset.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
dataset_rid: Dataset Resource Identifier
|
|
186
|
+
file_path: Path of file within dataset
|
|
187
|
+
output_path: Local path to save the downloaded file
|
|
188
|
+
branch: Dataset branch name
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
Download result information
|
|
192
|
+
"""
|
|
193
|
+
output_path = Path(output_path)
|
|
194
|
+
|
|
195
|
+
try:
|
|
196
|
+
# Ensure output directory exists
|
|
197
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
198
|
+
|
|
199
|
+
file_content = self.service.download_file(
|
|
200
|
+
dataset_rid=dataset_rid, file_path=file_path, branch=branch
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
# Write file content to disk
|
|
204
|
+
with open(output_path, "wb") as f:
|
|
205
|
+
if hasattr(file_content, "read"):
|
|
206
|
+
# If it's a stream
|
|
207
|
+
f.write(file_content.read())
|
|
208
|
+
else:
|
|
209
|
+
# If it's bytes
|
|
210
|
+
f.write(file_content)
|
|
211
|
+
|
|
212
|
+
return {
|
|
213
|
+
"dataset_rid": dataset_rid,
|
|
214
|
+
"file_path": file_path,
|
|
215
|
+
"output_path": str(output_path),
|
|
216
|
+
"branch": branch,
|
|
217
|
+
"size_bytes": output_path.stat().st_size,
|
|
218
|
+
"downloaded": True,
|
|
219
|
+
}
|
|
220
|
+
except Exception as e:
|
|
221
|
+
raise RuntimeError(
|
|
222
|
+
f"Failed to download file {file_path} from dataset {dataset_rid}: {e}"
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
def list_files(
|
|
226
|
+
self, dataset_rid: str, branch: str = "master"
|
|
227
|
+
) -> List[Dict[str, Any]]:
|
|
228
|
+
"""
|
|
229
|
+
List files in a dataset.
|
|
230
|
+
|
|
231
|
+
Args:
|
|
232
|
+
dataset_rid: Dataset Resource Identifier
|
|
233
|
+
branch: Dataset branch name
|
|
234
|
+
|
|
235
|
+
Returns:
|
|
236
|
+
List of file information dictionaries
|
|
237
|
+
"""
|
|
238
|
+
try:
|
|
239
|
+
files = self.service.list_files(dataset_rid=dataset_rid, branch=branch)
|
|
240
|
+
|
|
241
|
+
return [
|
|
242
|
+
{
|
|
243
|
+
"path": file.path,
|
|
244
|
+
"size_bytes": getattr(file, "size_bytes", None),
|
|
245
|
+
"last_modified": getattr(file, "last_modified", None),
|
|
246
|
+
"transaction_rid": getattr(file, "transaction_rid", None),
|
|
247
|
+
}
|
|
248
|
+
for file in files
|
|
249
|
+
]
|
|
250
|
+
except Exception as e:
|
|
251
|
+
raise RuntimeError(f"Failed to list files in dataset {dataset_rid}: {e}")
|
|
252
|
+
|
|
253
|
+
def get_branches(self, dataset_rid: str) -> List[Dict[str, Any]]:
|
|
254
|
+
"""
|
|
255
|
+
Get list of branches for a dataset.
|
|
256
|
+
|
|
257
|
+
Args:
|
|
258
|
+
dataset_rid: Dataset Resource Identifier
|
|
259
|
+
|
|
260
|
+
Returns:
|
|
261
|
+
List of branch information dictionaries
|
|
262
|
+
"""
|
|
263
|
+
try:
|
|
264
|
+
branches = self.service.list_branches(dataset_rid=dataset_rid)
|
|
265
|
+
|
|
266
|
+
return [
|
|
267
|
+
{
|
|
268
|
+
"name": branch.name,
|
|
269
|
+
"transaction_rid": getattr(branch, "transaction_rid", None),
|
|
270
|
+
"created_time": getattr(branch, "created_time", None),
|
|
271
|
+
"created_by": getattr(branch, "created_by", None),
|
|
272
|
+
}
|
|
273
|
+
for branch in branches
|
|
274
|
+
]
|
|
275
|
+
except Exception as e:
|
|
276
|
+
raise RuntimeError(f"Failed to get branches for dataset {dataset_rid}: {e}")
|
|
277
|
+
|
|
278
|
+
def create_branch(
|
|
279
|
+
self, dataset_rid: str, branch_name: str, parent_branch: str = "master"
|
|
280
|
+
) -> Dict[str, Any]:
|
|
281
|
+
"""
|
|
282
|
+
Create a new branch for a dataset.
|
|
283
|
+
|
|
284
|
+
Args:
|
|
285
|
+
dataset_rid: Dataset Resource Identifier
|
|
286
|
+
branch_name: Name for the new branch
|
|
287
|
+
parent_branch: Parent branch to branch from
|
|
288
|
+
|
|
289
|
+
Returns:
|
|
290
|
+
Created branch information
|
|
291
|
+
"""
|
|
292
|
+
try:
|
|
293
|
+
branch = self.service.create_branch(
|
|
294
|
+
dataset_rid=dataset_rid,
|
|
295
|
+
branch_name=branch_name,
|
|
296
|
+
parent_branch=parent_branch,
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
return {
|
|
300
|
+
"name": branch.name,
|
|
301
|
+
"dataset_rid": dataset_rid,
|
|
302
|
+
"parent_branch": parent_branch,
|
|
303
|
+
"transaction_rid": getattr(branch, "transaction_rid", None),
|
|
304
|
+
}
|
|
305
|
+
except Exception as e:
|
|
306
|
+
raise RuntimeError(
|
|
307
|
+
f"Failed to create branch '{branch_name}' for dataset {dataset_rid}: {e}"
|
|
308
|
+
)
|
|
309
|
+
|
|
310
|
+
def get_transactions(
|
|
311
|
+
self, dataset_rid: str, branch: str = "master"
|
|
312
|
+
) -> List[Dict[str, Any]]:
|
|
313
|
+
"""
|
|
314
|
+
Get list of transactions for a dataset branch.
|
|
315
|
+
|
|
316
|
+
Args:
|
|
317
|
+
dataset_rid: Dataset Resource Identifier
|
|
318
|
+
branch: Dataset branch name
|
|
319
|
+
|
|
320
|
+
Returns:
|
|
321
|
+
List of transaction information dictionaries
|
|
322
|
+
"""
|
|
323
|
+
try:
|
|
324
|
+
# Note: This method may not be available in all SDK versions
|
|
325
|
+
transactions = self.service.list_transactions(
|
|
326
|
+
dataset_rid=dataset_rid, branch=branch
|
|
327
|
+
)
|
|
328
|
+
|
|
329
|
+
return [
|
|
330
|
+
{
|
|
331
|
+
"transaction_rid": getattr(transaction, "rid", None),
|
|
332
|
+
"created_time": getattr(transaction, "created_time", None),
|
|
333
|
+
"created_by": getattr(transaction, "created_by", None),
|
|
334
|
+
"status": getattr(transaction, "status", None),
|
|
335
|
+
}
|
|
336
|
+
for transaction in transactions
|
|
337
|
+
]
|
|
338
|
+
except AttributeError:
|
|
339
|
+
# Method not available in this SDK version
|
|
340
|
+
raise NotImplementedError(
|
|
341
|
+
"Transaction listing is not supported by this SDK version. "
|
|
342
|
+
"This feature may require a newer version of foundry-platform-python."
|
|
343
|
+
)
|
|
344
|
+
except Exception as e:
|
|
345
|
+
raise RuntimeError(
|
|
346
|
+
f"Failed to get transactions for dataset {dataset_rid}: {e}"
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
def get_views(self, dataset_rid: str) -> List[Dict[str, Any]]:
|
|
350
|
+
"""
|
|
351
|
+
Get list of views for a dataset.
|
|
352
|
+
|
|
353
|
+
Args:
|
|
354
|
+
dataset_rid: Dataset Resource Identifier
|
|
355
|
+
|
|
356
|
+
Returns:
|
|
357
|
+
List of view information dictionaries
|
|
358
|
+
"""
|
|
359
|
+
try:
|
|
360
|
+
# Note: This method may not be available in all SDK versions
|
|
361
|
+
views = self.service.list_views(dataset_rid=dataset_rid)
|
|
362
|
+
|
|
363
|
+
return [
|
|
364
|
+
{
|
|
365
|
+
"view_rid": getattr(view, "rid", None),
|
|
366
|
+
"name": getattr(view, "name", None),
|
|
367
|
+
"description": getattr(view, "description", None),
|
|
368
|
+
"created_time": getattr(view, "created_time", None),
|
|
369
|
+
"created_by": getattr(view, "created_by", None),
|
|
370
|
+
}
|
|
371
|
+
for view in views
|
|
372
|
+
]
|
|
373
|
+
except AttributeError:
|
|
374
|
+
# Method not available in this SDK version
|
|
375
|
+
raise NotImplementedError(
|
|
376
|
+
"View listing is not supported by this SDK version. "
|
|
377
|
+
"This feature may require a newer version of foundry-platform-python."
|
|
378
|
+
)
|
|
379
|
+
except Exception as e:
|
|
380
|
+
raise RuntimeError(f"Failed to get views for dataset {dataset_rid}: {e}")
|
|
381
|
+
|
|
382
|
+
def create_view(
|
|
383
|
+
self, dataset_rid: str, view_name: str, description: Optional[str] = None
|
|
384
|
+
) -> Dict[str, Any]:
|
|
385
|
+
"""
|
|
386
|
+
Create a new view for a dataset.
|
|
387
|
+
|
|
388
|
+
Args:
|
|
389
|
+
dataset_rid: Dataset Resource Identifier
|
|
390
|
+
view_name: Name for the new view
|
|
391
|
+
description: Optional description for the view
|
|
392
|
+
|
|
393
|
+
Returns:
|
|
394
|
+
Created view information
|
|
395
|
+
"""
|
|
396
|
+
try:
|
|
397
|
+
# Note: This method may not be available in all SDK versions
|
|
398
|
+
view = self.service.create_view(
|
|
399
|
+
dataset_rid=dataset_rid,
|
|
400
|
+
name=view_name,
|
|
401
|
+
description=description,
|
|
402
|
+
)
|
|
403
|
+
|
|
404
|
+
return {
|
|
405
|
+
"view_rid": getattr(view, "rid", None),
|
|
406
|
+
"name": view_name,
|
|
407
|
+
"description": description,
|
|
408
|
+
"dataset_rid": dataset_rid,
|
|
409
|
+
"created_time": getattr(view, "created_time", None),
|
|
410
|
+
"created_by": getattr(view, "created_by", None),
|
|
411
|
+
}
|
|
412
|
+
except AttributeError:
|
|
413
|
+
# Method not available in this SDK version
|
|
414
|
+
raise NotImplementedError(
|
|
415
|
+
"View creation is not supported by this SDK version. "
|
|
416
|
+
"This feature may require a newer version of foundry-platform-python."
|
|
417
|
+
)
|
|
418
|
+
except Exception as e:
|
|
419
|
+
raise RuntimeError(
|
|
420
|
+
f"Failed to create view '{view_name}' for dataset {dataset_rid}: {e}"
|
|
421
|
+
)
|
|
422
|
+
|
|
75
423
|
def _format_dataset_info(self, dataset: Any) -> Dict[str, Any]:
|
|
76
424
|
"""
|
|
77
425
|
Format dataset information for consistent output.
|
|
@@ -82,9 +430,19 @@ class DatasetService(BaseService):
|
|
|
82
430
|
Returns:
|
|
83
431
|
Formatted dataset information dictionary
|
|
84
432
|
"""
|
|
85
|
-
# The v2 Dataset object
|
|
433
|
+
# The v2 Dataset object has different attributes
|
|
86
434
|
return {
|
|
87
|
-
"rid": dataset
|
|
88
|
-
"name": dataset
|
|
89
|
-
"
|
|
435
|
+
"rid": getattr(dataset, "rid", "unknown"),
|
|
436
|
+
"name": getattr(dataset, "name", "Unknown"),
|
|
437
|
+
"description": getattr(dataset, "description", ""),
|
|
438
|
+
"path": getattr(dataset, "path", None),
|
|
439
|
+
"created": getattr(dataset, "created", None),
|
|
440
|
+
"modified": getattr(dataset, "modified", None),
|
|
441
|
+
# Try to get additional attributes that might exist
|
|
442
|
+
"created_time": getattr(dataset, "created_time", None),
|
|
443
|
+
"created_by": getattr(dataset, "created_by", None),
|
|
444
|
+
"last_modified": getattr(dataset, "last_modified", None),
|
|
445
|
+
"size_bytes": getattr(dataset, "size_bytes", None),
|
|
446
|
+
"schema_id": getattr(dataset, "schema_id", None),
|
|
447
|
+
"parent_folder_rid": getattr(dataset, "parent_folder_rid", None),
|
|
90
448
|
}
|
pltr/services/folder.py
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Folder service wrapper for Foundry SDK filesystem API.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Any, Optional, Dict, List
|
|
6
|
+
|
|
7
|
+
from .base import BaseService
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class FolderService(BaseService):
|
|
11
|
+
"""Service wrapper for Foundry folder operations using filesystem API."""
|
|
12
|
+
|
|
13
|
+
def _get_service(self) -> Any:
|
|
14
|
+
"""Get the Foundry filesystem service."""
|
|
15
|
+
return self.client.filesystem
|
|
16
|
+
|
|
17
|
+
def create_folder(
|
|
18
|
+
self, display_name: str, parent_folder_rid: str
|
|
19
|
+
) -> Dict[str, Any]:
|
|
20
|
+
"""
|
|
21
|
+
Create a new folder.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
display_name: Folder display name
|
|
25
|
+
parent_folder_rid: Parent folder RID (use 'ri.compass.main.folder.0' for root)
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
Created folder information
|
|
29
|
+
"""
|
|
30
|
+
try:
|
|
31
|
+
folder = self.service.Folder.create(
|
|
32
|
+
display_name=display_name,
|
|
33
|
+
parent_folder_rid=parent_folder_rid,
|
|
34
|
+
preview=True,
|
|
35
|
+
)
|
|
36
|
+
return self._format_folder_info(folder)
|
|
37
|
+
except Exception as e:
|
|
38
|
+
raise RuntimeError(f"Failed to create folder '{display_name}': {e}")
|
|
39
|
+
|
|
40
|
+
def get_folder(self, folder_rid: str) -> Dict[str, Any]:
|
|
41
|
+
"""
|
|
42
|
+
Get information about a specific folder.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
folder_rid: Folder Resource Identifier
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
Folder information dictionary
|
|
49
|
+
"""
|
|
50
|
+
try:
|
|
51
|
+
folder = self.service.Folder.get(folder_rid, preview=True)
|
|
52
|
+
return self._format_folder_info(folder)
|
|
53
|
+
except Exception as e:
|
|
54
|
+
raise RuntimeError(f"Failed to get folder {folder_rid}: {e}")
|
|
55
|
+
|
|
56
|
+
def list_children(
|
|
57
|
+
self,
|
|
58
|
+
folder_rid: str,
|
|
59
|
+
page_size: Optional[int] = None,
|
|
60
|
+
page_token: Optional[str] = None,
|
|
61
|
+
) -> List[Dict[str, Any]]:
|
|
62
|
+
"""
|
|
63
|
+
List all child resources of a folder.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
folder_rid: Folder Resource Identifier
|
|
67
|
+
page_size: Number of items per page (optional)
|
|
68
|
+
page_token: Pagination token (optional)
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
List of child resources
|
|
72
|
+
"""
|
|
73
|
+
try:
|
|
74
|
+
children = []
|
|
75
|
+
# The children method returns an iterator
|
|
76
|
+
for child in self.service.Folder.children(
|
|
77
|
+
folder_rid, page_size=page_size, page_token=page_token, preview=True
|
|
78
|
+
):
|
|
79
|
+
children.append(self._format_resource_info(child))
|
|
80
|
+
return children
|
|
81
|
+
except Exception as e:
|
|
82
|
+
raise RuntimeError(f"Failed to list children of folder {folder_rid}: {e}")
|
|
83
|
+
|
|
84
|
+
def get_folders_batch(self, folder_rids: List[str]) -> List[Dict[str, Any]]:
|
|
85
|
+
"""
|
|
86
|
+
Get multiple folders in a single request.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
folder_rids: List of folder RIDs (max 1000)
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
List of folder information dictionaries
|
|
93
|
+
"""
|
|
94
|
+
if len(folder_rids) > 1000:
|
|
95
|
+
raise ValueError("Maximum batch size is 1000 folders")
|
|
96
|
+
|
|
97
|
+
try:
|
|
98
|
+
response = self.service.Folder.get_batch(body=folder_rids, preview=True)
|
|
99
|
+
folders = []
|
|
100
|
+
for folder in response.folders:
|
|
101
|
+
folders.append(self._format_folder_info(folder))
|
|
102
|
+
return folders
|
|
103
|
+
except Exception as e:
|
|
104
|
+
raise RuntimeError(f"Failed to get folders batch: {e}")
|
|
105
|
+
|
|
106
|
+
def _format_folder_info(self, folder: Any) -> Dict[str, Any]:
|
|
107
|
+
"""
|
|
108
|
+
Format folder information for consistent output.
|
|
109
|
+
|
|
110
|
+
Args:
|
|
111
|
+
folder: Folder object from Foundry SDK
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
Formatted folder information dictionary
|
|
115
|
+
"""
|
|
116
|
+
return {
|
|
117
|
+
"rid": getattr(folder, "rid", None),
|
|
118
|
+
"display_name": getattr(folder, "display_name", None),
|
|
119
|
+
"description": getattr(folder, "description", None),
|
|
120
|
+
"created": self._format_timestamp(getattr(folder, "created", None)),
|
|
121
|
+
"modified": self._format_timestamp(getattr(folder, "modified", None)),
|
|
122
|
+
"parent_folder_rid": getattr(folder, "parent_folder_rid", None),
|
|
123
|
+
"type": "folder",
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
def _format_resource_info(self, resource: Any) -> Dict[str, Any]:
|
|
127
|
+
"""
|
|
128
|
+
Format resource information (can be folder, dataset, etc.).
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
resource: Resource object from Foundry SDK
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
Formatted resource information dictionary
|
|
135
|
+
"""
|
|
136
|
+
resource_type = getattr(resource, "type", "unknown")
|
|
137
|
+
base_info = {
|
|
138
|
+
"rid": getattr(resource, "rid", None),
|
|
139
|
+
"display_name": getattr(resource, "display_name", None),
|
|
140
|
+
"type": resource_type,
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
# Add type-specific fields
|
|
144
|
+
if resource_type == "folder":
|
|
145
|
+
base_info["description"] = getattr(resource, "description", None)
|
|
146
|
+
elif resource_type == "dataset":
|
|
147
|
+
base_info["name"] = getattr(resource, "name", None)
|
|
148
|
+
|
|
149
|
+
return base_info
|
|
150
|
+
|
|
151
|
+
def _format_timestamp(self, timestamp: Any) -> Optional[str]:
|
|
152
|
+
"""
|
|
153
|
+
Format timestamp for display.
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
timestamp: Timestamp object from SDK
|
|
157
|
+
|
|
158
|
+
Returns:
|
|
159
|
+
Formatted timestamp string or None
|
|
160
|
+
"""
|
|
161
|
+
if timestamp is None:
|
|
162
|
+
return None
|
|
163
|
+
|
|
164
|
+
# Handle different timestamp formats from the SDK
|
|
165
|
+
if hasattr(timestamp, "time"):
|
|
166
|
+
return str(timestamp.time)
|
|
167
|
+
return str(timestamp)
|