terrakio-core 0.3.4__py3-none-any.whl → 0.3.6__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,369 @@
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
+ 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
+ ) -> Dict[str, Any]:
64
+ """
65
+ Create a new dataset.
66
+
67
+ Args:
68
+ name: Name of the dataset (required)
69
+ collection: Dataset collection (default: 'terrakio-datasets')
70
+ products: List of products
71
+ dates_iso8601: List of dates
72
+ bucket: Storage bucket
73
+ path: Storage path
74
+ data_type: Data type
75
+ no_data: No data value
76
+ i_max: Maximum level
77
+ j_max: Maximum level
78
+ y_size: Y size
79
+ x_size: X size
80
+ proj4: Projection string
81
+ abstract: Dataset abstract
82
+ geotransform: Geotransform parameters
83
+ padding: Padding value
84
+
85
+ Returns:
86
+ Created dataset information
87
+
88
+ Raises:
89
+ APIError: If the API request fails
90
+ """
91
+ params = {"collection": collection}
92
+ payload = {"name": name}
93
+ param_mapping = {
94
+ "products": products,
95
+ "dates_iso8601": dates_iso8601,
96
+ "bucket": bucket,
97
+ "path": path,
98
+ "data_type": data_type,
99
+ "no_data": no_data,
100
+ "i_max": i_max,
101
+ "j_max": j_max,
102
+ "y_size": y_size,
103
+ "x_size": x_size,
104
+ "proj4": proj4,
105
+ "abstract": abstract,
106
+ "geotransform": geotransform,
107
+ "padding": padding
108
+ }
109
+ for param, value in param_mapping.items():
110
+ if value is not None:
111
+ payload[param] = value
112
+ return self._client._terrakio_request("POST", "/datasets", params = params, json = payload)
113
+
114
+ @require_api_key
115
+ def update_dataset(
116
+ self,
117
+ name: str,
118
+ append: bool = True,
119
+ collection: str = "terrakio-datasets",
120
+ products: Optional[List[str]] = None,
121
+ dates_iso8601: Optional[List[str]] = None,
122
+ bucket: Optional[str] = None,
123
+ path: Optional[str] = None,
124
+ data_type: Optional[str] = None,
125
+ no_data: Optional[Any] = None,
126
+ i_max: Optional[int] = None,
127
+ j_max: Optional[int] = None,
128
+ y_size: Optional[int] = None,
129
+ x_size: Optional[int] = None,
130
+ proj4: Optional[str] = None,
131
+ abstract: Optional[str] = None,
132
+ geotransform: Optional[List[float]] = None,
133
+ padding: Optional[Any] = None
134
+ ) -> Dict[str, Any]:
135
+ """
136
+ Update an existing dataset.
137
+
138
+ Args:
139
+ name: Name of the dataset (required)
140
+ append: Whether to append data or replace (default: True)
141
+ collection: Dataset collection (default: 'terrakio-datasets')
142
+ products: List of products
143
+ dates_iso8601: List of dates
144
+ bucket: Storage bucket
145
+ path: Storage path
146
+ data_type: Data type
147
+ no_data: No data value
148
+ i_max: Maximum level
149
+ j_max: Maximum level
150
+ y_size: Y size
151
+ x_size: X size
152
+ proj4: Projection string
153
+ abstract: Dataset abstract
154
+ geotransform: Geotransform parameters
155
+ padding: Padding value
156
+
157
+ Returns:
158
+ Updated dataset information
159
+
160
+ Raises:
161
+ APIError: If the API request fails
162
+ """
163
+ params = {"collection": collection, "append": str(append).lower()}
164
+ payload = {"name": name}
165
+ param_mapping = {
166
+ "products": products,
167
+ "dates_iso8601": dates_iso8601,
168
+ "bucket": bucket,
169
+ "path": path,
170
+ "data_type": data_type,
171
+ "no_data": no_data,
172
+ "i_max": i_max,
173
+ "j_max": j_max,
174
+ "y_size": y_size,
175
+ "x_size": x_size,
176
+ "proj4": proj4,
177
+ "abstract": abstract,
178
+ "geotransform": geotransform,
179
+ "padding": padding
180
+ }
181
+ for param, value in param_mapping.items():
182
+ if value is not None:
183
+ payload[param] = value
184
+ return self._client._terrakio_request("PATCH", "/datasets", params = params, json = payload)
185
+
186
+ @require_api_key
187
+ def update_virtual_dataset(
188
+ self,
189
+ name: str,
190
+ append: bool = True,
191
+ collection: str = "terrakio-datasets",
192
+ products: Optional[List[str]] = None,
193
+ dates_iso8601: Optional[List[str]] = None,
194
+ bucket: Optional[str] = None,
195
+ path: Optional[str] = None,
196
+ data_type: Optional[str] = None,
197
+ no_data: Optional[Any] = None,
198
+ i_max: Optional[int] = None,
199
+ j_max: Optional[int] = None,
200
+ y_size: Optional[int] = None,
201
+ x_size: Optional[int] = None,
202
+ proj4: Optional[str] = None,
203
+ abstract: Optional[str] = None,
204
+ geotransform: Optional[List[float]] = None,
205
+ padding: Optional[Any] = None,
206
+ input: Optional[str] = None,
207
+ ) -> Dict[str, Any]:
208
+ """
209
+ Update an existing dataset.
210
+
211
+ Args:
212
+ name: Name of the dataset (required)
213
+ append: Whether to append data or replace (default: True)
214
+ collection: Dataset collection (default: 'terrakio-datasets')
215
+ products: List of products
216
+ dates_iso8601: List of dates
217
+ bucket: Storage bucket
218
+ path: Storage path
219
+ data_type: Data type
220
+ no_data: No data value
221
+ i_max: Maximum level
222
+ j_max: Maximum level
223
+ y_size: Y size
224
+ x_size: X size
225
+ proj4: Projection string
226
+ abstract: Dataset abstract
227
+ geotransform: Geotransform parameters
228
+ padding: Padding value
229
+ input: The input for the virtual dataset
230
+
231
+ Returns:
232
+ Updated dataset information
233
+
234
+ Raises:
235
+ APIError: If the API request fails
236
+ """
237
+ params = {"collection": collection, "append": str(append).lower()}
238
+ payload = {"name": name}
239
+ param_mapping = {
240
+ "products": products,
241
+ "dates_iso8601": dates_iso8601,
242
+ "bucket": bucket,
243
+ "path": path,
244
+ "data_type": data_type,
245
+ "no_data": no_data,
246
+ "i_max": i_max,
247
+ "j_max": j_max,
248
+ "y_size": y_size,
249
+ "x_size": x_size,
250
+ "proj4": proj4,
251
+ "abstract": abstract,
252
+ "geotransform": geotransform,
253
+ "padding": padding,
254
+ "input": input,
255
+ }
256
+ for param, value in param_mapping.items():
257
+ if value is not None:
258
+ payload[param] = value
259
+ return self._client._terrakio_request("PATCH", "/datasets", params = params, json = payload)
260
+
261
+
262
+
263
+ @require_api_key
264
+ def overwrite_dataset(
265
+ self,
266
+ name: str,
267
+ collection: str = "terrakio-datasets",
268
+ products: Optional[List[str]] = None,
269
+ dates_iso8601: Optional[List[str]] = None,
270
+ bucket: Optional[str] = None,
271
+ path: Optional[str] = None,
272
+ data_type: Optional[str] = None,
273
+ no_data: Optional[Any] = None,
274
+ i_max: Optional[int] = None,
275
+ j_max: Optional[int] = None,
276
+ y_size: Optional[int] = None,
277
+ x_size: Optional[int] = None,
278
+ proj4: Optional[str] = None,
279
+ abstract: Optional[str] = None,
280
+ geotransform: Optional[List[float]] = None,
281
+ padding: Optional[Any] = None
282
+ ) -> Dict[str, Any]:
283
+ """
284
+ Overwrite a dataset.
285
+
286
+ Args:
287
+ name: Name of the dataset (required)
288
+ collection: Dataset collection (default: 'terrakio-datasets')
289
+ products: List of products
290
+ dates_iso8601: List of dates
291
+ bucket: Storage bucket
292
+ path: Storage path
293
+ data_type: Data type
294
+ no_data: No data value
295
+ i_max: Maximum level
296
+ j_max: Maximum level
297
+ y_size: Y size
298
+ x_size: X size
299
+ proj4: Projection string
300
+ abstract: Dataset abstract
301
+ geotransform: Geotransform parameters
302
+ padding: Padding value
303
+
304
+ Returns:
305
+ Overwritten dataset information
306
+
307
+ Raises:
308
+ APIError: If the API request fails
309
+ """
310
+ params = {"collection": collection}
311
+ payload = {"name": name}
312
+ param_mapping = {
313
+ "products": products,
314
+ "dates_iso8601": dates_iso8601,
315
+ "bucket": bucket,
316
+ "path": path,
317
+ "data_type": data_type,
318
+ "no_data": no_data,
319
+ "i_max": i_max,
320
+ "j_max": j_max,
321
+ "y_size": y_size,
322
+ "x_size": x_size,
323
+ "proj4": proj4,
324
+ "abstract": abstract,
325
+ "geotransform": geotransform,
326
+ "padding": padding
327
+ }
328
+ for param, value in param_mapping.items():
329
+ if value is not None:
330
+ payload[param] = value
331
+ return self._client._terrakio_request("PUT", "/datasets", params = params, json = payload)
332
+
333
+ @require_api_key
334
+ def delete_dataset(self, name: str, collection: str = "terrakio-datasets") -> Dict[str, Any]:
335
+ """
336
+ Delete a dataset by name.
337
+
338
+ Args:
339
+ name: The name of the dataset (required)
340
+ collection: The dataset collection (default: 'terrakio-datasets')
341
+
342
+ Returns:
343
+ Deleted dataset information
344
+
345
+ Raises:
346
+ APIError: If the API request fails
347
+ """
348
+ params = {"collection": collection}
349
+ return self._client._terrakio_request("DELETE", f"/datasets/{name}", params = params)
350
+
351
+ @require_api_key
352
+ def download_file_to_path(self, job_name, stage, file_name, output_path):
353
+ if not self.mass_stats:
354
+ from terrakio_core.mass_stats import MassStats
355
+ if not self.url or not self.key:
356
+ raise ConfigurationError("Mass Stats client not initialized. Make sure API URL and key are set.")
357
+ self.mass_stats = MassStats(
358
+ base_url=self.url,
359
+ api_key=self.key,
360
+ verify=self.verify,
361
+ timeout=self.timeout
362
+ )
363
+
364
+ # fetch bucket info based on job name and stage
365
+
366
+ taskid = self.mass_stats.get_task_id(job_name, stage).get('task_id')
367
+ trackinfo = self.mass_stats.track_job([taskid])
368
+ bucket = trackinfo[taskid]['bucket']
369
+ 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}")