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.
- {semantic_link_labs-0.9.6.dist-info → semantic_link_labs-0.9.7.dist-info}/METADATA +7 -5
- {semantic_link_labs-0.9.6.dist-info → semantic_link_labs-0.9.7.dist-info}/RECORD +35 -32
- {semantic_link_labs-0.9.6.dist-info → semantic_link_labs-0.9.7.dist-info}/WHEEL +1 -1
- sempy_labs/__init__.py +4 -0
- sempy_labs/_ai.py +3 -1
- sempy_labs/_capacities.py +0 -1
- sempy_labs/_dax_query_view.py +2 -0
- sempy_labs/_delta_analyzer_history.py +298 -0
- sempy_labs/_helper_functions.py +171 -15
- sempy_labs/_icons.py +6 -6
- sempy_labs/_list_functions.py +3 -1
- sempy_labs/_model_bpa_bulk.py +10 -11
- sempy_labs/_model_bpa_rules.py +1 -1
- sempy_labs/admin/_basic_functions.py +28 -2
- sempy_labs/admin/_reports.py +1 -1
- sempy_labs/admin/_scanner.py +0 -2
- sempy_labs/admin/_tenant.py +8 -3
- sempy_labs/directlake/_generate_shared_expression.py +9 -1
- sempy_labs/directlake/_update_directlake_model_lakehouse_connection.py +82 -36
- sempy_labs/directlake/_update_directlake_partition_entity.py +3 -0
- sempy_labs/graph/_groups.py +6 -0
- sempy_labs/graph/_teams.py +2 -0
- sempy_labs/graph/_users.py +4 -0
- sempy_labs/lakehouse/__init__.py +12 -3
- sempy_labs/lakehouse/_blobs.py +231 -0
- sempy_labs/lakehouse/_shortcuts.py +22 -3
- sempy_labs/migration/_direct_lake_to_import.py +47 -10
- sempy_labs/report/__init__.py +4 -0
- sempy_labs/report/_report_functions.py +3 -3
- sempy_labs/report/_report_helper.py +17 -5
- sempy_labs/report/_reportwrapper.py +17 -8
- sempy_labs/report/_save_report.py +147 -0
- sempy_labs/tom/_model.py +154 -23
- {semantic_link_labs-0.9.6.dist-info → semantic_link_labs-0.9.7.dist-info/licenses}/LICENSE +0 -0
- {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.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: semantic-link-labs
|
|
3
|
-
Version: 0.9.
|
|
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.
|
|
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
|
[](https://badge.fury.io/py/semantic-link-labs)
|
|
29
|
-
[](https://readthedocs.org/projects/semantic-link-labs/)
|
|
30
31
|
[](https://github.com/psf/black)
|
|
31
32
|
[](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
|
-
|
|
2
|
-
sempy_labs/
|
|
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=
|
|
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=
|
|
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=
|
|
25
|
-
sempy_labs/_icons.py,sha256=
|
|
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=
|
|
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=
|
|
38
|
-
sempy_labs/_model_bpa_rules.py,sha256=
|
|
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=
|
|
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=
|
|
106
|
-
sempy_labs/admin/_scanner.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
122
|
-
sempy_labs/directlake/_update_directlake_partition_entity.py,sha256=
|
|
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=
|
|
126
|
-
sempy_labs/graph/_teams.py,sha256=
|
|
127
|
-
sempy_labs/graph/_users.py,sha256=
|
|
128
|
-
sempy_labs/lakehouse/__init__.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
151
|
-
sempy_labs/report/_report_helper.py,sha256=
|
|
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=
|
|
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=
|
|
186
|
-
semantic_link_labs-0.9.
|
|
187
|
-
semantic_link_labs-0.9.
|
|
188
|
-
semantic_link_labs-0.9.
|
|
189
|
-
semantic_link_labs-0.9.
|
|
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,,
|
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(
|
|
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
sempy_labs/_dax_query_view.py
CHANGED
|
@@ -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
|
+
)
|