semantic-link-labs 0.8.8__tar.gz → 0.8.10__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.

Potentially problematic release.


This version of semantic-link-labs might be problematic. Click here for more details.

Files changed (202) hide show
  1. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/PKG-INFO +5 -2
  2. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/README.md +4 -1
  3. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/docs/source/conf.py +1 -1
  4. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/pyproject.toml +1 -1
  5. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/semantic_link_labs.egg-info/PKG-INFO +5 -2
  6. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/__init__.py +10 -0
  7. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_authentication.py +31 -2
  8. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_dataflows.py +1 -1
  9. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_dax.py +69 -54
  10. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_gateways.py +46 -0
  11. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_generate_semantic_model.py +74 -27
  12. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_git.py +32 -27
  13. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_helper_functions.py +60 -23
  14. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_list_functions.py +178 -32
  15. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_model_bpa.py +25 -23
  16. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_model_bpa_bulk.py +5 -5
  17. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_model_dependencies.py +17 -8
  18. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_notebooks.py +50 -18
  19. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_refresh_semantic_model.py +23 -17
  20. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_translations.py +80 -148
  21. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_workspaces.py +1 -1
  22. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/admin/__init__.py +6 -0
  23. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/admin/_basic_functions.py +120 -40
  24. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/admin/_domains.py +3 -2
  25. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/admin/_scanner.py +5 -5
  26. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/directlake/_dl_helper.py +13 -8
  27. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_reportwrapper.py +14 -9
  28. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/tom/_model.py +77 -35
  29. semantic_link_labs-0.8.10/tests/test_tom.py +37 -0
  30. semantic_link_labs-0.8.8/tests/test_tom.py +0 -31
  31. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  32. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  33. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/.github/ISSUE_TEMPLATE/issue--question---advice-needed.md +0 -0
  34. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/.github/workflows/build.yaml +0 -0
  35. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/.github/workflows/codeql.yaml +0 -0
  36. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/.gitignore +0 -0
  37. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/.readthedocs.yaml +0 -0
  38. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/.vscode/settings.json +0 -0
  39. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/CODE_OF_CONDUCT.md +0 -0
  40. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/LICENSE +0 -0
  41. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/SECURITY.md +0 -0
  42. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/SUPPORT.md +0 -0
  43. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/docs/Makefile +0 -0
  44. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/docs/make.bat +0 -0
  45. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/docs/requirements.txt +0 -0
  46. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/docs/source/index.rst +0 -0
  47. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/docs/source/modules.rst +0 -0
  48. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/environment.yml +0 -0
  49. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/notebooks/Best Practice Analyzer Report.ipynb +0 -0
  50. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/notebooks/Capacity Migration.ipynb +0 -0
  51. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/notebooks/Migration to Direct Lake.ipynb +0 -0
  52. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/notebooks/Model Optimization.ipynb +0 -0
  53. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/notebooks/Query Scale Out.ipynb +0 -0
  54. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/notebooks/Report Analysis.ipynb +0 -0
  55. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/notebooks/SQL.ipynb +0 -0
  56. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/notebooks/Semantic Model Refresh.ipynb +0 -0
  57. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/notebooks/Tabular Object Model.ipynb +0 -0
  58. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/setup.cfg +0 -0
  59. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/semantic_link_labs.egg-info/SOURCES.txt +0 -0
  60. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/semantic_link_labs.egg-info/dependency_links.txt +0 -0
  61. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/semantic_link_labs.egg-info/requires.txt +0 -0
  62. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/semantic_link_labs.egg-info/top_level.txt +0 -0
  63. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_ai.py +0 -0
  64. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_am-ET.po +0 -0
  65. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_ar-AE.po +0 -0
  66. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_bg-BG.po +0 -0
  67. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_ca-ES.po +0 -0
  68. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_cs-CZ.po +0 -0
  69. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_da-DK.po +0 -0
  70. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_de-DE.po +0 -0
  71. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_el-GR.po +0 -0
  72. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_es-ES.po +0 -0
  73. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_fa-IR.po +0 -0
  74. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_fi-FI.po +0 -0
  75. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_fr-FR.po +0 -0
  76. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_ga-IE.po +0 -0
  77. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_he-IL.po +0 -0
  78. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_hi-IN.po +0 -0
  79. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_hu-HU.po +0 -0
  80. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_id-ID.po +0 -0
  81. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_is-IS.po +0 -0
  82. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_it-IT.po +0 -0
  83. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_ja-JP.po +0 -0
  84. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_ko-KR.po +0 -0
  85. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_mt-MT.po +0 -0
  86. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_nl-NL.po +0 -0
  87. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_pl-PL.po +0 -0
  88. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_pt-BR.po +0 -0
  89. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_pt-PT.po +0 -0
  90. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_ro-RO.po +0 -0
  91. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_ru-RU.po +0 -0
  92. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_sk-SK.po +0 -0
  93. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_sl-SL.po +0 -0
  94. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_sv-SE.po +0 -0
  95. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_ta-IN.po +0 -0
  96. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_te-IN.po +0 -0
  97. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_th-TH.po +0 -0
  98. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_tr-TR.po +0 -0
  99. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_uk-UA.po +0 -0
  100. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_zh-CN.po +0 -0
  101. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_bpa_translation/_model/_translations_zu-ZA.po +0 -0
  102. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_capacities.py +0 -0
  103. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_capacity_migration.py +0 -0
  104. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_clear_cache.py +0 -0
  105. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_connections.py +0 -0
  106. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_data_pipelines.py +0 -0
  107. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_deployment_pipelines.py +0 -0
  108. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_documentation.py +0 -0
  109. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_environments.py +0 -0
  110. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_eventhouses.py +0 -0
  111. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_eventstreams.py +0 -0
  112. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_external_data_shares.py +0 -0
  113. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_icons.py +0 -0
  114. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_kql_databases.py +0 -0
  115. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_kql_querysets.py +0 -0
  116. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_managed_private_endpoints.py +0 -0
  117. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_mirrored_databases.py +0 -0
  118. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_mirrored_warehouses.py +0 -0
  119. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_ml_experiments.py +0 -0
  120. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_ml_models.py +0 -0
  121. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_model_auto_build.py +0 -0
  122. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_model_bpa_rules.py +0 -0
  123. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_one_lake_integration.py +0 -0
  124. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_query_scale_out.py +0 -0
  125. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_spark.py +0 -0
  126. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_sql.py +0 -0
  127. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_vertipaq.py +0 -0
  128. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_warehouses.py +0 -0
  129. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_workloads.py +0 -0
  130. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/_workspace_identity.py +0 -0
  131. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/admin/_external_data_share.py +0 -0
  132. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/admin/_git.py +0 -0
  133. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/admin/_items.py +0 -0
  134. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/directlake/__init__.py +0 -0
  135. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/directlake/_directlake_schema_compare.py +0 -0
  136. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/directlake/_directlake_schema_sync.py +0 -0
  137. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/directlake/_generate_shared_expression.py +0 -0
  138. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/directlake/_get_directlake_lakehouse.py +0 -0
  139. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/directlake/_get_shared_expression.py +0 -0
  140. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/directlake/_guardrails.py +0 -0
  141. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/directlake/_list_directlake_model_calc_tables.py +0 -0
  142. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/directlake/_show_unsupported_directlake_objects.py +0 -0
  143. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/directlake/_update_directlake_model_lakehouse_connection.py +0 -0
  144. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/directlake/_update_directlake_partition_entity.py +0 -0
  145. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/directlake/_warm_cache.py +0 -0
  146. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/lakehouse/__init__.py +0 -0
  147. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/lakehouse/_get_lakehouse_columns.py +0 -0
  148. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/lakehouse/_get_lakehouse_tables.py +0 -0
  149. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/lakehouse/_lakehouse.py +0 -0
  150. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/lakehouse/_shortcuts.py +0 -0
  151. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/migration/__init__.py +0 -0
  152. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/migration/_create_pqt_file.py +0 -0
  153. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/migration/_migrate_calctables_to_lakehouse.py +0 -0
  154. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/migration/_migrate_calctables_to_semantic_model.py +0 -0
  155. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/migration/_migrate_model_objects_to_semantic_model.py +0 -0
  156. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/migration/_migrate_tables_columns_to_semantic_model.py +0 -0
  157. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/migration/_migration_validation.py +0 -0
  158. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/migration/_refresh_calc_tables.py +0 -0
  159. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_BPAReportTemplate.json +0 -0
  160. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/__init__.py +0 -0
  161. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/.pbi/localSettings.json +0 -0
  162. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/.platform +0 -0
  163. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/StaticResources/SharedResources/BaseThemes/CY24SU06.json +0 -0
  164. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/page.json +0 -0
  165. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/1b08bce3bebabb0a27a8/visual.json +0 -0
  166. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/2f22ddb70c301693c165/visual.json +0 -0
  167. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/3b1182230aa6c600b43a/visual.json +0 -0
  168. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/58577ba6380c69891500/visual.json +0 -0
  169. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/a2a8fa5028b3b776c96c/visual.json +0 -0
  170. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/adfd47ef30652707b987/visual.json +0 -0
  171. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/b6a80ee459e716e170b1/visual.json +0 -0
  172. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/ce3130a721c020cc3d81/visual.json +0 -0
  173. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/92735ae19b31712208ad/page.json +0 -0
  174. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/92735ae19b31712208ad/visuals/66e60dfb526437cd78d1/visual.json +0 -0
  175. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/page.json +0 -0
  176. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/07deb8bce824e1be37d7/visual.json +0 -0
  177. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/0b1c68838818b32ad03b/visual.json +0 -0
  178. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/0c171de9d2683d10b930/visual.json +0 -0
  179. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/0efa01be0510e40a645e/visual.json +0 -0
  180. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/6bf2f0eb830ab53cc668/visual.json +0 -0
  181. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/88d8141cb8500b60030c/visual.json +0 -0
  182. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/a753273590beed656a03/visual.json +0 -0
  183. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/b8fdc82cddd61ac447bc/visual.json +0 -0
  184. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/d37dce724a0ccc30044b/page.json +0 -0
  185. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/d37dce724a0ccc30044b/visuals/ce8532a7e25020271077/visual.json +0 -0
  186. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/pages/pages.json +0 -0
  187. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/report.json +0 -0
  188. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition/version.json +0 -0
  189. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_bpareporttemplate/definition.pbir +0 -0
  190. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_download_report.py +0 -0
  191. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_generate_report.py +0 -0
  192. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_paginated.py +0 -0
  193. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_report_bpa.py +0 -0
  194. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_report_bpa_rules.py +0 -0
  195. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_report_functions.py +0 -0
  196. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_report_helper.py +0 -0
  197. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_report_list_functions.py +0 -0
  198. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/report/_report_rebind.py +0 -0
  199. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/src/sempy_labs/tom/__init__.py +0 -0
  200. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/tests/__init__.py +0 -0
  201. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/tests/test_friendly_case.py +0 -0
  202. {semantic_link_labs-0.8.8 → semantic_link_labs-0.8.10}/tests/test_shortcuts.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: semantic-link-labs
