diff --git a/docs/content/en/latest/administration/appearance/create_color_palette.md b/docs/content/en/latest/administration/appearance/create_color_palette.md index 3679a83b1..781a5eb27 100644 --- a/docs/content/en/latest/administration/appearance/create_color_palette.md +++ b/docs/content/en/latest/administration/appearance/create_color_palette.md @@ -3,6 +3,7 @@ title: "create_color_palette" linkTitle: "create_color_palette" superheading: "catalog_appearance." weight: 220 +api_ref: "CatalogAppearanceService.create_color_palette" --- ``create_color_palette( color_palette: CatalogColorPalette ) -> None`` diff --git a/docs/content/en/latest/administration/appearance/create_theme.md b/docs/content/en/latest/administration/appearance/create_theme.md index 2d6b277e4..f28319867 100644 --- a/docs/content/en/latest/administration/appearance/create_theme.md +++ b/docs/content/en/latest/administration/appearance/create_theme.md @@ -3,6 +3,7 @@ title: "create_theme" linkTitle: "create_theme" superheading: "catalog_appearance." weight: 120 +api_ref: "CatalogAppearanceService.create_theme" --- ``create_theme( theme: CatalogTheme ) -> None`` diff --git a/docs/content/en/latest/administration/appearance/delete_color_palette.md b/docs/content/en/latest/administration/appearance/delete_color_palette.md index 1fa52d670..c9054fa25 100644 --- a/docs/content/en/latest/administration/appearance/delete_color_palette.md +++ b/docs/content/en/latest/administration/appearance/delete_color_palette.md @@ -3,6 +3,7 @@ title: "delete_color_palette" linkTitle: "delete_color_palette" superheading: "catalog_appearance." weight: 240 +api_ref: "CatalogAppearanceService.delete_color_palette" --- ``delete_color_palette( color_palette_id: str ) -> None`` diff --git a/docs/content/en/latest/administration/appearance/delete_theme.md b/docs/content/en/latest/administration/appearance/delete_theme.md index e8213d9be..d4ae21284 100644 --- a/docs/content/en/latest/administration/appearance/delete_theme.md +++ b/docs/content/en/latest/administration/appearance/delete_theme.md @@ -3,6 +3,7 @@ title: "delete_theme" linkTitle: "delete_theme" superheading: "catalog_appearance." weight: 140 +api_ref: "CatalogAppearanceService.delete_theme" --- ``delete_theme( theme_id: str ) -> None`` diff --git a/docs/content/en/latest/administration/appearance/get_color_palette.md b/docs/content/en/latest/administration/appearance/get_color_palette.md index 61d8a6086..46acade14 100644 --- a/docs/content/en/latest/administration/appearance/get_color_palette.md +++ b/docs/content/en/latest/administration/appearance/get_color_palette.md @@ -3,6 +3,7 @@ title: "get_color_palette" linkTitle: "get_color_palette" superheading: "catalog_appearance." weight: 210 +api_ref: "CatalogAppearanceService.get_color_palette" --- ``get_color_palette( color_palette_id: str ) -> CatalogColorPalette`` diff --git a/docs/content/en/latest/administration/appearance/get_theme.md b/docs/content/en/latest/administration/appearance/get_theme.md index 7156ca3ab..7876165b8 100644 --- a/docs/content/en/latest/administration/appearance/get_theme.md +++ b/docs/content/en/latest/administration/appearance/get_theme.md @@ -3,6 +3,7 @@ title: "get_theme" linkTitle: "get_theme" superheading: "catalog_appearance." weight: 110 +api_ref: "CatalogAppearanceService.get_theme" --- ``get_theme( theme_id: str ) -> CatalogTheme`` diff --git a/docs/content/en/latest/administration/appearance/list_color_palettes.md b/docs/content/en/latest/administration/appearance/list_color_palettes.md index a2e8d8583..fb5c12d0f 100644 --- a/docs/content/en/latest/administration/appearance/list_color_palettes.md +++ b/docs/content/en/latest/administration/appearance/list_color_palettes.md @@ -3,6 +3,7 @@ title: "list_color_palettes" linkTitle: "list_color_palettes" superheading: "catalog_appearance." weight: 200 +api_ref: "CatalogAppearanceService.list_color_palettes" --- ``list_color_palettes( ) -> list[CatalogColorPalette]`` diff --git a/docs/content/en/latest/administration/appearance/list_themes.md b/docs/content/en/latest/administration/appearance/list_themes.md index e852b0094..140271862 100644 --- a/docs/content/en/latest/administration/appearance/list_themes.md +++ b/docs/content/en/latest/administration/appearance/list_themes.md @@ -3,6 +3,7 @@ title: "list_themes" linkTitle: "list_themes" superheading: "catalog_appearance." weight: 100 +api_ref: "CatalogAppearanceService.list_themes" --- ``list_themes( ) -> list[CatalogTheme]`` diff --git a/docs/content/en/latest/administration/appearance/update_color_palette.md b/docs/content/en/latest/administration/appearance/update_color_palette.md index 26cb22c28..ab50fdab6 100644 --- a/docs/content/en/latest/administration/appearance/update_color_palette.md +++ b/docs/content/en/latest/administration/appearance/update_color_palette.md @@ -3,6 +3,7 @@ title: "update_color_palette" linkTitle: "update_color_palette" superheading: "catalog_appearance." weight: 230 +api_ref: "CatalogAppearanceService.update_color_palette" --- ``update_color_palette( color_palette: CatalogColorPalette ) -> None`` diff --git a/docs/content/en/latest/administration/appearance/update_theme.md b/docs/content/en/latest/administration/appearance/update_theme.md index ffe3c5292..ac288f23e 100644 --- a/docs/content/en/latest/administration/appearance/update_theme.md +++ b/docs/content/en/latest/administration/appearance/update_theme.md @@ -3,6 +3,7 @@ title: "update_theme" linkTitle: "update_theme" superheading: "catalog_appearance." weight: 130 +api_ref: "CatalogAppearanceService.update_theme" --- ``update_theme( theme: CatalogTheme ) -> None`` diff --git a/docs/content/en/latest/administration/notification-channels/get_declarative_notification_channels.md b/docs/content/en/latest/administration/notification-channels/get_declarative_notification_channels.md index c31b6343a..125dd4bf7 100644 --- a/docs/content/en/latest/administration/notification-channels/get_declarative_notification_channels.md +++ b/docs/content/en/latest/administration/notification-channels/get_declarative_notification_channels.md @@ -4,6 +4,7 @@ linkTitle: "get_declarative_notification_channels..." weight: 190 no_list: true superheading: "catalog_organization." +api_ref: "CatalogOrganizationService.get_declarative_notification_channels" --- diff --git a/docs/content/en/latest/administration/notification-channels/put_declarative_notification_channels.md b/docs/content/en/latest/administration/notification-channels/put_declarative_notification_channels.md index da1c086ee..fbecabc2c 100644 --- a/docs/content/en/latest/administration/notification-channels/put_declarative_notification_channels.md +++ b/docs/content/en/latest/administration/notification-channels/put_declarative_notification_channels.md @@ -4,6 +4,7 @@ linkTitle: "put_declarative_notification_channels..." weight: 190 no_list: true superheading: "catalog_organization." +api_ref: "CatalogOrganizationService.put_declarative_notification_channels" --- diff --git a/docs/content/en/latest/administration/organization/create_or_update_jwk.md b/docs/content/en/latest/administration/organization/create_or_update_jwk.md index 8e0581c64..d51f8b418 100644 --- a/docs/content/en/latest/administration/organization/create_or_update_jwk.md +++ b/docs/content/en/latest/administration/organization/create_or_update_jwk.md @@ -3,6 +3,7 @@ title: "create_or_update_jwk" linkTitle: "create_or_update_jwk" superheading: "catalog_organization." weight: 100 +api_ref: "CatalogOrganizationService.create_or_update_jwk" --- ``create_or_update_jwk( jwk: CatalogJwk ) -> None`` diff --git a/docs/content/en/latest/administration/organization/delete_jwk.md b/docs/content/en/latest/administration/organization/delete_jwk.md index 0146ca036..955035bbc 100644 --- a/docs/content/en/latest/administration/organization/delete_jwk.md +++ b/docs/content/en/latest/administration/organization/delete_jwk.md @@ -3,6 +3,7 @@ title: "delete_jwk" linkTitle: "delete_jwk" superheading: "catalog_organization." weight: 100 +api_ref: "CatalogOrganizationService.delete_jwk" --- ``delete_jwk( jwk_id: str ) -> None`` diff --git a/docs/content/en/latest/administration/organization/get_jwk.md b/docs/content/en/latest/administration/organization/get_jwk.md index a6a3186a8..e28ca8682 100644 --- a/docs/content/en/latest/administration/organization/get_jwk.md +++ b/docs/content/en/latest/administration/organization/get_jwk.md @@ -3,6 +3,7 @@ title: "get_jwk" linkTitle: "get_jwk" superheading: "catalog_organization." weight: 100 +api_ref: "CatalogOrganizationService.get_jwk" --- ``get_jwk( jwk_id: str ) -> CatalogJwk`` diff --git a/docs/content/en/latest/administration/organization/list_jwks.md b/docs/content/en/latest/administration/organization/list_jwks.md index 3569210ff..6b5d35b6a 100644 --- a/docs/content/en/latest/administration/organization/list_jwks.md +++ b/docs/content/en/latest/administration/organization/list_jwks.md @@ -3,6 +3,7 @@ title: "list_jwks" linkTitle: "list_jwks" superheading: "catalog_organization." weight: 100 +api_ref: "CatalogOrganizationService.list_jwks" --- ``list_jwks( ) -> List[CatalogJwk]`` diff --git a/docs/content/en/latest/administration/organization/update_name.md b/docs/content/en/latest/administration/organization/update_name.md index 90b2fbb61..dd4d41091 100644 --- a/docs/content/en/latest/administration/organization/update_name.md +++ b/docs/content/en/latest/administration/organization/update_name.md @@ -4,6 +4,7 @@ linkTitle: "update_name" weight: 10 no_list: true superheading: "catalog_organization." +api_ref: "CatalogOrganizationService.update_name" --- diff --git a/docs/content/en/latest/administration/permissions/get_declarative_organization_permissions.md b/docs/content/en/latest/administration/permissions/get_declarative_organization_permissions.md index 9ebc43666..e304f0539 100644 --- a/docs/content/en/latest/administration/permissions/get_declarative_organization_permissions.md +++ b/docs/content/en/latest/administration/permissions/get_declarative_organization_permissions.md @@ -4,6 +4,7 @@ linkTitle: "get_declarative_organization_permissions" weight: 10 no_list: true superheading: "catalog_permission." +api_ref: "CatalogPermissionService.get_declarative_organization_permissions" --- diff --git a/docs/content/en/latest/administration/permissions/get_declarative_permissions.md b/docs/content/en/latest/administration/permissions/get_declarative_permissions.md index f0c36515d..2304560f2 100644 --- a/docs/content/en/latest/administration/permissions/get_declarative_permissions.md +++ b/docs/content/en/latest/administration/permissions/get_declarative_permissions.md @@ -4,6 +4,7 @@ linkTitle: "get_declarative_permissions" weight: 10 no_list: true superheading: "catalog_permission." +api_ref: "CatalogPermissionService.get_declarative_permissions" --- diff --git a/docs/content/en/latest/administration/permissions/list_available_assignees.md b/docs/content/en/latest/administration/permissions/list_available_assignees.md index 70200410a..0574df833 100644 --- a/docs/content/en/latest/administration/permissions/list_available_assignees.md +++ b/docs/content/en/latest/administration/permissions/list_available_assignees.md @@ -4,6 +4,7 @@ linkTitle: "list_available_assignees" weight: 17 no_list: true superheading: "catalog_permission." +api_ref: "CatalogPermissionService.list_available_assignees" --- diff --git a/docs/content/en/latest/administration/permissions/list_dashboard_permissions.md b/docs/content/en/latest/administration/permissions/list_dashboard_permissions.md index b1ecf3415..e9d5db80d 100644 --- a/docs/content/en/latest/administration/permissions/list_dashboard_permissions.md +++ b/docs/content/en/latest/administration/permissions/list_dashboard_permissions.md @@ -4,6 +4,7 @@ linkTitle: "list_dashboard_permissions" weight: 16 no_list: true superheading: "catalog_permission." +api_ref: "CatalogPermissionService.list_dashboard_permissions" --- diff --git a/docs/content/en/latest/administration/permissions/manage_dashboard_permissions.md b/docs/content/en/latest/administration/permissions/manage_dashboard_permissions.md index 271d2db5e..ca03ceddb 100644 --- a/docs/content/en/latest/administration/permissions/manage_dashboard_permissions.md +++ b/docs/content/en/latest/administration/permissions/manage_dashboard_permissions.md @@ -4,6 +4,7 @@ linkTitle: "manage_dashboard_permissions" weight: 15 no_list: true superheading: "catalog_permission." +api_ref: "CatalogPermissionService.manage_dashboard_permissions" --- diff --git a/docs/content/en/latest/administration/permissions/manage_organization_permissions.md b/docs/content/en/latest/administration/permissions/manage_organization_permissions.md index 96676fbf9..3a972d3e8 100644 --- a/docs/content/en/latest/administration/permissions/manage_organization_permissions.md +++ b/docs/content/en/latest/administration/permissions/manage_organization_permissions.md @@ -4,6 +4,7 @@ linkTitle: "manage_organization_permissions" weight: 20 no_list: true superheading: "catalog_permission." +api_ref: "CatalogPermissionService.manage_organization_permissions" --- diff --git a/docs/content/en/latest/administration/permissions/put_declarative_organization_permissions.md b/docs/content/en/latest/administration/permissions/put_declarative_organization_permissions.md index adb4e4b51..50898d538 100644 --- a/docs/content/en/latest/administration/permissions/put_declarative_organization_permissions.md +++ b/docs/content/en/latest/administration/permissions/put_declarative_organization_permissions.md @@ -4,6 +4,7 @@ linkTitle: "put_declarative_organization_permissions" weight: 20 no_list: true superheading: "catalog_permission." +api_ref: "CatalogPermissionService.put_declarative_organization_permissions" --- diff --git a/docs/content/en/latest/administration/permissions/put_declarative_permissions.md b/docs/content/en/latest/administration/permissions/put_declarative_permissions.md index 3a0d47c30..9a0460f3b 100644 --- a/docs/content/en/latest/administration/permissions/put_declarative_permissions.md +++ b/docs/content/en/latest/administration/permissions/put_declarative_permissions.md @@ -4,6 +4,7 @@ linkTitle: "put_declarative_permissions" weight: 20 no_list: true superheading: "catalog_permission." +api_ref: "CatalogPermissionService.put_declarative_permissions" --- diff --git a/docs/content/en/latest/administration/user-groups/create_or_update_user_group.md b/docs/content/en/latest/administration/user-groups/create_or_update_user_group.md index 5ca57dc14..23c5b4379 100644 --- a/docs/content/en/latest/administration/user-groups/create_or_update_user_group.md +++ b/docs/content/en/latest/administration/user-groups/create_or_update_user_group.md @@ -4,6 +4,7 @@ linkTitle: "create_or_update_user_group" weight: 50 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.create_or_update_user_group" --- diff --git a/docs/content/en/latest/administration/user-groups/delete_user_group.md b/docs/content/en/latest/administration/user-groups/delete_user_group.md index 22f8b8fa0..820428758 100644 --- a/docs/content/en/latest/administration/user-groups/delete_user_group.md +++ b/docs/content/en/latest/administration/user-groups/delete_user_group.md @@ -4,6 +4,7 @@ linkTitle: "delete_user_group" weight: 70 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.delete_user_group" --- diff --git a/docs/content/en/latest/administration/user-groups/get_declarative_user_groups.md b/docs/content/en/latest/administration/user-groups/get_declarative_user_groups.md index 6ce63227e..d69f4f5e3 100644 --- a/docs/content/en/latest/administration/user-groups/get_declarative_user_groups.md +++ b/docs/content/en/latest/administration/user-groups/get_declarative_user_groups.md @@ -4,6 +4,7 @@ linkTitle: "get_declarative_user_groups" weight: 140 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.get_declarative_user_groups" --- ``get_declarative_user_groups()`` diff --git a/docs/content/en/latest/administration/user-groups/get_user_group.md b/docs/content/en/latest/administration/user-groups/get_user_group.md index 01105feb0..04d5fe049 100644 --- a/docs/content/en/latest/administration/user-groups/get_user_group.md +++ b/docs/content/en/latest/administration/user-groups/get_user_group.md @@ -4,6 +4,7 @@ linkTitle: "get_user_group" weight: 60 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.get_user_group" --- diff --git a/docs/content/en/latest/administration/user-groups/get_user_group_permissions.md b/docs/content/en/latest/administration/user-groups/get_user_group_permissions.md index 4c1d4bf6f..ff9ddeb21 100644 --- a/docs/content/en/latest/administration/user-groups/get_user_group_permissions.md +++ b/docs/content/en/latest/administration/user-groups/get_user_group_permissions.md @@ -4,6 +4,7 @@ linkTitle: "get_user_group_permissions" weight: 10 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.get_user_group_permissions" --- diff --git a/docs/content/en/latest/administration/user-groups/list_user_groups.md b/docs/content/en/latest/administration/user-groups/list_user_groups.md index 02469bab8..bd85f2722 100644 --- a/docs/content/en/latest/administration/user-groups/list_user_groups.md +++ b/docs/content/en/latest/administration/user-groups/list_user_groups.md @@ -4,6 +4,7 @@ linkTitle: "list_user_groups" weight: 80 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.list_user_groups" --- diff --git a/docs/content/en/latest/administration/user-groups/load_and_put_declarative_user_groups.md b/docs/content/en/latest/administration/user-groups/load_and_put_declarative_user_groups.md index ef7281638..007604a1b 100644 --- a/docs/content/en/latest/administration/user-groups/load_and_put_declarative_user_groups.md +++ b/docs/content/en/latest/administration/user-groups/load_and_put_declarative_user_groups.md @@ -4,6 +4,7 @@ linkTitle: "load_and_put_declarative_user_g..." weight: 180 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.load_and_put_declarative_user_groups" --- diff --git a/docs/content/en/latest/administration/user-groups/load_declarative_user_groups.md b/docs/content/en/latest/administration/user-groups/load_declarative_user_groups.md index 7b1ef3d47..eee7035db 100644 --- a/docs/content/en/latest/administration/user-groups/load_declarative_user_groups.md +++ b/docs/content/en/latest/administration/user-groups/load_declarative_user_groups.md @@ -4,6 +4,7 @@ linkTitle: "load_declarative_user_groups" weight: 170 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.load_declarative_user_groups" --- diff --git a/docs/content/en/latest/administration/user-groups/manage_user_group_permissions.md b/docs/content/en/latest/administration/user-groups/manage_user_group_permissions.md index 5191bf2db..ea0395881 100644 --- a/docs/content/en/latest/administration/user-groups/manage_user_group_permissions.md +++ b/docs/content/en/latest/administration/user-groups/manage_user_group_permissions.md @@ -4,6 +4,7 @@ linkTitle: "manage_user_group_permissions" weight: 10 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.manage_user_group_permissions" --- diff --git a/docs/content/en/latest/administration/user-groups/put_declarative_user_groups.md b/docs/content/en/latest/administration/user-groups/put_declarative_user_groups.md index 04e6802b7..050cc9ec5 100644 --- a/docs/content/en/latest/administration/user-groups/put_declarative_user_groups.md +++ b/docs/content/en/latest/administration/user-groups/put_declarative_user_groups.md @@ -4,6 +4,7 @@ linkTitle: "put_declarative_user_groups" weight: 150 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.put_declarative_user_groups" --- diff --git a/docs/content/en/latest/administration/user-groups/store_declarative_user_groups.md b/docs/content/en/latest/administration/user-groups/store_declarative_user_groups.md index 278bd65c1..6805a4370 100644 --- a/docs/content/en/latest/administration/user-groups/store_declarative_user_groups.md +++ b/docs/content/en/latest/administration/user-groups/store_declarative_user_groups.md @@ -4,6 +4,7 @@ linkTitle: "store_declarative_user_groups" weight: 160 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.store_declarative_user_groups" --- diff --git a/docs/content/en/latest/administration/users-and-user-groups/assign_permissions_bulk.md b/docs/content/en/latest/administration/users-and-user-groups/assign_permissions_bulk.md index ed318df07..a88073eed 100644 --- a/docs/content/en/latest/administration/users-and-user-groups/assign_permissions_bulk.md +++ b/docs/content/en/latest/administration/users-and-user-groups/assign_permissions_bulk.md @@ -4,6 +4,7 @@ linkTitle: "assign_permissions_bulk" weight: 10 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.assign_permissions_bulk" --- diff --git a/docs/content/en/latest/administration/users-and-user-groups/get_declarative_users_user_groups.md b/docs/content/en/latest/administration/users-and-user-groups/get_declarative_users_user_groups.md index 3208ee81a..5ee3a1525 100644 --- a/docs/content/en/latest/administration/users-and-user-groups/get_declarative_users_user_groups.md +++ b/docs/content/en/latest/administration/users-and-user-groups/get_declarative_users_user_groups.md @@ -4,6 +4,7 @@ linkTitle: "get_declarative_users_user_grou..." weight: 190 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.get_declarative_users_user_groups" --- diff --git a/docs/content/en/latest/administration/users-and-user-groups/load_and_put_declarative_users_user_groups.md b/docs/content/en/latest/administration/users-and-user-groups/load_and_put_declarative_users_user_groups.md index 62ad8c76c..acd299b18 100644 --- a/docs/content/en/latest/administration/users-and-user-groups/load_and_put_declarative_users_user_groups.md +++ b/docs/content/en/latest/administration/users-and-user-groups/load_and_put_declarative_users_user_groups.md @@ -4,6 +4,7 @@ linkTitle: "load_and_put_declarative_users..." weight: 230 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.load_and_put_declarative_users_user_groups" --- diff --git a/docs/content/en/latest/administration/users-and-user-groups/load_declarative_users_user_groups.md b/docs/content/en/latest/administration/users-and-user-groups/load_declarative_users_user_groups.md index d217662a1..04a458d5c 100644 --- a/docs/content/en/latest/administration/users-and-user-groups/load_declarative_users_user_groups.md +++ b/docs/content/en/latest/administration/users-and-user-groups/load_declarative_users_user_groups.md @@ -4,6 +4,7 @@ linkTitle: "load_declarative_users_user_gro..." weight: 220 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.load_declarative_users_user_groups" --- diff --git a/docs/content/en/latest/administration/users-and-user-groups/put_declarative_users_user_groups.md b/docs/content/en/latest/administration/users-and-user-groups/put_declarative_users_user_groups.md index 017705d85..572b73343 100644 --- a/docs/content/en/latest/administration/users-and-user-groups/put_declarative_users_user_groups.md +++ b/docs/content/en/latest/administration/users-and-user-groups/put_declarative_users_user_groups.md @@ -4,6 +4,7 @@ linkTitle: "put_declarative_users_user_grou..." weight: 200 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.put_declarative_users_user_groups" --- diff --git a/docs/content/en/latest/administration/users-and-user-groups/revoke_permissions_bulk.md b/docs/content/en/latest/administration/users-and-user-groups/revoke_permissions_bulk.md index 8cb407093..6bd80f527 100644 --- a/docs/content/en/latest/administration/users-and-user-groups/revoke_permissions_bulk.md +++ b/docs/content/en/latest/administration/users-and-user-groups/revoke_permissions_bulk.md @@ -4,6 +4,7 @@ linkTitle: "revoke_permissions_bulk" weight: 10 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.revoke_permissions_bulk" --- diff --git a/docs/content/en/latest/administration/users-and-user-groups/store_declarative_users_user_groups.md b/docs/content/en/latest/administration/users-and-user-groups/store_declarative_users_user_groups.md index cfd07c66c..1fe69eafb 100644 --- a/docs/content/en/latest/administration/users-and-user-groups/store_declarative_users_user_groups.md +++ b/docs/content/en/latest/administration/users-and-user-groups/store_declarative_users_user_groups.md @@ -4,6 +4,7 @@ linkTitle: "store_declarative_users_user_gro..." weight: 210 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.store_declarative_users_user_groups" --- diff --git a/docs/content/en/latest/administration/users/create_or_update_user.md b/docs/content/en/latest/administration/users/create_or_update_user.md index 33bc25538..313f3d1ad 100644 --- a/docs/content/en/latest/administration/users/create_or_update_user.md +++ b/docs/content/en/latest/administration/users/create_or_update_user.md @@ -4,6 +4,7 @@ linkTitle: "create_or_update_user" weight: 10 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.create_or_update_user" --- diff --git a/docs/content/en/latest/administration/users/create_user_api_token.md b/docs/content/en/latest/administration/users/create_user_api_token.md index 3e7c4c334..25e434578 100644 --- a/docs/content/en/latest/administration/users/create_user_api_token.md +++ b/docs/content/en/latest/administration/users/create_user_api_token.md @@ -4,6 +4,7 @@ linkTitle: "create_user_api_token" weight: 10 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.create_user_api_token" --- diff --git a/docs/content/en/latest/administration/users/delete_user.md b/docs/content/en/latest/administration/users/delete_user.md index 3a400c89d..ccb2cd181 100644 --- a/docs/content/en/latest/administration/users/delete_user.md +++ b/docs/content/en/latest/administration/users/delete_user.md @@ -4,6 +4,7 @@ linkTitle: "delete_user" weight: 30 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.delete_user" --- diff --git a/docs/content/en/latest/administration/users/delete_user_api_token.md b/docs/content/en/latest/administration/users/delete_user_api_token.md index 76bb9122c..efa5f3ec9 100644 --- a/docs/content/en/latest/administration/users/delete_user_api_token.md +++ b/docs/content/en/latest/administration/users/delete_user_api_token.md @@ -4,6 +4,7 @@ linkTitle: "delete_user_api_token" weight: 10 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.delete_user_api_token" --- diff --git a/docs/content/en/latest/administration/users/get_declarative_users.md b/docs/content/en/latest/administration/users/get_declarative_users.md index b220593b4..4e0f59ad9 100644 --- a/docs/content/en/latest/administration/users/get_declarative_users.md +++ b/docs/content/en/latest/administration/users/get_declarative_users.md @@ -4,6 +4,7 @@ linkTitle: "get_declarative_users" weight: 90 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.get_declarative_users" --- diff --git a/docs/content/en/latest/administration/users/get_user.md b/docs/content/en/latest/administration/users/get_user.md index c4f1984c0..74a4c10b6 100644 --- a/docs/content/en/latest/administration/users/get_user.md +++ b/docs/content/en/latest/administration/users/get_user.md @@ -4,6 +4,7 @@ linkTitle: "get_user" weight: 20 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.get_user" --- diff --git a/docs/content/en/latest/administration/users/get_user_api_token.md b/docs/content/en/latest/administration/users/get_user_api_token.md index fc5193a05..1a737fe69 100644 --- a/docs/content/en/latest/administration/users/get_user_api_token.md +++ b/docs/content/en/latest/administration/users/get_user_api_token.md @@ -4,6 +4,7 @@ linkTitle: "get_user_api_token" weight: 10 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.get_user_api_token" --- diff --git a/docs/content/en/latest/administration/users/get_user_permissions.md b/docs/content/en/latest/administration/users/get_user_permissions.md index 17a2bbd57..34c5cea6f 100644 --- a/docs/content/en/latest/administration/users/get_user_permissions.md +++ b/docs/content/en/latest/administration/users/get_user_permissions.md @@ -4,6 +4,7 @@ linkTitle: "get_user_permissions" weight: 10 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.get_user_permissions" --- diff --git a/docs/content/en/latest/administration/users/list_user_api_tokens.md b/docs/content/en/latest/administration/users/list_user_api_tokens.md index 6c4dad769..56fcf2742 100644 --- a/docs/content/en/latest/administration/users/list_user_api_tokens.md +++ b/docs/content/en/latest/administration/users/list_user_api_tokens.md @@ -4,6 +4,7 @@ linkTitle: "list_user_api_tokens" weight: 10 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.list_user_api_tokens" --- diff --git a/docs/content/en/latest/administration/users/list_users.md b/docs/content/en/latest/administration/users/list_users.md index 6d362e4f6..7c2af6a19 100644 --- a/docs/content/en/latest/administration/users/list_users.md +++ b/docs/content/en/latest/administration/users/list_users.md @@ -4,6 +4,7 @@ linkTitle: "list_users" weight: 40 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.list_users" --- diff --git a/docs/content/en/latest/administration/users/load_and_put_declarative_users.md b/docs/content/en/latest/administration/users/load_and_put_declarative_users.md index 730b11f0f..794038e72 100644 --- a/docs/content/en/latest/administration/users/load_and_put_declarative_users.md +++ b/docs/content/en/latest/administration/users/load_and_put_declarative_users.md @@ -4,6 +4,7 @@ linkTitle: "load_and_put_declarative_users" weight: 130 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.load_and_put_declarative_users" --- diff --git a/docs/content/en/latest/administration/users/load_declarative_users.md b/docs/content/en/latest/administration/users/load_declarative_users.md index c1ae510de..1adc0785d 100644 --- a/docs/content/en/latest/administration/users/load_declarative_users.md +++ b/docs/content/en/latest/administration/users/load_declarative_users.md @@ -4,6 +4,7 @@ linkTitle: "load_declarative_users" weight: 120 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.load_declarative_users" --- diff --git a/docs/content/en/latest/administration/users/manage_user_permissions.md b/docs/content/en/latest/administration/users/manage_user_permissions.md index 4cb2eb29f..787adcd22 100644 --- a/docs/content/en/latest/administration/users/manage_user_permissions.md +++ b/docs/content/en/latest/administration/users/manage_user_permissions.md @@ -4,6 +4,7 @@ linkTitle: "manage_user_permissions" weight: 10 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.manage_user_permissions" --- diff --git a/docs/content/en/latest/administration/users/put_declarative_users.md b/docs/content/en/latest/administration/users/put_declarative_users.md index d9816ae3d..c9a094ab3 100644 --- a/docs/content/en/latest/administration/users/put_declarative_users.md +++ b/docs/content/en/latest/administration/users/put_declarative_users.md @@ -4,6 +4,7 @@ linkTitle: "put_declarative_users" weight: 100 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.put_declarative_users" --- diff --git a/docs/content/en/latest/administration/users/store_declarative_users.md b/docs/content/en/latest/administration/users/store_declarative_users.md index 88c727dca..beb2bf322 100644 --- a/docs/content/en/latest/administration/users/store_declarative_users.md +++ b/docs/content/en/latest/administration/users/store_declarative_users.md @@ -4,6 +4,7 @@ linkTitle: "store_declarative_users" weight: 110 no_list: true superheading: "catalog_user." +api_ref: "CatalogUserService.store_declarative_users" --- diff --git a/docs/content/en/latest/data/data-source/analyze_csv.md b/docs/content/en/latest/data/data-source/analyze_csv.md index 4219f51fc..e25ffa2ba 100644 --- a/docs/content/en/latest/data/data-source/analyze_csv.md +++ b/docs/content/en/latest/data/data-source/analyze_csv.md @@ -3,6 +3,7 @@ title: "analyze_csv" linkTitle: "analyze_csv" weight: 191 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.analyze_csv" --- diff --git a/docs/content/en/latest/data/data-source/create_or_update_data_source.md b/docs/content/en/latest/data/data-source/create_or_update_data_source.md index 7a47347f3..e6d29e512 100644 --- a/docs/content/en/latest/data/data-source/create_or_update_data_source.md +++ b/docs/content/en/latest/data/data-source/create_or_update_data_source.md @@ -3,6 +3,7 @@ title: "create_or_update_data_source" linkTitle: "create_or_update_data_source" weight: 10 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.create_or_update_data_source" --- diff --git a/docs/content/en/latest/data/data-source/delete_csv_files.md b/docs/content/en/latest/data/data-source/delete_csv_files.md index d8ce004f3..4b58d9487 100644 --- a/docs/content/en/latest/data/data-source/delete_csv_files.md +++ b/docs/content/en/latest/data/data-source/delete_csv_files.md @@ -3,6 +3,7 @@ title: "delete_csv_files" linkTitle: "delete_csv_files" weight: 193 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.delete_csv_files" --- diff --git a/docs/content/en/latest/data/data-source/delete_data_source.md b/docs/content/en/latest/data/data-source/delete_data_source.md index 79ec7818a..664c81e00 100644 --- a/docs/content/en/latest/data/data-source/delete_data_source.md +++ b/docs/content/en/latest/data/data-source/delete_data_source.md @@ -3,6 +3,7 @@ title: "delete_data_source" linkTitle: "delete_data_source" weight: 30 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.delete_data_source" --- diff --git a/docs/content/en/latest/data/data-source/generate_logical_model.md b/docs/content/en/latest/data/data-source/generate_logical_model.md index db1d8b038..873033529 100644 --- a/docs/content/en/latest/data/data-source/generate_logical_model.md +++ b/docs/content/en/latest/data/data-source/generate_logical_model.md @@ -3,6 +3,7 @@ title: "generate_logical_model" linkTitle: "generate_logical_model" weight: 170 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.generate_logical_model" --- diff --git a/docs/content/en/latest/data/data-source/get_data_source.md b/docs/content/en/latest/data/data-source/get_data_source.md index 113f1ed3a..29d8c1927 100644 --- a/docs/content/en/latest/data/data-source/get_data_source.md +++ b/docs/content/en/latest/data/data-source/get_data_source.md @@ -3,6 +3,7 @@ title: "get_data_source" linkTitle: "get_data_source" weight: 20 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.get_data_source" --- diff --git a/docs/content/en/latest/data/data-source/get_declarative_data_sources.md b/docs/content/en/latest/data/data-source/get_declarative_data_sources.md index 12c16eb90..a39b1b781 100644 --- a/docs/content/en/latest/data/data-source/get_declarative_data_sources.md +++ b/docs/content/en/latest/data/data-source/get_declarative_data_sources.md @@ -3,6 +3,7 @@ title: "get_declarative_data_sources" linkTitle: "get_declarative_data_sources" weight: 70 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.get_declarative_data_sources" --- diff --git a/docs/content/en/latest/data/data-source/import_csv.md b/docs/content/en/latest/data/data-source/import_csv.md index 1b0bcf41e..41ee79e3e 100644 --- a/docs/content/en/latest/data/data-source/import_csv.md +++ b/docs/content/en/latest/data/data-source/import_csv.md @@ -3,6 +3,7 @@ title: "import_csv" linkTitle: "import_csv" weight: 192 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.import_csv" --- diff --git a/docs/content/en/latest/data/data-source/list_data_sources.md b/docs/content/en/latest/data/data-source/list_data_sources.md index 6167cb4ae..1765e26ad 100644 --- a/docs/content/en/latest/data/data-source/list_data_sources.md +++ b/docs/content/en/latest/data/data-source/list_data_sources.md @@ -3,6 +3,7 @@ title: "list_data_sources" linkTitle: "list_data_sources" weight: 50 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.list_data_sources" --- diff --git a/docs/content/en/latest/data/data-source/load_and_put_declarative_data_sources.md b/docs/content/en/latest/data/data-source/load_and_put_declarative_data_sources.md index 38d2bee0c..e5344d298 100644 --- a/docs/content/en/latest/data/data-source/load_and_put_declarative_data_sources.md +++ b/docs/content/en/latest/data/data-source/load_and_put_declarative_data_sources.md @@ -3,6 +3,7 @@ title: "load_and_put_declarative_data_sources" linkTitle: "load_and_put_declarative_data..." weight: 110 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.load_and_put_declarative_data_sources" --- diff --git a/docs/content/en/latest/data/data-source/load_declarative_data_sources.md b/docs/content/en/latest/data/data-source/load_declarative_data_sources.md index d3eba2c98..bb294df5f 100644 --- a/docs/content/en/latest/data/data-source/load_declarative_data_sources.md +++ b/docs/content/en/latest/data/data-source/load_declarative_data_sources.md @@ -3,6 +3,7 @@ title: "load_declarative_data_sources" linkTitle: "load_declarative_data_sources" weight: 100 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.load_declarative_data_sources" --- diff --git a/docs/content/en/latest/data/data-source/patch_data_source_attributes.md b/docs/content/en/latest/data/data-source/patch_data_source_attributes.md index bdd946ca8..120a480d1 100644 --- a/docs/content/en/latest/data/data-source/patch_data_source_attributes.md +++ b/docs/content/en/latest/data/data-source/patch_data_source_attributes.md @@ -3,6 +3,7 @@ title: "patch_data_source_attributes" linkTitle: "patch_data_source_attributes" weight: 40 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.patch_data_source_attributes" --- diff --git a/docs/content/en/latest/data/data-source/put_declarative_data_sources.md b/docs/content/en/latest/data/data-source/put_declarative_data_sources.md index 4658aa369..613da61b8 100644 --- a/docs/content/en/latest/data/data-source/put_declarative_data_sources.md +++ b/docs/content/en/latest/data/data-source/put_declarative_data_sources.md @@ -3,6 +3,7 @@ title: "put_declarative_data_sources" linkTitle: "put_declarative_data_sources" weight: 80 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.put_declarative_data_sources" --- diff --git a/docs/content/en/latest/data/data-source/register_upload_notification.md b/docs/content/en/latest/data/data-source/register_upload_notification.md index d40aff752..efd22507a 100644 --- a/docs/content/en/latest/data/data-source/register_upload_notification.md +++ b/docs/content/en/latest/data/data-source/register_upload_notification.md @@ -3,6 +3,7 @@ title: "register_upload_notification" linkTitle: "register_upload_notification" weight: 180 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.register_upload_notification" --- diff --git a/docs/content/en/latest/data/data-source/scan_data_source.md b/docs/content/en/latest/data/data-source/scan_data_source.md index 6dc011b90..daaa5dc69 100644 --- a/docs/content/en/latest/data/data-source/scan_data_source.md +++ b/docs/content/en/latest/data/data-source/scan_data_source.md @@ -3,6 +3,7 @@ title: "scan_data_source" linkTitle: "scan_data_source" weight: 190 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.scan_data_source" --- ``scan_data_source(data_source_id: str, scan_request: CatalogScanModelRequest = CatalogScanModelRequest(), report_warnings: bool = False)`` diff --git a/docs/content/en/latest/data/data-source/scan_pdm_and_generate_logical_model.md b/docs/content/en/latest/data/data-source/scan_pdm_and_generate_logical_model.md index 731be55ab..64c55f671 100644 --- a/docs/content/en/latest/data/data-source/scan_pdm_and_generate_logical_model.md +++ b/docs/content/en/latest/data/data-source/scan_pdm_and_generate_logical_model.md @@ -3,6 +3,7 @@ title: "scan_pdm_and_generate_logical_model" linkTitle: "scan_pdm_and_generate_logical_model" weight: 190 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.scan_pdm_and_generate_logical_model" --- ``scan_pdm_and_generate_logical_model(data_source_id: str, generate_ldm_request: Optional[CatalogGenerateLdmRequest] = None, scan_request: CatalogScanModelRequest = CatalogScanModelRequest(), report_warnings: bool = False) -> tuple[CatalogDeclarativeModel, CatalogScanResultPdm]`` diff --git a/docs/content/en/latest/data/data-source/scan_schemata.md b/docs/content/en/latest/data/data-source/scan_schemata.md index bdaae2948..f9ef345b2 100644 --- a/docs/content/en/latest/data/data-source/scan_schemata.md +++ b/docs/content/en/latest/data/data-source/scan_schemata.md @@ -3,6 +3,7 @@ title: "scan_schemata" linkTitle: "scan_schemata" weight: 210 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.scan_schemata" --- diff --git a/docs/content/en/latest/data/data-source/scan_sql.md b/docs/content/en/latest/data/data-source/scan_sql.md index ac789c09d..eed463876 100644 --- a/docs/content/en/latest/data/data-source/scan_sql.md +++ b/docs/content/en/latest/data/data-source/scan_sql.md @@ -3,6 +3,7 @@ title: "scan_sql" linkTitle: "scan_sql" weight: 210 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.scan_sql" --- diff --git a/docs/content/en/latest/data/data-source/staging_upload.md b/docs/content/en/latest/data/data-source/staging_upload.md index 27ef32105..9ccc2216a 100644 --- a/docs/content/en/latest/data/data-source/staging_upload.md +++ b/docs/content/en/latest/data/data-source/staging_upload.md @@ -3,6 +3,7 @@ title: "staging_upload" linkTitle: "staging_upload" weight: 190 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.staging_upload" --- diff --git a/docs/content/en/latest/data/data-source/store_declarative_data_sources.md b/docs/content/en/latest/data/data-source/store_declarative_data_sources.md index 18cfee10f..0248e9ec8 100644 --- a/docs/content/en/latest/data/data-source/store_declarative_data_sources.md +++ b/docs/content/en/latest/data/data-source/store_declarative_data_sources.md @@ -3,6 +3,7 @@ title: "store_declarative_data_sources" linkTitle: "store_declarative_data_sources" weight: 90 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.store_declarative_data_sources" --- ``store_declarative_data_sources(layout_root_path: Path = Path.cwd())`` diff --git a/docs/content/en/latest/data/data-source/test_data_sources_connection.md b/docs/content/en/latest/data/data-source/test_data_sources_connection.md index b5bfc2f9f..cb982552b 100644 --- a/docs/content/en/latest/data/data-source/test_data_sources_connection.md +++ b/docs/content/en/latest/data/data-source/test_data_sources_connection.md @@ -3,6 +3,7 @@ title: "test_data_sources_connection" linkTitle: "test_data_sources_connection" weight: 220 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.test_data_sources_connection" --- diff --git a/docs/content/en/latest/data/data-source/upload_csv.md b/docs/content/en/latest/data/data-source/upload_csv.md index 96a105d57..27d6242ac 100644 --- a/docs/content/en/latest/data/data-source/upload_csv.md +++ b/docs/content/en/latest/data/data-source/upload_csv.md @@ -3,6 +3,7 @@ title: "upload_csv" linkTitle: "upload_csv" weight: 194 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.upload_csv" --- diff --git a/docs/content/en/latest/data/physical-data-model/load_pdm_from_disk.md b/docs/content/en/latest/data/physical-data-model/load_pdm_from_disk.md index 4790ea80e..7f6b78b7f 100644 --- a/docs/content/en/latest/data/physical-data-model/load_pdm_from_disk.md +++ b/docs/content/en/latest/data/physical-data-model/load_pdm_from_disk.md @@ -3,6 +3,7 @@ title: "load_pdm_from_disk" linkTitle: "load_pdm_from_disk" weight: 140 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.load_pdm_from_disk" --- ``load_pdm_from_disk(path: Path = Path.cwd())`` diff --git a/docs/content/en/latest/data/physical-data-model/store_pdm_to_disk.md b/docs/content/en/latest/data/physical-data-model/store_pdm_to_disk.md index 263be9b18..d17136b5c 100644 --- a/docs/content/en/latest/data/physical-data-model/store_pdm_to_disk.md +++ b/docs/content/en/latest/data/physical-data-model/store_pdm_to_disk.md @@ -3,6 +3,7 @@ title: "store_pdm_to_disk" linkTitle: "store_pdm_to_disk" weight: 140 superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.store_pdm_to_disk" --- diff --git a/docs/content/en/latest/execution/ai/ai_chat.md b/docs/content/en/latest/execution/ai/ai_chat.md index 143cd11dc..707cb8f7e 100644 --- a/docs/content/en/latest/execution/ai/ai_chat.md +++ b/docs/content/en/latest/execution/ai/ai_chat.md @@ -3,6 +3,7 @@ title: "ai_chat" linkTitle: "ai_chat" weight: 92 superheading: "compute." +api_ref: "ComputeService.ai_chat" --- ``ai_chat(workspace_id: str, question: str) -> ChatResult`` diff --git a/docs/content/en/latest/execution/ai/ai_chat_stream.md b/docs/content/en/latest/execution/ai/ai_chat_stream.md index b3084ab8c..b88968d52 100644 --- a/docs/content/en/latest/execution/ai/ai_chat_stream.md +++ b/docs/content/en/latest/execution/ai/ai_chat_stream.md @@ -3,6 +3,7 @@ title: "ai_chat_stream" linkTitle: "ai_chat_stream" weight: 93 superheading: "compute." +api_ref: "ComputeService.ai_chat_stream" --- ``ai_chat_stream(workspace_id: str, question: str) -> Iterator[Any]`` diff --git a/docs/content/en/latest/execution/ai/build_exec_def_from_chat_result.md b/docs/content/en/latest/execution/ai/build_exec_def_from_chat_result.md index 4040b3754..3e98da2e6 100644 --- a/docs/content/en/latest/execution/ai/build_exec_def_from_chat_result.md +++ b/docs/content/en/latest/execution/ai/build_exec_def_from_chat_result.md @@ -3,6 +3,7 @@ title: "build_exec_def_from_chat_result" linkTitle: "build_exec_def_from_chat_result" weight: 95 superheading: "compute." +api_ref: "ComputeService.build_exec_def_from_chat_result" --- ``build_exec_def_from_chat_result(chat_result: ChatResult) -> ExecutionDefinition`` diff --git a/docs/content/en/latest/execution/ai/get_ai_chat_history.md b/docs/content/en/latest/execution/ai/get_ai_chat_history.md index 0f5ab7e46..0578366a5 100644 --- a/docs/content/en/latest/execution/ai/get_ai_chat_history.md +++ b/docs/content/en/latest/execution/ai/get_ai_chat_history.md @@ -3,6 +3,7 @@ title: "ai_chat" linkTitle: "ai_chat" weight: 96 superheading: "compute." +api_ref: "ComputeService.ai_chat" --- ``ai_chat(workspace_id: str, question: str) -> ChatResult`` diff --git a/docs/content/en/latest/execution/ai/reset_ai_chat_history.md b/docs/content/en/latest/execution/ai/reset_ai_chat_history.md index 1570f1b18..2e4db3e85 100644 --- a/docs/content/en/latest/execution/ai/reset_ai_chat_history.md +++ b/docs/content/en/latest/execution/ai/reset_ai_chat_history.md @@ -3,6 +3,7 @@ title: "reset_ai_chat_history" linkTitle: "reset_ai_chat_history" weight: 97 superheading: "compute." +api_ref: "ComputeService.reset_ai_chat_history" --- ``reset_ai_chat_history(workspace_id: str) -> None`` diff --git a/docs/content/en/latest/execution/ai/search_ai.md b/docs/content/en/latest/execution/ai/search_ai.md index dc9edb221..513f04aa2 100644 --- a/docs/content/en/latest/execution/ai/search_ai.md +++ b/docs/content/en/latest/execution/ai/search_ai.md @@ -3,6 +3,7 @@ title: "search_ai" linkTitle: "search_ai" weight: 98 superheading: "compute." +api_ref: "ComputeService.search_ai" --- ``search_ai( diff --git a/docs/content/en/latest/execution/ai/set_ai_chat_history_feedback.md b/docs/content/en/latest/execution/ai/set_ai_chat_history_feedback.md index 3e7df39d1..e4bdde574 100644 --- a/docs/content/en/latest/execution/ai/set_ai_chat_history_feedback.md +++ b/docs/content/en/latest/execution/ai/set_ai_chat_history_feedback.md @@ -3,6 +3,7 @@ title: "set_ai_chat_history_feedback" linkTitle: "set_ai_chat_history_feedback" weight: 101 superheading: "compute." +api_ref: "ComputeService.set_ai_chat_history_feedback" --- ``set_ai_chat_history_feedback(workspace_id: str, interaction_id: str, user_feedback: str, chat_history_interaction_id: str, thread_id_suffix: str = "") -> None`` diff --git a/docs/content/en/latest/execution/ai/sync_metadata.md b/docs/content/en/latest/execution/ai/sync_metadata.md index 517d99aa4..361f2187d 100644 --- a/docs/content/en/latest/execution/ai/sync_metadata.md +++ b/docs/content/en/latest/execution/ai/sync_metadata.md @@ -3,6 +3,7 @@ title: "sync_metadata" linkTitle: "sync_metadata" weight: 100 superheading: "compute." +api_ref: "ComputeService.sync_metadata" --- ``sync_metadata(workspace_id: str, async_req: bool = False) -> None`` diff --git a/docs/content/en/latest/execution/exports/export_pdf.md b/docs/content/en/latest/execution/exports/export_pdf.md index 685efea59..26eb1c174 100644 --- a/docs/content/en/latest/execution/exports/export_pdf.md +++ b/docs/content/en/latest/execution/exports/export_pdf.md @@ -3,6 +3,7 @@ title: "export_pdf" linkTitle: "export_pdf" weight: 110 superheading: "export." +api_ref: "ExportService.export_pdf" --- ``export_pdf(workspace_id: str, diff --git a/docs/content/en/latest/execution/exports/export_tabular.md b/docs/content/en/latest/execution/exports/export_tabular.md index e9ce3898c..5a1bcedd6 100644 --- a/docs/content/en/latest/execution/exports/export_tabular.md +++ b/docs/content/en/latest/execution/exports/export_tabular.md @@ -3,6 +3,7 @@ title: "export_tabular" linkTitle: "export_tabular" weight: 110 superheading: "export." +api_ref: "ExportService.export_tabular" --- ``export_tabular(workspace_id: str, diff --git a/docs/content/en/latest/execution/exports/export_tabular_by_visualization_id.md b/docs/content/en/latest/execution/exports/export_tabular_by_visualization_id.md index 3d849983a..7aeb0a949 100644 --- a/docs/content/en/latest/execution/exports/export_tabular_by_visualization_id.md +++ b/docs/content/en/latest/execution/exports/export_tabular_by_visualization_id.md @@ -3,6 +3,7 @@ title: "export_tabular_by_visualization_id" linkTitle: "export_tabular_by_visualization_id" weight: 110 superheading: "export." +api_ref: "ExportService.export_tabular_by_visualization_id" --- ``export_tabular_by_visualization_id( diff --git a/docs/content/en/latest/workspace-content/analytics-model/get_declarative_analytics_model.md b/docs/content/en/latest/workspace-content/analytics-model/get_declarative_analytics_model.md index c065ff8c4..b019f443b 100644 --- a/docs/content/en/latest/workspace-content/analytics-model/get_declarative_analytics_model.md +++ b/docs/content/en/latest/workspace-content/analytics-model/get_declarative_analytics_model.md @@ -3,6 +3,7 @@ title: "get_declarative_analytics_model" linkTitle: "get_declarative_analytics_model" weight: 110 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.get_declarative_analytics_model" --- ``get_declarative_analytics_model(workspace_id: str, exclude: Optional[list[str]])`` diff --git a/docs/content/en/latest/workspace-content/analytics-model/load_analytics_model_from_disk.md b/docs/content/en/latest/workspace-content/analytics-model/load_analytics_model_from_disk.md index 089105ea6..63d0152a3 100644 --- a/docs/content/en/latest/workspace-content/analytics-model/load_analytics_model_from_disk.md +++ b/docs/content/en/latest/workspace-content/analytics-model/load_analytics_model_from_disk.md @@ -3,6 +3,7 @@ title: "load_analytics_model_from_disk" linkTitle: "load_analytics_model_from_disk" weight: 132 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.load_analytics_model_from_disk" --- ``load_analytics_model_from_disk(path: Path = Path.cwd())`` diff --git a/docs/content/en/latest/workspace-content/analytics-model/load_and_put_declarative_analytics_model.md b/docs/content/en/latest/workspace-content/analytics-model/load_and_put_declarative_analytics_model.md index d833708e5..34a6f8634 100644 --- a/docs/content/en/latest/workspace-content/analytics-model/load_and_put_declarative_analytics_model.md +++ b/docs/content/en/latest/workspace-content/analytics-model/load_and_put_declarative_analytics_model.md @@ -3,6 +3,7 @@ title: "load_and_put_declarative_analytics_model" linkTitle: "load_and_put_declarative_analyt..." weight: 150 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.load_and_put_declarative_analytics_model" --- diff --git a/docs/content/en/latest/workspace-content/analytics-model/load_declarative_analytics_model.md b/docs/content/en/latest/workspace-content/analytics-model/load_declarative_analytics_model.md index 142373558..8074b8d75 100644 --- a/docs/content/en/latest/workspace-content/analytics-model/load_declarative_analytics_model.md +++ b/docs/content/en/latest/workspace-content/analytics-model/load_declarative_analytics_model.md @@ -3,6 +3,7 @@ title: "load_declarative_analytics_model" linkTitle: "load_declarative_analytics_model" weight: 140 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.load_declarative_analytics_model" --- diff --git a/docs/content/en/latest/workspace-content/analytics-model/put_declarative_analytics_model.md b/docs/content/en/latest/workspace-content/analytics-model/put_declarative_analytics_model.md index 3f114fd50..4ff051df6 100644 --- a/docs/content/en/latest/workspace-content/analytics-model/put_declarative_analytics_model.md +++ b/docs/content/en/latest/workspace-content/analytics-model/put_declarative_analytics_model.md @@ -3,6 +3,7 @@ title: "put_declarative_analytics_model" linkTitle: "put_declarative_analytics_model" weight: 120 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.put_declarative_analytics_model" --- ``put_declarative_analytics_model(workspace_id: str, analytics_model: CatalogDeclarativeAnalytics)`` diff --git a/docs/content/en/latest/workspace-content/analytics-model/store_analytics_model_to_disk.md b/docs/content/en/latest/workspace-content/analytics-model/store_analytics_model_to_disk.md index d1f5ea5df..85e67a2aa 100644 --- a/docs/content/en/latest/workspace-content/analytics-model/store_analytics_model_to_disk.md +++ b/docs/content/en/latest/workspace-content/analytics-model/store_analytics_model_to_disk.md @@ -3,6 +3,7 @@ title: "store_analytics_model_to_disk" linkTitle: "store_analytics_model_to_disk" weight: 131 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.store_analytics_model_to_disk" --- ``store_analytics_model_to_disk(workspace_id: str, path: Path = Path.cwd(), exclude: Optional[list[str]] = None, sort: bool = False)`` diff --git a/docs/content/en/latest/workspace-content/analytics-model/store_declarative_analytics_model.md b/docs/content/en/latest/workspace-content/analytics-model/store_declarative_analytics_model.md index 69408105a..9480bd0aa 100644 --- a/docs/content/en/latest/workspace-content/analytics-model/store_declarative_analytics_model.md +++ b/docs/content/en/latest/workspace-content/analytics-model/store_declarative_analytics_model.md @@ -3,6 +3,7 @@ title: "store_declarative_analytics_model" linkTitle: "store_declarative_analytics_model" weight: 130 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.store_declarative_analytics_model" --- diff --git a/docs/content/en/latest/workspace-content/localization/add_metadata_locale.md b/docs/content/en/latest/workspace-content/localization/add_metadata_locale.md index 2709b8a0f..e837e8459 100644 --- a/docs/content/en/latest/workspace-content/localization/add_metadata_locale.md +++ b/docs/content/en/latest/workspace-content/localization/add_metadata_locale.md @@ -3,6 +3,7 @@ title: "add_metadata_locale" linkTitle: "add_metadata_locale" weight: 25 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.add_metadata_locale" --- ``add_metadata_locale(workspace_id: str, target_language: str, translator_func: Callable, set_locale: bool = True) -> None`` diff --git a/docs/content/en/latest/workspace-content/localization/clean_metadata_localization.md b/docs/content/en/latest/workspace-content/localization/clean_metadata_localization.md index caad71e87..38f036ecf 100644 --- a/docs/content/en/latest/workspace-content/localization/clean_metadata_localization.md +++ b/docs/content/en/latest/workspace-content/localization/clean_metadata_localization.md @@ -3,6 +3,7 @@ title: "add_metadata_locale" linkTitle: "add_metadata_locale" weight: 55 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.add_metadata_locale" --- ``add_metadata_locale(workspace_id: str, target_language: str, translator_func: Callable, set_locale: bool = True) -> None`` diff --git a/docs/content/en/latest/workspace-content/localization/get_metadata_localization.md b/docs/content/en/latest/workspace-content/localization/get_metadata_localization.md index c192d7ace..0bcd29690 100644 --- a/docs/content/en/latest/workspace-content/localization/get_metadata_localization.md +++ b/docs/content/en/latest/workspace-content/localization/get_metadata_localization.md @@ -3,6 +3,7 @@ title: "get_metadata_localization" linkTitle: "get_metadata_localization" weight: 52 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.get_metadata_localization" --- ``get_metadata_localization(workspace_id: str, target_language: str) -> bytes`` diff --git a/docs/content/en/latest/workspace-content/localization/save_metadata_locale_to_disk.md b/docs/content/en/latest/workspace-content/localization/save_metadata_locale_to_disk.md index 4f878e0bc..ec50364ab 100644 --- a/docs/content/en/latest/workspace-content/localization/save_metadata_locale_to_disk.md +++ b/docs/content/en/latest/workspace-content/localization/save_metadata_locale_to_disk.md @@ -3,6 +3,7 @@ title: "save_metadata_locale_to_disk" linkTitle: "save_metadata_locale_to_disk" weight: 56 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.save_metadata_locale_to_disk" --- ``save_metadata_locale_to_disk(workspace_id: str, target_language: str, file_path: Path) -> None`` diff --git a/docs/content/en/latest/workspace-content/localization/set_metadata_locale_from_disk.md b/docs/content/en/latest/workspace-content/localization/set_metadata_locale_from_disk.md index 514d29009..4b54ed380 100644 --- a/docs/content/en/latest/workspace-content/localization/set_metadata_locale_from_disk.md +++ b/docs/content/en/latest/workspace-content/localization/set_metadata_locale_from_disk.md @@ -3,6 +3,7 @@ title: "set_metadata_locale_from_disk" linkTitle: "set_metadata_locale_from_disk" weight: 57 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.set_metadata_locale_from_disk" --- ``set_metadata_locale_from_disk(workspace_id: str, file_path: Path) -> None`` diff --git a/docs/content/en/latest/workspace-content/localization/set_metadata_localization.md b/docs/content/en/latest/workspace-content/localization/set_metadata_localization.md index 7260b85cc..28c411a3e 100644 --- a/docs/content/en/latest/workspace-content/localization/set_metadata_localization.md +++ b/docs/content/en/latest/workspace-content/localization/set_metadata_localization.md @@ -3,6 +3,7 @@ title: "set_metadata_localization" linkTitle: "set_metadata_localization" weight: 53 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.set_metadata_localization" --- ``set_metadata_localization(workspace_id: str, encoded_xml: bytes) -> None`` diff --git a/docs/content/en/latest/workspace-content/logical-data-model/get_declarative_ldm.md b/docs/content/en/latest/workspace-content/logical-data-model/get_declarative_ldm.md index dfec36ff9..37e9fd0aa 100644 --- a/docs/content/en/latest/workspace-content/logical-data-model/get_declarative_ldm.md +++ b/docs/content/en/latest/workspace-content/logical-data-model/get_declarative_ldm.md @@ -3,6 +3,7 @@ title: "get_declarative_ldm" linkTitle: "get_declarative_ldm" weight: 80 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.get_declarative_ldm" --- diff --git a/docs/content/en/latest/workspace-content/logical-data-model/load_and_put_declarative_ldm.md b/docs/content/en/latest/workspace-content/logical-data-model/load_and_put_declarative_ldm.md index e605ba05b..b51153ce6 100644 --- a/docs/content/en/latest/workspace-content/logical-data-model/load_and_put_declarative_ldm.md +++ b/docs/content/en/latest/workspace-content/logical-data-model/load_and_put_declarative_ldm.md @@ -3,6 +3,7 @@ title: "load_and_put_declarative_ldm" linkTitle: "load_and_put_declarative_ldm" weight: 120 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.load_and_put_declarative_ldm" --- diff --git a/docs/content/en/latest/workspace-content/logical-data-model/load_declarative_ldm.md b/docs/content/en/latest/workspace-content/logical-data-model/load_declarative_ldm.md index f74393912..e9a95a714 100644 --- a/docs/content/en/latest/workspace-content/logical-data-model/load_declarative_ldm.md +++ b/docs/content/en/latest/workspace-content/logical-data-model/load_declarative_ldm.md @@ -3,6 +3,7 @@ title: "load_declarative_ldm" linkTitle: "load_declarative_ldm" weight: 110 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.load_declarative_ldm" --- diff --git a/docs/content/en/latest/workspace-content/logical-data-model/load_ldm_from_disk.md b/docs/content/en/latest/workspace-content/logical-data-model/load_ldm_from_disk.md index c4fb5249c..3abd6b5ad 100644 --- a/docs/content/en/latest/workspace-content/logical-data-model/load_ldm_from_disk.md +++ b/docs/content/en/latest/workspace-content/logical-data-model/load_ldm_from_disk.md @@ -3,6 +3,7 @@ title: "load_ldm_from_disk" linkTitle: "load_ldm_from_disk" weight: 101 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.load_ldm_from_disk" --- ``load_ldm_from_disk( path: Path = Path.cwd())`` diff --git a/docs/content/en/latest/workspace-content/logical-data-model/put_declarative_ldm.md b/docs/content/en/latest/workspace-content/logical-data-model/put_declarative_ldm.md index 7c7e290ab..959393e95 100644 --- a/docs/content/en/latest/workspace-content/logical-data-model/put_declarative_ldm.md +++ b/docs/content/en/latest/workspace-content/logical-data-model/put_declarative_ldm.md @@ -3,6 +3,7 @@ title: "put_declarative_ldm" linkTitle: "put_declarative_ldm" weight: 90 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.put_declarative_ldm" --- diff --git a/docs/content/en/latest/workspace-content/logical-data-model/store_declarative_ldm.md b/docs/content/en/latest/workspace-content/logical-data-model/store_declarative_ldm.md index 3968f82b0..33292bdcc 100644 --- a/docs/content/en/latest/workspace-content/logical-data-model/store_declarative_ldm.md +++ b/docs/content/en/latest/workspace-content/logical-data-model/store_declarative_ldm.md @@ -3,6 +3,7 @@ title: "store_declarative_ldm" linkTitle: "store_declarative_ldm" weight: 100 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.store_declarative_ldm" --- diff --git a/docs/content/en/latest/workspace-content/logical-data-model/store_ldm_to_disk.md b/docs/content/en/latest/workspace-content/logical-data-model/store_ldm_to_disk.md index 1f7f695e9..ed9b80540 100644 --- a/docs/content/en/latest/workspace-content/logical-data-model/store_ldm_to_disk.md +++ b/docs/content/en/latest/workspace-content/logical-data-model/store_ldm_to_disk.md @@ -3,6 +3,7 @@ title: "store_ldm_to_disk" linkTitle: "store_ldm_to_disk" weight: 100 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.store_ldm_to_disk" --- diff --git a/docs/content/en/latest/workspace-content/workspace-content/for_items.md b/docs/content/en/latest/workspace-content/workspace-content/for_items.md index a8bb60309..5d938df3a 100644 --- a/docs/content/en/latest/workspace-content/workspace-content/for_items.md +++ b/docs/content/en/latest/workspace-content/workspace-content/for_items.md @@ -3,6 +3,7 @@ title: "for_items" linkTitle: "for_items" weight: 11 superheading: "tables." +api_ref: "TableService.for_items" --- diff --git a/docs/content/en/latest/workspace-content/workspace-content/for_visualization.md b/docs/content/en/latest/workspace-content/workspace-content/for_visualization.md index 9fc68ab92..c7893bb24 100644 --- a/docs/content/en/latest/workspace-content/workspace-content/for_visualization.md +++ b/docs/content/en/latest/workspace-content/workspace-content/for_visualization.md @@ -3,6 +3,7 @@ title: "for_visualization" linkTitle: "for_visualization" weight: 10 superheading: "tables." +api_ref: "TableService.for_visualization" --- diff --git a/docs/content/en/latest/workspace-content/workspace-content/get_attributes_catalog.md b/docs/content/en/latest/workspace-content/workspace-content/get_attributes_catalog.md index 2cbf79aa2..30fe4d541 100644 --- a/docs/content/en/latest/workspace-content/workspace-content/get_attributes_catalog.md +++ b/docs/content/en/latest/workspace-content/workspace-content/get_attributes_catalog.md @@ -3,6 +3,7 @@ title: "get_attributes_catalog" linkTitle: "get_attributes_catalog" weight: 50 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.get_attributes_catalog" --- diff --git a/docs/content/en/latest/workspace-content/workspace-content/get_dependent_entities_graph.md b/docs/content/en/latest/workspace-content/workspace-content/get_dependent_entities_graph.md index 9b3f005ce..2fc4da167 100644 --- a/docs/content/en/latest/workspace-content/workspace-content/get_dependent_entities_graph.md +++ b/docs/content/en/latest/workspace-content/workspace-content/get_dependent_entities_graph.md @@ -3,6 +3,7 @@ title: "get_dependent_entities_graph" linkTitle: "get_dependent_entities_graph" weight: 90 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.get_dependent_entities_graph" --- diff --git a/docs/content/en/latest/workspace-content/workspace-content/get_dependent_entities_graph_from_entry_points.md b/docs/content/en/latest/workspace-content/workspace-content/get_dependent_entities_graph_from_entry_points.md index e7e4823cc..29ced7343 100644 --- a/docs/content/en/latest/workspace-content/workspace-content/get_dependent_entities_graph_from_entry_points.md +++ b/docs/content/en/latest/workspace-content/workspace-content/get_dependent_entities_graph_from_entry_points.md @@ -3,6 +3,7 @@ title: "get_dependent_entities_graph_from_entry_points" linkTitle: "get_dependent_entities_graph_f..." weight: 100 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.get_dependent_entities_graph_from_entry_points" --- diff --git a/docs/content/en/latest/workspace-content/workspace-content/get_facts_catalog.md b/docs/content/en/latest/workspace-content/workspace-content/get_facts_catalog.md index 5bdb07e6c..b1db0803a 100644 --- a/docs/content/en/latest/workspace-content/workspace-content/get_facts_catalog.md +++ b/docs/content/en/latest/workspace-content/workspace-content/get_facts_catalog.md @@ -3,6 +3,7 @@ title: "get_facts_catalog" linkTitle: "get_facts_catalog" weight: 40 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.get_facts_catalog" --- diff --git a/docs/content/en/latest/workspace-content/workspace-content/get_full_catalog.md b/docs/content/en/latest/workspace-content/workspace-content/get_full_catalog.md index ecf1a66e0..d9773264c 100644 --- a/docs/content/en/latest/workspace-content/workspace-content/get_full_catalog.md +++ b/docs/content/en/latest/workspace-content/workspace-content/get_full_catalog.md @@ -3,6 +3,7 @@ title: "get_full_catalog" linkTitle: "get_full_catalog" weight: 20 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.get_full_catalog" --- diff --git a/docs/content/en/latest/workspace-content/workspace-content/get_labels_catalog.md b/docs/content/en/latest/workspace-content/workspace-content/get_labels_catalog.md index 456c615c8..aaad032ad 100644 --- a/docs/content/en/latest/workspace-content/workspace-content/get_labels_catalog.md +++ b/docs/content/en/latest/workspace-content/workspace-content/get_labels_catalog.md @@ -3,6 +3,7 @@ title: "get_labels_catalog" linkTitle: "get_labels_catalog" weight: 60 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.get_labels_catalog" --- diff --git a/docs/content/en/latest/workspace-content/workspace-content/get_metrics_catalog.md b/docs/content/en/latest/workspace-content/workspace-content/get_metrics_catalog.md index 48572af2a..54540b8c2 100644 --- a/docs/content/en/latest/workspace-content/workspace-content/get_metrics_catalog.md +++ b/docs/content/en/latest/workspace-content/workspace-content/get_metrics_catalog.md @@ -3,6 +3,7 @@ title: "get_metrics_catalog" linkTitle: "get_metrics_catalog" weight: 30 superheading: "catalog_workspace_content." +api_ref: "CatalogWorkspaceContentService.get_metrics_catalog" --- diff --git a/docs/content/en/latest/workspace-content/workspace-content/get_visualization.md b/docs/content/en/latest/workspace-content/workspace-content/get_visualization.md index 667ef2454..4a174eb01 100644 --- a/docs/content/en/latest/workspace-content/workspace-content/get_visualization.md +++ b/docs/content/en/latest/workspace-content/workspace-content/get_visualization.md @@ -3,6 +3,7 @@ title: "get_visualization" linkTitle: "get_visualization" weight: 15 superheading: "visualizations." +api_ref: "VisualizationService.get_visualization" --- diff --git a/docs/content/en/latest/workspace-content/workspace-content/get_visualizations.md b/docs/content/en/latest/workspace-content/workspace-content/get_visualizations.md index 6ee8f4921..82ddb5c67 100644 --- a/docs/content/en/latest/workspace-content/workspace-content/get_visualizations.md +++ b/docs/content/en/latest/workspace-content/workspace-content/get_visualizations.md @@ -3,6 +3,7 @@ title: "get_visualizations" linkTitle: "get_visualizations" weight: 15 superheading: "visualizations." +api_ref: "VisualizationService.get_visualizations" --- ``get_visualizations(workspace_id: str)`` diff --git a/docs/content/en/latest/workspace/workspace-data-filters/get_declarative_workspace_data_filters.md b/docs/content/en/latest/workspace/workspace-data-filters/get_declarative_workspace_data_filters.md index 8b50eb4fe..cdaa03238 100644 --- a/docs/content/en/latest/workspace/workspace-data-filters/get_declarative_workspace_data_filters.md +++ b/docs/content/en/latest/workspace/workspace-data-filters/get_declarative_workspace_data_filters.md @@ -3,6 +3,7 @@ title: "get_declarative_workspace_data_filters" linkTitle: "get_declarative_workspace_data_f..." weight: 140 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.get_declarative_workspace_data_filters" --- ``get_declarative_workspace_data_filters()`` diff --git a/docs/content/en/latest/workspace/workspace-data-filters/load_and_put_declarative_workspace_data_filters.md b/docs/content/en/latest/workspace/workspace-data-filters/load_and_put_declarative_workspace_data_filters.md index 2980cf5d9..1e951da7d 100644 --- a/docs/content/en/latest/workspace/workspace-data-filters/load_and_put_declarative_workspace_data_filters.md +++ b/docs/content/en/latest/workspace/workspace-data-filters/load_and_put_declarative_workspace_data_filters.md @@ -3,6 +3,7 @@ title: "load_and_put_declarative_workspace_data_filters" linkTitle: "load_and_put_declarative_worksp..." weight: 180 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.load_and_put_declarative_workspace_data_filters" --- diff --git a/docs/content/en/latest/workspace/workspace-data-filters/load_declarative_workspace_data_filters.md b/docs/content/en/latest/workspace/workspace-data-filters/load_declarative_workspace_data_filters.md index 7188ead32..f6dcc83b0 100644 --- a/docs/content/en/latest/workspace/workspace-data-filters/load_declarative_workspace_data_filters.md +++ b/docs/content/en/latest/workspace/workspace-data-filters/load_declarative_workspace_data_filters.md @@ -3,6 +3,7 @@ title: "load_declarative_workspace_data_filters" linkTitle: "load_declarative_workspace_data_..." weight: 170 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.load_declarative_workspace_data_filters" --- diff --git a/docs/content/en/latest/workspace/workspace-data-filters/put_declarative_workspace_data_filters.md b/docs/content/en/latest/workspace/workspace-data-filters/put_declarative_workspace_data_filters.md index 868008851..254f960a7 100644 --- a/docs/content/en/latest/workspace/workspace-data-filters/put_declarative_workspace_data_filters.md +++ b/docs/content/en/latest/workspace/workspace-data-filters/put_declarative_workspace_data_filters.md @@ -3,6 +3,7 @@ title: "put_declarative_workspace_data_filters" linkTitle: "put_declarative_workspace_data_f..." weight: 150 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.put_declarative_workspace_data_filters" --- diff --git a/docs/content/en/latest/workspace/workspace-data-filters/store_declarative_workspace_data_filters.md b/docs/content/en/latest/workspace/workspace-data-filters/store_declarative_workspace_data_filters.md index d8bfb8174..a285ced43 100644 --- a/docs/content/en/latest/workspace/workspace-data-filters/store_declarative_workspace_data_filters.md +++ b/docs/content/en/latest/workspace/workspace-data-filters/store_declarative_workspace_data_filters.md @@ -3,6 +3,7 @@ title: "store_declarative_workspace_data_filters" linkTitle: "store_declarative_workspace_dat..." weight: 160 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.store_declarative_workspace_data_filters" --- diff --git a/docs/content/en/latest/workspace/workspaces/clone_workspace.md b/docs/content/en/latest/workspace/workspaces/clone_workspace.md index 94baf9f46..d3ebd35d5 100644 --- a/docs/content/en/latest/workspace/workspaces/clone_workspace.md +++ b/docs/content/en/latest/workspace/workspaces/clone_workspace.md @@ -3,6 +3,7 @@ title: "clone_workspace" linkTitle: "clone_workspace" weight: 21 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.clone_workspace" --- diff --git a/docs/content/en/latest/workspace/workspaces/create_or_update.md b/docs/content/en/latest/workspace/workspaces/create_or_update.md index 4e94a1897..84686ef28 100644 --- a/docs/content/en/latest/workspace/workspaces/create_or_update.md +++ b/docs/content/en/latest/workspace/workspaces/create_or_update.md @@ -3,6 +3,7 @@ title: "create_or_update" linkTitle: "create_or_update" weight: 10 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.create_or_update" --- ``create_or_update(workspace: CatalogWorkspace)`` diff --git a/docs/content/en/latest/workspace/workspaces/delete_workspace.md b/docs/content/en/latest/workspace/workspaces/delete_workspace.md index 03ccceb7c..d3fefdb04 100644 --- a/docs/content/en/latest/workspace/workspaces/delete_workspace.md +++ b/docs/content/en/latest/workspace/workspaces/delete_workspace.md @@ -3,6 +3,7 @@ title: "delete_workspace" linkTitle: "delete_workspace" weight: 30 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.delete_workspace" --- diff --git a/docs/content/en/latest/workspace/workspaces/get_declarative_automations.md b/docs/content/en/latest/workspace/workspaces/get_declarative_automations.md index 072d1062a..0c3a1a35e 100644 --- a/docs/content/en/latest/workspace/workspaces/get_declarative_automations.md +++ b/docs/content/en/latest/workspace/workspaces/get_declarative_automations.md @@ -3,6 +3,7 @@ title: "get_declarative_automations" linkTitle: "get_declarative_automations" weight: 50 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.get_declarative_automations" --- ``get_declarative_automations(workspace_id: str)`` diff --git a/docs/content/en/latest/workspace/workspaces/get_declarative_workspace.md b/docs/content/en/latest/workspace/workspaces/get_declarative_workspace.md index 87b5c059e..375820de4 100644 --- a/docs/content/en/latest/workspace/workspaces/get_declarative_workspace.md +++ b/docs/content/en/latest/workspace/workspaces/get_declarative_workspace.md @@ -3,6 +3,7 @@ title: "get_declarative_workspace" linkTitle: "get_declarative_workspace" weight: 100 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.get_declarative_workspace" --- diff --git a/docs/content/en/latest/workspace/workspaces/get_declarative_workspaces.md b/docs/content/en/latest/workspace/workspaces/get_declarative_workspaces.md index 690c084da..0361eb371 100644 --- a/docs/content/en/latest/workspace/workspaces/get_declarative_workspaces.md +++ b/docs/content/en/latest/workspace/workspaces/get_declarative_workspaces.md @@ -3,6 +3,7 @@ title: "get_declarative_workspaces" linkTitle: "get_declarative_workspaces" weight: 50 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.get_declarative_workspaces" --- ``get_declarative_workspaces()`` diff --git a/docs/content/en/latest/workspace/workspaces/get_workspace.md b/docs/content/en/latest/workspace/workspaces/get_workspace.md index 1dc543478..edb1b81dc 100644 --- a/docs/content/en/latest/workspace/workspaces/get_workspace.md +++ b/docs/content/en/latest/workspace/workspaces/get_workspace.md @@ -3,6 +3,7 @@ title: "get_workspace" linkTitle: "get_workspace" weight: 20 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.get_workspace" --- diff --git a/docs/content/en/latest/workspace/workspaces/list_workspaces.md b/docs/content/en/latest/workspace/workspaces/list_workspaces.md index 24704d30b..2b58e5f32 100644 --- a/docs/content/en/latest/workspace/workspaces/list_workspaces.md +++ b/docs/content/en/latest/workspace/workspaces/list_workspaces.md @@ -3,6 +3,7 @@ title: "list_workspaces" linkTitle: "list_workspaces" weight: 40 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.list_workspaces" --- diff --git a/docs/content/en/latest/workspace/workspaces/load_and_put_declarative_workspace.md b/docs/content/en/latest/workspace/workspaces/load_and_put_declarative_workspace.md index f9aa5adcf..a7f14e330 100644 --- a/docs/content/en/latest/workspace/workspaces/load_and_put_declarative_workspace.md +++ b/docs/content/en/latest/workspace/workspaces/load_and_put_declarative_workspace.md @@ -3,6 +3,7 @@ title: "load_and_put_declarative_workspace" linkTitle: "load_and_put_declarative_work..." weight: 130 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.load_and_put_declarative_workspace" --- diff --git a/docs/content/en/latest/workspace/workspaces/load_and_put_declarative_workspaces.md b/docs/content/en/latest/workspace/workspaces/load_and_put_declarative_workspaces.md index edfcadcf2..462fabd61 100644 --- a/docs/content/en/latest/workspace/workspaces/load_and_put_declarative_workspaces.md +++ b/docs/content/en/latest/workspace/workspaces/load_and_put_declarative_workspaces.md @@ -3,6 +3,7 @@ title: "load_and_put_declarative_workspaces" linkTitle: "load_and_put_declarative_work..." weight: 90 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.load_and_put_declarative_workspaces" --- diff --git a/docs/content/en/latest/workspace/workspaces/load_declarative_workspace.md b/docs/content/en/latest/workspace/workspaces/load_declarative_workspace.md index 85d996e01..d4f8dd834 100644 --- a/docs/content/en/latest/workspace/workspaces/load_declarative_workspace.md +++ b/docs/content/en/latest/workspace/workspaces/load_declarative_workspace.md @@ -3,6 +3,7 @@ title: "load_declarative_workspace" linkTitle: "load_declarative_workspace" weight: 120 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.load_declarative_workspace" --- diff --git a/docs/content/en/latest/workspace/workspaces/load_declarative_workspaces.md b/docs/content/en/latest/workspace/workspaces/load_declarative_workspaces.md index d3f495964..3d0fa1713 100644 --- a/docs/content/en/latest/workspace/workspaces/load_declarative_workspaces.md +++ b/docs/content/en/latest/workspace/workspaces/load_declarative_workspaces.md @@ -3,6 +3,7 @@ title: "load_declarative_workspaces" linkTitle: "load_declarative_workspaces" weight: 80 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.load_declarative_workspaces" --- diff --git a/docs/content/en/latest/workspace/workspaces/put_declarative_automations.md b/docs/content/en/latest/workspace/workspaces/put_declarative_automations.md index 97434f595..921a0bb62 100644 --- a/docs/content/en/latest/workspace/workspaces/put_declarative_automations.md +++ b/docs/content/en/latest/workspace/workspaces/put_declarative_automations.md @@ -3,6 +3,7 @@ title: "put_declarative_automations" linkTitle: "put_declarative_automations" weight: 50 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.put_declarative_automations" --- ``put_declarative_automations(workspace_id: str, automations: list[CatalogDeclarativeAutomation])`` diff --git a/docs/content/en/latest/workspace/workspaces/put_declarative_workspace.md b/docs/content/en/latest/workspace/workspaces/put_declarative_workspace.md index d6509efbe..44583aed5 100644 --- a/docs/content/en/latest/workspace/workspaces/put_declarative_workspace.md +++ b/docs/content/en/latest/workspace/workspaces/put_declarative_workspace.md @@ -3,6 +3,7 @@ title: "put_declarative_workspace" linkTitle: "put_declarative_workspace" weight: 110 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.put_declarative_workspace" --- diff --git a/docs/content/en/latest/workspace/workspaces/put_declarative_workspaces.md b/docs/content/en/latest/workspace/workspaces/put_declarative_workspaces.md index f74c1a6aa..4c6bbae05 100644 --- a/docs/content/en/latest/workspace/workspaces/put_declarative_workspaces.md +++ b/docs/content/en/latest/workspace/workspaces/put_declarative_workspaces.md @@ -3,6 +3,7 @@ title: "put_declarative_workspaces" linkTitle: "put_declarative_workspaces" weight: 60 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.put_declarative_workspaces" --- ``put_declarative_workspaces(workspace: CatalogDeclarativeWorkspaces)`` diff --git a/docs/content/en/latest/workspace/workspaces/store_declarative_workspace.md b/docs/content/en/latest/workspace/workspaces/store_declarative_workspace.md index 715f0e903..8252cd432 100644 --- a/docs/content/en/latest/workspace/workspaces/store_declarative_workspace.md +++ b/docs/content/en/latest/workspace/workspaces/store_declarative_workspace.md @@ -3,6 +3,7 @@ title: "store_declarative_workspace" linkTitle: "store_declarative_workspace" weight: 115 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.store_declarative_workspace" --- diff --git a/docs/content/en/latest/workspace/workspaces/store_declarative_workspaces.md b/docs/content/en/latest/workspace/workspaces/store_declarative_workspaces.md index a4aac72f4..724eeee88 100644 --- a/docs/content/en/latest/workspace/workspaces/store_declarative_workspaces.md +++ b/docs/content/en/latest/workspace/workspaces/store_declarative_workspaces.md @@ -3,6 +3,7 @@ title: "store_declarative_workspaces" linkTitle: "store_declarative_workspaces" weight: 70 superheading: "catalog_workspace." +api_ref: "CatalogWorkspaceService.store_declarative_workspaces" --- diff --git a/docs/layouts/partials/api-ref-function-parenthesis.html b/docs/layouts/partials/api-ref-function-parenthesis.html deleted file mode 100644 index 1f648ed6f..000000000 --- a/docs/layouts/partials/api-ref-function-parenthesis.html +++ /dev/null @@ -1,10 +0,0 @@ -{{- $funcObj := . -}} -{{- /* Create the parenthesis string for signature */ -}} -{{- $parenthesisArgsString := "" -}} -{{- if $funcObj.docstring_parsed -}} -{{- range $funcObj.docstring_parsed.params -}} -{{- $parenthesisArgsString = print $parenthesisArgsString .arg_name ": " .type_name ", " -}} -{{- end -}} -{{- end -}} -{{- $parenthesisArgsString := strings.TrimRight ", " $parenthesisArgsString -}} -{{- $parenthesisArgsString -}} diff --git a/docs/layouts/partials/api-ref-link-all-partial.html b/docs/layouts/partials/api-ref-link-all-partial.html deleted file mode 100644 index 0e81805f6..000000000 --- a/docs/layouts/partials/api-ref-link-all-partial.html +++ /dev/null @@ -1,47 +0,0 @@ -{{ $context := .context}} -{{ $paragraph := .paragraph}} -{{ $jsonPath := printf "versioned_docs/%s/links.json" (partial "version.html" (dict "context" $context)).dirpath }} - -{{ if fileExists $jsonPath }} - -{{ with getJSON $jsonPath }} - {{ $links := . }} - - {{ range $name, $data := $links }} - {{ if and $data.path (ne $data.path "") }} - {{ $path := $data.path }} - {{ $kind := $data.kind }} - {{/* I don't think there is any other way to include literal backtick inside a raw-string */}} - {{/* The regex captures $name that is surrounded by any of */}} - {{/* [$name] `name`*/}} - {{/* Hugo doesn't support lookahead/lookbehind, so - the groups have to be used to match correctly*/}} - {{ $pattern := "" }} - {{ if strings.Contains $name "_" }} - {{ $pattern = printf `([\[%s ])(%s)([\]%s. ])` "`" $name "`"}} - {{/* If name contains "_" use more lenient regex, which allows the name - to be surrounded by whitespace. This is required, otherwise names like "load" - are matched in random places */}} - {{ else }} - {{ $pattern = printf `([\[%s])(%s)([\]%s])` "`" $name "`" }} - {{ end }} - {{ $matches := findRE $name $paragraph}} - {{ if gt (len $matches) 0 }} - {{ $a_html := (printf "$1%s$3" $path $name) }} - {{ $paragraph = replaceRE $pattern $a_html $paragraph | safeHTML}} - {{ end }} - {{ end }} - {{ end }} - - {{/* Remove backticks around links */}} - {{ $leadingBacktickRemovalPattern := "`" $paragraph}} - - {{ $paragraph | safeHTML }} -{{ end }} - -{{ else }} - Missing links.json for this version! -{{ end }} diff --git a/docs/layouts/partials/api-ref-link-partial.html b/docs/layouts/partials/api-ref-link-partial.html deleted file mode 100644 index 4902895c1..000000000 --- a/docs/layouts/partials/api-ref-link-partial.html +++ /dev/null @@ -1,28 +0,0 @@ -{{ $orig_name := .paragraph }} -{{ $context := .context }} -{{ $jsonPath := printf "versioned_docs/%s/links.json" (partial "version.html" (dict "context" $context)).dirpath }} - -{{ if fileExists $jsonPath }} - -{{ with getJSON $jsonPath }} - {{ $links := . }} - {{/* We have to handle the case of Optional[name] or list[name] */}} - {{ $name := $orig_name }} - {{ $name := replace $name "]" "" }} - {{ $name := replace $name "Optional[" "" }} - {{ $name := replace $name "list[" "" }} - {{ $name := replace $name "List[" "" }} - - {{ $data := index $links (trim $name " ") }} - {{ if and $data $data.path (ne $data.path "") }} - {{ $path := $data.path }} - {{ $a_html := (printf "%s" $path $name) }} - {{ replace $orig_name $name $a_html | safeHTML}} - {{ else }} - {{ $orig_name }} - {{ end }} -{{ end }} - -{{ else }} - Missing links.json for this version! -{{ end }} diff --git a/docs/layouts/partials/api-ref-object-partial.html b/docs/layouts/partials/api-ref-object-partial.html deleted file mode 100644 index 669efeb1b..000000000 --- a/docs/layouts/partials/api-ref-object-partial.html +++ /dev/null @@ -1,137 +0,0 @@ -{{ $context := .context }} -{{ $objData := .object }} -{{ $path := .path }} - - -
-{{ if and (eq $objData.kind "function")}} - -{{ $parenthesisArgsString := partial "api-ref-function-parenthesis.html" $objData}} -{{ if not $objData.is_property }} -

{{ (index (last 1 $path) 0) }}({{- $parenthesisArgsString -}}) -> {{ partial "api-ref-link-partial.html" (dict - "paragraph" $objData.signature.return_annotation "context" $context) }}

-{{ else }} -

{{ (index (last 1 $path) 0) }} -> {{ partial "api-ref-link-partial.html" (dict "paragraph" - $objData.signature.return_annotation "context" $context) }}

-{{ end }} - -{{ if $objData.docstring_parsed}} -
-

{{ partial "api-ref-link-all-partial.html" (dict "paragraph" ($objData.docstring_parsed.short_description | - safeHTML) "context" $context) }}

-

{{ partial "api-ref-link-all-partial.html" (dict "paragraph" ($objData.docstring_parsed.long_description | - safeHTML) "context" $context)}}

-
-{{ end }} - -{{ if not $objData.is_property }} -

Parameters

-{{ if $objData.docstring_parsed }} -{{ if (index $objData.docstring_parsed "params") }} -{{ if (gt (len $objData.docstring_parsed.params) 0) }} - - - - - - - - - - {{range $objData.docstring_parsed.params}} - - - - - - {{end}} - -
nametypedescription
{{ .arg_name }} {{ partial "api-ref-link-partial.html" (dict "paragraph" .type_name "context" $context) }} {{ partial "api-ref-link-all-partial.html" (dict "paragraph" (.description | safeHTML) "context" $context) - }} -
-{{ else }} - None -{{ end }} -{{ else if (gt (len $objData.signature.params) 0) }} - - - - - - - - - - {{range $objData.signature.params}} - - - - - - {{end}} - -
nametypedescription
{{ index . 0 }} {{ partial "api-ref-link-partial.html" (dict "paragraph" (index . 1) "context" $context) }} None
-{{ else }} - None -{{ end }} -{{ else }} - None -{{ end }} -{{ end }} - -

Returns

-{{ if $objData.docstring_parsed }} -{{ if not $objData.docstring_parsed.returns }} - No docs -{{ else if or $objData.docstring_parsed.returns.type_name (ne $objData.signature.return_annotation "None") }} -{{ $typeName := "" }} -{{ if $objData.docstring_parsed.returns.type_name }} -{{ $typeName = $objData.docstring_parsed.returns.type_name }} -{{ else }} -{{ $typeName = $objData.signature.return_type }} -{{ end }} - -{{ $description := $objData.docstring_parsed.returns.description }} - - - - - - - - - - - - - - -
typedescription
- {{ partial "api-ref-link-partial.html" (dict "paragraph" $typeName "context" $context) }} - - {{ if $description }} - {{ partial "api-ref-link-all-partial.html" (dict "paragraph" ($objData.docstring_parsed.returns.description - | safeHTML) "context" $context) }} - {{ else }} - None - {{ end }} -
-{{ else }} - None -{{ end }} -{{ else }} - No docs -{{ end }} - -{{ else if and (eq $objData.kind "class") }} -

{{index (last 2 $path) 0}}.{{ index (last 1 $path) 0 }}

-{{ if $objData.docstring_parsed }} -
-

{{ partial "api-ref-link-all-partial.html" (dict "paragraph" ($objData.docstring_parsed.short_description | - safeHTML) "context" $context) }}

-

{{ partial "api-ref-link-all-partial.html" (dict "paragraph" ($objData.docstring_parsed.long_description | - safeHTML) "context" $context) }}

-
-{{ end }} -{{end}} -
diff --git a/docs/layouts/partials/api-ref-partial.html b/docs/layouts/partials/api-ref-partial.html deleted file mode 100644 index 4d5ab7520..000000000 --- a/docs/layouts/partials/api-ref-partial.html +++ /dev/null @@ -1,29 +0,0 @@ -{{ $path := split .path "." }} -{{ $jsonPath := printf "versioned_docs/%s/data.json" (partial "version.html" (dict "context" .context )).dirpath }} - -{{ if fileExists $jsonPath }} - -{{ with getJSON $jsonPath }} - {{ $currentData := . }} - {{ range $path }} - {{ if (eq $currentData.kind "class") }} - {{ $currentData = $currentData.functions }} - {{ end }} - {{ if $currentData }} - {{$currentData = index $currentData .}} - {{ else }} - Failed to render: {{ $path }} - {{ end}} - {{ end }} - - {{ $objData := $currentData }} - - -
- {{ partial "api-ref-object-partial.html" (dict "object" $objData "path" $path "context" .) }} -
-{{ end }} - -{{ else }} - Missing data.json for this version! -{{ end }} diff --git a/docs/layouts/shortcodes/api-ref-base.html b/docs/layouts/shortcodes/api-ref-base.html deleted file mode 100644 index 38e5adea9..000000000 --- a/docs/layouts/shortcodes/api-ref-base.html +++ /dev/null @@ -1,29 +0,0 @@ -{{ $page := . }} -{{ $dirpath := (partial "version.html" (dict "context" .)).dirpath }} - -{{ $jsonPath := printf "versioned_docs/%s/data.json" $dirpath }} - -{{ if fileExists $jsonPath }} - - {{ with getJSON $jsonPath }} - {{ $data := . }} - {{ with getJSON (printf "versioned_docs/%s/links.json" $dirpath) }} - {{ $links := . }} - - - {{ end }} - {{ end }} - -{{ else }} - Missing data.json for this version! -{{ end }} diff --git a/docs/layouts/shortcodes/api-ref-class.html b/docs/layouts/shortcodes/api-ref-class.html deleted file mode 100644 index c358b49fd..000000000 --- a/docs/layouts/shortcodes/api-ref-class.html +++ /dev/null @@ -1,106 +0,0 @@ -{{ $path := split (.Get 0) "." }} -{{ $page := .Page }} -{{ $jsonPath := printf "versioned_docs/%s/data.json" (partial "version.html" (dict "context" $page)).dirpath }} - -{{ if fileExists $jsonPath }} - - {{ with getJSON $jsonPath }} - {{ $currentData := . }} - {{ range $path }} - {{ if (eq $currentData.kind "class") }} - {{ $currentData = $currentData.functions }} - {{ end }} - {{$currentData = index $currentData .}} - {{ end }} - - -{{ $objData := $currentData }} - -{{ $publicMethodsCounter := 0 }} -{{ $publicPropertiesCounter := 0 }} - -{{ range $name, $func := $objData.functions }} - {{ if (not (hasPrefix $name "_"))}} - {{ if $func.is_property }} - {{ $publicPropertiesCounter = add $publicPropertiesCounter 1 }} - {{ else }} - {{ $publicMethodsCounter = add $publicMethodsCounter 1 }} - {{ end }} - {{ end }} - -{{ end }} - -
- {{ partial "api-ref-object-partial.html" (dict "object" $objData "path" $path "context" $page) }} - -

Properties

- {{ if gt $publicPropertiesCounter 0 }} - - - - - - - - - {{ range $name, $func := $objData.functions }} - {{ if and (not (hasPrefix $name "_")) ($func.is_property)}} - - - - {{ if $func.docstring_parsed }} - - {{ else }} - - {{ end }} - - {{ end }} - {{ end }} - -
NameDescription
- {{ partial "api-ref-link-partial.html" (dict "paragraph" $name "context" $page) }} - {{ partial "api-ref-link-all-partial.html" (dict "paragraph" $func.docstring_parsed.short_description "context" $page) }}None
- {{ else }} - None - {{ end }} - -

Methods

- {{ if gt $publicMethodsCounter 0 }} - - - - - - - - - - - {{ range $name, $func := $objData.functions }} - - - {{ if and (not (hasPrefix $name "_")) (not $func.is_property)}} - {{ $parenthesisArgsString := partial "api-ref-function-parenthesis.html" $func}} - - - {{ if $func.docstring_parsed }} - - {{ else }} - - {{ end }} - {{ end }} - - {{ end }} - -
NameDescription
{{ partial "api-ref-link-partial.html" (dict "paragraph" $name "context" $page) }}({{- $parenthesisArgsString -}}) - {{ partial "api-ref-link-all-partial.html" (dict "paragraph" $func.docstring_parsed.short_description "context" $page) }}None
- {{ else}} - None - {{ end }} - -
-{{ end }} - -{{ else }} - Missing data.json for this version! -{{ end }} diff --git a/docs/layouts/shortcodes/api-ref-link.html b/docs/layouts/shortcodes/api-ref-link.html deleted file mode 100644 index 17636e194..000000000 --- a/docs/layouts/shortcodes/api-ref-link.html +++ /dev/null @@ -1 +0,0 @@ -{{ partial "api-ref-link-partial.html" (dict "paragraph" (index .Params 0) "context" .Page)}} diff --git a/docs/layouts/shortcodes/api-ref-module.html b/docs/layouts/shortcodes/api-ref-module.html deleted file mode 100644 index 9210fbc00..000000000 --- a/docs/layouts/shortcodes/api-ref-module.html +++ /dev/null @@ -1,43 +0,0 @@ -{{ $path := split (.Get 0) "." }} -{{ $page := .Page }} -{{ $jsonPath := printf "versioned_docs/%s/data.json" (partial "version.html" (dict "context" .Page)).dirpath }} - -{{ if fileExists $jsonPath }} -{{ $data := getJSON $jsonPath }} - - -{{ $currentData := $data}} -{{ range $path }} - {{ if (eq $currentData.kind "class") }} - {{ $currentData = $currentData.functions }} - {{ end }} - {{$currentData = index $currentData .}} -{{ end }} - -{{ $moduleData := $currentData }} - - -
- - - - - - - - - {{ range $objName, $objData := $moduleData }} - {{ if ne $objName "kind" }} - - - - - {{ end }} - {{ end }} - -
TypeName
{{$objData.kind}}{{partial "api-ref-link-partial.html" (dict "paragraph" $objName "context" $page) }}
-
- -{{ else }} - Missing data.json for this version! -{{ end }} diff --git a/docs/layouts/shortcodes/api-ref.html b/docs/layouts/shortcodes/api-ref.html deleted file mode 100644 index d4366cd01..000000000 --- a/docs/layouts/shortcodes/api-ref.html +++ /dev/null @@ -1,34 +0,0 @@ -{{ $page := .Page }} -{{ $path := split (.Get 0) "." }} -{{ $version := partial "version.html" (dict "context" $page)}} -{{ $jsonPath := printf "versioned_docs/%s/data.json" $version.dirpath }} - -{{ if fileExists $jsonPath }} - - {{ if and $version $version.dirpath }} - {{ with getJSON $jsonPath }} - {{ $currentData := .}} - {{ range $path }} - {{ if (eq $currentData.kind "class") }} - {{ $currentData = $currentData.functions }} - {{ end }} - {{$currentData = index $currentData .}} - {{ end }} - - {{ $objData := $currentData }} - - -
- {{ partial "api-ref-object-partial.html" (dict "object" $objData "path" $path "context" $page) }} -
- {{ end }} - - {{ else }} - - Problem parsing the data.json! - - {{ end }} - -{{ else }} - Missing data.json for this version! -{{ end }} diff --git a/docs/layouts/shortcodes/parameter.html b/docs/layouts/shortcodes/parameter.html deleted file mode 100644 index 8912e9d21..000000000 --- a/docs/layouts/shortcodes/parameter.html +++ /dev/null @@ -1,5 +0,0 @@ - -{{ with .Get "p_name" }}{{ . | safeHTML }}{{ end }} -{{ with .Get "p_type" }}{{ . | safeHTML }}{{ end }} -{{.Inner | safeHTML}} - diff --git a/docs/layouts/shortcodes/parameters-block.html b/docs/layouts/shortcodes/parameters-block.html deleted file mode 100644 index c3e332a48..000000000 --- a/docs/layouts/shortcodes/parameters-block.html +++ /dev/null @@ -1,20 +0,0 @@ -{{ $partitle := .Get "title"}} -

{{$partitle}}

-{{ with .Get `None`}} -None -{{else}} - - - -{{ if eq $partitle "Parameters"}} - -{{end}} - - - - - -{{.Inner}} - -
nametypedescription
-{{end}} diff --git a/docs/public/.gitkeep b/docs/public/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/versioned_docs/.gitkeep b/docs/versioned_docs/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/gooddata-pandas/src/gooddata_pandas/data_access.py b/packages/gooddata-pandas/src/gooddata_pandas/data_access.py index 9bc8b8b64..6a05d7624 100644 --- a/packages/gooddata-pandas/src/gooddata_pandas/data_access.py +++ b/packages/gooddata-pandas/src/gooddata_pandas/data_access.py @@ -230,7 +230,7 @@ def build_execution_definition(self, filter_by: Union[Filter, list[Filter]] | No Args: filter_by (Optional[Union[Filter, list[Filter]]]): A filter or a list of filters to be applied to the - execution definition. If it's not provided or None, then the current filter configuration is used. + execution definition. If it's not provided or None, then the current filter configuration is used. Returns: ExecutionDefinition: An ExecutionDefinition instance containing attributes, metrics, filters, diff --git a/packages/gooddata-pandas/src/gooddata_pandas/dataframe.py b/packages/gooddata-pandas/src/gooddata_pandas/dataframe.py index 2074a6526..d431a95e5 100644 --- a/packages/gooddata-pandas/src/gooddata_pandas/dataframe.py +++ b/packages/gooddata-pandas/src/gooddata_pandas/dataframe.py @@ -60,7 +60,8 @@ class DataFrameFactory: """ def __init__(self, sdk: GoodDataSdk, workspace_id: str) -> None: - """ + """Create a new DataFrameFactory. + Args: sdk (GoodDataSdk): GoodData SDK instance. workspace_id (str): Workspace identifier. diff --git a/packages/gooddata-pandas/src/gooddata_pandas/series.py b/packages/gooddata-pandas/src/gooddata_pandas/series.py index 664f17186..7981dc81f 100644 --- a/packages/gooddata-pandas/src/gooddata_pandas/series.py +++ b/packages/gooddata-pandas/src/gooddata_pandas/series.py @@ -38,37 +38,26 @@ def indexed( of the index labels. The elements of the index labels will be used to construct simple or hierarchical index. Args: - index_by (IndexDef): label to index by; specify either: - - - string with id: ``some_label_id``, - - object identifier: ``ObjId(id='some_label_id', type='label')``, - - string representation of object identifier: ``label/some_label_id`` - - or an Attribute object used in the compute model: ``Attribute(local_id=..., label='some_label_id')`` - - dict containing mapping of index name to label to use for indexing (in one of the ways listed above) - - data_by (Union[SimpleMetric, str, ObjId, Attribute]): label, fact or metric to that will provide data - (metric values or label elements); specify either: - - - object identifier: ``ObjId(id='some_id', type='')`` - where type is either ``label``, ``fact`` - or ``metric`` - - string representation of object identifier: ``/some_id`` - where type is either ``label``, ``fact`` - or ``metric`` - - Attribute object used in the compute model: ``Attribute(local_id=..., label='some_label_id')`` - - SimpleMetric object used in the compute model: ``SimpleMetric(local_id=..., item=..., aggregation=...)`` - - filter_by (Optional[Union[Filter, list[Filter]]]): optionally specify filter to apply during computation on - the server, reference to filtering column can be one of: - - - string reference to index key - - object identifier in string form - - object identifier: ``ObjId(id='some_label_id', type='')`` - - Attribute or Metric depending on type of filter - + index_by (IndexDef): label to index by; specify either + a string with id (``some_label_id``), + an object identifier (``ObjId(id='some_label_id', type='label')``), + a string representation of object identifier (``label/some_label_id``), + an Attribute object used in the compute model + (``Attribute(local_id=..., label='some_label_id')``), + or a dict containing mapping of index name to label to use for indexing. + data_by (Union[SimpleMetric, str, ObjId, Attribute]): label, fact or metric that will provide data + (metric values or label elements); specify either an object identifier + (``ObjId(id='some_id', type='')``), a string representation + (``/some_id``), an Attribute object, or a SimpleMetric object. + filter_by (Optional[Union[Filter, list[Filter]]]): optionally specify filter to apply during + computation on the server, reference to filtering column can be a string reference to + index key, object identifier in string form, + ``ObjId(id='some_label_id', type='')``, + or Attribute/Metric depending on type of filter. on_execution_submitted (Optional[Callable[[Execution], None]]): Callback to call when the execution was submitted to the backend. - - is_cancellable (bool, optional): Whether the execution should be cancelled when the connection is interrupted. - + is_cancellable (bool, optional): Whether the execution should be cancelled when the connection + is interrupted. result_page_len (Optional[int]): Optional page size for result pagination. Defaults to 1000. Larger values can improve performance for large result sets. diff --git a/packages/gooddata-sdk/src/gooddata_sdk/catalog/data_source/service.py b/packages/gooddata-sdk/src/gooddata_sdk/catalog/data_source/service.py index 8126d496c..7491187d8 100644 --- a/packages/gooddata-sdk/src/gooddata_sdk/catalog/data_source/service.py +++ b/packages/gooddata-sdk/src/gooddata_sdk/catalog/data_source/service.py @@ -130,9 +130,6 @@ def patch_data_source_attributes(self, data_source_id: str, attributes: dict) -> def list_data_sources(self) -> list[CatalogDataSource]: """Lists all data sources. - Args: - None - Returns: list[CatalogDataSource]: List of all Data Sources in the whole organization. @@ -149,9 +146,6 @@ def list_data_sources(self) -> list[CatalogDataSource]: def get_declarative_data_sources(self) -> CatalogDeclarativeDataSources: """Retrieve all data sources. - Args: - None - Returns: CatalogDeclarativeDataSources: Declarative Data Sources, including physical data model. diff --git a/packages/gooddata-sdk/src/gooddata_sdk/catalog/export/service.py b/packages/gooddata-sdk/src/gooddata_sdk/catalog/export/service.py index 0207fc1a7..8bf69a212 100644 --- a/packages/gooddata-sdk/src/gooddata_sdk/catalog/export/service.py +++ b/packages/gooddata-sdk/src/gooddata_sdk/catalog/export/service.py @@ -21,6 +21,7 @@ class ExportService(CatalogServiceBase): """ ExportService provides the ability to export PDF and Tabular data from GoodData Dashboards. + Attributes: _entities_api: A reference to the entities_api of GoodDataApiClient instance. @@ -47,6 +48,7 @@ def __init__(self, api_client: GoodDataApiClient) -> None: super().__init__(api_client) """ Initializes the ExportService with the GoodDataApiClient instance. + Args: api_client (GoodDataApiClient): An instance of the GoodData API Client. """ @@ -62,6 +64,7 @@ def _get_exported_content( ) -> bytes: """ Get the exported content from a server as bytes. + Args: workspace_id (str): The workspace ID for which content is to be exported. @@ -75,8 +78,10 @@ def _get_exported_content( Initial time in seconds to wait between retries. Defaults to 0.2. max_retry (float, optional): Maximum time in seconds to wait between retries. Defaults to 5.0. + Returns: bytes: The exported content as bytes. + Raises: ValueError: If the server is not able to return a response or if the input values are invalid. """ @@ -107,11 +112,13 @@ def _create_export( ) -> str: """ Creates an export of the requested type (PDF or Tabular) in the specified Workspace. + Args: workspace_id (str): The ID of the target Workspace. request (Union[PdfExportRequest, TabularExportRequest]): A request object specifying the type of export (PDF or Tabular) to be created. create_func (Callable): The function used to create the export. + Returns: str: The export result from the response object. """ @@ -127,6 +134,7 @@ def _dashboard_id_exists(self, workspace_id: str, dashboard_id: str) -> bool: The ID of the target Workspace. dashboard_id (str): The ID of the target Dashboard. + Returns: bool: Returns true, if the dashboard exists. @@ -152,6 +160,7 @@ def _export_common( ) -> None: """ Common method to export content from a workspace. + Args: workspace_id (str): The ID of the workspace to export from. @@ -169,6 +178,7 @@ def _export_common( The time interval to retry checking for exported content (in seconds). Defaults to 0.2. max_retry (float, optional): The maximum number of retries to check for exported content. Defaults to 5.0. + Returns: None """ @@ -190,6 +200,7 @@ def export_pdf( ) -> None: """ Export a PDF of the specified GoodData Dashboard and save it to the specified file path. + Args: workspace_id (str): The ID of the GoodData Workspace. @@ -236,6 +247,7 @@ def export_tabular( ) -> None: """ Export Tabular (CSV, XLSX) data from the specified GoodData Dashboard report, saved to the specified file path. + Args: workspace_id (str): The ID of the GoodData Workspace. diff --git a/packages/gooddata-sdk/src/gooddata_sdk/catalog/permission/service.py b/packages/gooddata-sdk/src/gooddata_sdk/catalog/permission/service.py index 5c4c4e3d6..796362daf 100644 --- a/packages/gooddata-sdk/src/gooddata_sdk/catalog/permission/service.py +++ b/packages/gooddata-sdk/src/gooddata_sdk/catalog/permission/service.py @@ -59,6 +59,7 @@ def list_available_assignees(self, workspace_id: str, dashboard_id: str) -> Cata Workspace identification string. e.g. "demo" dashboard_id (str): Dashboard identification string. e.g. "campaign" + Returns: CatalogAvailableAssignees: Object containing users and user groups @@ -76,6 +77,7 @@ def list_dashboard_permissions(self, workspace_id: str, dashboard_id: str) -> Ca Workspace identification string. e.g. "demo" dashboard_id (str): Dashboard identification string. e.g. "campaign" + Returns: CatalogDashboardPermissions: Object containing users and user groups and granted dashboard permissions @@ -103,6 +105,7 @@ def manage_dashboard_permissions( permissions_for_assignee ([Union[CatalogPermissionsForAssignee, CatalogPermissionsForAssigneeRule]]): Object containing a List of permission assignments. An empty list of permissions in the assignment removes existing dashboard permissions. + Returns: None """ @@ -116,9 +119,6 @@ def manage_dashboard_permissions( def get_declarative_organization_permissions(self) -> list[CatalogDeclarativeOrganizationPermission]: """Get a list of all declarative organization permissions. - Args: - None - Returns: list[CatalogDeclarativeOrganizationPermission]: List of all declarative organization permissions. @@ -155,6 +155,7 @@ def manage_organization_permissions( organization_permission_assignments ([CatalogOrganizationPermissionAssignment]): Object containing List of users and user group and desired organization permissions. Set empty list permissions for user/user group means remove organization permissions. + Returns: None """ diff --git a/packages/gooddata-sdk/src/gooddata_sdk/catalog/user/service.py b/packages/gooddata-sdk/src/gooddata_sdk/catalog/user/service.py index 23a71452e..1e1f4ad33 100644 --- a/packages/gooddata-sdk/src/gooddata_sdk/catalog/user/service.py +++ b/packages/gooddata-sdk/src/gooddata_sdk/catalog/user/service.py @@ -75,9 +75,6 @@ def delete_user(self, user_id: str) -> None: def list_users(self) -> list[CatalogUser]: """Get a list of all existing users. - Args: - None - Returns: list[CatalogUser]: List of all Users as User entity objects. @@ -143,9 +140,6 @@ def delete_user_group(self, user_group_id: str) -> None: def list_user_groups(self) -> list[CatalogUserGroup]: """Get a list of all existing user groups. - Args: - None - Returns: list[CatalogUserGroup]: List of all User groups as UserGroup entity object. @@ -163,9 +157,6 @@ def list_user_groups(self) -> list[CatalogUserGroup]: def get_declarative_users(self) -> CatalogDeclarativeUsers: """Retrieve all users in a declarative form. - Args: - None - Returns: CatalogDeclarativeUsers: Declarative Users object. @@ -231,9 +222,6 @@ def get_declarative_user_groups(self) -> CatalogDeclarativeUserGroups: """Retrieve all user groups in a declarative form. - Args: - None - Returns: CatalogDeclarativeUserGroups: Declarative User Groups object. @@ -302,9 +290,6 @@ def get_declarative_users_user_groups(self) -> CatalogDeclarativeUsersUserGroups """Retrieves all users and user groups in a declarative form. - Args: - None - Returns: CatalogDeclarativeUsersUserGroups: Declarative Users and User Groups object. diff --git a/packages/gooddata-sdk/src/gooddata_sdk/catalog/workspace/service.py b/packages/gooddata-sdk/src/gooddata_sdk/catalog/workspace/service.py index 4ef49204a..50f5f113e 100644 --- a/packages/gooddata-sdk/src/gooddata_sdk/catalog/workspace/service.py +++ b/packages/gooddata-sdk/src/gooddata_sdk/catalog/workspace/service.py @@ -131,7 +131,7 @@ def delete_workspace(self, workspace_id: str) -> None: self._entities_api.delete_entity_workspaces(workspace_id) def list_workspaces(self) -> list[CatalogWorkspace]: - """Returns a list of all workspaces in current organization + """Returns a list of all workspaces in current organization. Returns: list[CatalogWorkspace]: List of workspaces in the current organization. @@ -191,13 +191,17 @@ def list_workspace_settings(self, workspace_id: str) -> list[CatalogWorkspaceSet return [CatalogWorkspaceSetting.from_api(ws) for ws in workspace_settings] def resolve_all_workspace_settings(self, workspace_id: str) -> dict: - """ - Resolves values for all settings in a workspace by current user, workspace, organization, or default settings - and return them as a dictionary. Proper parsing is up to the caller. + """Resolve values for all settings in a workspace. + + Resolves by current user, workspace, organization, or default settings + and returns them as a dictionary. Proper parsing is up to the caller. TODO: long-term we should return a proper entity object. - :param workspace_id: Workspace ID - :return: Dict of settings + Args: + workspace_id: Workspace ID + + Returns: + Dict of settings """ # note: in case some settings were recently added and the API client was not regenerated it can fail on # invalid value when validating allowed types on the client side before request is sent to the server @@ -211,14 +215,18 @@ def resolve_all_workspace_settings(self, workspace_id: str) -> dict: return {setting["type"]: setting for setting in resolved_workspace_settings} def resolve_workspace_settings(self, workspace_id: str, settings: list) -> dict: - """ - Resolves values for given settings in a workspace by current user, workspace, organization, or default settings - and return them as a dictionary. Proper parsing is up to the caller. + """Resolve values for given settings in a workspace. + + Resolves by current user, workspace, organization, or default settings + and returns them as a dictionary. Proper parsing is up to the caller. TODO: long-term we should return a proper entity object. - :param workspace_id: Workspace ID - :param settings: List of settings to resolve - :return: Dict of settings + Args: + workspace_id: Workspace ID + settings: List of settings to resolve + + Returns: + Dict of settings """ resolved_workspace_settings = [ setting.to_dict() @@ -280,6 +288,7 @@ def load_declarative_workspaces(self, layout_root_path: Path = Path.cwd()) -> Ca Args: layout_root_path (Path, optional): Path to the root of the layout directory. Defaults to Path.cwd(). + Returns: CatalogDeclarativeWorkspaces: Declarative Workspaces Object @@ -339,6 +348,7 @@ def put_declarative_workspace( standalone_copy (bool): If true, then workspace data filter references will be removed from LDM. Note that first, the copy is made so we do not interfere with the original input. + Returns: None """ @@ -525,6 +535,7 @@ def generate_localized_workspaces( Translation YAML files are created for each language containing pairs of source and target texts. If translation is not requested, source and target texts are identical. Users must translate it manually We recommend to translate using a third party service and polish the result manually. + Args: workspace_id: ID of source workspace which we clone and translate all texts in it to_lang: ISO lang name (IETF BCP 47) @@ -1034,9 +1045,6 @@ def set_metadata_locale_from_disk(self, workspace_id: str, file_path: Path) -> N def get_declarative_workspace_data_filters(self) -> CatalogDeclarativeWorkspaceDataFilters: """Retrieve a workspace data filers layout. - Args: - None - Returns: CatalogDeclarativeWorkspaceDataFilters: Object containing List of declarative workspace data filters. @@ -1300,6 +1308,7 @@ def put_declarative_automations(self, workspace_id: str, automations: list[Catal Workspace identification string e.g. "demo" automations (list[CatalogDeclarativeAutomation]): List of declarative automations. + Returns: None """ diff --git a/packages/gooddata-sdk/src/gooddata_sdk/compute/compute_to_sdk_converter.py b/packages/gooddata-sdk/src/gooddata_sdk/compute/compute_to_sdk_converter.py index 8e2c4473d..0ce15f2e4 100644 --- a/packages/gooddata-sdk/src/gooddata_sdk/compute/compute_to_sdk_converter.py +++ b/packages/gooddata-sdk/src/gooddata_sdk/compute/compute_to_sdk_converter.py @@ -43,10 +43,13 @@ class ComputeToSdkConverter: @staticmethod def convert_attribute(attribute_dict: dict[str, Any]) -> Attribute: - """ - Converts attribute dictionary to the SDK Compute model. - :param attribute_dict: the attribute dictionary to convert - :return: the converted attribute + """Convert attribute dictionary to the SDK Compute model. + + Args: + attribute_dict: the attribute dictionary to convert + + Returns: + the converted attribute """ return Attribute( local_id=attribute_dict["localIdentifier"], @@ -56,10 +59,13 @@ def convert_attribute(attribute_dict: dict[str, Any]) -> Attribute: @staticmethod def convert_filter(filter_dict: dict[str, Any]) -> Filter: - """ - Converts filter dictionary to the SDK Compute model. - :param filter_dict: the filter dictionary to convert - :return: the converted filter + """Convert filter dictionary to the SDK Compute model. + + Args: + filter_dict: the filter dictionary to convert + + Returns: + the converted filter """ if "positiveAttributeFilter" in filter_dict: f = filter_dict["positiveAttributeFilter"] @@ -186,10 +192,13 @@ def convert_filter(filter_dict: dict[str, Any]) -> Filter: @staticmethod def convert_metric(metric_dict: dict[str, Any]) -> Metric: - """ - Converts metric dictionary to the SDK Compute model. - :param metric_dict: the metric dictionary to convert - :return: the converted metric + """Convert metric dictionary to the SDK Compute model. + + Args: + metric_dict: the metric dictionary to convert + + Returns: + the converted metric """ definition = metric_dict["definition"] local_id = metric_dict["localIdentifier"] diff --git a/packages/gooddata-sdk/src/gooddata_sdk/compute/model/base.py b/packages/gooddata-sdk/src/gooddata_sdk/compute/model/base.py index a354bdf74..1804cb9bf 100644 --- a/packages/gooddata-sdk/src/gooddata_sdk/compute/model/base.py +++ b/packages/gooddata-sdk/src/gooddata_sdk/compute/model/base.py @@ -87,11 +87,14 @@ def as_api_model(self) -> OpenApiModel: raise NotImplementedError() def description(self, labels: dict[str, str], format_locale: str | None = None) -> str: - """ - Description of the filter as it's visible for customer in UI. + """Description of the filter as it's visible for customer in UI. + + Args: + labels: Dict of labels in a form of ``id: label``. Measures and attributes are expected to be here. + format_locale: Locale ICU format to use for dates formatting in the description + (ie. "en-US" or "cs-CZ") - :param labels: Dict of labels in a form of `id: label`. Measures and attributes are expected to be here. - :param format_locale: Locale ICU format to use for dates formatting in the description (ie. "en-US" or "cs-CZ") - :return: Filter's human-readable description + Returns: + Filter's human-readable description """ raise NotImplementedError() diff --git a/packages/gooddata-sdk/src/gooddata_sdk/type_converter.py b/packages/gooddata-sdk/src/gooddata_sdk/type_converter.py index 10fcee4fb..4d3e3ee08 100644 --- a/packages/gooddata-sdk/src/gooddata_sdk/type_converter.py +++ b/packages/gooddata-sdk/src/gooddata_sdk/type_converter.py @@ -119,10 +119,10 @@ class TypeConverterRegistry: """ def __init__(self, type_name: str): - """ - Initialize instance with type for which instance is going to be responsible + """Initialize instance with type for which instance is going to be responsible. - :param type_name: type name + Args: + type_name: type name """ self._type_name = type_name self._converters: dict[str, Converter] = {} @@ -160,10 +160,10 @@ def _register_with_sub_type(self, converter: Converter, sub_type: str) -> None: self._converters[sub_type] = converter def _register_default(self, converter: Converter) -> None: - """ - Register default converter instance for the type. Default type can be registered only once. + """Register default converter instance for the type. Default type can be registered only once. - :param converter: converter instance + Args: + converter: converter instance """ if self._default_converter: reg_converter_type = self._default_converter.__class__.__name__ diff --git a/pyproject.toml b/pyproject.toml index d8704ddaa..b356f1003 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,8 +48,10 @@ type = [ test = [ # Common test dependencies used across all workspace packages "pytest~=8.3.4", - # Required by scripts/docs/ tests (python_ref_builder uses toml) + # Required by scripts/docs/ tests "toml~=0.10.2", + "griffe>=1.0", + "docstring_parser~=0.15", "pytest-cov~=6.0.0", "pytest-json-report==1.5.0", # Additional test dependencies used by multiple packages diff --git a/scripts/docs/README.md b/scripts/docs/README.md index 3e389b9e9..bcf905082 100644 --- a/scripts/docs/README.md +++ b/scripts/docs/README.md @@ -1,23 +1,52 @@ # Documentation Generation -This directory contains Python scripts that generate the API reference pages for -the GoodData Python SDK documentation site. +This directory contains Python scripts that generate the API reference pages and +pre-render method documentation for the GoodData Python SDK documentation site. ## How it works -The docs site is built with Hugo. API reference pages are generated in two steps: +The docs site is built with Hugo. API content is generated in three steps: + +1. **`griffe_builder.py`** — performs static AST analysis of the `gooddata_sdk` + and `gooddata_pandas` source trees using [griffe](https://mkdocstrings.github.io/griffe/), + producing a `data.json` file with class/function/property metadata and parsed + Google-style docstrings. No package installation required. + Falls back to the legacy **`json_builder.py`** (runtime introspection via + `inspect`) for older branches that don't have the griffe builder. -1. **`json_builder.py`** — introspects the installed `gooddata_sdk` and - `gooddata_pandas` packages using `inspect`, producing a `data.json` file with - class/function/property metadata and parsed docstrings. 2. **`python_ref_builder.py`** — reads `data.json` and `api_spec.toml`, then generates markdown files with pre-rendered HTML for each module, class, and function. Jinja2 templates in `templates/` replicate the output of the former - Hugo shortcodes, but at build time instead of at Hugo render time. + Hugo shortcodes. Also exports a `links.json` mapping type names to their + generated page URLs. + +3. **`method_page_renderer.py`** — reads `data.json` and `links.json`, then + pre-renders the 136 method documentation pages (e.g., `scan_sql.md`, + `list_workspaces.md`). For each page with an `api_ref` frontmatter key, it + generates the signature, description, parameters table, and returns table + from the docstring, with type names hyperlinked to the API reference pages. + Hand-written `## Example` sections are preserved. + +The generated markdown files contain Hugo front matter and pre-rendered HTML. +Hugo serves them as-is without needing shortcodes, `data.json`, or `links.json`. + +## Method page format + +Method pages use an `api_ref` frontmatter key to specify which class method to +render from: + +```yaml +--- +title: "scan_sql" +linkTitle: "scan_sql" +weight: 210 +superheading: "catalog_data_source." +api_ref: "CatalogDataSourceService.scan_sql" +--- +``` -The generated markdown files contain Hugo front matter (title, linkTitle, weight) -and a `CONTENT` block with the full HTML. Hugo serves them as-is without needing -shortcodes, `data.json`, or `links.json`. +Everything between the frontmatter and the first `## Example` heading is +auto-generated. Only the example section is hand-written. ## Workflows @@ -34,8 +63,9 @@ discover-versions ──> generate-version (matrix, parallel) ──> build-and- - `discover-versions.sh` finds the latest N release branches. - Each version runs in its own runner: checks out the version's SDK packages, - installs master's `script-requirements.txt`, runs `json_builder.py` + - `python_ref_builder.py` via `generate-single-version.sh`. + installs master's `script-requirements.txt`, runs `griffe_builder.py` + + `python_ref_builder.py` + `method_page_renderer.py` via + `generate-single-version.sh`. - Per-version results are cached by `(scripts hash + templates hash + branch SHA)`. - `assemble-versions.sh` merges all version artifacts, promotes the highest numbered version to `/latest`, then Hugo builds the final site. @@ -57,6 +87,24 @@ Triggered automatically on PRs that change `docs/**`. - Uses the simpler `hugo-build-action` (no API reference generation). - Deploys to a Netlify preview URL (`preview-{PR}--{site}.netlify.app`). +## Data flow + +``` +griffe_builder.py (static AST analysis, no imports needed) + -> data.json + +python_ref_builder.py (reads data.json + api_spec.toml) + -> links.json (type name -> URL mapping) + -> versioned_docs/{version}/api-reference/ (pre-rendered API ref pages) + -> versioned_docs/{version}/pandas/ (pre-rendered pandas ref pages) + +method_page_renderer.py (reads data.json + links.json) + -> versioned_docs/{version}/**/*.md (pre-rendered method pages with linked types) + +Hugo (pure static build, no shortcode processing needed) + -> public/ (final site) +``` + ## Local development Build and serve docs locally using Docker: @@ -68,20 +116,50 @@ docker run --rm -p 1313:1313 python-sdk-docs # Open http://localhost:1313/latest/ ``` +Or manually: + +```bash +cd docs +# Generate data.json (from repo root, no package install needed) +uv run --with griffe python3 ../scripts/docs/griffe_builder.py \ + --search-path ../packages/gooddata-sdk/src \ + --search-path ../packages/gooddata-pandas/src \ + --output data.json \ + gooddata_sdk gooddata_pandas + +# Generate API reference pages + links.json +mkdir -p versioned_docs/latest +cp -r content/en/latest/* versioned_docs/latest/ +uv run --with jinja2 --with toml --with attrs --with cattrs \ + python3 ../scripts/docs/python_ref_builder.py \ + api_spec.toml data.json latest versioned_docs --export-links links.json + +# Pre-render method pages +python3 ../scripts/docs/method_page_renderer.py \ + data.json versioned_docs/latest --links-json links.json + +# Serve +hugo server -e production +``` + ## Key files | File | Purpose | |------|---------| -| `json_builder.py` | Introspects SDK packages into `data.json` | -| `python_ref_builder.py` | Generates markdown + HTML from `data.json` | -| `templates/*.html.j2` | Jinja2 templates (replicate old Hugo shortcodes) | -| `tests/test_python_ref_builder.py` | Unit tests (`make test-docs-scripts`) | -| `../script-requirements.txt` | Python dependencies for both scripts | +| `griffe_builder.py` | Static AST analysis of SDK source into `data.json` | +| `json_builder.py` | Legacy runtime introspection fallback (older branches) | +| `python_ref_builder.py` | Generates API reference markdown + exports `links.json` | +| `method_page_renderer.py` | Pre-renders method pages from `api_ref` frontmatter | +| `migrate_method_pages.py` | One-time migration script (added `api_ref` to 136 pages) | +| `templates/*.html.j2` | Jinja2 templates for API reference pages | +| `tests/` | Unit tests for all scripts | +| `../script-requirements.txt` | Python dependencies | | `../../docs/api_spec.toml` | Maps package names to output directories | | `../../docs/*_template.md` | Markdown front matter templates (module/class/function) | ## Running tests ```bash -make test-docs-scripts +uv run --with griffe --with pytest --with jinja2 --with toml --with attrs --with cattrs \ + pytest scripts/docs/tests/ -v ``` diff --git a/scripts/docs/griffe_builder.py b/scripts/docs/griffe_builder.py new file mode 100644 index 000000000..d3ed9c0d9 --- /dev/null +++ b/scripts/docs/griffe_builder.py @@ -0,0 +1,292 @@ +# (C) 2026 GoodData Corporation +"""Build data.json from Python source using griffe (static AST analysis). + +Drop-in replacement for json_builder.py — produces an identical JSON schema +but does NOT require importing the target packages at runtime. + +Usage: + python griffe_builder.py [--search-path PATH ...] [--output FILE] PACKAGE [PACKAGE ...] + +Example: + python griffe_builder.py \ + --search-path packages/gooddata-sdk/src \ + --search-path packages/gooddata-pandas/src \ + --output data.json \ + gooddata_sdk gooddata_pandas +""" + +from __future__ import annotations + +import argparse +import json +import os +from typing import Any + +import griffe +from griffe import ( + Attribute, + Class, + Docstring, + DocstringParameter, + DocstringReturn, + DocstringSectionKind, + Function, + Module, +) + +# --------------------------------------------------------------------------- +# Docstring helpers +# --------------------------------------------------------------------------- + + +def _parse_docstring_params(docstring: Docstring | None) -> list[dict[str, Any]]: + """Extract parameter info from a parsed Google-style docstring.""" + if docstring is None: + return [] + params: list[dict[str, Any]] = [] + for section in docstring.parsed: + if section.kind is DocstringSectionKind.parameters: + for p in section.value: + assert isinstance(p, DocstringParameter) + params.append( + { + "arg_name": p.name, + "default": str(p.default) if p.default else None, + "is_optional": None, + "type_name": str(p.annotation) if p.annotation else None, + "description": p.description or None, + } + ) + return params + + +def _parse_docstring_returns(docstring: Docstring | None) -> dict[str, Any] | None: + """Extract return info from a parsed Google-style docstring.""" + if docstring is None: + return None + for section in docstring.parsed: + if section.kind is DocstringSectionKind.returns: + for r in section.value: + assert isinstance(r, DocstringReturn) + return { + "type_name": str(r.annotation) if r.annotation else None, + "description": r.description or None, + "return_name": r.name or None, + } + return None + + +def _short_description(docstring: Docstring | None) -> str | None: + if docstring is None: + return None + for section in docstring.parsed: + if section.kind is DocstringSectionKind.text: + text = section.value + # First paragraph = short description + idx = text.find("\n\n") + return text[:idx].strip() if idx != -1 else text.strip() + return None + + +def _long_description(docstring: Docstring | None) -> str | None: + if docstring is None: + return None + for section in docstring.parsed: + if section.kind is DocstringSectionKind.text: + text = section.value + idx = text.find("\n\n") + if idx != -1: + return text[idx:].strip() + return None + return None + + +def _examples_str(docstring: Docstring | None) -> str: + if docstring is None: + return "[]" + for section in docstring.parsed: + if section.kind is DocstringSectionKind.examples: + return str(section.value) + return "[]" + + +def _docstring_data(docstring: Docstring | None) -> dict[str, Any] | None: + """Build the docstring_parsed dict matching json_builder output.""" + if docstring is None: + return None + return { + "params": _parse_docstring_params(docstring), + "long_description": _long_description(docstring), + "short_description": _short_description(docstring), + "examples": _examples_str(docstring), + "returns": _parse_docstring_returns(docstring), + } + + +# --------------------------------------------------------------------------- +# Object converters +# --------------------------------------------------------------------------- + + +def _annotation_str(annotation: Any) -> str: + """Convert a griffe annotation to the string form json_builder would produce.""" + if annotation is None: + return "None" + return str(annotation) + + +def _function_data(func: Function) -> dict[str, Any]: + """Build function dict matching json_builder.FunctionData.""" + sig_params: list[list[str]] = [] + for param in func.parameters: + if param.name == "self": + continue + param_str = str(param.name) + if param.annotation is not None: + param_str += f": {param.annotation}" + if param.default is not None: + param_str += f" = {param.default}" + ann_str = _annotation_str(param.annotation) + sig_params.append([param_str, ann_str]) + + is_property = "property" in func.labels + docstring = func.docstring + # Parse with Google style + if docstring is not None: + docstring.parse("google") + + return { + "kind": "function", + "docstring": docstring.value if docstring else None, + "signature": { + "params": sig_params, + "return_annotation": _annotation_str(func.annotation), + }, + "is_property": is_property, + "docstring_parsed": _docstring_data(docstring), + } + + +def _class_data(cls: Class, package_name: str) -> dict[str, Any]: + """Build class dict matching json_builder.ClassData.""" + docstring = cls.docstring + if docstring is not None: + docstring.parse("google") + + functions: dict[str, Any] = {} + # Use all_members to include inherited methods (matches inspect.getmembers behavior) + for name, member in cls.all_members.items(): + if member.is_alias: + try: + resolved = member.resolve_target() + if isinstance(resolved, Function): + functions[name] = _function_data(resolved) + except Exception: + pass + elif isinstance(member, Function): + functions[name] = _function_data(member) + elif ( + isinstance(member, Attribute) + and "property" in member.labels + and hasattr(member, "getter") + and member.getter is not None + ): + functions[name] = _function_data(member.getter) + + return { + "kind": "class", + "docstring": docstring.value if docstring else None, + "docstring_parsed": _docstring_data(docstring), + "functions": functions, + } + + +def _module_data(module: Module, package_name: str) -> dict[str, Any]: + """Build module dict matching json_builder.module_data.""" + data: dict[str, Any] = {"kind": "module"} + for name, member in module.members.items(): + if isinstance(member, Class): + # Filter: only classes defined in this package + if member.is_alias: + try: + target = member.resolve_target() + if package_name not in str(target.canonical_path): + continue + except Exception: + continue + data[name] = _class_data(member, package_name) + elif isinstance(member, Module): + if member.is_alias: + try: + target = member.resolve_target() + if package_name not in str(target.canonical_path): + continue + except Exception: + continue + data[name] = _module_data(member, package_name) + return data + + +def _parse_package(module: Module, package_name: str) -> dict[str, Any]: + """Walk the package tree and build the data dict.""" + data: dict[str, Any] = {"kind": "module"} + for name, member in module.members.items(): + if isinstance(member, Module): + if member.is_alias: + try: + target = member.resolve_target() + if package_name not in str(target.canonical_path): + continue + except Exception: + continue + if member.is_subpackage: + data[name] = _parse_package(member, package_name) + else: + data[name] = _module_data(member, package_name) + return data + + +# --------------------------------------------------------------------------- +# Entry point +# --------------------------------------------------------------------------- + + +def build_data_json(packages: list[str], search_paths: list[str]) -> dict[str, Any]: + """Load packages via griffe and produce the combined data dict.""" + output: dict[str, Any] = {} + for pkg_name in packages: + pkg = griffe.load( + pkg_name, + search_paths=search_paths, + docstring_parser="google", + ) + output.update(_parse_package(pkg, pkg_name)) + # Remove the top-level "kind" keys that _parse_package adds + output.pop("kind", None) + return output + + +def main() -> None: + parser = argparse.ArgumentParser(description="Build data.json using griffe (static AST analysis)") + parser.add_argument("packages", nargs="+", help="Package names to analyze (e.g. gooddata_sdk)") + parser.add_argument( + "--search-path", + action="append", + default=[], + dest="search_paths", + help="Directories to search for packages (repeatable)", + ) + parser.add_argument("--output", default="data.json", help="Output JSON file path") + args = parser.parse_args() + + search_paths = args.search_paths or ["."] + output = build_data_json(args.packages, search_paths) + + with open(args.output, "w") as f: + json.dump(output, f) + + print(f"Saved data.json ({len(output)} top-level keys) to {os.path.abspath(args.output)}") + + +if __name__ == "__main__": + main() diff --git a/scripts/docs/method_page_renderer.py b/scripts/docs/method_page_renderer.py new file mode 100644 index 000000000..6eeb008c8 --- /dev/null +++ b/scripts/docs/method_page_renderer.py @@ -0,0 +1,382 @@ +# (C) 2026 GoodData Corporation +"""Pre-render method documentation pages from data.json. + +For each markdown file with an ``api_ref`` frontmatter key, this script: +1. Resolves the method/function from data.json +2. Generates signature, description, parameters, and returns as HTML +3. Linkifies type names using the same links dictionary as python_ref_builder +4. Replaces everything between the frontmatter and the first ``## `` heading + (typically ``## Example``) with the generated HTML +5. Preserves all hand-written content below that heading + +Usage: + python method_page_renderer.py DATA_JSON CONTENT_DIR [--api-ref-url URL_ROOT] + +Example: + python method_page_renderer.py data.json versioned_docs/1.3 \ + --api-ref-url /1.3/api-reference +""" + +from __future__ import annotations + +import argparse +import json +import re +from pathlib import Path +from typing import Any + +# --------------------------------------------------------------------------- +# Link resolution (mirrors python_ref_builder.LinkResolver) +# --------------------------------------------------------------------------- + + +class LinkResolver: + """Resolve type names to HTML hyperlinks using a name->path dict.""" + + def __init__(self, links: dict[str, dict]) -> None: + self.links = links + + def type_link(self, name: str) -> str: + if not name: + return name or "" + orig = name + clean = name.replace("]", "").replace("Optional[", "").replace("list[", "").replace("List[", "").strip() + data = self.links.get(clean) + if data and data.get("path"): + return orig.replace(clean, f'{clean}') + return orig + + +# --------------------------------------------------------------------------- +# Build links dict from data.json (mirrors python_ref_builder pass 1) +# --------------------------------------------------------------------------- + + +def build_links(data: dict, url_root: str) -> dict[str, dict]: + """Walk data.json and build {name: {"path": url, "kind": str}} dict.""" + links: dict[str, dict] = {} + + def _walk(node: dict, api_ref_root: str) -> None: + for name, obj in node.items(): + if not isinstance(obj, dict): + continue + kind = obj.get("kind") + if kind == "module": + if name not in links: + links[name] = {"path": f"{api_ref_root}/{name}".lower(), "kind": "module"} + _walk(obj, f"{api_ref_root}/{name}") + elif kind == "class": + if name not in links: + links[name] = {"path": f"{api_ref_root}/{name}".lower(), "kind": "class"} + _walk(obj, f"{api_ref_root}/{name}") + elif name == "functions": + for fname in obj: + if fname.startswith("_") or fname in links: + continue + links[fname] = {"path": f"{api_ref_root}/{fname}".lower(), "kind": "function"} + + _walk(data, url_root) + return links + + +# --------------------------------------------------------------------------- +# Resolve method data from data.json +# --------------------------------------------------------------------------- + + +def resolve_method(data: dict, api_ref: str) -> dict[str, Any] | None: + """Resolve ``ClassName.method_name`` from data.json. + + Walks the full tree looking for a class with matching name, then looks up + the method in its ``functions`` dict. + """ + parts = api_ref.split(".") + if len(parts) != 2: + return None + class_name, method_name = parts + + def _find_class(node: dict) -> dict | None: + for name, obj in node.items(): + if not isinstance(obj, dict): + continue + kind = obj.get("kind") + if kind == "class" and name == class_name: + return obj + if kind == "module": + result = _find_class(obj) + if result is not None: + return result + return None + + cls = _find_class(data) + if cls is None: + return None + functions = cls.get("functions", {}) + return functions.get(method_name) + + +# --------------------------------------------------------------------------- +# HTML generation (matches shortcode output) +# --------------------------------------------------------------------------- + + +def _render_signature(func_data: dict, resolver: LinkResolver) -> str: + """Build the ``name(params) -> return_type`` line.""" + ds = func_data.get("docstring_parsed") + sig = func_data.get("signature", {}) + + # Build parameter string from docstring params if available, else from signature + if ds and ds.get("params"): + parts: list[str] = [] + for p in ds["params"]: + arg = p["arg_name"] + t = p.get("type_name", "") + if t: + arg += f": {t}" + parts.append(arg) + param_str = ", ".join(parts) + elif sig.get("params"): + param_str = ", ".join(p[0] for p in sig["params"]) + else: + param_str = "" + + ret_ann = sig.get("return_annotation", "") + ret_link = resolver.type_link(ret_ann) + return f"({param_str}) -> {ret_link}" if ret_ann and ret_ann != "None" else f"({param_str})" + + +def _render_params_table(func_data: dict, resolver: LinkResolver) -> str: + """Render the Parameters section HTML.""" + ds = func_data.get("docstring_parsed") + sig = func_data.get("signature", {}) + + doc_params = ds.get("params") if ds else None + sig_params = sig.get("params", []) + + if doc_params: + rows = "" + for p in doc_params: + name = p["arg_name"] + ptype = resolver.type_link(p.get("type_name", "")) + desc = p.get("description", "") or "" + rows += f'\n{name}\n{ptype}\n{desc}\n\n' + return ( + "

Parameters

\n" + '\n' + "\n\n\n\n\n\n\n" + f"\n{rows}\n
nametypedescription
" + ) + elif sig_params: + rows = "" + for p in sig_params: + name = p[0] + ptype = resolver.type_link(p[1]) if len(p) > 1 else "" + rows += f'\n{name}\n{ptype}\n\n\n' + return ( + "

Parameters

\n" + '\n' + "\n\n\n\n\n\n\n" + f"\n{rows}\n
nametypedescription
" + ) + else: + return "

Parameters

\nNone" + + +def _render_returns_table(func_data: dict, resolver: LinkResolver) -> str: + """Render the Returns section HTML.""" + ds = func_data.get("docstring_parsed") + sig = func_data.get("signature", {}) + ret_ann = sig.get("return_annotation", "") + + if not ds: + return "

Returns

\nNo docs" + + returns = ds.get("returns") + if not returns: + if ret_ann and ret_ann != "None": + # Has return annotation but no docstring returns section + return ( + "

Returns

\n" + '\n' + "\n\n\n\n\n\n" + f'\n\n\n\n
typedescription
{resolver.type_link(ret_ann)}\n' + "\n
" + ) + return "

Returns

\nNone" + + type_name = returns.get("type_name") or ret_ann + if not type_name or type_name == "None": + return "

Returns

\nNone" + + desc = returns.get("description", "") or "" + return ( + "

Returns

\n" + '\n' + "\n\n\n\n\n\n" + f'\n\n\n\n
typedescription
{resolver.type_link(type_name)}\n' + f"{desc}\n
" + ) + + +def render_method_html(method_name: str, func_data: dict, resolver: LinkResolver) -> str: + """Render full method HTML block matching current shortcode output.""" + ds = func_data.get("docstring_parsed") + sig_line = f"

{method_name}{_render_signature(func_data, resolver)}

" + + desc_html = "" + if ds: + short = ds.get("short_description", "") or "" + long = ds.get("long_description", "") or "" + if short or long: + desc_html = '
\n' + if short: + desc_html += f"

{short}

\n" + if long: + desc_html += f"

{long}

\n" + desc_html += "
" + + params_html = _render_params_table(func_data, resolver) + returns_html = _render_returns_table(func_data, resolver) + + return ( + "\n\n" + '
\n' + f"{sig_line}\n" + f"{desc_html}\n" + f"{params_html}\n" + f"{returns_html}\n" + "
\n" + ) + + +# --------------------------------------------------------------------------- +# Frontmatter parsing +# --------------------------------------------------------------------------- + +_FRONTMATTER_RE = re.compile(r"^---\n(.*?\n)---\n", re.DOTALL) +_API_REF_RE = re.compile(r'^api_ref:\s*["\']?([^"\']+?)["\']?\s*$', re.MULTILINE) +# Match ## or ### headings that are NOT Parameters or Returns (those are auto-generated) +_HEADING_RE = re.compile(r"^#{2,3} (?!Parameters$|Returns$)", re.MULTILINE) + + +def parse_frontmatter(content: str) -> tuple[str, dict[str, str], str]: + """Parse frontmatter, returning (frontmatter_block, kv_dict, rest_of_file).""" + m = _FRONTMATTER_RE.match(content) + if not m: + return "", {}, content + fm_block = m.group(0) + fm_text = m.group(1) + rest = content[m.end() :] + + kv: dict[str, str] = {} + for line in fm_text.splitlines(): + if ":" in line: + key, _, val = line.partition(":") + kv[key.strip()] = val.strip().strip("\"'") + return fm_block, kv, rest + + +# --------------------------------------------------------------------------- +# Process a single file +# --------------------------------------------------------------------------- + + +def process_file( + file_path: Path, + data: dict, + resolver: LinkResolver, + *, + dry_run: bool = False, +) -> bool: + """Process a single markdown file. Returns True if the file was modified.""" + content = file_path.read_text(encoding="utf-8") + fm_block, kv, rest = parse_frontmatter(content) + + api_ref = kv.get("api_ref") + if not api_ref: + return False + + func_data = resolve_method(data, api_ref) + if func_data is None: + print(f"WARN: Could not resolve api_ref={api_ref!r} in {file_path}") + return False + + method_name = api_ref.split(".")[-1] + html = render_method_html(method_name, func_data, resolver) + + # Find the first ## heading in rest to preserve hand-written content + heading_match = _HEADING_RE.search(rest) + preserved = rest[heading_match.start() :] if heading_match else "" + + new_content = fm_block + "\n" + html + "\n" + preserved + + if dry_run: + print(f"Would update: {file_path}") + return True + + if new_content != content: + file_path.write_text(new_content, encoding="utf-8") + return True + return False + + +# --------------------------------------------------------------------------- +# Walk content directory +# --------------------------------------------------------------------------- + + +def process_directory( + content_dir: Path, + data: dict, + resolver: LinkResolver, + *, + dry_run: bool = False, +) -> int: + """Walk all .md files and process those with api_ref frontmatter.""" + count = 0 + for md_file in sorted(content_dir.rglob("*.md")): + if md_file.name.startswith("_"): + continue + if process_file(md_file, data, resolver, dry_run=dry_run): + count += 1 + return count + + +# --------------------------------------------------------------------------- +# Entry point +# --------------------------------------------------------------------------- + + +def main() -> None: + parser = argparse.ArgumentParser(description="Pre-render method documentation pages from data.json") + parser.add_argument("data_json", help="Path to data.json") + parser.add_argument("content_dir", help="Path to content directory containing .md files") + parser.add_argument( + "--api-ref-url", + default="/latest/api-reference", + help="URL root for API reference links (default: /latest/api-reference)", + ) + parser.add_argument( + "--links-json", + help="Path to links.json exported by python_ref_builder (preferred over --api-ref-url)", + ) + parser.add_argument("--dry-run", action="store_true", help="Print what would change without writing") + args = parser.parse_args() + + with open(args.data_json) as f: + data = json.load(f) + + if args.links_json: + with open(args.links_json) as f: + links = json.load(f) + else: + links = build_links(data, args.api_ref_url) + resolver = LinkResolver(links) + + content_dir = Path(args.content_dir) + count = process_directory(content_dir, data, resolver, dry_run=args.dry_run) + print(f"{'Would update' if args.dry_run else 'Updated'} {count} file(s) in {content_dir}") + + +if __name__ == "__main__": + main() diff --git a/scripts/docs/migrate_method_pages.py b/scripts/docs/migrate_method_pages.py new file mode 100644 index 000000000..a6698cdc9 --- /dev/null +++ b/scripts/docs/migrate_method_pages.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python3 +# (C) 2026 GoodData Corporation +"""One-time migration: convert hand-written method pages to api_ref directive format. + +For each method page under docs/content/: +1. Reads the frontmatter to determine the superheading (e.g. "catalog_data_source.") +2. Maps superheading to the SDK class name (e.g. CatalogDataSourceService) +3. Adds ``api_ref: "ClassName.method_name"`` to frontmatter +4. Strips the manually written signature, description, and parameter/returns blocks +5. Preserves the ## Example section and everything below + +Usage: + python migrate_method_pages.py CONTENT_DIR [--dry-run] + +Example: + python migrate_method_pages.py docs/content/en/latest --dry-run + python migrate_method_pages.py docs/content/en/latest +""" + +from __future__ import annotations + +import argparse +import re +from pathlib import Path + +# Mapping from superheading prefix to SDK service class name. +# Derived from GoodDataSdk service attributes. +SUPERHEADING_TO_CLASS: dict[str, str] = { + "catalog_data_source": "CatalogDataSourceService", + "catalog_workspace": "CatalogWorkspaceService", + "catalog_workspace_content": "CatalogWorkspaceContentService", + "catalog_user": "CatalogUserService", + "catalog_permission": "CatalogPermissionService", + "catalog_organization": "CatalogOrganizationService", + "compute": "ComputeService", + "export": "ExportService", + "tables": "TableService", + "visualizations": "VisualizationService", + "support": "SupportService", +} + +_FRONTMATTER_RE = re.compile(r"^---\n(.*?\n)---\n", re.DOTALL) +# Match ## or ### headings that are NOT Parameters or Returns (those are auto-generated) +_PRESERVE_HEADING_RE = re.compile(r"^#{2,3} (?!Parameters$|Returns$)", re.MULTILINE) + + +def migrate_file(file_path: Path, *, dry_run: bool = False) -> bool: + """Migrate a single method page. Returns True if the file was modified.""" + content = file_path.read_text(encoding="utf-8") + + fm_match = _FRONTMATTER_RE.match(content) + if not fm_match: + return False + + fm_text = fm_match.group(1) + rest = content[fm_match.end() :] + + # Skip files that already have api_ref + if "api_ref:" in fm_text: + return False + + # Extract superheading + sh_match = re.search(r'^superheading:\s*["\']?([^"\']+?)["\']?\s*$', fm_text, re.MULTILINE) + if not sh_match: + return False + + superheading = sh_match.group(1).rstrip(".") + class_name = SUPERHEADING_TO_CLASS.get(superheading) + if not class_name: + print(f"WARN: Unknown superheading {superheading!r} in {file_path}") + return False + + # Extract method name from title + title_match = re.search(r'^title:\s*["\']?([^"\']+?)["\']?\s*$', fm_text, re.MULTILINE) + if not title_match: + return False + method_name = title_match.group(1) + + api_ref = f"{class_name}.{method_name}" + + # Add api_ref to frontmatter (before the closing ---) + new_fm_text = fm_text.rstrip("\n") + f'\napi_ref: "{api_ref}"\n' + new_fm_block = f"---\n{new_fm_text}---\n" + + # Find the first ## heading that isn't Parameters/Returns to preserve hand-written content + heading_match = _PRESERVE_HEADING_RE.search(rest) + preserved = rest[heading_match.start() :] if heading_match else "" + + new_content = new_fm_block + "\n" + preserved + + if dry_run: + print(f'Would migrate: {file_path} -> api_ref: "{api_ref}"') + return True + + if new_content != content: + file_path.write_text(new_content, encoding="utf-8") + print(f'Migrated: {file_path} -> api_ref: "{api_ref}"') + return True + return False + + +def main() -> None: + parser = argparse.ArgumentParser(description="Migrate method pages to api_ref directive format") + parser.add_argument("content_dir", help="Path to content directory (e.g. docs/content/en/latest)") + parser.add_argument("--dry-run", action="store_true", help="Print what would change without writing") + args = parser.parse_args() + + content_dir = Path(args.content_dir) + count = 0 + skipped = 0 + + for md_file in sorted(content_dir.rglob("*.md")): + if md_file.name.startswith("_"): + continue + # Skip non-method pages (no superheading = not a method page) + text = md_file.read_text(encoding="utf-8") + if "superheading:" not in text: + skipped += 1 + continue + if migrate_file(md_file, dry_run=args.dry_run): + count += 1 + + action = "Would migrate" if args.dry_run else "Migrated" + print(f"\n{action} {count} file(s), skipped {skipped} non-method file(s)") + + +if __name__ == "__main__": + main() diff --git a/scripts/docs/python_ref_builder.py b/scripts/docs/python_ref_builder.py index 6b5690771..3e383aceb 100644 --- a/scripts/docs/python_ref_builder.py +++ b/scripts/docs/python_ref_builder.py @@ -300,7 +300,7 @@ def read_json_file(file_path: str) -> dict: return json.load(json_file) -def create_file_structure(data: dict, root: Path, url_root: str): +def create_file_structure(data: dict, root: Path, url_root: str) -> dict[str, dict]: """Create file structure based on JSON data using a two-pass approach. Pass 1 — walk the data tree, build the ``links`` dict and collect page @@ -311,6 +311,9 @@ def create_file_structure(data: dict, root: Path, url_root: str): data (dict): JSON data representing the object. root (Path): Path to the root directory. url_root (str): URL root path for the API reference. + + Returns: + dict[str, dict]: The links dictionary mapping type names to URL paths. """ links: dict[str, dict] = {} pages: list[_PageSpec] = [] @@ -323,8 +326,6 @@ def _pass1(data_root: dict, dir_root: Path, api_ref_root: str, module_import_pat for name, obj in data_root.items(): if not isinstance(obj, dict): continue - if name in links: - continue kind = obj.get("kind", None) obj_module_import_path = module_import_path + f".{name}" if module_import_path != "" else name @@ -332,36 +333,38 @@ def _pass1(data_root: dict, dir_root: Path, api_ref_root: str, module_import_pat obj_module_import_path = obj_module_import_path.replace(".functions", "") if kind == "module": - (dir_root / name).mkdir(exist_ok=True) - links[name] = {"path": f"{api_ref_root}/{name}".lower(), "kind": "function"} - pages.append( - _PageSpec( - kind="module", - name=name, - parent_name="", - import_path=obj_module_import_path, - file_path=dir_root / name / "_index.md", - data=obj, + if name not in links: + (dir_root / name).mkdir(exist_ok=True) + links[name] = {"path": f"{api_ref_root}/{name}".lower(), "kind": "function"} + pages.append( + _PageSpec( + kind="module", + name=name, + parent_name="", + import_path=obj_module_import_path, + file_path=dir_root / name / "_index.md", + data=obj, + ) ) - ) elif kind == "class": - (dir_root / name).mkdir(exist_ok=True) - links[name] = {"path": f"{api_ref_root}/{name}".lower(), "kind": "class"} - pages.append( - _PageSpec( - kind="class", - name=name, - parent_name=module_import_path.split(".")[-1], - import_path=obj_module_import_path, - file_path=dir_root / name / "_index.md", - data=obj, + if name not in links: + (dir_root / name).mkdir(exist_ok=True) + links[name] = {"path": f"{api_ref_root}/{name}".lower(), "kind": "class"} + pages.append( + _PageSpec( + kind="class", + name=name, + parent_name=module_import_path.split(".")[-1], + import_path=obj_module_import_path, + file_path=dir_root / name / "_index.md", + data=obj, + ) ) - ) elif name == "functions": for func_name in obj: - if func_name.startswith("_"): + if func_name.startswith("_") or func_name in links: continue links[func_name] = { "path": f"{api_ref_root}/{func_name}".lower(), @@ -410,6 +413,8 @@ def _pass1(data_root: dict, dir_root: Path, api_ref_root: str, module_import_pat with page.file_path.open("w") as f: spec.render_template_to_file(template, f) + return links + def change_json_root(data: dict, json_start_paths: list[str] | None) -> dict: """Change the root of the JSON data to the specified path. @@ -459,15 +464,23 @@ def main(): parser.add_argument("json_file", metavar="FILE", help="Paths to json data file", default="data.json") parser.add_argument("version", metavar="str", help="Current Version", default="latest") parser.add_argument("root_directory", metavar="str", help="Current Version", default="versioned_docs") + parser.add_argument("--export-links", metavar="FILE", help="Export links dict as JSON for method_page_renderer") args = parser.parse_args() + all_links: dict[str, dict] = {} references = parse_toml(args.toml_file, args.version, args.root_directory) for ref in references: print(f"Parsing: {ref.url}") data = read_json_file(args.json_file) data = change_json_root(data, ref.packages) - create_file_structure(data, Path(ref.directory), url_root=ref.url) + links = create_file_structure(data, Path(ref.directory), url_root=ref.url) + all_links.update(links) + + if args.export_links: + with open(args.export_links, "w") as f: + json.dump(all_links, f) + print(f"Exported {len(all_links)} links to {args.export_links}") if __name__ == "__main__": diff --git a/scripts/docs/tests/test_griffe_builder.py b/scripts/docs/tests/test_griffe_builder.py new file mode 100644 index 000000000..09fc98034 --- /dev/null +++ b/scripts/docs/tests/test_griffe_builder.py @@ -0,0 +1,357 @@ +# (C) 2026 GoodData Corporation +from __future__ import annotations + +import json +import sys +import textwrap +from pathlib import Path + +import pytest + +_SCRIPTS_DOCS = Path(__file__).resolve().parent.parent + + +@pytest.fixture(autouse=True) +def _setup_path(monkeypatch: pytest.MonkeyPatch) -> None: + if str(_SCRIPTS_DOCS) not in sys.path: + monkeypatch.syspath_prepend(str(_SCRIPTS_DOCS)) + + +@pytest.fixture() +def _mod(): + import griffe_builder as mod + + return mod + + +@pytest.fixture() +def sample_pkg(tmp_path: Path) -> Path: + """Create a minimal Python package for griffe to analyze.""" + pkg = tmp_path / "sample_pkg" + pkg.mkdir() + (pkg / "__init__.py").write_text( + textwrap.dedent("""\ + from sample_pkg.services import MyService + from sample_pkg.models import MyModel + """) + ) + (pkg / "services.py").write_text( + textwrap.dedent("""\ + from __future__ import annotations + + from sample_pkg.models import MyModel + + + class MyService: + \"\"\"A service that does things.\"\"\" + + def list_items(self, workspace_id: str, limit: int = 10) -> list[MyModel]: + \"\"\"List all items in a workspace. + + Args: + workspace_id: The workspace ID. + limit: Maximum number of items to return. + + Returns: + list[MyModel]: All matching items. + \"\"\" + ... + + def delete_item(self, item_id: str) -> None: + \"\"\"Delete an item by ID. + + Args: + item_id: The item ID. + \"\"\" + ... + + @property + def name(self) -> str: + \"\"\"The service name.\"\"\" + return "my_service" + + def _private_method(self) -> None: + pass + """) + ) + (pkg / "models.py").write_text( + textwrap.dedent("""\ + from __future__ import annotations + + + class MyModel: + \"\"\"A model representing an item. + + Args: + id: The item identifier. + name: The item name. + \"\"\" + + def __init__(self, id: str, name: str) -> None: + self.id = id + self.name = name + """) + ) + return tmp_path + + +@pytest.fixture() +def inheritance_pkg(tmp_path: Path) -> Path: + """Package with class inheritance to test inherited member resolution.""" + pkg = tmp_path / "inherit_pkg" + pkg.mkdir() + (pkg / "__init__.py").write_text( + textwrap.dedent("""\ + from inherit_pkg.base import BaseService + from inherit_pkg.child import ChildService + """) + ) + (pkg / "base.py").write_text( + textwrap.dedent("""\ + class BaseService: + \"\"\"Base service.\"\"\" + + def shared_method(self) -> str: + \"\"\"A method defined on the base class.\"\"\" + return "shared" + """) + ) + (pkg / "child.py").write_text( + textwrap.dedent("""\ + from inherit_pkg.base import BaseService + + + class ChildService(BaseService): + \"\"\"Child service extending base.\"\"\" + + def child_only(self) -> int: + \"\"\"A method only on the child.\"\"\" + return 42 + """) + ) + return tmp_path + + +# --------------------------------------------------------------------------- +# Tests — build_data_json +# --------------------------------------------------------------------------- + + +class TestBuildDataJson: + def test_loads_package(self, _mod, sample_pkg): + data = _mod.build_data_json(["sample_pkg"], [str(sample_pkg)]) + assert "services" in data or "models" in data + + def test_finds_classes(self, _mod, sample_pkg): + data = _mod.build_data_json(["sample_pkg"], [str(sample_pkg)]) + found = False + + def _walk(node): + nonlocal found + for key, val in node.items(): + if key == "MyService" and isinstance(val, dict) and val.get("kind") == "class": + found = True + return val + if isinstance(val, dict) and val.get("kind") == "module": + result = _walk(val) + if result: + return result + return None + + cls = _walk(data) + assert found, f"MyService not found in data keys: {list(data.keys())}" + assert cls["kind"] == "class" + assert cls["docstring"] is not None + + def test_function_data_structure(self, _mod, sample_pkg): + data = _mod.build_data_json(["sample_pkg"], [str(sample_pkg)]) + + def _find_func(node, name): + for val in node.values(): + if isinstance(val, dict): + if val.get("kind") == "class": + funcs = val.get("functions", {}) + if name in funcs: + return funcs[name] + if val.get("kind") == "module": + result = _find_func(val, name) + if result: + return result + return None + + func = _find_func(data, "list_items") + assert func is not None, "list_items not found" + assert func["kind"] == "function" + + # Signature + sig = func["signature"] + assert "params" in sig + assert "return_annotation" in sig + assert len(sig["params"]) >= 2 # workspace_id, limit + + # Docstring parsed + ds = func["docstring_parsed"] + assert ds is not None + assert ds["short_description"] is not None + assert len(ds["params"]) == 2 + assert ds["params"][0]["arg_name"] == "workspace_id" + assert ds["returns"] is not None + + def test_no_top_level_kind_key(self, _mod, sample_pkg): + data = _mod.build_data_json(["sample_pkg"], [str(sample_pkg)]) + assert "kind" not in data + + def test_output_is_json_serializable(self, _mod, sample_pkg): + data = _mod.build_data_json(["sample_pkg"], [str(sample_pkg)]) + json.dumps(data) + + def test_private_methods_included(self, _mod, sample_pkg): + """Private methods should be in data (filtered later by python_ref_builder).""" + data = _mod.build_data_json(["sample_pkg"], [str(sample_pkg)]) + + def _find_class(node, name): + for k, v in node.items(): + if k == name and isinstance(v, dict) and v.get("kind") == "class": + return v + if isinstance(v, dict) and v.get("kind") == "module": + r = _find_class(v, name) + if r: + return r + return None + + cls = _find_class(data, "MyService") + assert cls is not None + assert "_private_method" in cls["functions"] + + def test_property_detected_if_resolved(self, _mod, sample_pkg): + """@property methods should have is_property=True when griffe resolves them.""" + data = _mod.build_data_json(["sample_pkg"], [str(sample_pkg)]) + + def _find_class(node, name): + for k, v in node.items(): + if k == name and isinstance(v, dict) and v.get("kind") == "class": + return v + if isinstance(v, dict) and v.get("kind") == "module": + r = _find_class(v, name) + if r: + return r + return None + + cls = _find_class(data, "MyService") + assert cls is not None + # griffe may or may not resolve @property into functions depending on resolution; + # if it does, is_property should be True + if "name" in cls["functions"]: + assert cls["functions"]["name"]["is_property"] is True + + def test_void_function_return_annotation(self, _mod, sample_pkg): + """Functions returning None should have 'None' as return_annotation.""" + data = _mod.build_data_json(["sample_pkg"], [str(sample_pkg)]) + + def _find_func(node, name): + for val in node.values(): + if isinstance(val, dict): + if val.get("kind") == "class": + funcs = val.get("functions", {}) + if name in funcs: + return funcs[name] + if val.get("kind") == "module": + result = _find_func(val, name) + if result: + return result + return None + + func = _find_func(data, "delete_item") + assert func is not None + assert func["signature"]["return_annotation"] == "None" + + def test_default_parameter_values(self, _mod, sample_pkg): + """Parameters with defaults should include them in the param string.""" + data = _mod.build_data_json(["sample_pkg"], [str(sample_pkg)]) + + def _find_func(node, name): + for val in node.values(): + if isinstance(val, dict): + if val.get("kind") == "class": + funcs = val.get("functions", {}) + if name in funcs: + return funcs[name] + if val.get("kind") == "module": + result = _find_func(val, name) + if result: + return result + return None + + func = _find_func(data, "list_items") + assert func is not None + # The 'limit' param should have default=10 + limit_param = [p for p in func["signature"]["params"] if "limit" in p[0]] + assert len(limit_param) == 1 + assert "10" in limit_param[0][0] + + def test_class_docstring_parsed(self, _mod, sample_pkg): + """Class-level docstrings should be parsed.""" + data = _mod.build_data_json(["sample_pkg"], [str(sample_pkg)]) + + def _find_class(node, name): + for k, v in node.items(): + if k == name and isinstance(v, dict) and v.get("kind") == "class": + return v + if isinstance(v, dict) and v.get("kind") == "module": + r = _find_class(v, name) + if r: + return r + return None + + cls = _find_class(data, "MyService") + assert cls is not None + assert cls["docstring_parsed"] is not None + assert cls["docstring_parsed"]["short_description"] == "A service that does things." + + def test_multiple_packages(self, _mod, sample_pkg): + """Loading multiple packages should merge their data.""" + # sample_pkg has both services and models submodules + data = _mod.build_data_json(["sample_pkg"], [str(sample_pkg)]) + assert len(data) >= 1 + + +# --------------------------------------------------------------------------- +# Tests — inheritance +# --------------------------------------------------------------------------- + + +class TestInheritedMembers: + def test_child_has_own_method(self, _mod, inheritance_pkg): + data = _mod.build_data_json(["inherit_pkg"], [str(inheritance_pkg)]) + + def _find_class(node, name): + for k, v in node.items(): + if k == name and isinstance(v, dict) and v.get("kind") == "class": + return v + if isinstance(v, dict) and v.get("kind") == "module": + r = _find_class(v, name) + if r: + return r + return None + + cls = _find_class(data, "ChildService") + assert cls is not None + assert "child_only" in cls["functions"] + + def test_base_class_has_shared_method(self, _mod, inheritance_pkg): + """Base class methods should be present on the base class itself.""" + data = _mod.build_data_json(["inherit_pkg"], [str(inheritance_pkg)]) + + def _find_class(node, name): + for k, v in node.items(): + if k == name and isinstance(v, dict) and v.get("kind") == "class": + return v + if isinstance(v, dict) and v.get("kind") == "module": + r = _find_class(v, name) + if r: + return r + return None + + cls = _find_class(data, "BaseService") + assert cls is not None + assert "shared_method" in cls["functions"] diff --git a/scripts/docs/tests/test_method_page_renderer.py b/scripts/docs/tests/test_method_page_renderer.py new file mode 100644 index 000000000..27b887229 --- /dev/null +++ b/scripts/docs/tests/test_method_page_renderer.py @@ -0,0 +1,503 @@ +# (C) 2026 GoodData Corporation +from __future__ import annotations + +import sys +from pathlib import Path + +import pytest + +_SCRIPTS_DOCS = Path(__file__).resolve().parent.parent + + +@pytest.fixture(autouse=True) +def _setup_path(monkeypatch: pytest.MonkeyPatch) -> None: + if str(_SCRIPTS_DOCS) not in sys.path: + monkeypatch.syspath_prepend(str(_SCRIPTS_DOCS)) + + +@pytest.fixture() +def _mod(): + import method_page_renderer as mod + + return mod + + +# --------------------------------------------------------------------------- +# Sample data (mirrors json_builder output) +# --------------------------------------------------------------------------- + +SAMPLE_DATA: dict = { + "sdk": { + "kind": "module", + "catalog": { + "kind": "module", + "CatalogDataSourceService": { + "kind": "class", + "docstring": "Data source service.", + "docstring_parsed": { + "short_description": "Data source service.", + "long_description": "", + }, + "functions": { + "scan_sql": { + "kind": "function", + "docstring": "Analyze SELECT SQL query.", + "signature": { + "params": [ + ["data_source_id: str", "str"], + ["sql_request: ScanSqlRequest", "ScanSqlRequest"], + ], + "return_annotation": "ScanSqlResponse", + }, + "docstring_parsed": { + "short_description": "Analyze SELECT SQL query in a given request.", + "long_description": "Returns column names with types.", + "params": [ + { + "arg_name": "data_source_id", + "type_name": "str", + "description": "Data source identification string.", + }, + { + "arg_name": "sql_request", + "type_name": "ScanSqlRequest", + "description": "SELECT SQL query to analyze.", + }, + ], + "returns": { + "type_name": "ScanSqlResponse", + "description": "SELECT query analysis result.", + "return_name": None, + }, + }, + }, + "delete_data_source": { + "kind": "function", + "docstring": "Delete a data source.", + "signature": { + "params": [["data_source_id: str", "str"]], + "return_annotation": "None", + }, + "docstring_parsed": { + "short_description": "Delete a data source by ID.", + "long_description": None, + "params": [ + { + "arg_name": "data_source_id", + "type_name": "str", + "description": "The data source ID.", + }, + ], + "returns": None, + }, + }, + "no_docstring_method": { + "kind": "function", + "docstring": None, + "signature": { + "params": [["workspace_id: str", "str"]], + "return_annotation": "list[str]", + }, + "docstring_parsed": None, + }, + }, + }, + }, + }, +} + + +# --------------------------------------------------------------------------- +# build_links +# --------------------------------------------------------------------------- + + +class TestBuildLinks: + def test_builds_links_from_nested_data(self, _mod): + links = _mod.build_links(SAMPLE_DATA, "/latest/api-reference") + assert "CatalogDataSourceService" in links + assert links["CatalogDataSourceService"]["kind"] == "class" + assert "/catalogdatasourceservice" in links["CatalogDataSourceService"]["path"] + + def test_includes_functions(self, _mod): + links = _mod.build_links(SAMPLE_DATA, "/latest/api-reference") + assert "scan_sql" in links + assert links["scan_sql"]["kind"] == "function" + + def test_recurses_into_duplicate_module_names(self, _mod): + """Modules with the same name at different levels should all be recursed into.""" + data = { + "outer": { + "kind": "module", + "inner": { + "kind": "module", + "MyClass": {"kind": "class", "functions": {}}, + }, + }, + "other": { + "kind": "module", + "inner": { + "kind": "module", + "HiddenClass": {"kind": "class", "functions": {}}, + }, + }, + } + links = _mod.build_links(data, "/api") + assert "MyClass" in links + assert "HiddenClass" in links + + def test_skips_private_functions(self, _mod): + links = _mod.build_links(SAMPLE_DATA, "/latest/api-reference") + for name in links: + assert not name.startswith("_") + + +# --------------------------------------------------------------------------- +# resolve_method +# --------------------------------------------------------------------------- + + +class TestResolveMethod: + def test_resolves_known_method(self, _mod): + func = _mod.resolve_method(SAMPLE_DATA, "CatalogDataSourceService.scan_sql") + assert func is not None + assert func["kind"] == "function" + + def test_returns_none_for_unknown_class(self, _mod): + assert _mod.resolve_method(SAMPLE_DATA, "Unknown.scan_sql") is None + + def test_returns_none_for_unknown_method(self, _mod): + assert _mod.resolve_method(SAMPLE_DATA, "CatalogDataSourceService.unknown") is None + + def test_returns_none_for_bad_format(self, _mod): + assert _mod.resolve_method(SAMPLE_DATA, "just_a_name") is None + + def test_returns_none_for_empty(self, _mod): + assert _mod.resolve_method(SAMPLE_DATA, "") is None + + def test_returns_none_for_three_parts(self, _mod): + assert _mod.resolve_method(SAMPLE_DATA, "A.B.C") is None + + +# --------------------------------------------------------------------------- +# LinkResolver +# --------------------------------------------------------------------------- + + +class TestLinkResolver: + def test_type_link_known(self, _mod): + links = _mod.build_links(SAMPLE_DATA, "/latest/api-reference") + resolver = _mod.LinkResolver(links) + result = resolver.type_link("CatalogDataSourceService") + assert 'Foo' in result + assert "Optional[" in result + + def test_type_link_list_wrapper(self, _mod): + links = {"Foo": {"path": "/api/foo", "kind": "class"}} + resolver = _mod.LinkResolver(links) + result = resolver.type_link("list[Foo]") + assert 'Foo' in result + assert "list[" in result + + +# --------------------------------------------------------------------------- +# render_method_html +# --------------------------------------------------------------------------- + + +class TestRenderMethodHtml: + def test_contains_signature(self, _mod): + resolver = _mod.LinkResolver({}) + func = _mod.resolve_method(SAMPLE_DATA, "CatalogDataSourceService.scan_sql") + html = _mod.render_method_html("scan_sql", func, resolver) + assert "scan_sql" in html + assert "data_source_id" in html + assert "ScanSqlRequest" in html + + def test_contains_parameters_table(self, _mod): + resolver = _mod.LinkResolver({}) + func = _mod.resolve_method(SAMPLE_DATA, "CatalogDataSourceService.scan_sql") + html = _mod.render_method_html("scan_sql", func, resolver) + assert "Parameters" in html + assert "gd-docs-parameters-block" in html + + def test_contains_returns_table(self, _mod): + resolver = _mod.LinkResolver({}) + func = _mod.resolve_method(SAMPLE_DATA, "CatalogDataSourceService.scan_sql") + html = _mod.render_method_html("scan_sql", func, resolver) + assert "Returns" in html + assert "ScanSqlResponse" in html + + def test_none_return(self, _mod): + resolver = _mod.LinkResolver({}) + func = _mod.resolve_method(SAMPLE_DATA, "CatalogDataSourceService.delete_data_source") + html = _mod.render_method_html("delete_data_source", func, resolver) + assert "Returns" in html + assert "None" in html + + def test_auto_generated_comment(self, _mod): + resolver = _mod.LinkResolver({}) + func = _mod.resolve_method(SAMPLE_DATA, "CatalogDataSourceService.scan_sql") + html = _mod.render_method_html("scan_sql", func, resolver) + assert "AUTO-GENERATED FROM DOCSTRING" in html + + def test_description_short_and_long(self, _mod): + resolver = _mod.LinkResolver({}) + func = _mod.resolve_method(SAMPLE_DATA, "CatalogDataSourceService.scan_sql") + html = _mod.render_method_html("scan_sql", func, resolver) + assert "Analyze SELECT SQL query in a given request." in html + assert "Returns column names with types." in html + + def test_return_type_in_signature(self, _mod): + resolver = _mod.LinkResolver({}) + func = _mod.resolve_method(SAMPLE_DATA, "CatalogDataSourceService.scan_sql") + html = _mod.render_method_html("scan_sql", func, resolver) + assert "-> ScanSqlResponse" in html + + def test_no_return_arrow_for_none(self, _mod): + resolver = _mod.LinkResolver({}) + func = _mod.resolve_method(SAMPLE_DATA, "CatalogDataSourceService.delete_data_source") + html = _mod.render_method_html("delete_data_source", func, resolver) + assert "->" not in html + + def test_no_docstring_fallback_to_signature(self, _mod): + """When docstring_parsed is None, should fall back to signature params.""" + resolver = _mod.LinkResolver({}) + func = _mod.resolve_method(SAMPLE_DATA, "CatalogDataSourceService.no_docstring_method") + html = _mod.render_method_html("no_docstring_method", func, resolver) + assert "workspace_id" in html + assert "No docs" in html or "gd-docs-parameters-block" in html + + def test_type_links_in_params(self, _mod): + links = {"ScanSqlRequest": {"path": "/api/scansqlrequest", "kind": "class"}} + resolver = _mod.LinkResolver(links) + func = _mod.resolve_method(SAMPLE_DATA, "CatalogDataSourceService.scan_sql") + html = _mod.render_method_html("scan_sql", func, resolver) + assert 'ScanSqlRequest' in html + + def test_type_links_in_return(self, _mod): + links = {"ScanSqlResponse": {"path": "/api/scansqlresponse", "kind": "class"}} + resolver = _mod.LinkResolver(links) + func = _mod.resolve_method(SAMPLE_DATA, "CatalogDataSourceService.scan_sql") + html = _mod.render_method_html("scan_sql", func, resolver) + assert 'ScanSqlResponse' in html + + def test_python_ref_wrapper(self, _mod): + resolver = _mod.LinkResolver({}) + func = _mod.resolve_method(SAMPLE_DATA, "CatalogDataSourceService.scan_sql") + html = _mod.render_method_html("scan_sql", func, resolver) + assert '
' in html + assert "
" in html + + +# --------------------------------------------------------------------------- +# parse_frontmatter +# --------------------------------------------------------------------------- + + +class TestParseFrontmatter: + def test_basic(self, _mod): + content = '---\ntitle: "test"\napi_ref: "Foo.bar"\n---\n\nBody text\n' + fm_block, kv, rest = _mod.parse_frontmatter(content) + assert kv["title"] == "test" + assert kv["api_ref"] == "Foo.bar" + assert "Body text" in rest + + def test_no_frontmatter(self, _mod): + content = "Just some text\n" + fm_block, kv, rest = _mod.parse_frontmatter(content) + assert fm_block == "" + assert kv == {} + assert rest == content + + def test_quoted_api_ref(self, _mod): + content = '---\napi_ref: "MyClass.my_method"\n---\nBody\n' + _, kv, _ = _mod.parse_frontmatter(content) + assert kv["api_ref"] == "MyClass.my_method" + + def test_preserves_frontmatter_block(self, _mod): + content = '---\ntitle: "test"\nweight: 10\n---\nBody\n' + fm_block, _, _ = _mod.parse_frontmatter(content) + assert fm_block == '---\ntitle: "test"\nweight: 10\n---\n' + + def test_multiline_values(self, _mod): + content = '---\ntitle: "a title"\nsuperheading: "service."\napi_ref: "Svc.method"\n---\n' + _, kv, _ = _mod.parse_frontmatter(content) + assert kv["superheading"] == "service." + + +# --------------------------------------------------------------------------- +# process_file (integration) +# --------------------------------------------------------------------------- + + +class TestProcessFile: + def test_updates_file_with_api_ref(self, _mod, tmp_path): + md = tmp_path / "test.md" + md.write_text( + '---\ntitle: "scan_sql"\napi_ref: "CatalogDataSourceService.scan_sql"\n---\n\n' + "Old content here\n\n## Example\n\n```python\nsdk.scan_sql()\n```\n" + ) + links = _mod.build_links(SAMPLE_DATA, "/latest/api-reference") + resolver = _mod.LinkResolver(links) + changed = _mod.process_file(md, SAMPLE_DATA, resolver) + assert changed + + content = md.read_text() + assert "AUTO-GENERATED FROM DOCSTRING" in content + assert "## Example" in content + assert "sdk.scan_sql()" in content + assert "Old content here" not in content + + def test_preserves_example_section(self, _mod, tmp_path): + md = tmp_path / "test.md" + example = "## Example\n\n```python\nmy_example_code()\n```\n" + md.write_text('---\napi_ref: "CatalogDataSourceService.scan_sql"\n---\n\nOld stuff\n\n' + example) + links = _mod.build_links(SAMPLE_DATA, "/latest/api-reference") + resolver = _mod.LinkResolver(links) + _mod.process_file(md, SAMPLE_DATA, resolver) + + content = md.read_text() + assert "my_example_code()" in content + + def test_preserves_h3_example(self, _mod, tmp_path): + """### Example headings should also be preserved.""" + md = tmp_path / "test.md" + md.write_text('---\napi_ref: "CatalogDataSourceService.scan_sql"\n---\n\nOld\n\n### Example\n\nkept\n') + links = _mod.build_links(SAMPLE_DATA, "/latest/api-reference") + resolver = _mod.LinkResolver(links) + _mod.process_file(md, SAMPLE_DATA, resolver) + + content = md.read_text() + assert "### Example" in content + assert "kept" in content + + def test_strips_parameters_returns_headings(self, _mod, tmp_path): + """## Parameters and ## Returns should NOT be preserved (they're auto-generated).""" + md = tmp_path / "test.md" + md.write_text( + '---\napi_ref: "CatalogDataSourceService.scan_sql"\n---\n\n' + "## Parameters\n\nold param table\n\n## Returns\n\nold return\n\n## Example\n\nkept\n" + ) + links = _mod.build_links(SAMPLE_DATA, "/latest/api-reference") + resolver = _mod.LinkResolver(links) + _mod.process_file(md, SAMPLE_DATA, resolver) + + content = md.read_text() + assert "old param table" not in content + assert "old return" not in content + assert "## Example" in content + assert "kept" in content + + def test_skips_file_without_api_ref(self, _mod, tmp_path): + md = tmp_path / "test.md" + md.write_text("---\ntitle: test\n---\nBody\n") + links = _mod.build_links(SAMPLE_DATA, "/latest/api-reference") + resolver = _mod.LinkResolver(links) + changed = _mod.process_file(md, SAMPLE_DATA, resolver) + assert not changed + + def test_warns_on_unresolvable_api_ref(self, _mod, tmp_path, capsys): + md = tmp_path / "test.md" + md.write_text('---\napi_ref: "Nonexistent.method"\n---\nBody\n') + links = _mod.build_links(SAMPLE_DATA, "/latest/api-reference") + resolver = _mod.LinkResolver(links) + changed = _mod.process_file(md, SAMPLE_DATA, resolver) + assert not changed + assert "WARN" in capsys.readouterr().out + + def test_dry_run_does_not_write(self, _mod, tmp_path): + md = tmp_path / "test.md" + original = '---\napi_ref: "CatalogDataSourceService.scan_sql"\n---\n\n## Example\ncode\n' + md.write_text(original) + links = _mod.build_links(SAMPLE_DATA, "/latest/api-reference") + resolver = _mod.LinkResolver(links) + changed = _mod.process_file(md, SAMPLE_DATA, resolver, dry_run=True) + assert changed + assert md.read_text() == original + + def test_idempotent(self, _mod, tmp_path): + """Running the renderer twice should produce identical output.""" + md = tmp_path / "test.md" + md.write_text('---\napi_ref: "CatalogDataSourceService.scan_sql"\n---\n\n## Example\n\ncode\n') + links = _mod.build_links(SAMPLE_DATA, "/latest/api-reference") + resolver = _mod.LinkResolver(links) + + _mod.process_file(md, SAMPLE_DATA, resolver) + first_pass = md.read_text() + + changed = _mod.process_file(md, SAMPLE_DATA, resolver) + assert not changed # no change on second pass + assert md.read_text() == first_pass + + def test_no_example_section(self, _mod, tmp_path): + """Files without any ## heading should still render (no preserved section).""" + md = tmp_path / "test.md" + md.write_text('---\napi_ref: "CatalogDataSourceService.scan_sql"\n---\n\nOld content\n') + links = _mod.build_links(SAMPLE_DATA, "/latest/api-reference") + resolver = _mod.LinkResolver(links) + + changed = _mod.process_file(md, SAMPLE_DATA, resolver) + assert changed + content = md.read_text() + assert "AUTO-GENERATED" in content + assert "Old content" not in content + + def test_uses_links_json(self, _mod, tmp_path): + """When links are provided via dict (simulating --links-json), type links work.""" + md = tmp_path / "test.md" + md.write_text('---\napi_ref: "CatalogDataSourceService.scan_sql"\n---\n\n## Example\ncode\n') + # Provide explicit links (as --links-json would) + links = {"ScanSqlResponse": {"path": "/v1/api-reference/scansqlresponse", "kind": "class"}} + resolver = _mod.LinkResolver(links) + _mod.process_file(md, SAMPLE_DATA, resolver) + + content = md.read_text() + assert 'ScanSqlResponse' in content + + +# --------------------------------------------------------------------------- +# process_directory +# --------------------------------------------------------------------------- + + +class TestProcessDirectory: + def test_processes_matching_files(self, _mod, tmp_path): + (tmp_path / "good.md").write_text( + '---\napi_ref: "CatalogDataSourceService.scan_sql"\n---\n\n## Example\ncode\n' + ) + (tmp_path / "skip.md").write_text("---\ntitle: skip\n---\nno api_ref\n") + (tmp_path / "_index.md").write_text("---\ntitle: index\n---\n") + + links = _mod.build_links(SAMPLE_DATA, "/latest/api-reference") + resolver = _mod.LinkResolver(links) + count = _mod.process_directory(tmp_path, SAMPLE_DATA, resolver) + assert count == 1 + + def test_processes_subdirectories(self, _mod, tmp_path): + sub = tmp_path / "section" + sub.mkdir() + (sub / "method.md").write_text('---\napi_ref: "CatalogDataSourceService.scan_sql"\n---\n\n## Example\ncode\n') + links = _mod.build_links(SAMPLE_DATA, "/latest/api-reference") + resolver = _mod.LinkResolver(links) + count = _mod.process_directory(tmp_path, SAMPLE_DATA, resolver) + assert count == 1 diff --git a/scripts/generate-single-version.sh b/scripts/generate-single-version.sh index 44c004f5c..3d86130d6 100755 --- a/scripts/generate-single-version.sh +++ b/scripts/generate-single-version.sh @@ -40,9 +40,10 @@ echo "Extracting docs from $branch for section $section (src=$src_section)" git archive "$branch" "content/en/$src_section" | tar xf - -C "$content_dir/$section" \ --strip-components=3 "content/en/$src_section" -# Generate API reference if json_builder.py exists on the branch -API_GEN_FILE="$branch:scripts/docs/json_builder.py" -if git cat-file -e "$API_GEN_FILE" 2>/dev/null; then +# Generate API reference if griffe_builder.py (or legacy json_builder.py) exists on the branch +GRIFFE_GEN_FILE="$branch:scripts/docs/griffe_builder.py" +LEGACY_GEN_FILE="$branch:scripts/docs/json_builder.py" +if git cat-file -e "$GRIFFE_GEN_FILE" 2>/dev/null || git cat-file -e "$LEGACY_GEN_FILE" 2>/dev/null; then echo "Generating API ref for section $section..." # Get api_spec.toml from the branch @@ -53,17 +54,36 @@ if git cat-file -e "$API_GEN_FILE" 2>/dev/null; then rm -f api_spec.toml fi - # Generate API introspection data from this version's SDK - python3 ../scripts/docs/json_builder.py + # Generate API introspection data — prefer griffe (static analysis, no imports needed) + if git cat-file -e "$GRIFFE_GEN_FILE" 2>/dev/null; then + echo "Using griffe_builder.py (static analysis)" + python3 ../scripts/docs/griffe_builder.py \ + --search-path ../packages/gooddata-sdk/src \ + --search-path ../packages/gooddata-pandas/src \ + --output data.json \ + gooddata_sdk gooddata_pandas + else + echo "Falling back to json_builder.py (runtime introspection)" + python3 ../scripts/docs/json_builder.py + fi - # Generate API reference markdown files + # Generate API reference markdown files and export links for method page renderer python3 ../scripts/docs/python_ref_builder.py api_spec.toml \ - data.json "$section" "$content_dir" + data.json "$section" "$content_dir" \ + --export-links links.json + + # Pre-render method pages with api_ref directives + if git cat-file -e "$branch:scripts/docs/method_page_renderer.py" 2>/dev/null; then + echo "Pre-rendering method pages for section $section..." + python3 ../scripts/docs/method_page_renderer.py \ + data.json "$content_dir/$section" \ + --links-json links.json + fi - # Clean up intermediate file (no longer needed after pre-rendering) - rm -f data.json + # Clean up intermediate files (no longer needed after pre-rendering) + rm -f data.json links.json else - echo "No json_builder.py on $branch, skipping API ref generation" + echo "No json_builder.py or griffe_builder.py on $branch, skipping API ref generation" fi echo "Done: section $section from $branch" diff --git a/scripts/generate.sh b/scripts/generate.sh index 4829aaed4..3a208b4a8 100755 --- a/scripts/generate.sh +++ b/scripts/generate.sh @@ -90,9 +90,9 @@ for branch in "${branches_to_process[@]}" ; do git archive "$branch" "content/en/$src_section" | tar xf - -C "$content_dir/$target_section" \ --strip-components=$strip_count "content/en/$src_section" fi - API_GEN_FILE="$branch:scripts/docs/json_builder.py" - if git cat-file -e $API_GEN_FILE; then - echo "$API_GEN_FILE exists." + GRIFFE_GEN_FILE="$branch:scripts/docs/griffe_builder.py" + LEGACY_GEN_FILE="$branch:scripts/docs/json_builder.py" + if git cat-file -e "$GRIFFE_GEN_FILE" 2>/dev/null || git cat-file -e "$LEGACY_GEN_FILE" 2>/dev/null; then echo "Generating API ref..." if [ "$target_section" == "" ] ; then echo "Skipping master api ref" @@ -103,9 +103,25 @@ for branch in "${branches_to_process[@]}" ; do echo "removing the API_spec" rm -rf api_spec.toml fi - python3 ../scripts/docs/json_builder.py - python3 ../scripts/docs/python_ref_builder.py api_spec.toml data.json "$target_section" versioned_docs - rm -f data.json + # Prefer griffe (static analysis, no imports needed) + if git cat-file -e "$GRIFFE_GEN_FILE" 2>/dev/null; then + python3 ../scripts/docs/griffe_builder.py \ + --search-path ../packages/gooddata-sdk/src \ + --search-path ../packages/gooddata-pandas/src \ + --output data.json \ + gooddata_sdk gooddata_pandas + else + python3 ../scripts/docs/json_builder.py + fi + python3 ../scripts/docs/python_ref_builder.py api_spec.toml data.json "$target_section" versioned_docs \ + --export-links links.json + # Pre-render method pages with api_ref directives + if git cat-file -e "$branch:scripts/docs/method_page_renderer.py" 2>/dev/null; then + python3 ../scripts/docs/method_page_renderer.py \ + data.json "versioned_docs/$target_section" \ + --links-json links.json + fi + rm -f data.json links.json fi fi done diff --git a/scripts/script-requirements.txt b/scripts/script-requirements.txt index 6cc8d065e..4ef97b008 100644 --- a/scripts/script-requirements.txt +++ b/scripts/script-requirements.txt @@ -1,6 +1,4 @@ docstring_parser~=0.15 +griffe>=1.0 jinja2~=3.1 toml~=0.10.2 --e./gooddata-api-client --e./packages/gooddata-sdk --e./packages/gooddata-pandas diff --git a/uv.lock b/uv.lock index 2b09e4ddd..9359d4ded 100644 --- a/uv.lock +++ b/uv.lock @@ -667,6 +667,15 @@ version = "0.6.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491", size = 25901, upload-time = "2014-06-16T11:18:57.406Z" } +[[package]] +name = "docstring-parser" +version = "0.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/9d/c3b43da9515bd270df0f80548d9944e389870713cc1fe2b8fb35fe2bcefd/docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912", size = 27442, upload-time = "2025-07-21T07:35:01.868Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" }, +] + [[package]] name = "dynaconf" version = "3.2.12" @@ -1017,6 +1026,8 @@ release = [ ] test = [ { name = "deepdiff" }, + { name = "docstring-parser" }, + { name = "griffe" }, { name = "moto" }, { name = "orjson" }, { name = "pytest" }, @@ -1063,6 +1074,8 @@ release = [ ] test = [ { name = "deepdiff", specifier = "~=8.5.0" }, + { name = "docstring-parser", specifier = "~=0.15" }, + { name = "griffe", specifier = ">=1.0" }, { name = "moto", specifier = ">=5.1.6" }, { name = "orjson", specifier = ">=3.11.3" }, { name = "pytest", specifier = "~=8.3.4" }, @@ -1137,6 +1150,38 @@ test = [ { name = "vcrpy", specifier = "~=8.0.0" }, ] +[[package]] +name = "griffe" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "griffecli" }, + { name = "griffelib" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/94/ee21d41e7eb4f823b94603b9d40f86d3c7fde80eacc2c3c71845476dddaa/griffe-2.0.0-py3-none-any.whl", hash = "sha256:5418081135a391c3e6e757a7f3f156f1a1a746cc7b4023868ff7d5e2f9a980aa", size = 5214, upload-time = "2026-02-09T19:09:44.105Z" }, +] + +[[package]] +name = "griffecli" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama" }, + { name = "griffelib" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/ed/d93f7a447bbf7a935d8868e9617cbe1cadf9ee9ee6bd275d3040fbf93d60/griffecli-2.0.0-py3-none-any.whl", hash = "sha256:9f7cd9ee9b21d55e91689358978d2385ae65c22f307a63fb3269acf3f21e643d", size = 9345, upload-time = "2026-02-09T19:09:42.554Z" }, +] + +[[package]] +name = "griffelib" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl", hash = "sha256:01284878c966508b6d6f1dbff9b6fa607bc062d8261c5c7253cb285b06422a7f", size = 142004, upload-time = "2026-02-09T19:09:40.561Z" }, +] + [[package]] name = "identify" version = "2.6.16"