semantic-link-labs 0.9.6__py3-none-any.whl → 0.9.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 (35) hide show
  1. {semantic_link_labs-0.9.6.dist-info → semantic_link_labs-0.9.7.dist-info}/METADATA +7 -5
  2. {semantic_link_labs-0.9.6.dist-info → semantic_link_labs-0.9.7.dist-info}/RECORD +35 -32
  3. {semantic_link_labs-0.9.6.dist-info → semantic_link_labs-0.9.7.dist-info}/WHEEL +1 -1
  4. sempy_labs/__init__.py +4 -0
  5. sempy_labs/_ai.py +3 -1
  6. sempy_labs/_capacities.py +0 -1
  7. sempy_labs/_dax_query_view.py +2 -0
  8. sempy_labs/_delta_analyzer_history.py +298 -0
  9. sempy_labs/_helper_functions.py +171 -15
  10. sempy_labs/_icons.py +6 -6
  11. sempy_labs/_list_functions.py +3 -1
  12. sempy_labs/_model_bpa_bulk.py +10 -11
  13. sempy_labs/_model_bpa_rules.py +1 -1
  14. sempy_labs/admin/_basic_functions.py +28 -2
  15. sempy_labs/admin/_reports.py +1 -1
  16. sempy_labs/admin/_scanner.py +0 -2
  17. sempy_labs/admin/_tenant.py +8 -3
  18. sempy_labs/directlake/_generate_shared_expression.py +9 -1
  19. sempy_labs/directlake/_update_directlake_model_lakehouse_connection.py +82 -36
  20. sempy_labs/directlake/_update_directlake_partition_entity.py +3 -0
  21. sempy_labs/graph/_groups.py +6 -0
  22. sempy_labs/graph/_teams.py +2 -0
  23. sempy_labs/graph/_users.py +4 -0
  24. sempy_labs/lakehouse/__init__.py +12 -3
  25. sempy_labs/lakehouse/_blobs.py +231 -0
  26. sempy_labs/lakehouse/_shortcuts.py +22 -3
  27. sempy_labs/migration/_direct_lake_to_import.py +47 -10
  28. sempy_labs/report/__init__.py +4 -0
  29. sempy_labs/report/_report_functions.py +3 -3
  30. sempy_labs/report/_report_helper.py +17 -5
  31. sempy_labs/report/_reportwrapper.py +17 -8
  32. sempy_labs/report/_save_report.py +147 -0
  33. sempy_labs/tom/_model.py +154 -23
  34. {semantic_link_labs-0.9.6.dist-info → semantic_link_labs-0.9.7.dist-info/licenses}/LICENSE +0 -0
  35. {semantic_link_labs-0.9.6.dist-info → semantic_link_labs-0.9.7.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: semantic-link-labs
3
- Version: 0.9.6
3
+ Version: 0.9.7
4
4
  Summary: Semantic Link Labs for Microsoft Fabric
5
5
  Author: Microsoft Corporation
6
6
  License: MIT License
@@ -15,18 +15,19 @@ Classifier: Framework :: Jupyter
15
15
  Requires-Python: <3.12,>=3.10
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
- Requires-Dist: semantic-link-sempy>=0.8.5
18
+ Requires-Dist: semantic-link-sempy>=0.9.3
19
19
  Requires-Dist: anytree
20
20
  Requires-Dist: powerbiclient
21
21
  Requires-Dist: polib
22
22
  Requires-Dist: jsonpath_ng
23
23
  Provides-Extra: test
24
24
  Requires-Dist: pytest>=8.2.1; extra == "test"
25
+ Dynamic: license-file
25
26
 
26
27
  # Semantic Link Labs
27
28
 
28
29
  [![PyPI version](https://badge.fury.io/py/semantic-link-labs.svg)](https://badge.fury.io/py/semantic-link-labs)
29
- [![Read The Docs](https://readthedocs.org/projects/semantic-link-labs/badge/?version=0.9.6&style=flat)](https://readthedocs.org/projects/semantic-link-labs/)
30
+ [![Read The Docs](https://readthedocs.org/projects/semantic-link-labs/badge/?version=0.9.7&style=flat)](https://readthedocs.org/projects/semantic-link-labs/)
30
31
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
31
32
  [![Downloads](https://static.pepy.tech/badge/semantic-link-labs)](https://pepy.tech/project/semantic-link-labs)
32
33
 
@@ -148,6 +149,7 @@ An even better way to ensure the semantic-link-labs library is available in your
148
149
  2. Select your newly created environment within the 'Environment' drop down in the navigation bar at the top of the notebook
149
150
 
150
151
  ## Version History
152
+ * [0.9.7](https://github.com/microsoft/semantic-link-labs/releases/tag/0.9.7) (April 1, 2025)
151
153
  * [0.9.6](https://github.com/microsoft/semantic-link-labs/releases/tag/0.9.6) (March 12, 2025)
152
154
  * [0.9.5](https://github.com/microsoft/semantic-link-labs/releases/tag/0.9.5) (March 7, 2025)
153
155
  * [0.9.4](https://github.com/microsoft/semantic-link-labs/releases/tag/0.9.4) (February 27, 2025)
@@ -309,7 +311,7 @@ We use [black](github.com/psf/black) formatting as a code formatting standard. M
309
311
 
310
312
  Run this code to install black
311
313
  ```cli
312
- pip install black
314
+ pip install black==25.1.0
313
315
  ```
314
316
 
315
317
  Run this code to format your code using black
@@ -1,7 +1,8 @@
1
- sempy_labs/__init__.py,sha256=FVczkUAO4jdRM325pPRwLZ_GZuhPaaEZfxT902JZ7w8,15500
2
- sempy_labs/_ai.py,sha256=rhVohfwrU1mvWH0EN_vCTnldb8xJNfGHZGba34k1JVw,16174
1
+ semantic_link_labs-0.9.7.dist-info/licenses/LICENSE,sha256=ws_MuBL-SCEBqPBFl9_FqZkaaydIJmxHrJG2parhU4M,1141
2
+ sempy_labs/__init__.py,sha256=DCtHeonEHwZmNAmVJz_kX-a97d04NsenB-b8eK38Omo,15609
3
+ sempy_labs/_ai.py,sha256=BD1TdGOJ7T4m3x426OP-FLb7bevn-9gKY8BTEDAJDQU,16205
3
4
  sempy_labs/_authentication.py,sha256=GjtN5XqIyWXbR5Ni4hfYiUNwgFa-ySX8e-BrqE1vgGc,6903
4
- sempy_labs/_capacities.py,sha256=hoHRWkZ_Gls0bMc8QGO-ZZj9zTOfH9iGvkEgFVCIm2g,40456
5
+ sempy_labs/_capacities.py,sha256=n48NYTY03zygRzcfyK1UOkSwTqKSyQefQ10IKQh-dfA,40426
5
6
  sempy_labs/_capacity_migration.py,sha256=GGIMrHwc7IEVJ9pDwmikXiF2QHu2nYqNyG235QYbmEw,24837
6
7
  sempy_labs/_clear_cache.py,sha256=5z73I4Zdr3C0Bd4zyxrQdcGG2VOzsXWukzB_evm4bRs,12731
7
8
  sempy_labs/_connections.py,sha256=Cc3VpQtXUDVpEyn5CVd9lGeZ13Nrdk_E_XrLu4pGRi8,18658
@@ -9,8 +10,9 @@ sempy_labs/_dashboards.py,sha256=cyFD-pUUFu4scGkbitilrI22GW5dTmTkUZ15ou7Bl-A,188
9
10
  sempy_labs/_data_pipelines.py,sha256=cW_WGmuWD4V9IgLprKL4TqFXgid4eTBXvEL3-IArS0w,4817
10
11
  sempy_labs/_dataflows.py,sha256=xv-wRDUq4Bzz-BOs1Jdb4bgS9HbPLpa1GqexfA6H0mg,8053
11
12
  sempy_labs/_dax.py,sha256=cFaXJUHuG93lYmjq_4CLG6gStvSTtgvJ8NA43TqeW_g,16871
12
- sempy_labs/_dax_query_view.py,sha256=owOHoU9_yV8deBnSVtEJk-xi-relyTV3wyLGelYiD_E,1853
13
+ sempy_labs/_dax_query_view.py,sha256=_zSvgystZzBj5euNTLKTg7-G77XVk0vqyqrDT72VvoM,1892
13
14
  sempy_labs/_delta_analyzer.py,sha256=1H2bfB8j8VovdtIOPLztfTIQYCdbfR54wrMW4qO6R-4,17576
15
+ sempy_labs/_delta_analyzer_history.py,sha256=A50dlBd2d3ILKV7Fwj4pfIRtXKmCFslhk1gpeEw4inc,10765
14
16
  sempy_labs/_deployment_pipelines.py,sha256=SDQYkCAhOAlxBr58jYxtLFOVySiRXO0_WhfOKGDeYZQ,6254
15
17
  sempy_labs/_documentation.py,sha256=yVA8VPEzx_fmljtcvSxtB7-BeupYsfdMXXjp6Fpnyo8,5007
16
18
  sempy_labs/_environments.py,sha256=5I5gHU68Crs603R00NgGy3RKdr925-X05V5EPkrHFkY,4995
@@ -21,12 +23,12 @@ sempy_labs/_gateways.py,sha256=6JE6VeGFPKF617sf2mMkxXVOz57YHI5jAQLAF-BzRLc,17527
21
23
  sempy_labs/_generate_semantic_model.py,sha256=5BRdobiNJ035HShCEpEkMPN-KfqVdqzGFuR0HM346mA,18560
22
24
  sempy_labs/_git.py,sha256=RyaT4XzrSi-4NLJZWiWZnnNpMgrKzRNxhyY8b1O2I6c,17819
23
25
  sempy_labs/_graphQL.py,sha256=truXeIUPRKLwc4skhs3FZYNcKP9FCGKly9en0YkR4NE,2690
24
- sempy_labs/_helper_functions.py,sha256=CgRxc1_EH-C2SZtJX5xYR69m3nIuiltRZBBXZFz9tgE,60805
25
- sempy_labs/_icons.py,sha256=ez2dx_LCti71S_-eB6WYQ-kOMyiBL8ZJN12-ev5dcmA,3579
26
+ sempy_labs/_helper_functions.py,sha256=Dx1B2VZdCY-X8qwDo3KZ5wE3jm1XL0jDsTqQ8F0tJks,65798
27
+ sempy_labs/_icons.py,sha256=SB9EQeoFCfD4bO6fcYuJOoPRSYenSrW0rI9G5RFsH28,3579
26
28
  sempy_labs/_job_scheduler.py,sha256=_-Pifkttk1oPNxewxwWcQ4QC_Hr24GSi6nmrEXwc0pc,15814
27
29
  sempy_labs/_kql_databases.py,sha256=0WVG9oiWgbjgV_oQc4f96QogqitVkbIeCmF_dVeePQE,4212
28
30
  sempy_labs/_kql_querysets.py,sha256=Jjcs4SkjeirnDkG6zfsl0KRUXVzMyWii0Yn0JMWwln8,3502
29
- sempy_labs/_list_functions.py,sha256=HCCJEwi3Q4VXfBXXAUNnYpvuP-CwGSOkN4uCn92TZZU,61842
31
+ sempy_labs/_list_functions.py,sha256=HwKFs7ojnzWiPk-DyhGHoGYlHeBOtmkYwOtuhMV9we0,61870
30
32
  sempy_labs/_managed_private_endpoints.py,sha256=Vqicp_EiGg_m8aA2F__gaJiB9cwjbxQOSOi7hkS6FvQ,6907
31
33
  sempy_labs/_mirrored_databases.py,sha256=-9ZV2PdPeIc4lvFNkpPMm_9wkGIY1QLZXspYdSev5oQ,13147
32
34
  sempy_labs/_mirrored_warehouses.py,sha256=Q3WlRjUwCLz8KW1eN8MiTPeY0P52Vkuz5kgnv4GvQ3k,1739
@@ -34,8 +36,8 @@ sempy_labs/_ml_experiments.py,sha256=-DA71k91cvrIhAlT5z5CDAL1ygVRsRUDxyJ-5e6fVJs
34
36
  sempy_labs/_ml_models.py,sha256=69i67MHn-_Fsq-5slLxxhCF8N2s0JBYn_CDTa1Hhhs0,3261
35
37
  sempy_labs/_model_auto_build.py,sha256=PTQo3dufzLSFcQ5shFkmBWAVSdP7cTJgpUclrcXyNbg,5105
36
38
  sempy_labs/_model_bpa.py,sha256=AoHshKqn3z2lNPwu1hKntJuCELYe1bLa_0LUzFXRjgs,22032
37
- sempy_labs/_model_bpa_bulk.py,sha256=SyiIOunbhKiuV8fNnpoFA_D09OtaAdm7tJHUL_Zi7Bo,15758
38
- sempy_labs/_model_bpa_rules.py,sha256=L3XaK1SThgz3h0uTZZH92IVkWooG5rhqVus-ddnBIHw,45975
39
+ sempy_labs/_model_bpa_bulk.py,sha256=hRY3dRBUtecrbscCZsEGv6TpCVqg_zAi8NmRq6dVMiE,15845
40
+ sempy_labs/_model_bpa_rules.py,sha256=3rpDcsl99ji2KbozqdrAeC_1YrTvF8A-l8VhiUHK0bo,45968
39
41
  sempy_labs/_model_dependencies.py,sha256=0xGgubrq76zIvBdEqmEX_Pd6WdizXFVECBW6BPl2DZo,13162
40
42
  sempy_labs/_mounted_data_factories.py,sha256=-IBxE5XurYyeeQg7BvpXSSR1MW3rRGmue6UGpqlo96U,3906
41
43
  sempy_labs/_notebooks.py,sha256=GbyBDay_c4dnPmS32e8qgRrKVb3evi_omSMzq-Xk9z0,8082
@@ -95,44 +97,45 @@ sempy_labs/admin/__init__.py,sha256=MIWuLkSdQ4BsHBgRKWMkPi1atDA-bQeUeRhNPW6_IEs,
95
97
  sempy_labs/admin/_activities.py,sha256=YfISDzhXro9glEa_yJmoYv-2q2M1DIkoyNzgLl7eWuI,6695
96
98
  sempy_labs/admin/_apps.py,sha256=PUEQlXbzVR9u3ZUQUhpfU3J-hfa8A2nTGFBpCqzMdW0,4085
97
99
  sempy_labs/admin/_artifacts.py,sha256=eCiNBdgNSUhOsE3i-Y1lp6p6T3is7RZJPy7ctu36oW4,2246
98
- sempy_labs/admin/_basic_functions.py,sha256=OvQ1X2KQoKFmqLSwnfy9uiSJTI6IUXXy5d7D89Ij5cw,15419
100
+ sempy_labs/admin/_basic_functions.py,sha256=NAiju3N6xGOHFbK6sRz8NyVOCsgDIwl50U2CRA2SV3g,16320
99
101
  sempy_labs/admin/_capacities.py,sha256=O-hqtiWWjZC25hOFLnx_PvnH0-m9Ky_hx3_1ubLUkgI,9863
100
102
  sempy_labs/admin/_datasets.py,sha256=kMerpBNro--kKdp2rhEKnVe0JDGjMDsxqgfbbw17K-U,6235
101
103
  sempy_labs/admin/_domains.py,sha256=Z0EhIJCcujx1NumeqM4eKAvai18p-9TAw1WJaU-cbbE,15076
102
104
  sempy_labs/admin/_external_data_share.py,sha256=q4gw5iYZJDH-9xIM6L0b2CU9ebUIdE-ZVrFsulRHyUU,3364
103
105
  sempy_labs/admin/_git.py,sha256=gsbDQKd66knCI_Zh8vHSfHK-uQVJjVmhKKvfMMYKZyA,2264
104
106
  sempy_labs/admin/_items.py,sha256=zX-eUDyQWiB8mY8Nojj03-_R728JvVIOlp0iEOisnKE,8750
105
- sempy_labs/admin/_reports.py,sha256=qkqV53w6XG-eyCrYWSEUG5xm7WARu4y8H5DzibbSHuE,7858
106
- sempy_labs/admin/_scanner.py,sha256=qBBY_ga9sShOQhkVR6TMobMBfNjwmNA2sGR1GYYSNFA,4425
107
+ sempy_labs/admin/_reports.py,sha256=nPDoC90Yzc67CtiuL4WYBYkGYuUQOnZAy0PCU0aYKj8,7857
108
+ sempy_labs/admin/_scanner.py,sha256=0mKi0ihJETdsSaeHFBEq3drcCS8J_enWWkIMBMECz64,4370
107
109
  sempy_labs/admin/_shared.py,sha256=srgkqttbMbK5XXjOt4zeAV8rMCvK7zEus55HsGtNUFI,3007
108
- sempy_labs/admin/_tenant.py,sha256=6CrJ8LBz5epst5kmqxbhoc0AmaU5KHZCJ36Hj6mlaVY,19141
110
+ sempy_labs/admin/_tenant.py,sha256=4--NxSqVbuS4BpNRcJoEikdJnJ2LV0R21HXuBD6d7vY,19357
109
111
  sempy_labs/admin/_users.py,sha256=eEOkgvny3FwMuUrSIBQ0n3JwrzWV_6_nwGc8_c-eXSM,4571
110
112
  sempy_labs/admin/_workspaces.py,sha256=XiiO3vyuJxKkVf9ZrW7261wHSBrnd8r7rbia8HGDFkI,4911
111
113
  sempy_labs/directlake/__init__.py,sha256=etaj-3wqe5t93mu74tGYjEOQ6gtHWUogidOygiVvlq8,2131
112
114
  sempy_labs/directlake/_directlake_schema_compare.py,sha256=tVc6hIgDxxA7a8V51e5tlzlp3bzVVTqQ_OKsTNxiWG4,5074
113
115
  sempy_labs/directlake/_directlake_schema_sync.py,sha256=ipONLkBaXm4WgcMMChAyD4rVushdqdjAQdexT-fJxcY,6573
114
116
  sempy_labs/directlake/_dl_helper.py,sha256=HHFy6tW-tSVZ4YHxSHvt6pXrloh0O6Lx7yNmZE7IAI4,10348
115
- sempy_labs/directlake/_generate_shared_expression.py,sha256=9GyGWy_IXSLMs-J2UXDgHGYNjYgS9-1G4z2PHFRokOw,2862
117
+ sempy_labs/directlake/_generate_shared_expression.py,sha256=SccfwnVnIocDdBj1159PUvWW4aaCRpLYwrePhdUntRw,3314
116
118
  sempy_labs/directlake/_get_directlake_lakehouse.py,sha256=e0WFQm4-daJR4K1aHuVaubu7T26yTeBgfNEMOXk-EzM,2392
117
119
  sempy_labs/directlake/_get_shared_expression.py,sha256=qc85kXggkx_7Sz_rAAli_yPnLzrGZpgD8IfVbTfZhQM,1133
118
120
  sempy_labs/directlake/_guardrails.py,sha256=wNVXpeiZckgLTly4cS5DU5DoV9x1S4DMxN5S08qAavE,2749
119
121
  sempy_labs/directlake/_list_directlake_model_calc_tables.py,sha256=EYT4ELmOZ3Uklzy6uMQMidc4WtBXm21NQqZu1Q5HTsg,2509
120
122
  sempy_labs/directlake/_show_unsupported_directlake_objects.py,sha256=nmrZrtDez7U8Ji76i9fxnnTx1zxMu2LCOZTMz4sFUEc,3504
121
- sempy_labs/directlake/_update_directlake_model_lakehouse_connection.py,sha256=IQ5Pfv_ffvzIJd4jeoQZ8cGerWTxAjGOyclKqsb8-c8,5746
122
- sempy_labs/directlake/_update_directlake_partition_entity.py,sha256=VzNYQ_Kiqz7TnKwNp7Nfbs0YYF0x6Crx7MeKFKc3C-Y,8988
123
+ sempy_labs/directlake/_update_directlake_model_lakehouse_connection.py,sha256=oKD4rKwD_s6Q3jKPw7H05isZWT8hs9WdtFyy23MDozc,7080
124
+ sempy_labs/directlake/_update_directlake_partition_entity.py,sha256=8YxrReJObtc7_Huq0qQrLKTVMhPO84guv8bQKtp__4c,9032
123
125
  sempy_labs/directlake/_warm_cache.py,sha256=xc7gG_OJY1rJYg79ztgcLATpnXHNqFaw-6CU1HgdlXk,9258
124
126
  sempy_labs/graph/__init__.py,sha256=AZ_IpOL06VvXrYmgbcrvQlxCxdDksvwXKf7JAGohCNI,620
125
- sempy_labs/graph/_groups.py,sha256=2axQ__eHNgJfb0ITOjexysz2Tq4AQ7xSejH4zG-QCFc,12531
126
- sempy_labs/graph/_teams.py,sha256=KTkIHd9XShsAiv1RsmVQpL2XmUVt4p9QyJFMP5evDj4,3050
127
- sempy_labs/graph/_users.py,sha256=o3bnpjln-K8JDAJQlcjpfgthAHPTT3CiAYzsx-3n6I4,5898
128
- sempy_labs/lakehouse/__init__.py,sha256=htZjFvJs3hCUUtMzRHQKbG6JlyC808QmXa_sVrPj0xg,799
127
+ sempy_labs/graph/_groups.py,sha256=j3YDeV6MzhRjGJRoD60SAaGyU8yb23x8QhXBzU2RWlE,12590
128
+ sempy_labs/graph/_teams.py,sha256=SRFaFuxtB7ylC5WeXIdrW0aLCxc_JTJHeEmxOPG99r8,3089
129
+ sempy_labs/graph/_users.py,sha256=dFOZ-jel6Aj4Um66f1jzQrgV0fOoI0cQnZfmR4OJSXo,5947
130
+ sempy_labs/lakehouse/__init__.py,sha256=5dRO6WfcHANed720iGhrgW4QajzV1emT47bPpCSKJNg,956
131
+ sempy_labs/lakehouse/_blobs.py,sha256=GgS2Zx6_0xzwUzuSBUll2bkNRFE-ThbK8jdYh-lJ2LY,8095
129
132
  sempy_labs/lakehouse/_get_lakehouse_columns.py,sha256=FWCyJhqqnZg837eK-S5st0xZpxbhxkcS8aTguazxjjY,2685
130
133
  sempy_labs/lakehouse/_get_lakehouse_tables.py,sha256=OmgYLNiegc8HwJP7hEPo5JMWFPyDIPSoqewBxsDkucc,8544
131
134
  sempy_labs/lakehouse/_lakehouse.py,sha256=dzDhBGN2FizREYFMsDsDzGm9cwLln1__OTAV_JV_GPY,8753
132
- sempy_labs/lakehouse/_shortcuts.py,sha256=jeecQA5EYj_D7OcfQJ1sgE3lcVNprTYxyijmUA2Q6yk,15469
135
+ sempy_labs/lakehouse/_shortcuts.py,sha256=24sPtX98ho84fNV_JCAHZrSkvk0Ui7p-0b-jTdGOGM8,16580
133
136
  sempy_labs/migration/__init__.py,sha256=142n01VAqlcx4E0mGGRtUfVOEwAXVdiHI_XprmUm7As,1175
134
137
  sempy_labs/migration/_create_pqt_file.py,sha256=eRK0Jz9ZeV_7jV3kNRze0bTAIqxsAZXLKMGE_loKOaY,9677
135
- sempy_labs/migration/_direct_lake_to_import.py,sha256=uMqvElwkCHMyraP9t2nGNgstRobiHPFo4AMuS60dXyU,2732
138
+ sempy_labs/migration/_direct_lake_to_import.py,sha256=GTSERKSwj4M4wOsENgDbb-ZO7NFqwD1VUcyOS73AbaM,3948
136
139
  sempy_labs/migration/_migrate_calctables_to_lakehouse.py,sha256=XzOPphiUmDIgv1ruhMyhAOs80hOfXCTKCrBGRP3PKtE,17998
137
140
  sempy_labs/migration/_migrate_calctables_to_semantic_model.py,sha256=Qt4WfmllCtSl-xkWzWWL5sTzi3lQDaJp43lVEXQisVY,6303
138
141
  sempy_labs/migration/_migrate_model_objects_to_semantic_model.py,sha256=RD0ttWcBratAzpPKjFF6jpEnZEd6M7m8OfEUFbkInbA,22950
@@ -140,18 +143,19 @@ sempy_labs/migration/_migrate_tables_columns_to_semantic_model.py,sha256=HYi2vn7
140
143
  sempy_labs/migration/_migration_validation.py,sha256=AHURrWofb-U-L2Bdu36mcisVXOuZXi6Smgrrs2kjYBM,2650
141
144
  sempy_labs/migration/_refresh_calc_tables.py,sha256=W-lYdUZZcoYyLRIpMdpgaz03PEMM6Zf7E1vzT6MmMAE,5516
142
145
  sempy_labs/report/_BPAReportTemplate.json,sha256=9Uh-7E6d2ooxQ7j5JRayv_ayEULc7Gzg42kZGKdOqH8,63920
143
- sempy_labs/report/__init__.py,sha256=wnmjUX3w521OYnQBV3h9EaJs1eFLkIxmjc59VQOC19I,1293
146
+ sempy_labs/report/__init__.py,sha256=bPZ_MMqKGokskjJwM3T89LxIVNa2AXJg8Lr-mvJhP0E,1392
144
147
  sempy_labs/report/_download_report.py,sha256=hCQ2_fSXSCqSUeaNM2Tf9T3MpRofREnDwp_zrfp7iTA,2703
145
148
  sempy_labs/report/_export_report.py,sha256=XCMsZzTBMgvQOe3Ltdod7my7_izpmP-3AVH6W5CExPE,10976
146
149
  sempy_labs/report/_generate_report.py,sha256=ncFo8brgwPkSNF3urROMkIElqO6pcSy9tM6ymHE_UeQ,13868
147
150
  sempy_labs/report/_paginated.py,sha256=rsElE0IQ9qxRDuEp6qNF1EcD5XEgfTc7WsWEQsalsuI,2156
148
151
  sempy_labs/report/_report_bpa.py,sha256=ClETB8Q41sY1scCuknhpvalvuBaQ9ZwA4QX7F3sPcjc,13596
149
152
  sempy_labs/report/_report_bpa_rules.py,sha256=tPVGA0hmE6QMLlWtig7Va7Ksr2yXWl_Lndq--tWWd6w,4959
150
- sempy_labs/report/_report_functions.py,sha256=Y6MGxi_WVW-k1-JK1UlezlKPYqpfGZHYHeex5Oiit-A,19709
151
- sempy_labs/report/_report_helper.py,sha256=NcdWgFuh1GjDwVPzy6QWwg3ecaJKoWzZdhbxT6hbbdA,10599
153
+ sempy_labs/report/_report_functions.py,sha256=pSrsUfMJqmsn9CYb5AM0iYdPR-EmuUSprVnc0dGhO1s,19709
154
+ sempy_labs/report/_report_helper.py,sha256=m23osIZMjvHhKbfhmTHyqHibXoWA9eP84TPanbH8kuE,10863
152
155
  sempy_labs/report/_report_list_functions.py,sha256=K9tMDQKhIZhelHvfMMW0lsxbVHekJ-5dAQveoD7PUDA,3980
153
156
  sempy_labs/report/_report_rebind.py,sha256=svyxUSdqgXJW1UDNcb-urJxU9erO3JM72uzmuJUWIT0,5090
154
- sempy_labs/report/_reportwrapper.py,sha256=gwilmrE_QqWLQankc1rFlbp1_bexbdR5K5pGyx0N3Go,82945
157
+ sempy_labs/report/_reportwrapper.py,sha256=u3MrszXTCQ8JtzdukXcnakdRW225jMXR2QvHgn1Wl_0,83226
158
+ sempy_labs/report/_save_report.py,sha256=FAzScMQIXl89TgVSRvaJofzKT0TfZh_hhPNNvDiktaI,6033
155
159
  sempy_labs/report/_bpareporttemplate/.platform,sha256=kWRa6B_KwSYLsvVFDx372mQriQO8v7dJ_YzQV_cfD-Q,303
156
160
  sempy_labs/report/_bpareporttemplate/definition.pbir,sha256=bttyHZYKqjA8OBb_cezGlX4H82cDvGZVCl1QB3fij4E,343
157
161
  sempy_labs/report/_bpareporttemplate/.pbi/localSettings.json,sha256=kzjBlNdjbsSBBSHBwbQc298AJCr9Vp6Ex0D5PemUuT0,1578
@@ -182,9 +186,8 @@ sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visua
182
186
  sempy_labs/report/_bpareporttemplate/definition/pages/d37dce724a0ccc30044b/page.json,sha256=wBVuNc8S2NaUA0FC708w6stmR2djNZp8nAsHMqesgsc,293
183
187
  sempy_labs/report/_bpareporttemplate/definition/pages/d37dce724a0ccc30044b/visuals/ce8532a7e25020271077/visual.json,sha256=mlY6t9OlSe-Y6_QmXJpS1vggU6Y3FjISUKECL8FVSg8,931
184
188
  sempy_labs/tom/__init__.py,sha256=Qbs8leW0fjzvWwOjyWK3Hjeehu7IvpB1beASGsi28bk,121
185
- sempy_labs/tom/_model.py,sha256=uQXCiaym-00LNxGLVEUMb5VyhBXL2Hd59bIGnWtle08,189080
186
- semantic_link_labs-0.9.6.dist-info/LICENSE,sha256=ws_MuBL-SCEBqPBFl9_FqZkaaydIJmxHrJG2parhU4M,1141
187
- semantic_link_labs-0.9.6.dist-info/METADATA,sha256=iPChIwMy-nN_f_SXFLSC66d0Ig0tPMtdB5E-ClRT5mk,26076
188
- semantic_link_labs-0.9.6.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
189
- semantic_link_labs-0.9.6.dist-info/top_level.txt,sha256=kiQX1y42Dbein1l3Q8jMUYyRulDjdlc2tMepvtrvixQ,11
190
- semantic_link_labs-0.9.6.dist-info/RECORD,,
189
+ sempy_labs/tom/_model.py,sha256=nHKFDh9yjTAvO96yPCsbW7ZMUPn44m8mlSElZp6ebbs,194439
190
+ semantic_link_labs-0.9.7.dist-info/METADATA,sha256=pbas6wJ715KVGnLNZ4R3vk3vq3tU6tKWp_mGydHWJKs,26200
191
+ semantic_link_labs-0.9.7.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
192
+ semantic_link_labs-0.9.7.dist-info/top_level.txt,sha256=kiQX1y42Dbein1l3Q8jMUYyRulDjdlc2tMepvtrvixQ,11
193
+ semantic_link_labs-0.9.7.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (76.0.0)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
sempy_labs/__init__.py CHANGED
@@ -1,3 +1,6 @@
1
+ from sempy_labs._delta_analyzer_history import (
2
+ delta_analyzer_history,
3
+ )
1
4
  from sempy_labs._dax_query_view import (
2
5
  generate_dax_query_view_url,
3
6
  )
@@ -554,4 +557,5 @@ __all__ = [
554
557
  "create_sql_database",
555
558
  "delete_sql_database",
556
559
  "list_sql_databases",
560
+ "delta_analyzer_history",
557
561
  ]
sempy_labs/_ai.py CHANGED
@@ -216,7 +216,9 @@ def generate_aggs(
216
216
  f"{icons.green_dot} The '{aggLakeTName}' table has been created/updated in the lakehouse."
217
217
 
218
218
  # Create/update semantic model agg table
219
- tom_server = fabric.create_tom_server(readonly=False, workspace=workspace)
219
+ tom_server = fabric.create_tom_server(
220
+ dataset=dataset, readonly=False, workspace=workspace
221
+ )
220
222
  m = tom_server.Databases.GetByName(dataset).Model
221
223
  print(f"\n{icons.in_progress} Updating the '{dataset}' semantic model...")
222
224
  dfC_agg = dfC[dfC["Table Name"] == aggTableName]
sempy_labs/_capacities.py CHANGED
@@ -1,4 +1,3 @@
1
- import sempy.fabric as fabric
2
1
  from typing import Optional, List, Tuple
3
2
  from sempy._utils._log import log
4
3
  import sempy_labs._icons as icons
@@ -5,11 +5,13 @@ from sempy_labs._helper_functions import (
5
5
  _get_fabric_context_setting,
6
6
  resolve_workspace_id,
7
7
  )
8
+ from sempy._utils._log import log
8
9
  import gzip
9
10
  import base64
10
11
  import urllib.parse
11
12
 
12
13
 
14
+ @log
13
15
  def generate_dax_query_view_url(
14
16
  dataset: str | UUID, dax_string: str, workspace: Optional[str | UUID] = None
15
17
  ):
@@ -0,0 +1,298 @@
1
+ import pandas as pd
2
+ from typing import Optional
3
+ import pyarrow.parquet as pq
4
+ from sempy_labs._helper_functions import (
5
+ create_abfss_path,
6
+ resolve_workspace_id,
7
+ resolve_lakehouse_id,
8
+ _mount,
9
+ )
10
+ from sempy._utils._log import log
11
+ from tqdm.auto import tqdm
12
+ from uuid import UUID
13
+ from datetime import datetime
14
+
15
+
16
+ @log
17
+ def delta_analyzer_history(
18
+ table_name: str,
19
+ schema: Optional[str] = None,
20
+ lakehouse: Optional[str | UUID] = None,
21
+ workspace: Optional[str | UUID] = None,
22
+ ) -> pd.DataFrame:
23
+ """
24
+ Analyzes the transaction log for a specified delta table and shows the results in dataframe. One row per data modification operation.
25
+
26
+ Keeps track on the number of Parquet files, rowgroups, file size and #rows impacted by each change.
27
+
28
+ Incremental Framing effect: 100% = highly effective, 0% = no benefit at all
29
+
30
+ Parameters
31
+ ----------
32
+ table_name : str
33
+ The delta table name.
34
+ schema : str, default=None
35
+ The schema name of the delta table.
36
+ lakehouse : str | uuid.UUID, default=None
37
+ The Fabric lakehouse name or ID.
38
+ Defaults to None which resolves to the lakehouse attached to the notebook.
39
+ workspace : str | uuid.UUID, default=None
40
+ The Fabric workspace name or ID used by the lakehouse.
41
+ Defaults to None which resolves to the workspace of the attached lakehouse
42
+ or if no lakehouse attached, resolves to the workspace of the notebook.
43
+
44
+ Returns
45
+ -------
46
+ pandas.DataFrame
47
+ Displays a gantt visual showing a timeline for individual parquet files.
48
+ """
49
+
50
+ import notebookutils
51
+ from IPython.display import display, HTML
52
+
53
+ workspace_id = resolve_workspace_id(workspace=workspace)
54
+ lakehouse_id = resolve_lakehouse_id(lakehouse=lakehouse, workspace=workspace)
55
+
56
+ table_path = create_abfss_path(lakehouse_id, workspace_id, table_name, schema)
57
+ local_path = _mount(lakehouse=lakehouse, workspace=workspace)
58
+ table_path_local = f"{local_path}/Tables/{table_name}"
59
+ delta_table_path = f"{table_path}/_delta_log"
60
+
61
+ files = notebookutils.fs.ls(delta_table_path)
62
+ json_files = [file.name for file in files if file.name.endswith(".json")]
63
+
64
+ element_version = total_size = total_rows = total_files = total_rowgroups = 0
65
+ changes_array = []
66
+ parquet_files = []
67
+ my_date_time_format = "%Y-%m-%d %H:%M:%S.%f"
68
+ now_to_epoch = datetime.now().strftime(my_date_time_format)
69
+ num_latest_files = len(json_files)
70
+
71
+ for idx, file in enumerate(bar := tqdm(json_files), start=1):
72
+ bar.set_description(
73
+ f"Analyzing the '{file}' parquet file ({idx}/{num_latest_files})..."
74
+ )
75
+
76
+ change_timestamp = datetime.strptime(
77
+ "2001-01-01 12:00:00.000", my_date_time_format
78
+ )
79
+ df = pd.read_json(f"{delta_table_path}/{file}", lines=True)
80
+
81
+ rows_added = size_added = rows_deleted = size_deleted = files_added = (
82
+ files_removed
83
+ ) = row_groups_added = row_groups_removed = 0
84
+ total_files_before_change = total_files
85
+ total_row_groups_before_change = total_rowgroups
86
+ operation = predicate = tags = ""
87
+
88
+ for _, row in df.iterrows():
89
+ add_row = row.get("add")
90
+ remove_row = row.get("remove")
91
+ commit_row = row.get("commitInfo")
92
+
93
+ if isinstance(add_row, dict):
94
+ file_name = add_row["path"]
95
+ fs_filename = f"{table_path}/{file_name}"
96
+ size_added += add_row["size"]
97
+ files_added += 1
98
+ filerows_added = 0
99
+
100
+ if notebookutils.fs.exists(fs_filename):
101
+ parquet_file = pq.ParquetFile(table_path_local + f"/{file_name}")
102
+ for i in range(parquet_file.num_row_groups):
103
+ row_group = parquet_file.metadata.row_group(i)
104
+ num_rows = row_group.num_rows
105
+ filerows_added += num_rows
106
+ rows_added += num_rows
107
+
108
+ row_groups_added += parquet_file.num_row_groups
109
+
110
+ start = str(
111
+ datetime.fromtimestamp(add_row["modificationTime"] / 1000.0)
112
+ )
113
+ parquet_files.append(
114
+ {
115
+ "file": file_name,
116
+ "start": start,
117
+ "end": now_to_epoch,
118
+ "rows": filerows_added,
119
+ "isCurrent": 1,
120
+ }
121
+ )
122
+
123
+ if isinstance(remove_row, dict):
124
+ file_name = remove_row["path"]
125
+ fs_filename = f"{table_path}/{file_name}"
126
+
127
+ if notebookutils.fs.exists(fs_filename):
128
+ parquet_file = pq.ParquetFile(table_path_local + f"/{file_name}")
129
+ for i in range(parquet_file.num_row_groups):
130
+ row_group = parquet_file.metadata.row_group(i)
131
+ num_rows = row_group.num_rows
132
+ rows_deleted += num_rows
133
+
134
+ files_removed += 1
135
+ size_deleted += remove_row.get("size", 0)
136
+ row_groups_removed += parquet_file.num_row_groups
137
+
138
+ result = next(
139
+ (row for row in parquet_files if row["file"] == file_name), None
140
+ )
141
+ if result:
142
+ result.update(
143
+ {
144
+ "isCurrent": 0,
145
+ "end": str(
146
+ datetime.fromtimestamp(
147
+ remove_row["deletionTimestamp"] / 1000.0
148
+ )
149
+ ),
150
+ }
151
+ )
152
+
153
+ if isinstance(commit_row, dict):
154
+ operation = commit_row.get("operation")
155
+ tags = commit_row.get("tags")
156
+ predicate = commit_row.get("operationParameters", {}).get("predicate")
157
+
158
+ if operation == "VACUUM START":
159
+ operation_metrics = commit_row.get("operationMetrics", {})
160
+ total_files -= int(operation_metrics.get("numFilesToDelete", 0))
161
+ total_size -= int(operation_metrics.get("sizeOfDataToDelete", 0))
162
+
163
+ change_timestamp = datetime.fromtimestamp(
164
+ commit_row["timestamp"] / 1000.0
165
+ )
166
+
167
+ total_size += size_added - size_deleted
168
+ total_rows += rows_added - rows_deleted
169
+ total_files += files_added - files_removed
170
+ total_rowgroups += row_groups_added - row_groups_removed
171
+
172
+ incremental_framing_effect = 1
173
+ if size_deleted != 0:
174
+ incremental_framing_effect = (
175
+ int((total_size - size_added * 1.0) / total_size * 100000) / 1000
176
+ )
177
+ # incrementalFramingEffect = round(
178
+ # (totalSize - sizeAdded * 1.0) / totalSize, 4
179
+ # )
180
+
181
+ changes_array.append(
182
+ [
183
+ element_version,
184
+ operation,
185
+ predicate,
186
+ change_timestamp,
187
+ incremental_framing_effect,
188
+ files_added,
189
+ files_removed,
190
+ total_files_before_change - files_removed,
191
+ total_files,
192
+ size_added,
193
+ size_deleted,
194
+ total_size,
195
+ row_groups_added,
196
+ row_groups_removed,
197
+ total_row_groups_before_change - row_groups_removed,
198
+ total_rowgroups,
199
+ rows_added,
200
+ rows_deleted,
201
+ rows_added - rows_deleted,
202
+ total_rows,
203
+ tags,
204
+ ]
205
+ )
206
+
207
+ element_version += 1
208
+
209
+ # /********************************************************************************************************************
210
+ # Display Gantt Chart of files
211
+ # ********************************************************************************************************************/
212
+ spec: str = (
213
+ """{
214
+ "$$schema": 'https://vega.github.io/schema/vega-lite/v2.json',
215
+ "description": "A simple bar chart with ranged data (aka Gantt Chart).",
216
+ "width" : 1024 ,
217
+ "data": {
218
+ "values": %s
219
+ },
220
+ "layer":[
221
+ {"mark": "bar"},
222
+ {"mark": {
223
+ "type": "text",
224
+ "align": "center",
225
+ "baseline": "middle",
226
+ "dx": 40
227
+ },
228
+ "encoding": {
229
+ "text": {"field": "rows", "type": "quantitative", "format":","},
230
+ "color":{
231
+ "condition": {"test": "datum['isCurrent'] == 1", "value": "black"},
232
+ "value": "black"
233
+ }
234
+ }
235
+ }],
236
+ "encoding": {
237
+ "y": {"field": "file", "type": "ordinal","sort": "isCurrent","title":null,"axis":{"labelPadding":15,"labelLimit":360}},
238
+ "x": {"field": "start", "type": "temporal","title":null},
239
+ "x2": {"field": "end", "type": "temporal","title":null},
240
+ "color": {
241
+ "field": "isCurrent",
242
+ "scale": {"range": ["silver", "#ca8861"]}
243
+ }
244
+ }
245
+ }"""
246
+ % (parquet_files)
247
+ )
248
+
249
+ display(
250
+ HTML(
251
+ """
252
+ <!DOCTYPE html>
253
+ <html>
254
+ <head>
255
+ <script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
256
+ <script src="https://cdn.jsdelivr.net/npm/vega-lite@5"></script>
257
+ <script src="https://cdn.jsdelivr.net/npm/vega-embed@6"></script>
258
+ </head>
259
+ <body>
260
+ <div id="vis"></div>
261
+ <script type="text/javascript">
262
+ var spec = """
263
+ + spec
264
+ + """;
265
+ var opt = {"renderer": "canvas", "actions": false};
266
+ vegaEmbed("#vis", spec, opt);
267
+ </script>
268
+ </body>
269
+ </html>"""
270
+ )
271
+ )
272
+
273
+ return pd.DataFrame(
274
+ changes_array,
275
+ columns=[
276
+ "Change Number",
277
+ "Change Type",
278
+ "Predicate",
279
+ "Modification Time",
280
+ "Incremental Effect",
281
+ "Files Added",
282
+ "Files Removed",
283
+ "Files Preserved",
284
+ "Files After Change",
285
+ "Size Added",
286
+ "Sized Removed",
287
+ "Size After Change",
288
+ "Rowgroups Added",
289
+ "Rowgroups Removed",
290
+ "Rowgroups Preserved",
291
+ "Rowgroups After Change",
292
+ "Rows Added",
293
+ "Rows Removed",
294
+ "Rows Delta",
295
+ "Rows After Change",
296
+ "Tags",
297
+ ],
298
+ )