3
- Version: 0.8.8
3
+ Version: 0.8.10
4
4
  Summary: Semantic Link Labs for Microsoft Fabric
5
5
  Author: Microsoft Corporation
6
6
  License: MIT License
@@ -27,7 +27,7 @@ Requires-Dist: pytest>=8.2.1; extra == "test"
27
27
  # Semantic Link Labs
28
28
 
29
29
  [![PyPI version](https://badge.fury.io/py/semantic-link-labs.svg)](https://badge.fury.io/py/semantic-link-labs)
30
- [![Read The Docs](https://readthedocs.org/projects/semantic-link-labs/badge/?version=0.8.8&style=flat)](https://readthedocs.org/projects/semantic-link-labs/)
30
+ [![Read The Docs](https://readthedocs.org/projects/semantic-link-labs/badge/?version=0.8.10&style=flat)](https://readthedocs.org/projects/semantic-link-labs/)
31
31
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
32
32
  [![Downloads](https://static.pepy.tech/badge/semantic-link-labs)](https://pepy.tech/project/semantic-link-labs)
33
33
 
@@ -64,6 +64,7 @@ Check out the video below for an introduction to Semantic Link, Semantic Link La
64
64
  * [Dynamically generate a Direct Lake semantic model](https://semantic-link-labs.readthedocs.io/en/stable/sempy_labs.directlake.html#sempy_labs.directlake.generate_direct_lake_semantic_model)
65
65
  * [Check why a Direct Lake semantic model would fallback to DirectQuery](https://semantic-link-labs.readthedocs.io/en/stable/sempy_labs.directlake.html#sempy_labs.directlake.check_fallback_reason)
66
66
  * [View a measure dependency tree](https://semantic-link-labs.readthedocs.io/en/stable/sempy_labs.html#sempy_labs.measure_dependency_tree)
67
+ * [View unique columns touched in a single (or multiple) DAX query(ies)](https://semantic-link-labs.readthedocs.io/en/stable/sempy_labs.html#sempy_labs.get_dax_query_dependencies)
67
68
  * Reports
68
69
  * [Report Best Practice Analyzer (BPA)](https://semantic-link-labs.readthedocs.io/en/stable/sempy_labs.report.html#sempy_labs.report.run_report_bpa)
69
70
  * [View report metadata](https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Report%20Analysis.ipynb)
@@ -141,6 +142,8 @@ An even better way to ensure the semantic-link-labs library is available in your
141
142
  2. Select your newly created environment within the 'Environment' drop down in the navigation bar at the top of the notebook
142
143
 
143
144
  ## Version History
145
+ * [0.8.10](https://github.com/microsoft/semantic-link-labs/releases/tag/0.8.10) (December 16, 2024)
146
+ * [0.8.9](https://github.com/microsoft/semantic-link-labs/releases/tag/0.8.9) (December 4, 2024)
144
147
  * [0.8.8](https://github.com/microsoft/semantic-link-labs/releases/tag/0.8.8) (November 28, 2024)
145
148
  * [0.8.7](https://github.com/microsoft/semantic-link-labs/releases/tag/0.8.7) (November 27, 2024)
146
149
  * [0.8.6](https://github.com/microsoft/semantic-link-labs/releases/tag/0.8.6) (November 14, 2024)
@@ -1,7 +1,7 @@
1
1
  # Semantic Link Labs
2
2
 
3
3
  [![PyPI version](https://badge.fury.io/py/semantic-link-labs.svg)](https://badge.fury.io/py/semantic-link-labs)
4
- [![Read The Docs](https://readthedocs.org/projects/semantic-link-labs/badge/?version=0.8.8&style=flat)](https://readthedocs.org/projects/semantic-link-labs/)
4
+ [![Read The Docs](https://readthedocs.org/projects/semantic-link-labs/badge/?version=0.8.10&style=flat)](https://readthedocs.org/projects/semantic-link-labs/)
5
5
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
6
6
  [![Downloads](https://static.pepy.tech/badge/semantic-link-labs)](https://pepy.tech/project/semantic-link-labs)
7
7
 
@@ -38,6 +38,7 @@ Check out the video below for an introduction to Semantic Link, Semantic Link La
38
38
  * [Dynamically generate a Direct Lake semantic model](https://semantic-link-labs.readthedocs.io/en/stable/sempy_labs.directlake.html#sempy_labs.directlake.generate_direct_lake_semantic_model)
39
39
  * [Check why a Direct Lake semantic model would fallback to DirectQuery](https://semantic-link-labs.readthedocs.io/en/stable/sempy_labs.directlake.html#sempy_labs.directlake.check_fallback_reason)
40
40
  * [View a measure dependency tree](https://semantic-link-labs.readthedocs.io/en/stable/sempy_labs.html#sempy_labs.measure_dependency_tree)
41
+ * [View unique columns touched in a single (or multiple) DAX query(ies)](https://semantic-link-labs.readthedocs.io/en/stable/sempy_labs.html#sempy_labs.get_dax_query_dependencies)
41
42
  * Reports
42
43
  * [Report Best Practice Analyzer (BPA)](https://semantic-link-labs.readthedocs.io/en/stable/sempy_labs.report.html#sempy_labs.report.run_report_bpa)
43
44
  * [View report metadata](https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Report%20Analysis.ipynb)
@@ -115,6 +116,8 @@ An even better way to ensure the semantic-link-labs library is available in your
115
116
  2. Select your newly created environment within the 'Environment' drop down in the navigation bar at the top of the notebook
116
117
 
117
118
  ## Version History
119
+ * [0.8.10](https://github.com/microsoft/semantic-link-labs/releases/tag/0.8.10) (December 16, 2024)
120
+ * [0.8.9](https://github.com/microsoft/semantic-link-labs/releases/tag/0.8.9) (December 4, 2024)
118
121
  * [0.8.8](https://github.com/microsoft/semantic-link-labs/releases/tag/0.8.8) (November 28, 2024)
119
122
  * [0.8.7](https://github.com/microsoft/semantic-link-labs/releases/tag/0.8.7) (November 27, 2024)
120
123
  * [0.8.6](https://github.com/microsoft/semantic-link-labs/releases/tag/0.8.6) (November 14, 2024)
@@ -13,7 +13,7 @@ sys.path.insert(0, os.path.abspath('../../src/'))
13
13
  project = 'semantic-link-labs'
14
14
  copyright = '2024, Microsoft and community'
15
15
  author = 'Microsoft and community'
16
- release = '0.8.8'
16
+ release = '0.8.10'
17
17
 
18
18
  # -- General configuration ---------------------------------------------------
19
19
  # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
@@ -7,7 +7,7 @@ name="semantic-link-labs"
7
7
  authors = [
8
8
  { name = "Microsoft Corporation" },
9
9
  ]
10
- version="0.8.8"
10
+ version="0.8.10"
11
11
  description="Semantic Link Labs for Microsoft Fabric"
12
12
  readme="README.md"
13
13
  requires-python=">=3.10,<3.12"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: semantic-link-labs
3
- Version: 0.8.8
3
+ Version: 0.8.10
4
4
  Summary: Semantic Link Labs for Microsoft Fabric
5
5
  Author: Microsoft Corporation
6
6
  License: MIT License
@@ -27,7 +27,7 @@ Requires-Dist: pytest>=8.2.1; extra == "test"
27
27
  # Semantic Link Labs
28
28
 
29
29
  [![PyPI version](https://badge.fury.io/py/semantic-link-labs.svg)](https://badge.fury.io/py/semantic-link-labs)
30
- [![Read The Docs](https://readthedocs.org/projects/semantic-link-labs/badge/?version=0.8.8&style=flat)](https://readthedocs.org/projects/semantic-link-labs/)
30
+ [![Read The Docs](https://readthedocs.org/projects/semantic-link-labs/badge/?version=0.8.10&style=flat)](https://readthedocs.org/projects/semantic-link-labs/)
31
31
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
32
32
  [![Downloads](https://static.pepy.tech/badge/semantic-link-labs)](https://pepy.tech/project/semantic-link-labs)
33
33
 
@@ -64,6 +64,7 @@ Check out the video below for an introduction to Semantic Link, Semantic Link La
64
64
  * [Dynamically generate a Direct Lake semantic model](https://semantic-link-labs.readthedocs.io/en/stable/sempy_labs.directlake.html#sempy_labs.directlake.generate_direct_lake_semantic_model)
65
65
  * [Check why a Direct Lake semantic model would fallback to DirectQuery](https://semantic-link-labs.readthedocs.io/en/stable/sempy_labs.directlake.html#sempy_labs.directlake.check_fallback_reason)
66
66
  * [View a measure dependency tree](https://semantic-link-labs.readthedocs.io/en/stable/sempy_labs.html#sempy_labs.measure_dependency_tree)
67
+ * [View unique columns touched in a single (or multiple) DAX query(ies)](https://semantic-link-labs.readthedocs.io/en/stable/sempy_labs.html#sempy_labs.get_dax_query_dependencies)
67
68
  * Reports
68
69
  * [Report Best Practice Analyzer (BPA)](https://semantic-link-labs.readthedocs.io/en/stable/sempy_labs.report.html#sempy_labs.report.run_report_bpa)
69
70
  * [View report metadata](https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Report%20Analysis.ipynb)
@@ -141,6 +142,8 @@ An even better way to ensure the semantic-link-labs library is available in your
141
142
  2. Select your newly created environment within the 'Environment' drop down in the navigation bar at the top of the notebook
142
143
 
143
144
  ## Version History
145
+ * [0.8.10](https://github.com/microsoft/semantic-link-labs/releases/tag/0.8.10) (December 16, 2024)
146
+ * [0.8.9](https://github.com/microsoft/semantic-link-labs/releases/tag/0.8.9) (December 4, 2024)
144
147
  * [0.8.8](https://github.com/microsoft/semantic-link-labs/releases/tag/0.8.8) (November 28, 2024)
145
148
  * [0.8.7](https://github.com/microsoft/semantic-link-labs/releases/tag/0.8.7) (November 27, 2024)
146
149
  * [0.8.6](https://github.com/microsoft/semantic-link-labs/releases/tag/0.8.6) (November 14, 2024)
@@ -8,6 +8,7 @@ from sempy_labs._gateways import (
8
8
  create_vnet_gateway,
9
9
  update_vnet_gateway,
10
10
  update_on_premises_gateway,
11
+ bind_semantic_model_to_gateway,
11
12
  )
12
13
 
13
14
  from sempy_labs._authentication import (
@@ -190,6 +191,7 @@ from sempy_labs._generate_semantic_model import (
190
191
  get_semantic_model_bim,
191
192
  get_semantic_model_size,
192
193
  update_semantic_model_from_bim,
194
+ get_semantic_model_definition,
193
195
  )
194
196
  from sempy_labs._list_functions import (
195
197
  list_reports_using_semantic_model,
@@ -204,6 +206,8 @@ from sempy_labs._list_functions import (
204
206
  list_lakehouses,
205
207
  list_sql_endpoints,
206
208
  update_item,
209
+ list_server_properties,
210
+ list_semantic_model_errors,
207
211
  )
208
212
  from sempy_labs._helper_functions import (
209
213
  convert_to_friendly_case,
@@ -229,6 +233,7 @@ from sempy_labs._helper_functions import (
229
233
  get_capacity_id,
230
234
  get_capacity_name,
231
235
  resolve_capacity_name,
236
+ get_tenant_id,
232
237
  )
233
238
  from sempy_labs._model_bpa_bulk import (
234
239
  run_model_bpa_bulk,
@@ -456,4 +461,9 @@ __all__ = [
456
461
  "create_vnet_gateway",
457
462
  "update_vnet_gateway",
458
463
  "update_on_premises_gateway",
464
+ "get_semantic_model_definition",
465
+ "get_tenant_id",
466
+ "list_server_properties",
467
+ "bind_semantic_model_to_gateway",
468
+ "list_semantic_model_errors",
459
469
  ]
@@ -91,11 +91,13 @@ class ServicePrincipalTokenProvider(TokenProvider):
91
91
 
92
92
  return cls(credential)
93
93
 
94
- def __call__(self, audience: Literal["pbi", "storage"] = "pbi") -> str:
94
+ def __call__(
95
+ self, audience: Literal["pbi", "storage", "azure", "graph"] = "pbi"
96
+ ) -> str:
95
97
  """
96
98
  Parameters
97
99
  ----------
98
- audience : Literal["pbi", "storage"] = "pbi") -> str
100
+ audience : Literal["pbi", "storage", "azure", "graph"] = "pbi") -> str
99
101
  Literal if it's for PBI/Fabric API call or OneLake/Storage Account call.
100
102
  """
101
103
  if audience == "pbi":
@@ -104,5 +106,32 @@ class ServicePrincipalTokenProvider(TokenProvider):
104
106
  ).token
105
107
  elif audience == "storage":
106
108
  return self.credential.get_token("https://storage.azure.com/.default").token
109
+ elif audience == "azure":
110
+ return self.credential.get_token(
111
+ "https://management.azure.com/.default"
112
+ ).token
113
+ elif audience == "graph":
114
+ return self.credential.get_token(
115
+ "https://graph.microsoft.com/.default"
116
+ ).token
107
117
  else:
108
118
  raise NotImplementedError
119
+
120
+
121
+ def _get_headers(
122
+ token_provider: str, audience: Literal["pbi", "storage", "azure", "graph"] = "azure"
123
+ ):
124
+ """
125
+ Generates headers for an API request.
126
+ """
127
+
128
+ token = token_provider(audience=audience)
129
+
130
+ headers = {"Authorization": f"Bearer {token}"}
131
+
132
+ if audience == "graph":
133
+ headers["ConsistencyLevel"] = "eventual"
134
+ else:
135
+ headers["Content-Type"] = "application/json"
136
+
137
+ return headers
@@ -42,7 +42,7 @@ def list_dataflows(workspace: Optional[str] = None):
42
42
  "Dataflow Id": v.get("objectId"),
43
43
  "Dataflow Name": v.get("name"),
44
44
  "Configured By": v.get("configuredBy"),
45
- "Users": [v.get("users")],
45
+ "Users": v.get("users"),
46
46
  "Generation": v.get("generation"),
47
47
  }
48
48
  df = pd.concat(
@@ -6,7 +6,7 @@ from sempy_labs._helper_functions import (
6
6
  format_dax_object_name,
7
7
  )
8
8
  from sempy_labs._model_dependencies import get_model_calc_dependencies
9
- from typing import Optional
9
+ from typing import Optional, List
10
10
  from sempy._utils._log import log
11
11
  from tqdm.auto import tqdm
12
12
 
@@ -67,8 +67,9 @@ def evaluate_dax_impersonation(
67
67
  @log
68
68
  def get_dax_query_dependencies(
69
69
  dataset: str,
70
- dax_string: str,
70
+ dax_string: str | List[str],
71
71
  put_in_memory: bool = False,
72
+ show_vertipaq_stats: bool = True,
72
73
  workspace: Optional[str] = None,
73
74
  ) -> pd.DataFrame:
74
75
  """
@@ -78,10 +79,12 @@ def get_dax_query_dependencies(
78
79
  ----------
79
80
  dataset : str
80
81
  Name of the semantic model.
81
- dax_string : str
82
- The DAX query.
82
+ dax_string : str | List[str]
83
+ The DAX query or list of DAX queries.
83
84
  put_in_memory : bool, default=False
84
85
  If True, ensures that the dependent columns are put into memory in order to give realistic Vertipaq stats (i.e. Total Size etc.).
86
+ show_vertipaq_stats : bool, default=True
87
+ If True, shows vertipaq stats (i.e. Total Size, Data Size, Dictionary Size, Hierarchy Size)
85
88
  workspace : str, default=None
86
89
  The Fabric workspace name.
87
90
  Defaults to None which resolves to the workspace of the attached lakehouse
@@ -96,67 +99,79 @@ def get_dax_query_dependencies(
96
99
  if workspace is None:
97
100
  workspace = fabric.resolve_workspace_name(workspace)
98
101
 
99
- # Escape quotes in dax
100
- dax_string = dax_string.replace('"', '""')
101
- final_query = f"""
102
- EVALUATE
103
- VAR source_query = "{dax_string}"
104
- VAR all_dependencies = SELECTCOLUMNS(
105
- INFO.CALCDEPENDENCY("QUERY", source_query),
106
- "Referenced Object Type",[REFERENCED_OBJECT_TYPE],
107
- "Referenced Table", [REFERENCED_TABLE],
108
- "Referenced Object", [REFERENCED_OBJECT]
109
- )
110
- RETURN all_dependencies
111
- """
112
- dep = fabric.evaluate_dax(
113
- dataset=dataset, workspace=workspace, dax_string=final_query
114
- )
102
+ if isinstance(dax_string, str):
103
+ dax_string = [dax_string]
115
104
 
116
- # Clean up column names and values (remove outside square brackets, underscorees in object type)
117
- dep.columns = dep.columns.map(lambda x: x[1:-1])
118
- dep["Referenced Object Type"] = (
119
- dep["Referenced Object Type"].str.replace("_", " ").str.title()
120
- )
121
- dep
122
-
123
- # Dataframe df will contain the output of all dependencies of the objects used in the query
124
- df = dep.copy()
105
+ final_df = pd.DataFrame(columns=["Object Type", "Table", "Object"])
125
106
 
126
107
  cd = get_model_calc_dependencies(dataset=dataset, workspace=workspace)
127
108
 
128
- for _, r in dep.iterrows():
129
- ot = r["Referenced Object Type"]
130
- object_name = r["Referenced Object"]
131
- table_name = r["Referenced Table"]
132
- cd_filt = cd[
133
- (cd["Object Type"] == ot)
134
- & (cd["Object Name"] == object_name)
135
- & (cd["Table Name"] == table_name)
136
- ]
137
-
138
- # Adds in the dependencies of each object used in the query (i.e. relationship etc.)
139
- if len(cd_filt) > 0:
140
- subset = cd_filt[
141
- ["Referenced Object Type", "Referenced Table", "Referenced Object"]
109
+ for dax in dax_string:
110
+ # Escape quotes in dax
111
+ dax = dax.replace('"', '""')
112
+ final_query = f"""
113
+ EVALUATE
114
+ VAR source_query = "{dax}"
115
+ VAR all_dependencies = SELECTCOLUMNS(
116
+ INFO.CALCDEPENDENCY("QUERY", source_query),
117
+ "Referenced Object Type",[REFERENCED_OBJECT_TYPE],
118
+ "Referenced Table", [REFERENCED_TABLE],
119
+ "Referenced Object", [REFERENCED_OBJECT]
120
+ )
121
+ RETURN all_dependencies
122
+ """
123
+ dep = fabric.evaluate_dax(
124
+ dataset=dataset, workspace=workspace, dax_string=final_query
125
+ )
126
+
127
+ # Clean up column names and values (remove outside square brackets, underscorees in object type)
128
+ dep.columns = dep.columns.map(lambda x: x[1:-1])
129
+ dep["Referenced Object Type"] = (
130
+ dep["Referenced Object Type"].str.replace("_", " ").str.title()
131
+ )
132
+
133
+ # Dataframe df will contain the output of all dependencies of the objects used in the query
134
+ df = dep.copy()
135
+
136
+ for _, r in dep.iterrows():
137
+ ot = r["Referenced Object Type"]
138
+ object_name = r["Referenced Object"]
139
+ table_name = r["Referenced Table"]
140
+ cd_filt = cd[
141
+ (cd["Object Type"] == ot)
142
+ & (cd["Object Name"] == object_name)
143
+ & (cd["Table Name"] == table_name)
142
144
  ]
143
- df = pd.concat([df, subset], ignore_index=True)
144
-
145
- df.columns = df.columns.map(lambda x: x.replace("Referenced ", ""))
146
- # Remove duplicates
147
- df = df.drop_duplicates().reset_index(drop=True)
148
- # Only show columns and remove the rownumber column
149
- df = df[
150
- (df["Object Type"].isin(["Column", "Calc Column"]))
151
- & (~df["Object"].str.startswith("RowNumber-"))
145
+
146
+ # Adds in the dependencies of each object used in the query (i.e. relationship etc.)
147
+ if len(cd_filt) > 0:
148
+ subset = cd_filt[
149
+ ["Referenced Object Type", "Referenced Table", "Referenced Object"]
150
+ ]
151
+ df = pd.concat([df, subset], ignore_index=True)
152
+
153
+ df.columns = df.columns.map(lambda x: x.replace("Referenced ", ""))
154
+ final_df = pd.concat([df, final_df], ignore_index=True)
155
+
156
+ final_df = final_df[
157
+ (final_df["Object Type"].isin(["Column", "Calc Column"]))
158
+ & (~final_df["Object"].str.startswith("RowNumber-"))
152
159
  ]
160
+ final_df = final_df.drop_duplicates().reset_index(drop=True)
161
+ final_df = final_df.rename(columns={"Table": "Table Name", "Object": "Column Name"})
162
+ final_df.drop(columns=["Object Type"], inplace=True)
163
+
164
+ if not show_vertipaq_stats:
165
+ return final_df
153
166
 
154
167
  # Get vertipaq stats, filter to just the objects in the df dataframe
155
- df["Full Object"] = format_dax_object_name(df["Table"], df["Object"])
168
+ final_df["Full Object"] = format_dax_object_name(
169
+ final_df["Table Name"], final_df["Column Name"]
170
+ )
156
171
  dfC = fabric.list_columns(dataset=dataset, workspace=workspace, extended=True)
157
172
  dfC["Full Object"] = format_dax_object_name(dfC["Table Name"], dfC["Column Name"])
158
173
 
159
- dfC_filtered = dfC[dfC["Full Object"].isin(df["Full Object"].values)][
174
+ dfC_filtered = dfC[dfC["Full Object"].isin(final_df["Full Object"].values)][
160
175
  [
161
176
  "Table Name",
162
177
  "Column Name",
@@ -6,6 +6,8 @@ from sempy_labs._helper_functions import (
6
6
  pagination,
7
7
  _is_valid_uuid,
8
8
  resolve_capacity_id,
9
+ resolve_workspace_name_and_id,
10
+ resolve_dataset_name_and_id,
9
11
  )
10
12
  from uuid import UUID
11
13
  import sempy_labs._icons as icons
@@ -437,3 +439,47 @@ def update_vnet_gateway(
437
439
  raise FabricHTTPException(response)
438
440
 
439
441
  print(f"{icons.green_dot} The '{gateway}' has been updated accordingly.")
442
+
443
+
444
+ def bind_semantic_model_to_gateway(
445
+ dataset: str | UUID, gateway: str | UUID, workspace: Optional[str | UUID] = None
446
+ ):
447
+ """
448
+ Binds the specified dataset from the specified workspace to the specified gateway.
449
+
450
+ This is a wrapper function for the following API: `Datasets - Bind To Gateway In Group <https://learn.microsoft.com/rest/api/power-bi/datasets/bind-to-gateway-in-group>`_.
451
+
452
+ Parameters
453
+ ----------
454
+ dataset : str | UUID
455
+ The name or ID of the semantic model.
456
+ gateway : str | UUID
457
+ The name or ID of the gateway.
458
+ workspace : str | UUID, default=None
459
+ The Fabric workspace name.
460
+ Defaults to None which resolves to the workspace of the attached lakehouse
461
+ or if no lakehouse attached, resolves to the workspace of the notebook.
462
+ """
463
+
464
+ (workspace_name, workspace_id) = resolve_workspace_name_and_id(workspace)
465
+ (dataset_name, dataset_id) = resolve_dataset_name_and_id(
466
+ dataset, workspace=workspace_id
467
+ )
468
+
469
+ gateway_id = _resolve_gateway_id(gateway)
470
+ payload = {
471
+ "gatewayObjectId": gateway_id,
472
+ }
473
+
474
+ client = fabric.FabricRestClient()
475
+ response = client.post(
476
+ f"/v1.0/myorg/groups/{workspace_id}/datasets/{dataset_id}/Default.BindToGateway",
477
+ json=payload,
478
+ )
479
+
480
+ if response.status_code != 200:
481
+ raise FabricHTTPException(response)
482
+
483
+ print(
484
+ f"{icons.green_dot} The '{dataset_name}' semantic model within the '{workspace_name}' workspace has been binded to the '{gateway_id}' gateway."
485
+ )
@@ -2,7 +2,7 @@ import sempy.fabric as fabric
2
2
  import pandas as pd
3
3
  import json
4
4
  import os
5
- from typing import Optional
5
+ from typing import Optional, List
6
6
  from sempy_labs._helper_functions import (
7
7
  resolve_lakehouse_name,
8
8
  resolve_workspace_name_and_id,
@@ -203,14 +203,7 @@ def update_semantic_model_from_bim(
203
203
  """
204
204
 
205
205
  (workspace, workspace_id) = resolve_workspace_name_and_id(workspace)
206
-
207
- dfD = fabric.list_datasets(workspace=workspace, mode="rest")
208
- dfD_filt = dfD[dfD["Dataset Name"] == dataset]
209
- if len(dfD_filt) == 0:
210
- raise ValueError(
211
- f"{icons.red_dot} The '{dataset}' semantic model within the '{workspace}' workspace does not exist."
212
- )
213
- dataset_id = dfD_filt["Dataset Id"].iloc[0]
206
+ dataset_id = resolve_dataset_id(dataset=dataset, workspace=workspace)
214
207
 
215
208
  client = fabric.FabricRestClient()
216
209
  defPBIDataset = {"version": "1.0", "settings": {}}
@@ -303,12 +296,11 @@ def deploy_semantic_model(
303
296
  bim = get_semantic_model_bim(dataset=source_dataset, workspace=source_workspace)
304
297
 
305
298
  # Create the semantic model if the model does not exist
306
- if len(dfD_filt) == 0:
299
+ if dfD_filt.empty:
307
300
  create_semantic_model_from_bim(
308
301
  dataset=target_dataset,
309
302
  bim_file=bim,
310
303
  workspace=target_workspace,
311
- overwrite=overwrite,
312
304
  )
313
305
  # Update the semantic model if the model exists
314
306
  else:
@@ -329,8 +321,6 @@ def get_semantic_model_bim(
329
321
  """
330
322
  Extracts the Model.bim file for a given semantic model.
331
323
 
332
- This is a wrapper function for the following API: `Items - Get Semantic Model Definition <https://learn.microsoft.com/rest/api/fabric/semanticmodel/items/get-semantic-model-definition>`_.
333
-
334
324
  Parameters
335
325
  ----------
336
326
  dataset : str
@@ -352,20 +342,9 @@ def get_semantic_model_bim(
352
342
  The Model.bim file for the semantic model.
353
343
  """
354
344
 
355
- (workspace, workspace_id) = resolve_workspace_name_and_id(workspace)
356
-
357
- fmt = "TMSL"
358
- client = fabric.FabricRestClient()
359
- dataset_id = resolve_dataset_id(dataset=dataset, workspace=workspace)
360
- response = client.post(
361
- f"/v1/workspaces/{workspace_id}/semanticModels/{dataset_id}/getDefinition?format={fmt}",
345
+ bimJson = get_semantic_model_definition(
346
+ dataset=dataset, workspace=workspace, format="TMSL", return_dataframe=False
362
347
  )
363
- result = lro(client, response).json()
364
- df_items = pd.json_normalize(result["definition"]["parts"])
365
- df_items_filt = df_items[df_items["path"] == "model.bim"]
366
- payload = df_items_filt["payload"].iloc[0]
367
- bimFile = _decode_b64(payload)
368
- bimJson = json.loads(bimFile)
369
348
 
370
349
  if save_to_file_name is not None:
371
350
  if not lakehouse_attached():
@@ -384,12 +363,80 @@ def get_semantic_model_bim(
384
363
  with open(filePath, "w") as json_file:
385
364
  json.dump(bimJson, json_file, indent=4)
386
365
  print(
387
- f"{icons.green_dot} The .bim file for the '{dataset}' semantic model has been saved to the '{lakehouse}' in this location: '{filePath}'.\n\n"
366
+ f"{icons.green_dot} The {fileExt} file for the '{dataset}' semantic model has been saved to the '{lakehouse}' in this location: '{filePath}'.\n\n"
388
367
  )
389
368
 
390
369
  return bimJson
391
370
 
392
371
 
372
+ def get_semantic_model_definition(
373
+ dataset: str,
374
+ format: str = "TMSL",
375
+ workspace: Optional[str] = None,
376
+ return_dataframe: bool = True,
377
+ ) -> pd.DataFrame | dict | List:
378
+ """
379
+ Extracts the semantic model definition.
380
+
381
+ This is a wrapper function for the following API: `Items - Get Semantic Model Definition <https://learn.microsoft.com/rest/api/fabric/semanticmodel/items/get-semantic-model-definition>`_.
382
+
383
+ Parameters
384
+ ----------
385
+ dataset : str
386
+ Name of the semantic model.
387
+ format : str, default="TMSL"
388
+ The output format. Valid options are "TMSL" or "TMDL". "TMSL" returns the .bim file whereas "TMDL" returns the collection of TMDL files. Can also enter 'bim' for the TMSL version.
389
+ workspace : str, default=None
390
+ The Fabric workspace name in which the semantic model resides.
391
+ Defaults to None which resolves to the workspace of the attached lakehouse
392
+ or if no lakehouse attached, resolves to the workspace of the notebook.
393
+ return_dataframe : bool, default=True
394
+ If True, returns a dataframe.
395
+ If False, returns the .bim file for TMSL format. Returns a list of the TMDL files (decoded) for TMDL format.
396
+
397
+ Returns
398
+ -------
399
+ pandas.DataFrame | dict | List
400
+ A pandas dataframe with the semantic model definition or the file or files comprising the semantic model definition.
401
+ """
402
+
403
+ valid_formats = ["TMSL", "TMDL"]
404
+
405
+ format = format.upper()
406
+ if format == "BIM":
407
+ format = "TMSL"
408
+ if format not in valid_formats:
409
+ raise ValueError(
410
+ f"{icons.red_dot} Invalid format. Valid options: {valid_formats}."
411
+ )
412
+
413
+ (workspace, workspace_id) = resolve_workspace_name_and_id(workspace)
414
+
415
+ client = fabric.FabricRestClient()
416
+ dataset_id = resolve_dataset_id(dataset=dataset, workspace=workspace)
417
+ response = client.post(
418
+ f"/v1/workspaces/{workspace_id}/semanticModels/{dataset_id}/getDefinition?format={format}",
419
+ )
420
+ result = lro(client, response).json()
421
+
422
+ files = result["definition"]["parts"]
423
+
424
+ if return_dataframe:
425
+ return pd.json_normalize(files)
426
+ elif format == "TMSL":
427
+ payload = next(
428
+ (part["payload"] for part in files if part["path"] == "model.bim"), None
429
+ )
430
+ return json.loads(_decode_b64(payload))
431
+ else:
432
+ decoded_parts = [
433
+ {"file_name": part["path"], "content": _decode_b64(part["payload"])}
434
+ for part in files
435
+ ]
436
+
437
+ return decoded_parts
438
+
439
+
393
440
  def get_semantic_model_size(dataset: str, workspace: Optional[str] = None):
394
441
 
395
442
  workspace = fabric.resolve_workspace_name(workspace)