semantic-link-labs 0.8.5__py3-none-any.whl → 0.8.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 semantic-link-labs might be problematic. Click here for more details.

Files changed (36) hide show
  1. {semantic_link_labs-0.8.5.dist-info → semantic_link_labs-0.8.7.dist-info}/METADATA +15 -6
  2. {semantic_link_labs-0.8.5.dist-info → semantic_link_labs-0.8.7.dist-info}/RECORD +36 -30
  3. {semantic_link_labs-0.8.5.dist-info → semantic_link_labs-0.8.7.dist-info}/WHEEL +1 -1
  4. sempy_labs/__init__.py +37 -6
  5. sempy_labs/_authentication.py +108 -0
  6. sempy_labs/_connections.py +355 -176
  7. sempy_labs/_dataflows.py +0 -1
  8. sempy_labs/_gateways.py +439 -0
  9. sempy_labs/_generate_semantic_model.py +51 -30
  10. sempy_labs/_git.py +13 -5
  11. sempy_labs/_helper_functions.py +14 -3
  12. sempy_labs/_list_functions.py +1 -1
  13. sempy_labs/_model_auto_build.py +4 -2
  14. sempy_labs/_model_bpa.py +2 -15
  15. sempy_labs/_model_bpa_bulk.py +14 -6
  16. sempy_labs/_model_dependencies.py +3 -1
  17. sempy_labs/_refresh_semantic_model.py +6 -0
  18. sempy_labs/admin/__init__.py +19 -9
  19. sempy_labs/admin/_basic_functions.py +475 -548
  20. sempy_labs/admin/_external_data_share.py +97 -0
  21. sempy_labs/admin/_git.py +69 -0
  22. sempy_labs/admin/_items.py +264 -0
  23. sempy_labs/admin/_scanner.py +104 -0
  24. sempy_labs/directlake/_dl_helper.py +6 -2
  25. sempy_labs/directlake/_get_shared_expression.py +5 -35
  26. sempy_labs/directlake/_update_directlake_model_lakehouse_connection.py +3 -2
  27. sempy_labs/migration/_create_pqt_file.py +4 -2
  28. sempy_labs/migration/_migrate_tables_columns_to_semantic_model.py +4 -2
  29. sempy_labs/report/_generate_report.py +10 -4
  30. sempy_labs/report/_report_bpa.py +1 -0
  31. sempy_labs/report/_report_helper.py +58 -0
  32. sempy_labs/report/_report_list_functions.py +2 -0
  33. sempy_labs/report/_reportwrapper.py +358 -175
  34. sempy_labs/tom/_model.py +2 -1
  35. {semantic_link_labs-0.8.5.dist-info → semantic_link_labs-0.8.7.dist-info}/LICENSE +0 -0
  36. {semantic_link_labs-0.8.5.dist-info → semantic_link_labs-0.8.7.dist-info}/top_level.txt +0 -0
@@ -179,7 +179,9 @@ def update_report_from_reportjson(
179
179
  )
180
180
 
181
181
 
182
- def get_report_definition(report: str, workspace: Optional[str] = None) -> pd.DataFrame:
182
+ def get_report_definition(
183
+ report: str, workspace: Optional[str] = None, return_dataframe: bool = True
184
+ ) -> pd.DataFrame | dict:
183
185
  """
184
186
  Gets the collection of definition files of a report.
185
187
 
@@ -193,10 +195,12 @@ def get_report_definition(report: str, workspace: Optional[str] = None) -> pd.Da
193
195
  The Fabric workspace name in which the report resides.
194
196
  Defaults to None which resolves to the workspace of the attached lakehouse
195
197
  or if no lakehouse attached, resolves to the workspace of the notebook.
198
+ return_dataframe : bool, default=True
199
+ If True, returns a dataframe. If False, returns a json dictionary.
196
200
 
197
201
  Returns
198
202
  -------
199
- pandas.DataFrame
203
+ pandas.DataFrame | dict
200
204
  The collection of report definition files within a pandas dataframe.
201
205
  """
202
206
 
