msfabricpysdkcore 0.0.4__tar.gz → 0.0.5__tar.gz

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.
Files changed (35) hide show
  1. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/PKG-INFO +1 -1
  2. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/coreapi.py +2 -2
  3. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/item.py +6 -4
  4. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/job_instance.py +0 -1
  5. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/lakehouse.py +0 -1
  6. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/long_running_operation.py +6 -9
  7. msfabricpysdkcore-0.0.5/msfabricpysdkcore/otheritems.py +17 -0
  8. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/tests/test_items_incl_lakehouse.py +34 -0
  9. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/workspace.py +116 -17
  10. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore.egg-info/PKG-INFO +1 -1
  11. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore.egg-info/SOURCES.txt +1 -0
  12. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/pyproject.toml +1 -1
  13. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/setup.py +1 -1
  14. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/LICENSE +0 -0
  15. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/README.md +0 -0
  16. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/__init__.py +0 -0
  17. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/admin_item.py +0 -0
  18. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/admin_workspace.py +0 -0
  19. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/adminapi.py +0 -0
  20. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/auth.py +0 -0
  21. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/capacity.py +0 -0
  22. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/client.py +0 -0
  23. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/domain.py +0 -0
  24. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/onelakeshortcut.py +0 -0
  25. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/tests/__init__.py +0 -0
  26. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/tests/test_admin_apis.py +0 -0
  27. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/tests/test_domains.py +0 -0
  28. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/tests/test_git.py +0 -0
  29. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/tests/test_jobs.py +0 -0
  30. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/tests/test_shortcuts.py +0 -0
  31. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore/tests/test_workspaces_capacities.py +0 -0
  32. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore.egg-info/dependency_links.txt +0 -0
  33. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore.egg-info/requires.txt +0 -0
  34. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/msfabricpysdkcore.egg-info/top_level.txt +0 -0
  35. {msfabricpysdkcore-0.0.4 → msfabricpysdkcore-0.0.5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: msfabricpysdkcore
3
- Version: 0.0.4
3
+ Version: 0.0.5
4
4
  Summary: A Python SDK for Microsoft Fabric
5
5
  Author: Andreas Rederer
6
6
  Project-URL: Homepage, https://github.com/DaSenf1860/ms-fabric-sdk-core
@@ -203,10 +203,10 @@ class FabricClientCore(FabricClient):
203
203
  ws = self.get_workspace_by_id(workspace_id)
204
204
  return ws.delete_item(item_id)
205
205
 
206
- def list_items(self, workspace_id):
206
+ def list_items(self, workspace_id, with_properties = False):
207
207
  """List items in a workspace"""
208
208
  ws = self.get_workspace_by_id(workspace_id)
209
- return ws.list_items()
209
+ return ws.list_items(with_properties=with_properties)
210
210
 
211
211
  def get_item_definition(self, workspace_id, item_id):
212
212
  """Get the definition of an item"""
@@ -80,7 +80,9 @@ class Item:
80
80
  sleep(10)
81
81
  continue
82
82
  if response.status_code == 202:
83
- check_long_running_operation( response.headers, self.auth)
83
+ operation_result = check_long_running_operation( response.headers, self.auth)
84
+ self.definition = operation_result['definition']
85
+ return operation_result
84
86
 
85
87
  if response.status_code not in (200, 202, 429):
86
88
  print(response.status_code)
@@ -88,9 +90,9 @@ class Item:
88
90
  raise Exception(f"Error getting item definition: {response.text}")
89
91
  break
90
92
 
91
- print(response.text)
92
- print(response.status_code)
93
- return json.loads(response.text)
93
+ resp_dict = json.loads(response.text)
94
+ self.definition = resp_dict['definition']
95
+ return resp_dict
94
96
 
95
97
  def update(self, display_name = None, description = None):
96
98
  """Update the item"""
@@ -1,7 +1,6 @@
1
1
  import json
2
2
  import requests
3
3
  from time import sleep
4
- from msfabricpysdkcore.long_running_operation import check_long_running_operation
5
4
 
6
5
  class JobInstance:
7
6
  """Class to represent a job instance in Microsoft Fabric"""
@@ -2,7 +2,6 @@ import json
2
2
  import requests
3
3
  from time import sleep
4
4
 
5
- from msfabricpysdkcore.long_running_operation import check_long_running_operation
6
5
  from msfabricpysdkcore.item import Item
7
6
 
8
7
  class Lakehouse(Item):
@@ -22,13 +22,14 @@ class LongRunningOperation:
22
22
  print("Too many requests, waiting 10 seconds")
23
23
  sleep(10)
24
24
  continue
25
+ if response.status_code == 400:
26
+ return None
25
27
  if response.status_code not in (200, 429):
26
28
  print(response.status_code)
27
29
  print(response.text)
28
30
  raise Exception(f"Error getting operation results: {response.text}")
29
31
  break
30
32
 
31
- print(json.loads(response.text))
32
33
  return json.loads(response.text)
33
34
 
34
35
  def get_operation_state(self):
@@ -47,7 +48,6 @@ class LongRunningOperation:
47
48
  raise Exception(f"Error getting operation state: {response.text}")
48
49
  break
49
50
 
50
- print(json.loads(response.text))
51
51
  return json.loads(response.text)
52
52
 
53
53
  def wait_for_completion(self):
@@ -72,10 +72,7 @@ def check_long_running_operation(headers, auth):
72
72
  if not operation_id:
73
73
  print("Operation initiated, no operation id found")
74
74
  return None
75
- else:
76
- print("Operation initiated, waiting for completion")
77
- lro = LongRunningOperation(operation_id=operation_id, auth=auth)
78
- lro.wait_for_completion()
79
- print("Operation completed")
80
- lro = LongRunningOperation(operation_id, auth)
81
- return lro.wait_for_completion()
75
+ lro = LongRunningOperation(operation_id=operation_id, auth=auth)
76
+ lro.wait_for_completion()
77
+
78
+ return lro.get_operation_results()
@@ -0,0 +1,17 @@
1
+ from time import sleep
2
+
3
+ from msfabricpysdkcore.item import Item
4
+
5
+ class SparkJobDefinition(Item):
6
+ """Class to represent a spark job definition in Microsoft Fabric"""
7
+
8
+ def __init__(self, id, display_name, type, workspace_id, auth, properties = None, definition=None, description=""):
9
+ super().__init__(id, display_name, type, workspace_id, auth, properties, definition, description)
10
+
11
+ class Warehouse(Item):
12
+ """Class to represent a warehouse in Microsoft Fabric"""
13
+
14
+ def __init__(self, id, display_name, type, workspace_id, auth, properties = None, definition=None, description=""):
15
+ super().__init__(id, display_name, type, workspace_id, auth, properties, definition, description)
16
+
17
+
@@ -47,9 +47,43 @@ class TestFabricClientCore(unittest.TestCase):
47
47
 
48
48
  self.assertAlmostEqual(status_code, 200)
49
49
 
50
+ def test_item_definition(self):
51
+
52
+ sjd = self.fc.get_item(workspace_id=self.workspace_id, item_name="blubb", item_type="SparkJobDefinition")
53
+ self.assertIsNotNone(sjd.definition)
54
+ datetime_str = datetime.now().strftime("%Y%m%d%H%M%S")
55
+ blubb2 = "blubb2" + datetime_str
56
+ blubb3 = "blubb3" + datetime_str
57
+ blubb2 = self.fc.create_item(display_name=blubb2, type="SparkJobDefinition", workspace_id=self.workspace_id,
58
+ definition=sjd.definition)
59
+
60
+ blubb3 = self.fc.create_item(display_name=blubb3, type="SparkJobDefinition", workspace_id=self.workspace_id)
61
+
62
+ blubb3 = self.fc.update_item_definition(workspace_id=self.workspace_id,
63
+ item_id=blubb3.id, definition=sjd.definition)
64
+
65
+ self.assertEqual(blubb3.definition, sjd.definition)
66
+
67
+ self.assertNotEqual(blubb2.id, sjd.id)
68
+ self.assertEqual(blubb2.definition, sjd.definition)
69
+ self.assertNotEqual(blubb2.id, blubb3.id)
70
+
71
+ blubb2.delete()
72
+ blubb3.delete()
73
+
74
+ def test_warehouse(self):
75
+ warehouse = self.fc.get_item(workspace_id=self.workspace_id, item_name="testitem20240404134030", item_type="Warehouse")
76
+ self.assertIsNotNone(warehouse.properties)
77
+
78
+ def test_spark_job_definition(self):
79
+ spark_job_definition = self.fc.get_item(workspace_id=self.workspace_id,
80
+ item_name="blubb", item_type="SparkJobDefinition")
81
+ self.assertIsNotNone(spark_job_definition.properties)
82
+
50
83
  def test_lakehouse(self):
51
84
 
52
85
  lakehouse = self.fc.get_item(workspace_id=self.workspace_id, item_name="lakehouse1", item_type="Lakehouse")
86
+ self.assertIsNotNone(lakehouse.properties)
53
87
  item_id = lakehouse.id
54
88
  date_str = datetime.now().strftime("%Y%m%d%H%M%S")
55
89
  table_name = f"table{date_str}"
@@ -2,7 +2,10 @@ import json
2
2
  import requests
3
3
  from time import sleep
4
4
  from msfabricpysdkcore.item import Item
5
+ from msfabricpysdkcore.lakehouse import Lakehouse
5
6
  from msfabricpysdkcore.long_running_operation import check_long_running_operation
7
+ from msfabricpysdkcore.otheritems import SparkJobDefinition
8
+ from msfabricpysdkcore.otheritems import Warehouse
6
9
 
7
10
  class Workspace:
8
11
  """Class to represent a workspace in Microsoft Fabric"""
@@ -247,26 +250,29 @@ class Workspace:
247
250
  item_dict = json.loads(response.text)
248
251
  if item_dict is None:
249
252
  print("Item not returned by API, trying to get it by name")
250
- return self.get_item_by_name(display_name, type)
251
- return Item.from_dict(item_dict, auth=self.auth)
253
+ return self.get_item_by_name(display_name, type)
254
+
255
+ if item_dict["type"] == "Lakehouse":
256
+ return self.get_lakehouse(item_dict["id"])
257
+ if item_dict["type"] == "Warehouse":
258
+ return self.get_warehouse(item_dict["id"])
259
+ if item_dict["type"] == "SparkJobDefinition":
260
+ return self.get_spark_job_definition(item_dict["id"])
252
261
 
262
+ item_obj = Item.from_dict(item_dict, auth=self.auth)
263
+ if item_obj.type in ["Notebook", "Report", "SemanticModel"]:
264
+ item_obj.get_definition()
265
+ return item_obj
253
266
 
254
267
  def get_item_by_name(self, item_name, item_type):
255
268
  """Get an item from a workspace by name"""
256
- ws_items = self.list_items()
269
+ ws_items = self.list_items(with_properties=False)
257
270
  for item in ws_items:
258
271
  if item.display_name == item_name and item.type == item_type:
259
- return item
272
+ return self.get_item(item.id, item_type)
260
273
 
261
- def get_item(self, item_id = None, item_name = None, item_type = None):
262
- # GET https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/items/{itemId}
263
- """Get an item from a workspace"""
264
- if item_id is None and item_name is not None and item_type is not None:
265
- return self.get_item_by_name(item_name, item_type)
266
- elif item_id is None:
267
- raise Exception("item_id or the combination item_name + item_type is required")
268
-
269
- url = f"https://api.fabric.microsoft.com/v1/workspaces/{self.id}/items/{item_id}"
274
+
275
+ def get_item_internal(self, url):
270
276
 
271
277
  for _ in range(10):
272
278
  response = requests.get(url=url, headers=self.auth.get_headers())
@@ -281,14 +287,103 @@ class Workspace:
281
287
  break
282
288
 
283
289
  item_dict = json.loads(response.text)
284
- return Item.from_dict(item_dict, auth=self.auth)
290
+ return item_dict
291
+
292
+ def get_lakehouse(self, lakehouse_id = None, lakehouse_name = None):
293
+ """Get a lakehouse from a workspace"""
294
+
295
+ if lakehouse_id is None and lakehouse_name is not None:
296
+ return self.get_item_by_name(lakehouse_name, "Lakehouse")
297
+ elif lakehouse_id is None:
298
+ raise Exception("lakehouse_id or the lakehouse_name is required")
299
+
300
+ url = f"https://api.fabric.microsoft.com/v1/workspaces/{self.id}/lakehouses/{lakehouse_id}"
301
+
302
+ item_dict = self.get_item_internal(url)
303
+ return Lakehouse.from_dict(item_dict, auth=self.auth)
304
+
305
+ def get_warehouse(self, warehouse_id = None, warehouse_name = None):
306
+ """Get a warehouse from a workspace"""
307
+ if warehouse_id is None and warehouse_name is not None:
308
+ return self.get_item_by_name(warehouse_name, "Warehouse")
309
+ elif warehouse_id is None:
310
+ raise Exception("warehouse_id or the warehouse_name is required")
311
+
312
+ url = f"https://api.fabric.microsoft.com/v1/workspaces/{self.id}/warehouses/{warehouse_id}"
313
+
314
+ item_dict = self.get_item_internal(url)
315
+ return Warehouse.from_dict(item_dict, auth=self.auth)
316
+
317
+ def get_spark_job_definition(self, spark_job_definition_id = None, spark_job_definition_name = None):
318
+ """Get a spark job definition from a workspace"""
319
+ if spark_job_definition_id is None and spark_job_definition_name is not None:
320
+ return self.get_item_by_name(spark_job_definition_name, "SparkJobDefinition")
321
+ elif spark_job_definition_id is None:
322
+ raise Exception("spark_job_definition_id or the spark_job_definition_name is required")
323
+
324
+ url = f"https://api.fabric.microsoft.com/v1/workspaces/{self.id}/sparkjobdefinitions/{spark_job_definition_id}"
325
+
326
+ item_dict = self.get_item_internal(url)
327
+ sjd_obj = SparkJobDefinition.from_dict(item_dict, auth=self.auth)
328
+ sjd_obj.get_definition()
329
+ return sjd_obj
330
+
331
+ def get_item(self, item_id = None, item_name = None, item_type = None):
332
+ # GET https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/items/{itemId}
333
+ """Get an item from a workspace"""
334
+ if item_type:
335
+ if item_type.lower() == "lakehouse":
336
+ return self.get_lakehouse(item_id, item_name)
337
+ if item_type.lower() == "warehouse":
338
+ return self.get_warehouse(item_id, item_name)
339
+ if item_type.lower() == "sparkjobdefinition":
340
+ return self.get_spark_job_definition(item_id, item_name)
341
+
342
+ if item_id is None and item_name is not None and item_type is not None:
343
+ return self.get_item_by_name(item_name, item_type)
344
+ elif item_id is None:
345
+ raise Exception("item_id or the combination item_name + item_type is required")
346
+
347
+ url = f"https://api.fabric.microsoft.com/v1/workspaces/{self.id}/items/{item_id}"
348
+
349
+ item_dict = self.get_item_internal(url)
350
+ if item_dict["type"] == "Lakehouse":
351
+ return self.get_lakehouse(item_dict["id"])
352
+ if item_dict["type"] == "Warehouse":
353
+ return self.get_warehouse(item_dict["id"])
354
+ if item_dict["type"] == "SparkJobDefinition":
355
+ return self.get_spark_job_definition(item_dict["id"])
356
+
357
+
358
+ item_obj = Item.from_dict(item_dict, auth=self.auth)
359
+ if item_obj.type in ["Notebook", "Report", "SemanticModel"]:
360
+ item_obj.get_definition()
361
+ return item_obj
362
+
285
363
 
286
364
  def delete_item(self, item_id):
287
365
  """Delete an item from a workspace"""
288
366
  return self.get_item(item_id).delete()
289
367
 
290
368
 
291
- def list_items(self, continuationToken = None):
369
+ def get_item_object_w_properties(self, item_list):
370
+
371
+ new_item_list = []
372
+ for item in item_list:
373
+ if item["type"] == "Lakehouse":
374
+ item = self.get_lakehouse(item["id"])
375
+ elif item["type"] == "Warehouse":
376
+ item = self.get_warehouse(item["id"])
377
+ elif item["type"] == "SparkJobDefinition":
378
+ item = self.get_spark_job_definition(item["id"])
379
+ else:
380
+ item = Item.from_dict(item, auth=self.auth)
381
+ if item.type in ["Notebook", "Report", "SemanticModel"]:
382
+ item.get_definition()
383
+ new_item_list.append(item)
384
+ return new_item_list
385
+
386
+ def list_items(self, with_properties = False, continuationToken = None):
292
387
  """List items in a workspace"""
293
388
  url = f"https://api.fabric.microsoft.com/v1/workspaces/{self.id}/items"
294
389
 
@@ -309,10 +404,14 @@ class Workspace:
309
404
 
310
405
  resp_dict = json.loads(response.text)
311
406
  items = resp_dict["value"]
312
- items = [Item.from_dict(item, auth=self.auth) for item in items]
407
+ if with_properties:
408
+ items = self.get_item_object_w_properties(items)
409
+ else:
410
+ items = [Item.from_dict(item, auth=self.auth) for item in items]
313
411
 
314
412
  if "continuationToken" in resp_dict:
315
- item_list_next = self.list_items(continuationToken=resp_dict["continuationToken"])
413
+ item_list_next = self.list_items(with_properties=with_properties,
414
+ continuationToken=resp_dict["continuationToken"])
316
415
  items.extend(item_list_next)
317
416
 
318
417
  return items
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: msfabricpysdkcore
3
- Version: 0.0.4
3
+ Version: 0.0.5
4
4
  Summary: A Python SDK for Microsoft Fabric
5
5
  Author: Andreas Rederer
6
6
  Project-URL: Homepage, https://github.com/DaSenf1860/ms-fabric-sdk-core
@@ -16,6 +16,7 @@ msfabricpysdkcore/job_instance.py
16
16
  msfabricpysdkcore/lakehouse.py
17
17
  msfabricpysdkcore/long_running_operation.py
18
18
  msfabricpysdkcore/onelakeshortcut.py
19
+ msfabricpysdkcore/otheritems.py
19
20
  msfabricpysdkcore/workspace.py
20
21
  msfabricpysdkcore.egg-info/PKG-INFO
21
22
  msfabricpysdkcore.egg-info/SOURCES.txt
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "msfabricpysdkcore"
7
- version = "0.0.4"
7
+ version = "0.0.5"
8
8
  dynamic = ["dependencies"]
9
9
  authors = [
10
10
  { name="Andreas Rederer"},
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name='msfabricpysdkcore',
5
- version='0.4',
5
+ version='0.5',
6
6
  packages=find_packages(),
7
7
  install_requires=[
8
8
  'requests>=2.30.0',