terrakio-core 0.3.4__py3-none-any.whl → 0.3.7__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 terrakio-core might be problematic. Click here for more details.

@@ -0,0 +1,371 @@
1
+ from typing import Dict, Any, List, Optional
2
+ from ..helper.decorators import require_token, require_api_key, require_auth
3
+
4
+ class DatasetManagement:
5
+ def __init__(self, client):
6
+ self._client = client
7
+
8
+
9
+ @require_api_key
10
+ def list_datasets(self, substring: Optional[str] = None, collection: str = "terrakio-datasets") -> List[Dict[str, Any]]:
11
+ """
12
+ List datasets, optionally filtering by a substring and collection.
13
+
14
+ Args:
15
+ substring: Substring to filter by (optional)
16
+ collection: Dataset collection (default: 'terrakio-datasets')
17
+
18
+ Returns:
19
+ List of datasets matching the criteria
20
+ """
21
+ params = {"collection": collection}
22
+ if substring:
23
+ params.update({"substring": substring})
24
+ return self._client._terrakio_request("GET", "/datasets", params = params)
25
+
26
+ @require_api_key
27
+ def get_dataset(self, name: str, collection: str = "terrakio-datasets") -> Dict[str, Any]:
28
+ """
29
+ Retrieve dataset info by dataset name.
30
+
31
+ Args:
32
+ name: The name of the dataset (required)
33
+ collection: The dataset collection (default: 'terrakio-datasets')
34
+
35
+ Returns:
36
+ Dataset information as a dictionary
37
+
38
+ Raises:
39
+ APIError: If the API request fails
40
+ """
41
+ params = {"collection": collection}
42
+ return self._client._terrakio_request("GET", f"/datasets/{name}", params = params)
43
+
44
+ @require_api_key
45
+ async def create_dataset(
46
+ self,
47
+ name: str,
48
+ collection: str = "terrakio-datasets",
49
+ products: Optional[List[str]] = None,
50
+ dates_iso8601: Optional[List[str]] = None,
51
+ bucket: Optional[str] = None,
52
+ path: Optional[str] = None,
53
+ data_type: Optional[str] = None,
54
+ no_data: Optional[Any] = None,
55
+ i_max: Optional[int] = None,
56
+ j_max: Optional[int] = None,
57
+ y_size: Optional[int] = None,
58
+ x_size: Optional[int] = None,
59
+ proj4: Optional[str] = None,
60
+ abstract: Optional[str] = None,
61
+ geotransform: Optional[List[float]] = None,
62
+ padding: Optional[Any] = None,
63
+ input: Optional[str] = None
64
+ ) -> Dict[str, Any]:
65
+ """
66
+ Create a new dataset.
67
+
68
+ Args:
69
+ name: Name of the dataset (required)
70
+ collection: Dataset collection (default: 'terrakio-datasets')
71
+ products: List of products
72
+ dates_iso8601: List of dates
73
+ bucket: Storage bucket
74
+ path: Storage path
75
+ data_type: Data type
76
+ no_data: No data value
77
+ i_max: Maximum level
78
+ j_max: Maximum level
79
+ y_size: Y size
80
+ x_size: X size
81
+ proj4: Projection string
82
+ abstract: Dataset abstract
83
+ geotransform: Geotransform parameters
84
+ padding: Padding value
85
+
86
+ Returns:
87
+ Created dataset information
88
+
89
+ Raises:
90
+ APIError: If the API request fails
91
+ """
92
+ params = {"collection": collection}
93
+ payload = {"name": name}
94
+ param_mapping = {
95
+ "products": products,
96
+ "dates_iso8601": dates_iso8601,
97
+ "bucket": bucket,
98
+ "path": path,
99
+ "data_type": data_type,
100
+ "no_data": no_data,
101
+ "i_max": i_max,
102
+ "j_max": j_max,
103
+ "y_size": y_size,
104
+ "x_size": x_size,
105
+ "proj4": proj4,
106
+ "abstract": abstract,
107
+ "geotransform": geotransform,
108
+ "padding": padding,
109
+ "input": input
110
+ }
111
+ for param, value in param_mapping.items():
112
+ if value is not None:
113
+ payload[param] = value
114
+ return await self._client._terrakio_request("POST", "/datasets", params = params, json = payload)
115
+
116
+ @require_api_key
117
+ def update_dataset(
118
+ self,
119
+ name: str,
120
+ append: bool = True,
121
+ collection: str = "terrakio-datasets",
122
+ products: Optional[List[str]] = None,
123
+ dates_iso8601: Optional[List[str]] = None,
124
+ bucket: Optional[str] = None,
125
+ path: Optional[str] = None,
126
+ data_type: Optional[str] = None,
127
+ no_data: Optional[Any] = None,
128
+ i_max: Optional[int] = None,
129
+ j_max: Optional[int] = None,
130
+ y_size: Optional[int] = None,
131
+ x_size: Optional[int] = None,
132
+ proj4: Optional[str] = None,
133
+ abstract: Optional[str] = None,
134
+ geotransform: Optional[List[float]] = None,
135
+ padding: Optional[Any] = None
136
+ ) -> Dict[str, Any]:
137
+ """
138
+ Update an existing dataset.
139
+
140
+ Args:
141
+ name: Name of the dataset (required)
142
+ append: Whether to append data or replace (default: True)
143
+ collection: Dataset collection (default: 'terrakio-datasets')
144
+ products: List of products
145
+ dates_iso8601: List of dates
146
+ bucket: Storage bucket
147
+ path: Storage path
148
+ data_type: Data type
149
+ no_data: No data value
150
+ i_max: Maximum level
151
+ j_max: Maximum level
152
+ y_size: Y size
153
+ x_size: X size
154
+ proj4: Projection string
155
+ abstract: Dataset abstract
156
+ geotransform: Geotransform parameters
157
+ padding: Padding value
158
+
159
+ Returns:
160
+ Updated dataset information
161
+
162
+ Raises:
163
+ APIError: If the API request fails
164
+ """
165
+ params = {"collection": collection, "append": str(append).lower()}
166
+ payload = {"name": name}
167
+ param_mapping = {
168
+ "products": products,
169
+ "dates_iso8601": dates_iso8601,
170
+ "bucket": bucket,
171
+ "path": path,
172
+ "data_type": data_type,
173
+ "no_data": no_data,
174
+ "i_max": i_max,
175
+ "j_max": j_max,
176
+ "y_size": y_size,
177
+ "x_size": x_size,
178
+ "proj4": proj4,
179
+ "abstract": abstract,
180
+ "geotransform": geotransform,
181
+ "padding": padding
182
+ }
183
+ for param, value in param_mapping.items():
184
+ if value is not None:
185
+ payload[param] = value
186
+ return self._client._terrakio_request("PATCH", "/datasets", params = params, json = payload)
187
+
188
+ @require_api_key
189
+ def update_virtual_dataset(
190
+ self,
191
+ name: str,
192
+ append: bool = True,
193
+ collection: str = "terrakio-datasets",
194
+ products: Optional[List[str]] = None,
195
+ dates_iso8601: Optional[List[str]] = None,
196
+ bucket: Optional[str] = None,
197
+ path: Optional[str] = None,
198
+ data_type: Optional[str] = None,
199
+ no_data: Optional[Any] = None,
200
+ i_max: Optional[int] = None,
201
+ j_max: Optional[int] = None,
202
+ y_size: Optional[int] = None,
203
+ x_size: Optional[int] = None,
204
+ proj4: Optional[str] = None,
205
+ abstract: Optional[str] = None,
206
+ geotransform: Optional[List[float]] = None,
207
+ padding: Optional[Any] = None,
208
+ input: Optional[str] = None,
209
+ ) -> Dict[str, Any]:
210
+ """
211
+ Update an existing dataset.
212
+
213
+ Args:
214
+ name: Name of the dataset (required)
215
+ append: Whether to append data or replace (default: True)
216
+ collection: Dataset collection (default: 'terrakio-datasets')
217
+ products: List of products
218
+ dates_iso8601: List of dates
219
+ bucket: Storage bucket
220
+ path: Storage path
221
+ data_type: Data type
222
+ no_data: No data value
223
+ i_max: Maximum level
224
+ j_max: Maximum level
225
+ y_size: Y size
226
+ x_size: X size
227
+ proj4: Projection string
228
+ abstract: Dataset abstract
229
+ geotransform: Geotransform parameters
230
+ padding: Padding value
231
+ input: The input for the virtual dataset
232
+
233
+ Returns:
234
+ Updated dataset information
235
+
236
+ Raises:
237
+ APIError: If the API request fails
238
+ """
239
+ params = {"collection": collection, "append": str(append).lower()}
240
+ payload = {"name": name}
241
+ param_mapping = {
242
+ "products": products,
243
+ "dates_iso8601": dates_iso8601,
244
+ "bucket": bucket,
245
+ "path": path,
246
+ "data_type": data_type,
247
+ "no_data": no_data,
248
+ "i_max": i_max,
249
+ "j_max": j_max,
250
+ "y_size": y_size,
251
+ "x_size": x_size,
252
+ "proj4": proj4,
253
+ "abstract": abstract,
254
+ "geotransform": geotransform,
255
+ "padding": padding,
256
+ "input": input,
257
+ }
258
+ for param, value in param_mapping.items():
259
+ if value is not None:
260
+ payload[param] = value
261
+ return self._client._terrakio_request("PATCH", "/datasets", params = params, json = payload)
262
+
263
+
264
+
265
+ @require_api_key
266
+ def overwrite_dataset(
267
+ self,
268
+ name: str,
269
+ collection: str = "terrakio-datasets",
270
+ products: Optional[List[str]] = None,
271
+ dates_iso8601: Optional[List[str]] = None,
272
+ bucket: Optional[str] = None,
273
+ path: Optional[str] = None,
274
+ data_type: Optional[str] = None,
275
+ no_data: Optional[Any] = None,
276
+ i_max: Optional[int] = None,
277
+ j_max: Optional[int] = None,
278
+ y_size: Optional[int] = None,
279
+ x_size: Optional[int] = None,
280
+ proj4: Optional[str] = None,
281
+ abstract: Optional[str] = None,
282
+ geotransform: Optional[List[float]] = None,
283
+ padding: Optional[Any] = None
284
+ ) -> Dict[str, Any]:
285
+ """
286
+ Overwrite a dataset.
287
+
288
+ Args:
289
+ name: Name of the dataset (required)
290
+ collection: Dataset collection (default: 'terrakio-datasets')
291
+ products: List of products
292
+ dates_iso8601: List of dates
293
+ bucket: Storage bucket
294
+ path: Storage path
295
+ data_type: Data type
296
+ no_data: No data value
297
+ i_max: Maximum level
298
+ j_max: Maximum level
299
+ y_size: Y size
300
+ x_size: X size
301
+ proj4: Projection string
302
+ abstract: Dataset abstract
303
+ geotransform: Geotransform parameters
304
+ padding: Padding value
305
+
306
+ Returns:
307
+ Overwritten dataset information
308
+
309
+ Raises:
310
+ APIError: If the API request fails
311
+ """
312
+ params = {"collection": collection}
313
+ payload = {"name": name}
314
+ param_mapping = {
315
+ "products": products,
316
+ "dates_iso8601": dates_iso8601,
317
+ "bucket": bucket,
318
+ "path": path,
319
+ "data_type": data_type,
320
+ "no_data": no_data,
321
+ "i_max": i_max,
322
+ "j_max": j_max,
323
+ "y_size": y_size,
324
+ "x_size": x_size,
325
+ "proj4": proj4,
326
+ "abstract": abstract,
327
+ "geotransform": geotransform,
328
+ "padding": padding
329
+ }
330
+ for param, value in param_mapping.items():
331
+ if value is not None:
332
+ payload[param] = value
333
+ return self._client._terrakio_request("PUT", "/datasets", params = params, json = payload)
334
+
335
+ @require_api_key
336
+ def delete_dataset(self, name: str, collection: str = "terrakio-datasets") -> Dict[str, Any]:
337
+ """
338
+ Delete a dataset by name.
339
+
340
+ Args:
341
+ name: The name of the dataset (required)
342
+ collection: The dataset collection (default: 'terrakio-datasets')
343
+
344
+ Returns:
345
+ Deleted dataset information
346
+
347
+ Raises:
348
+ APIError: If the API request fails
349
+ """
350
+ params = {"collection": collection}
351
+ return self._client._terrakio_request("DELETE", f"/datasets/{name}", params = params)
352
+
353
+ @require_api_key
354
+ def download_file_to_path(self, job_name, stage, file_name, output_path):
355
+ if not self.mass_stats:
356
+ from terrakio_core.mass_stats import MassStats
357
+ if not self.url or not self.key:
358
+ raise ConfigurationError("Mass Stats client not initialized. Make sure API URL and key are set.")
359
+ self.mass_stats = MassStats(
360
+ base_url=self.url,
361
+ api_key=self.key,
362
+ verify=self.verify,
363
+ timeout=self.timeout
364
+ )
365
+
366
+ # fetch bucket info based on job name and stage
367
+
368
+ taskid = self.mass_stats.get_task_id(job_name, stage).get('task_id')
369
+ trackinfo = self.mass_stats.track_job([taskid])
370
+ bucket = trackinfo[taskid]['bucket']
371
+ return self.mass_stats.download_file(job_name, bucket, file_name, output_path)
@@ -0,0 +1,228 @@
1
+ from typing import Dict, Any
2
+ from ..helper.decorators import require_token, require_api_key, require_auth
3
+ class BaseGroupManagement:
4
+ """Base class with common group management methods."""
5
+ def __init__(self, client):
6
+ self._client = client
7
+
8
+ @require_api_key
9
+ def get_group_datasets(self, group: str, collection: str = "terrakio-datasets") -> Dict[str, Any]:
10
+ """
11
+ Get datasets of a group.
12
+
13
+ Args:
14
+ group: Name of the group
15
+ collection: Name of the collection (default is "terrakio-datasets")
16
+
17
+ Returns:
18
+ API response data
19
+
20
+ Raises:
21
+ APIError: If the API request fails
22
+ """
23
+ params = {"collection": collection}
24
+ return self._client._terrakio_request("GET", f"/groups/{group}/datasets", params=params)
25
+
26
+ @require_api_key
27
+ def add_user_to_group(self, group: str, emails: list[str]) -> Dict[str, Any]:
28
+ """
29
+ Add a user to a group.
30
+
31
+ Args:
32
+ group: Name of the group
33
+ email: List of user emails to add to the group
34
+
35
+ Returns:
36
+ API response data
37
+ """
38
+ payload = {"emails": emails}
39
+ return self._client._terrakio_request("POST", f"/groups/{group}/users", json = payload)
40
+
41
+ @require_api_key
42
+ def add_group_to_dataset(self, dataset: str, id: str) -> Dict[str, Any]:
43
+ """
44
+ Add a group to a dataset.
45
+
46
+ Args:
47
+ dataset: Name of the dataset
48
+ id: Group ID
49
+
50
+ Returns:
51
+ API response data
52
+ """
53
+ payload = {"id": id}
54
+ return self._client._terrakio_request("POST", f"/datasets/{dataset}/groups", json = payload)
55
+
56
+ @require_api_key
57
+ def add_user_to_dataset(self, dataset: str, emails: list[str]) -> Dict[str, Any]:
58
+ """
59
+ Add a user to a dataset.
60
+
61
+ Args:
62
+ dataset: Name of the dataset
63
+ email: List of user emails to add to the dataset
64
+
65
+ Returns:
66
+ API response data
67
+ """
68
+ payload = {"emails": emails}
69
+ return self._client._terrakio_request("POST", f"/datasets/{dataset}/share", json = payload)
70
+
71
+ @require_api_key
72
+ def remove_user_from_group(self, group: str, emails: list[str]) -> Dict[str, Any]:
73
+ """
74
+ Remove a user from a group.
75
+
76
+ Args:
77
+ group: Name of the group
78
+ email: List of user emails to remove from the group
79
+
80
+ Returns:
81
+ API response data
82
+ """
83
+ payload = {"emails": emails}
84
+ return self._client._terrakio_request("DELETE", f"/groups/{group}/users", json = payload)
85
+
86
+ @require_api_key
87
+ def remove_user_from_dataset(self, dataset: str, emails: list[str]) -> Dict[str, Any]:
88
+ """
89
+ Remove a user from a dataset.
90
+
91
+ Args:
92
+ dataset: Name of the dataset
93
+ email: List of user emails to remove from the dataset
94
+
95
+ Returns:
96
+ API response data
97
+ """
98
+ payload = {"emails": emails}
99
+ return self._client._terrakio_request("PATCH", f"/datasets/{dataset}/share", json = payload)
100
+
101
+ class GroupManagement(BaseGroupManagement):
102
+ """Normal user group management with regular user permissions."""
103
+ @require_api_key
104
+ def list_groups(self) -> Dict[str, Any]:
105
+ """
106
+ List all groups.
107
+
108
+ Returns:
109
+ API response data
110
+
111
+ Raises:
112
+ APIError: If the API request fails
113
+ """
114
+ return self._client._terrakio_request("GET", "/groups")
115
+
116
+ @require_api_key
117
+ def get_group(self, group: str) -> Dict[str, Any]:
118
+ """
119
+ Get a group.
120
+
121
+ Args:
122
+ group: Name of the group
123
+
124
+ Returns:
125
+ API response data
126
+
127
+ Raises:
128
+ APIError: If the API request fails
129
+ """
130
+ return self._client._terrakio_request("GET", f"/groups/{group}")
131
+
132
+ @require_api_key
133
+ def create_group(self, name: str) -> Dict[str, Any]:
134
+ """
135
+ Create a group
136
+
137
+ Args:
138
+ name: Name of the group
139
+
140
+ Returns:
141
+ API response data
142
+
143
+ Raises:
144
+ APIError: If the API request fails
145
+ """
146
+ payload = {"name": name}
147
+ return self._client._terrakio_request("POST", "/groups", json = payload)
148
+
149
+ @require_api_key
150
+ def delete_group(self, group: str) -> Dict[str, Any]:
151
+ """
152
+ Delete a group.
153
+
154
+ Args:
155
+ group: Name of the group to delete
156
+
157
+ Returns:
158
+ API response data
159
+
160
+ Raises:
161
+ APIError: If the API request fails
162
+ """
163
+ return self._client._terrakio_request("DELETE", f"/groups/{group}")
164
+
165
+ class AdminGroupManagement(BaseGroupManagement):
166
+ """Admin user group management with admin permissions."""
167
+ @require_api_key
168
+ def list_groups(self) -> Dict[str, Any]:
169
+ """
170
+ List all groups.
171
+
172
+ Returns:
173
+ API response data
174
+
175
+ Raises:
176
+ APIError: If the API request fails
177
+ """
178
+ return self._client._terrakio_request("GET", "/admin/groups")
179
+
180
+ @require_api_key
181
+ def get_group(self, group: str) -> Dict[str, Any]:
182
+ """
183
+ Get a group.
184
+
185
+ Args:
186
+ group: Name of the group
187
+
188
+ Returns:
189
+ API response data
190
+
191
+ Raises:
192
+ APIError: If the API request fails
193
+ """
194
+ return self._client._terrakio_request("GET", f"/admin/groups/{group}")
195
+
196
+ @require_api_key
197
+ def create_group(self, name: str, owner: str) -> Dict[str, Any]:
198
+ """
199
+ Create a group.
200
+
201
+ Args:
202
+ name: Name of the group
203
+ owner: User email of the owner
204
+
205
+ Returns:
206
+ API response data
207
+
208
+ Raises:
209
+ APIError: If the API request fails
210
+ """
211
+ payload = {"name": name, "owner": owner}
212
+ return self._client._terrakio_request("POST", f"/admin/groups", json=payload)
213
+
214
+ @require_api_key
215
+ def delete_group(self, group: str) -> Dict[str, Any]:
216
+ """
217
+ Delete a group.
218
+
219
+ Args:
220
+ group: Name of the group to delete
221
+
222
+ Returns:
223
+ API response data
224
+
225
+ Raises:
226
+ APIError: If the API request fails
227
+ """
228
+ return self._client._terrakio_request("DELETE", f"/admin/groups/{group}")