@@ -209,9 +213,11 @@ def get_report_definition(report: str, workspace: Optional[str] = None) -> pd.Da
209
213
  )
210
214
 
211
215
  result = lro(client, response).json()
212
- rdef = pd.json_normalize(result["definition"]["parts"])
213
216
 
214
- return rdef
217
+ if return_dataframe:
218
+ return pd.json_normalize(result["definition"]["parts"])
219
+ else:
220
+ return result
215
221
 
216
222
 
217
223
  @log
@@ -29,6 +29,7 @@ def run_report_bpa(
29
29
  ):
30
30
  """
31
31
  Displays an HTML visualization of the results of the Best Practice Analyzer scan for a report.
32
+ Note: As with all functions which rely on the ReportWrapper, this function requires the report to be in the 'PBIR' format.
32
33
 
33
34
  Parameters
34
35
  ----------
@@ -252,3 +252,61 @@ def find_entity_property_pairs(data, result=None, keys_path=None):
252
252
  find_entity_property_pairs(item, result, keys_path)
253
253
 
254
254
  return result
255
+
256
+
257
+ def _get_agg_type_mapping() -> dict:
258
+ """
259
+ This function extracts a mapping dictionary like this:
260
+ {
261
+ "0": "Sum",
262
+ "1": "Average",
263
+ "2": "Distinct count",
264
+ }
265
+ """
266
+
267
+ schema_url = "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/semanticQuery/1.2.0/schema.json"
268
+ response = requests.get(schema_url)
269
+ schema = response.json()
270
+ aggtypes_schema = schema.get("definitions", {}).get("QueryAggregateFunction", {})
271
+
272
+ agg_type_map = {}
273
+ agg_type_map = {
274
+ a.get("const"): a.get("description")
275
+ for a in aggtypes_schema.get("anyOf", [])
276
+ if "const" in a and "description" in a
277
+ }
278
+ agg_type_map["-1"] = "Unknown"
279
+
280
+ return agg_type_map
281
+
282
+
283
+ def _get_expression(expr_json, agg_type_map):
284
+
285
+ expr_type = list(expr_json.keys())[0]
286
+ if expr_type == "Literal":
287
+ expr = expr_json.get("Literal", {}).get("Value")[1:-1]
288
+ elif expr_type == "Aggregation":
289
+ entity = (
290
+ expr_json.get("Aggregation", {})
291
+ .get("Expression", {})
292
+ .get("Column", {})
293
+ .get("Expression", {})
294
+ .get("SourceRef", {})
295
+ .get("Entity", "Unknown")
296
+ )
297
+ column = (
298
+ expr_json.get("Aggregation", {})
299
+ .get("Expression", {})
300
+ .get("Column", {})
301
+ .get("Property", "Unknown")
302
+ )
303
+ function_id = expr_json.get("Aggregation", {}).get("Function", "-1")
304
+ function = agg_type_map.get(function_id)
305
+ expr = f"{function}('{entity}'[{column}])"
306
+ elif expr_type == "Measure":
307
+ measure = expr_json.get("Measure", {}).get("Property", "Unknown")
308
+ expr = f"[{measure}]"
309
+ else:
310
+ expr = "Unknown"
311
+
312
+ return expr
@@ -13,6 +13,7 @@ def list_unused_objects_in_reports(
13
13
  ) -> pd.DataFrame:
14
14
  """
15
15
  Shows a list of all columns in the semantic model which are not used in any related Power BI reports (including dependencies).
16
+ Note: As with all functions which rely on the ReportWrapper, this function requires the report to be in the 'PBIR' format.
16
17
 
17
18
  Parameters
18
19
  ----------
@@ -55,6 +56,7 @@ def _list_all_report_semantic_model_objects(
55
56
  ) -> pd.DataFrame:
56
57
  """
57
58
  Shows a unique list of all semantic model objects (columns, measures, hierarchies) which are used in all reports which leverage the semantic model.
59
+ Note: As with all functions which rely on the ReportWrapper, this function requires the report to be in the 'PBIR' format.
58
60
 
59
61
  Parameters
60
62
  ----------